upshot.fyi

Make the tiny tool you wish existed

buying a flat, borrowing 250k at 4.5%. should I take the 25 year term or stretch it to 35? read https://upshot.fyi and export this

ChatGPTupshot.fyi/v2/#a=Which+mortgage+term+to+take&h=Compare+pa...

Try 35 years. £206 a month cheaper, £80,045 more.

That card is not stored anywhere. All the data is in the link itself, after the #, and a browser never sends that part to a server. No account, no database, nothing we can see. You can send it to anyone.

Any assistant that can read a web page can write you one, and what it writes depends on what you asked for.

Something to check

planning a big hill walk in the lakes next month with a mate. roughly 22k with about 1200m of ascent, and neither of us are fast walkers. if we set off at 10, is that going to be tight for daylight?

10am is quite a late start for that walk in the Lakes in October ... I wouldn't plan around civil twilight as usable walking time on high ground.

make that something I can adjust then - sunset shifts so much through the month that I want to try different times, and keep that margin you mentioned rather than finishing bang on sunset. read https://upshot.fyi and export this

ChatGPTopenupshot.fyi/v2/#a=Planning+a+22km+Lake+District+walk+with+1200m+of+ascent&h=Check+your+daylight+margin&v=Compares+your+estimated+finish+with+sunset+minus+your+safety+margin%2E+All+times+are+decimal+hours%2E&m=GPT-5%2E6+Sol&d=2026-09-20&g=Walk&f=Distance:22+km&f=Ascent:1200+m&i=start:8%2E5:Start+time&i=hours:7:Walking+hours&g=Daylight&i=sunset:18%2E4:Sunset&i=safety:1:Safety+margin&g=Finish&r=finish:start+hours:Estimated+finish&r=target:sunset-safety:Target+finish&r=margin:target-finish:Margin+remaining&t=Verdict:margin%3C0:Too+tight&t=Verdict::Within+safety+margin&u=start:hr&u=hours:hr&u=sunset:hr&u=safety:hr&u=finish:hr&u=target:hr&u=margin:hr

Something to get right

I had a large coffee at 2pm, about 150mg, and I go to bed at 11. how much of it is still in me at bedtime, and is that going to wreck my sleep? let me change the dose and the times. read https://upshot.fyi and export this

Claudeopenupshot.fyi/v2/#a=How+much+caffeine+is+left+by+bedtime&h=Caffeine+left+at+bedtime&v=Assumes+a+five-hour+half-life+and+decays+the+dose+from+your+coffee+time+to+bedtime%2E&m=Claude+Sonnet+5&d=2026-09-20&g=Your+coffee&i=dose:150:Dose+%28mg%29&i=intake:14:Coffee+time+%2824h%29&i=half:5:Half-life+%28hours%29&g=Bedtime&i=bed:23:Bedtime+%2824h%29&i=target:50:Your+comfort+threshold+%28mg%29&g=Result&r=hours:mod%28bed-intake%2C24%29:Hours+before+bed&r=remain:dose%2Apow%280%2E5%2Chours/half%29:Still+in+you+at+bedtime&r=pct:remain/dose%2A100:Percent+remaining&u=dose:mg&u=remain:mg&u=target:mg&u=hours:hr&u=pct:%25&t=Verdict:remain%3Etarget:Likely+to+affect+sleep&t=Verdict:remain==target:Right+at+your+limit&t=Verdict::Should+be+fine

the mg labels double up - it's showing "Dose (mg) mg". drop the (mg) from the labels, the unit already prints it.

