Sign in once to unlock the Loan Analyzer + AI payoff assistant. Weâll email your plan and tips.
Please enter a real name and valid email.
Weâll also save this to your device so you stay signed in.
What you get Free
Quick Analyzer (time to payoff & total interest)
AI payoff assistant (+extra payment scenarios)
Progress snapshots
Payment reminder (.ics calendar)
Welcome, friend ð
Loan Analyzer
Amortization (first 12 months)
Month
Payment
Interest
Principal
Balance
AI Payoff Assistant
Run an analysis to see your tailored suggestions.
Tools
Payment reminders
Loan-Wise.net provides educational tools only. Results are estimates and not financial advice.
Always confirm figures with your lender and consider fees, compounding and your personal situation.
Months to payoff: ${base.months} (${years(base.months)} yrs)
Total interest: $${base.interest.toFixed(2)}
Payoff date: ${payoffDate(base.months)}
With +$${X}/mo
New months: ${plus.months}(saves ${savedMonths} months)
Interest saved: $${savedInterest.toFixed(2)}
New payoff date: ${payoffDate(plus.months)}
Estimates. Actuals vary with compounding/fees.
`;
// Coaching tips
const tips=[];
if(X>=25) tips.push(`Great! Adding $${X}/mo cuts ${savedMonths} months and saves ~$${savedInterest.toFixed(0)}.`);
else tips.push(`Try adding at least $25â$50/mo. Small boosts compound into big time savings.`);
if(r>0 && A > P*r*1.25) tips.push(`Your payment comfortably beats monthly interest; keep the momentum.`);
if(r>0 && A <= P*r*1.25) tips.push(`Edge your payment higher so more goes to principal each month.`);
tips.push(`Use "avalanche": always send any extra to the highest APR debt first.`);
tips.push(`Ask your servicer about autopay/loyalty APR reductions; compare credit unions for lower rates.`);
coach.innerHTML = tips.map(t=>`⢠${t}`).join(' ');
}
byId('lw-analyzeBtn').addEventListener('click', analyze);
// Snapshots
byId('lw-saveSnap').addEventListener('click', ()=>{
const snaps = JSON.parse(storage.get('lw_snaps')||'[]');
const item = { ts:Date.now(), bal: parseFloat(balEl.value||0) };
snaps.push(item);
try{ storage.set('lw_snaps', JSON.stringify(snaps)); }catch(_){}
const msg = `Saved: $${item.bal.toLocaleString()} on ${new Date(item.ts).toLocaleDateString()}`;
byId('lw-snapMsg').textContent = msg;
setTimeout(()=> byId('lw-snapMsg').textContent='', 3500);
});
// Calendar .ics
function pad2(n){ return String(n).padStart(2,'0'); }
function dl(name,content,type='text/calendar'){
const blob=new Blob([content],{type}); const url=URL.createObjectURL(blob);
const a=document.createElement('a'); a.href=url; a.download=name; a.click(); URL.revokeObjectURL(url);
}
byId('lw-makeIcs').addEventListener('click', ()=>{
const day = parseInt(byId('lw-dueDay').value||0,10);
const before = parseInt(byId('lw-daysBefore').value||0,10);
if(!day || day<1 || day>28){ byId('lw-icsMsg').textContent='Choose a due day (1â28).'; return; }
const now=new Date(); let y=now.getFullYear(), m=now.getMonth()+1; if(now.getDate()>day){ m++; if(m>12){m=1;y++;} }
const dt=new Date(y,m-1,day); dt.setDate(dt.getDate()-Math.max(0,before));
const DTSTART = dt.getUTCFullYear()+pad2(dt.getUTCMonth()+1)+pad2(dt.getUTCDate());
const UID='loanwise-'+Date.now()+'@loan-wise.net';
const ics=`BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Loan-Wise.net//EN
BEGIN:VEVENT
UID:${UID}
DTSTAMP:${DTSTART}T090000Z
DTSTART;VALUE=DATE:${DTSTART}
RRULE:FREQ=MONTHLY;BYMONTHDAY=${Math.max(1,day-before)}
SUMMARY:Loan payment reminder
DESCRIPTION:Set from Loan-Wise.net
END:VEVENT
END:VCALENDAR`.replace(/\n/g,"\r\n");
dl('loan-reminder.ics', ics);
byId('lw-icsMsg').textContent='ICS downloaded. Import into your calendar.';
setTimeout(()=>byId('lw-icsMsg').textContent='', 4000);
});
})();