You have made a thousand estimates. You have checked none of them. fibo reads the tracker and git, divides took by said for every task you ever closed, and prints one number.
said: a gif · took: the real thing, in your browser
A working copy of the program, in the browser, on the demo repository. Every line it prints was printed by the real one first; the refusals are the same rules. Type, or press a button. Nothing here is sent anywhere.
you@demo/tmp/fibo-demo · 230 tasks · 169 counted · 2 in the ledgerENGINE READYONE SUBJECTNO NETWORKNOTHING LEAVES
The demo is two years of made-up history — the same numbers on every machine. Yours starts empty, and neither run sends anything anywhere.
PYTHON3.10+DEPS0TESTS227 ✓LICENSEMITSUBJECTSONELEAVES THE MACHINENOTHING
7b02d4c
02 a promise with a number on it
said: 3 lines · took: 3 lines · ×1.0
saidan estimate written down before the first commit: in your tracker, in the commit, or in the ledger
first commit → merge, in working hours, in the time zone your own commits carry
×took ÷ said for every task you finished, and the median of those, taken in log space
The auth migration took 9.6 days and shipped on a Friday. The search index took 14 hours. Hover a number — it tells you what was promised.
Your tracker already holds years of estimates (Jira, Linear, GitHub, GitLab), so the first run has history to work with. Without a tracker, put Estimate: 2d in the first commit of a branch. Without either, fibo say PROJ-412 2d writes it down before you start.
#An estimate nobody checks is not an estimate. It is a mood.
e91a5f0
03 the multiplier
said: 1 screen · took: 2 screens · ×2.0
0.0×this number is the whole product. it does not tell you to estimate better. it tells you what to multiply by.
drift · 90-day rolling mediantwo years → now
3.7×4.5× · last 90 days
median in log space. ×4 and ×¼ are the same distance from ×1, and the median does not care about the one ×40 disaster.
working hours. mon–fri, 9–18, in the offset your own commits carried. a day is 8h, a week is 40h. --calendar takes both sides literally, shown small.
span and active. span: first commit → merge. active clips any pause over three working days. the gap is how long tasks sat waiting.
p90 is the bad day: in the worst case, ×8.6.
by kind of work. tracker labels, then where the diff went (migrations/, tests/), then the words in the title. five tasks to be shown.
fibo PROJ-412 takes one task apart. fibo drift shows it quarter by quarter. fibo doctor checks that nobody nudged anything.
c47d210
04 what it refuses
said: 4 examples · took: 5 · ×1.25
fibo say PROJ-412 soon✗ not a duration
fibo say PROJ-412 2d✗ written after the work began
a task with no estimate✗ not counted, and not guessed
--whose someone@else.com✗ this tool has one subject
story points, no rate given✗ points are not time
not a duration. "soon", "by the end of the sprint", "quick" are not estimates. say a number and a unit.
written after the work began. the program knows when the field changed and when the first commit was made. the value that stood at the first commit counts. doctor lists the rest.
not guessed. a task without an estimate gets nothing by analogy, by average or by diff size. it is left out, and the output says so.
one subject. yours. it will not print another person's multiplier, aggregate a team, or export. --whose with anyone else's address fails loudly.
points are not time.--points-as-hours=N exists, and the output then says the number rests on your assumption.
#A mirror pointed at someone else is a different object with a different name.
51fe8ab
05 on disk · the ledger
said: 4 files · took: 4 files · ×1.0
.fibo.jsonoptional, yours: who you are, which tracker to ask.fibo/ledger.jsonlevery line hashes the one before.fibo/ledger.headthe hash of the last line.fibo/cache/tracker responses with a TTL; delete it any time
That is all of it. No database, no index, no daemon, no server, no account, no telemetry. Every run recomputes from history. With a tracker it only reads — GET and GraphQL queries; a mutation is refused before it is sent.
.fibo/ledger.jsonltry editing a line
$ fibo doctor
#A multiplier you can quietly edit after a bad quarter is not a multiplier.
deadbee
06 the token
the program does not touch it · said: nothing · took: nothing
$FIBrobinhood chainnot live yet
—price · said at launch took · whatever the chart says
A community token. The code does not know it exists: there is no import, no flag, no line in the ledger. fibo will never require it and will never print its price.
No promises. If someone tells you a date, run fibo on them first.
not financial advice · the owl is not a financial advisor · it is not even a real owl
live chartpowered by geckoterminal— · pool address appears here
—————
nothing is deployed yet. when $FIB is live on a pool the indexers can see, the pair, the price and this chart fill themselves in. what you see behind is made up, like the demo.