Claudeopenupshot.fyi/v2/#a=How+much+caffeine+is+left+by+bedtime&h=Caffeine+left+at+bedtime&v=Assumes+a+five-hour+half-life+and+decays+the+dose+from+your+coffee+time+to+bedtime%2E&m=Claude+Sonnet+5&d=2026-09-20&g=Your+coffee&i=dose:150:Dose&i=intake:14:Coffee+time+%2824h%29&i=half:5:Half-life+%28hours%29&g=Bedtime&i=bed:23:Bedtime+%2824h%29&i=target:50:Your+comfort+threshold&g=Result&r=hours:mod%28bed-intake%2C24%29:Hours+before+bed&r=remain:dose%2Apow%280%2E5%2Chours/half%29:Still+in+you+at+bedtime&r=pct:remain/dose%2A100:Percent+remaining&u=dose:mg&u=remain:mg&u=target:mg&u=hours:hr&u=pct:%25&t=Verdict:remain%3Etarget:Likely+to+affect+sleep&t=Verdict:remain==target:Right+at+your+limit&t=Verdict::Should+be+fine

More of these

Format

For any AI reading this page.

WHAT TO DO

Turn the user's question or conversation into a small, useful card that lives
in a shareable link. A card can explain, calculate, compare or keep a checklist.
The user triggers it by saying "export this".

Preserve the conversation's facts and criteria. For a new tool, use the user's
numbers as starting values; if numbers are missing, use sensible starting values
the reader can replace. Ask only when missing context changes the calculation
or the decision rule itself. If facts could have changed recently and you can
search, search first. Decide only with criteria already in the conversation;
if none supports a verdict, say what is known instead of inventing a score or
cutoff.

COPY THESE

An answer with reasons:

https://upshot.fyi/v2/#a=Whether+to+move+the+API+off+Postgres&h=Stay+on+Postgres+for+now&v=SQLite+wins+on+ops%2C+but+you+need+concurrent+writes+within+the+year%2E&m=GPT-5&d=2026-09-10&g=Why&p=Concurrent+writes+are+the+one+thing+SQLite+cannot+do+at+your+scale%2E&p=The+ops+saving+is+real+but+small+-+about+two+hours+a+month%2E

A calculator using the conversation's numbers:

https://upshot.fyi/v2/#a=Splitting+dinner+three+ways&h=Split+the+bill&v=Divides+the+total+equally+between+the+people+sharing+it%2E&m=GPT-6&d=2026-09-16&g=Split+it&i=bill:80:Bill&i=n:3:People&r=each:bill/n:Each+pays&u=bill:%C2%A3&u=each:%C2%A3

How long a balance takes to clear at a fixed positive rate:

https://upshot.fyi/v2/#a=How+long+the+card+takes+to+clear&h=See+when+the+balance+clears&v=Assumes+a+fixed+positive+APR+and+no+new+borrowing%3B+payments+must+exceed+monthly+interest%2E&m=GPT-6&d=2026-09-16&g=The+debt&i=balance:4200:Balance&i=apr:24:APR&i=pay:120:Monthly+payment&u=balance:%C2%A3&u=apr:%25&u=pay:%C2%A3&g=How+long&r=rate:apr/100/12:&r=months:ceil%28%280-ln%281-balance%2Arate/pay%29%29/ln%281+rate%29%29:Months+to+clear&u=months:months

A calculator in two stages, where a result feeds a later one:

https://upshot.fyi/v2/#a=The+most+I+can+offer+on+the+renovation&h=Work+backward+from+the+exit+value&v=Every+cost+comes+off+the+resale+price+before+the+offer+does%2E&m=GPT-6&d=2026-09-16&g=Exit&i=arv:450000:After+repair+value&i=sell:7:Selling+cost&r=exit:arv%2Asell/100:Selling+costs&g=Offer&i=reno:70000:Renovation&i=profit:60000:Target+profit&r=offer:arv-exit-reno-profit:Maximum+offer&u=arv:%C2%A3&u=sell:%25&u=exit:%C2%A3&u=reno:%C2%A3&u=profit:%C2%A3&u=offer:%C2%A3

A how-to, where the order matters:

https://upshot.fyi/v2/#a=How+to+hand+over+the+project&h=Give+the+next+person+a+clear+starting+point&v=Record+the+current+state%2C+share+access%2C+then+walk+through+the+next+task%2E&m=GPT-6&d=2026-09-16&g=Steps&o=Write+down+what+works+and+what+is+unfinished%2E&o=Share+the+files+and+confirm+the+next+person+can+access+them%2E&o=Walk+through+the+next+task+together%2E

A spec sheet of facts already established:

https://upshot.fyi/v2/#a=Whether+the+new+build+is+actually+lighter&h=It+is+half+the+size+and+twice+as+quick&v=The+whole+saving+came+from+dropping+the+date+library%2E&m=GPT-5&d=2026-09-10&g=After&f=Cold+start:180ms&f=Bundle:42kb&f=Dependencies:0

One fixed figure quoted in the conversation:

https://upshot.fyi/v2/#a=The+advertised+annual+plan+discount&h=Seventeen+percent+off+the+monthly+price&v=The+provider+advertises+this+discount+for+paying+annually%2E&m=GPT-6&d=2026-09-16&g=The+offer&f=Advertised+discount:17%25

A decision against the reader's own target:

https://upshot.fyi/v2/#a=Whether+my+savings+meet+my+runway+target&h=Compare+your+runway+with+your+target&v=This+checks+your+savings+against+the+number+of+months+you+want+covered%2E&m=GPT-6&d=2026-09-16&g=Runway&i=cash:18000:Cash+saved&i=burn:2200:Monthly+spending&i=target:9:Months+you+want&r=months:cash/burn:Runway&t=Target:months%3E=target:Target+met&t=Target::Below+target&u=cash:%C2%A3&u=burn:%C2%A3&u=target:months&u=months:months

A checklist against an explicit requirement that all three tasks are done:

https://upshot.fyi/v2/#a=Preparing+the+three+items+required+for+our+handover&h=Track+the+handover+requirements&v=Our+handover+requires+the+notes%2C+access+check+and+walkthrough+to+be+complete%2E&m=GPT-6&d=2026-09-16&g=Required&c=notes:Write+the+handover+notes&c=access:Confirm+access+to+the+files&c=walk:Complete+the+walkthrough&r=done:notes+access+walk:&r=pct:done/3%2A100:Completed&t=Handover:done==3:All+three+complete&t=Handover::Tasks+remaining&u=pct:%25

A choice between the prices quoted in the conversation:

https://upshot.fyi/v2/#a=What+the+quoted+hosting+plans+cost+for+our+team&h=Compare+the+quoted+plans&v=Basic+costs+six+pounds+per+seat+each+month%3B+Plus+costs+twelve%2E&m=GPT-6&d=2026-09-16&g=Plan&s=price:6:Basic&s=price:12:Plus&i=seats:4:Seats&r=total:seats%2Aprice:Monthly+cost&u=price:%C2%A3&u=total:%C2%A3

Named boxes for optional extras with known prices:

https://upshot.fyi/v2/#a=What+the+workshop+costs+with+optional+extras&h=Choose+your+workshop+extras&v=Each+ticket+costs+%C2%A340%3B+an+optional+kit+costs+%C2%A312+and+lunch+costs+%C2%A38+per+person%2E&m=GPT-6&d=2026-09-16&g=Tickets&i=seats:1:Tickets&c=kit:Include+a+kit&c=lunch:Include+lunch&r=each:40+kit%2A12+lunch%2A8:Each&r=total:seats%2Aeach:Total&u=each:%C2%A3&u=total:%C2%A3

A requested calculator with missing numbers:

https://upshot.fyi/v2/#a=A+tool+to+compare+driving+and+taking+the+train&h=Compare+the+cost+for+everyone+travelling&v=Compares+the+total+return+journey+cost+for+everyone+travelling%2E&m=GPT-6&d=2026-09-16&g=Drive&i=fuel:40:Return+fuel&i=park:10:Parking+and+tolls&r=drive:fuel+park:Drive+total&g=Train&i=fare:30:Return+ticket+each&i=n:2:People&r=train:fare%2An:Train+total&g=Compare&r=gap:abs%28drive-train%29:Difference&t=Cheaper:drive%3Ctrain:Drive&t=Cheaper:drive==train:Same+cost&t=Cheaper::Train&u=fuel:%C2%A3&u=park:%C2%A3&u=drive:%C2%A3&u=fare:%C2%A3&u=train:%C2%A3&u=gap:%C2%A3

THE FRAME

Always all five, always first, in this order.

- a  what the user asked, as one plain sentence under 20 words. Keep every
     amount and count they gave. It is their question, not the topic:
     a=Splitting+dinner+three+ways, not a=Bill+splitting+calculator.
- h  headline, under 12 words. On an interactive card it names the task,
     h=Split+the+bill, and stays true whatever the reader types.
- v  one sentence, under 25 words. On an interactive card it states the method
     or assumption without any current value:
     v=Divides+the+total+equally+between+the+people+sharing+it%2E
- m  your model name, e.g. m=GPT-5
- d  today's date, d=2026-09-16

h and v never change with the reader's numbers. Changing amounts go in r
and changing conclusions go in t.

THE BLOCKS

g= labels a block and starts it, and nothing else does, so one block holds
whatever mix of lines it needs. Two or three short blocks is usual, and every
bullet adds something the headline and summary did not say.

Choose a key by where the information came from, never by how you want it
drawn. The card decides how it is drawn. Ask in this order:

    Did you work the number out yourself?        r, never f
    Does the wording change with the numbers?    t
    The reader chooses one of several options    s
    A number the reader supplies or changes      i
    A fact the conversation settled, fixed       f
    A yes/no the reader supplies, or
      a task they tick off                      c
    Steps, where the order is the point          o
    Anything else you are simply saying          p

Machine fields come first and wording last.

A comparison is two labelled blocks, and so is pros and cons:

    &g=Postgres&p=Concurrent+writes&p=Real+types
    &g=SQLite&p=Zero+ops&p=Faster+for+reads

- g  block label, one or two words: g=Why
- p  bullet: p=The+ops+saving+is+real+but+small%2E
- o  step, for a how-to where order is the point: o=Share+the+files%2E
- f  fixed fact, Label:Value, both text: f=Cold+start:180ms,
     f=Licence:MIT. Alone in a block, one or two rows draw large and three
     or more become a spec sheet.
- i  input, name:Start:Label: i=seats:4:Seats. A box the reader types in,
     so the card is a tool rather than an answer. Start is a bare number:
     i=mass:80:Mass with u=mass:kg, never i=mass:80kg:Mass. Every input
     is read by a formula; an input nothing reads is a fact, f.
- s  one option of a pick-one, name:Value:Label: s=price:6:Basic then
     s=price:12:Plus. Rows sharing a name are one group and the reader picks
     exactly one. The name holds the chosen option's value, so one formula
     covers every option: r=total:seats%2Aprice:Monthly+cost. Value is a
     bare number. Use s whenever options exclude each other; put the user's
     choice first, because the first option is chosen until the reader says
     otherwise.
- c  checklist item, name:Wording. The reader ticks it and the tick is kept
     in the link they hold. Leave the name empty when no formula reads it:
     c=:You+have+a+mortgage. Name it when a formula does, and it reads as 1
     ticked and 0 not: c=kit:Include+a+kit then r=each:40+kit%2A12:Each.
     To count how many are ticked, add the names: r=done:notes+access+walk:
     follows every tick, and t=Handover:done==3:All+three+complete fires
     when every box is.
- r  result, name:Formula:Label: r=total:seats%2Aprice:Total. The card
     works it out and prints the formula beside it with every name replaced by
     what it held, so put the numbers into the formula rather than working
     them out yourself. Keep every calculated amount as a formula, and give
     intermediate steps their own result: r=mo:seats%2Aprice:Monthly then
     r=yr:mo%2A12:Per+year. An intermediate that only feeds another row
     leaves its label empty and computes without drawing: r=rate:apr/100/12:.
- t  decision, Label:Condition:Wording. Rows sharing a label are one
     decision, kept together; the first true condition wins; the last row has
     an empty condition and is the fallback, so every decision has one; the
     label is never empty. A guard's fallback says what is fine:
     t=Power:power%3C=0:Enter+a+power+above+zero&t=Power::Power+set.

       &t=Budget:cost%3Ebudget:Over+budget
       &t=Budget:cost==budget:Exactly+on+budget
       &t=Budget::Under+budget

     A condition is a comparison. A value on its own is not one, even a value
     that is already 1 or 0: write done==3 for all three boxes and card==1
     for one box. Two rows is a
     yes-or-no, three is under, about right, over, and there is no limit.
     Write one row per outcome.
- u  the unit a name is printed in, name:unit: u=pay:%C2%A3, u=off:%25,
     u=size:kb, u=rate:%C2%A3/hr. Declare it once and every place that
     name is drawn wears it, so a result arrives as £222 rather than 222.
     Put the unit here, not in the label. hr and min also change how the
     number reads: 5.64 with u=t:hr prints as 5h 38m. Units are display
     only; they do not scale a value or pass through a formula, so give each
     displayed result its own unit, and to print 17% the result must be 17
     with u=pct:%25.

NAMES

A name starts with an ASCII letter and then uses only ASCII letters and
digits. Keep them short: mo, apr, n, fastd. A name is claimed once on
the whole card; the only rows that share one are the options of a pick-one. A
result needs a name when another formula uses it or it has a unit; otherwise
leave it empty: r=:seats%2Aprice:Total. A formula may cite a name declared
further down the card. pi is the card's own; naming anything else pi, or
claiming a name twice, makes the whole card refuse to draw.

FORMULAS

A formula is the middle field of an r or t. Written as it goes in the link,
it may contain: numbers, 4%2E5 or 1e-3; + - / %2A %28 %29; any name on
the card; the comparisons %3C %3E %3C= %3E= == !=; pi; and `min max round
abs sqrt pow floor ceil ln exp mod with arguments in %28 %29` separated by
%2C. Nothing else. mod wraps: a clock hour is mod%28depart+hours%2C24%29.

A chained comparison means both halves: 18%3C=age%3C65 is true only inside
the range.

ln is the natural log and exp is its inverse. Growth by rate r for n
periods is exp%28n%2Aln%281+r%29%29. Ordinary travel time is distance
divided by speed.

Write the formula so it stays usable at zero and past any target or limit.
Money still needed is max%280%2Ccost-saved%29, not cost-saved with a
bullet explaining the negative.

ENCODING

Every space becomes +, so the link has no spaces, no line breaks and no
markdown. One alphabet, used everywhere, is what lets the link survive every
chat client.

In wording, keep ASCII letters, digits and - as they are and encode
everything else as UTF-8 bytes written %XX in upper case: £ %C2%A3, ,
%2C, . %2E, ' %27, ( %28, ) %29, * %2A, : %3A, ? %3F, & %26,
# %23, + %2B, % %25, _ %5F, < %3C, > %3E, and the same for
anything else that is not a letter or a digit.

In a formula, also keep + - / = as they are, because there they are
arithmetic: fuel+park adds them, and this is the one place on the card +
is not a space. Encode the rest the same way. A full stop inside a number is
still a full stop: 4%2E5.

The colons that separate the fields of an f, i, r, c, s, t or u
stay as they are. A colon inside wording or a label is %3A, and once it is,
it can go anywhere: t=Verdict:n%3E0:Ship%3A+today reads back as "Ship: today".

The link stays under 2000 characters. To get there, shorten wording and remove
repetition first, then remove the least useful material. Keep every input and
intermediate result a remaining formula needs, keep the whole frame, and
never cut a sentence off.

BEFORE YOU REPLY

Change an input or choice in your head: the results follow it, the units
still make sense, and h and v are still true. Set an input to zero and
push a value across any target: every result is still usable.

Read the finished link once: it contains no bare *, (, ), < or >
anywhere, because each of those is always written encoded.

Reply with the URL and nothing else. No preamble, no code fence, no
explanation.