Repository navigation
Releases
v1.0.0: the version submitted to the Nebius x NVIDIA Global AI Hackathon
Said Who? 1.0.0 is the version submitted to the Nebius x NVIDIA Global AI Hackathon, in the Best Apps and Agents track. Paste a quote you saw online, and six steps trace it to its earliest verifiable source: a Planner on Nemotron 3 Ultra, Tavily search, Readers on Nemotron 3.5 Lightning, a Checker in plain code that finds each copied sentence on its page, a Genealogist that follows cited works into digital libraries, and a Judge on Nemotron 3 Super, with Ultra stepping in when a verdict fails a check. Every model call goes to Nebius Token Factory.
In the third eval, the app's mix of models got 13 of the 20 test quotes right and all 10 of a held-out set, at $0.0076 and $0.0070 of Nebius tokens a quote. In the first eval it matched every step on Ultra, 14 of 20, at about a tenth of the cost. The README lists where it still fails.
Try it at https://saidwho.online.
Changes since 0.9.0
- README shows which Nemotron model runs each step and why, and where Token Factory sped up the work, instead of folding the models away, and says the project was built for the hackathon (#66)
- FEEDBACK.md opens with a summary of what worked and what needs work in Token Factory, the Nemotron models, AI Cloud and Tavily (#66)
- The local setup in README points at the run page (#65)
Full Changelog: v0.9.0...v1.0.0
v0.9.0: a new look, a run page of its own, and counted access codes
Said Who? has a new look: a light and dark theme, a home page that opens on the featured case with its earliest trace drawn on like a pen, and motion that follows how a run works. Run your own moved to its own page, which checks the keys before a run and keeps a list of the runs started from that browser. Trial access codes can now come with a set number of runs.
Changes
- A logo: a magnifier over two quote marks stands in for the "o" in the site's name, and the browser tab and home screen icons show it (#58)
- A light and dark theme switch. The page opens in the saved choice or the system's, with no flash of the other (#60)
- Run your own has its own page at
/run. It checks the Nebius and Tavily keys before a run, at most 40 checks an hour per visitor, says which field needs fixing, and shows what to do when a run fails. Old/#code=links lead there (#60) - Case replays have a play and pause button, a bar to drag and "Skip to the end" (#60)
- Access codes with a set number of trial runs, next to the one shared
TRIAL_ACCESS_CODE. The database keeps only each code's hash, a used-up code gets its own message, andpnpm trial-codemakes a code (#62) /runlists the runs started from this browser, newest first, each linking to its page. The list stays in the browser, holds up to 24 runs and can be cleared (#63)- The site header stays at the top while the page scrolls, as a see-through bar the page blurs and fades into, and links to a section on the home page stop below it. When large text makes the header take more than a quarter of the window, it scrolls away with the page (#59)
- A new look across the site: Schibsted Grotesk and IBM Plex Mono replace Geist, and the footer has the site's links. Cards, fields and text buttons share one small corner radius, and icon buttons are round. Nothing moves when the system asks for reduced motion (#60)
- The home page opens on the featured case: the quote set large, the name it's usually credited to struck out, and the earliest trace underlined by a marker drawn on at a pen's pace. How it works is a numbered map that marks the step in view, the eval scores count up as they come into view, and the case cards rise in as they are scrolled to (#60, #61)
- The lineage on a case page is one vertical line of steps that draws in step by step (#60)
- The quote's language can be left as "Not sure" (#60)
- GitHub Actions moved to newer versions of checkout, setup-node, pnpm/action-setup and gitleaks (#53, #54, #55, #56)
Full Changelog: v0.8.0...v0.9.0
v0.8.0: saidwho.online, a gated free trial, and runs that finish in time
Said Who? now lives at saidwho.online, and judges can try it on the owner's keys with an access code, within a $2 daily budget. A run stops starting new work after 180 s so it always finishes inside the function's time limit, error messages say which key was rejected, and CI builds the app with pinned Actions.
Changes
- Each example case has its own share image with its verdict, the quote, who it's usually credited to and what the run found, and a saved run's preview is titled with its quote (#46)
pnpm rejudgerunsscripts/rejudge.ts, and CI builds the app on every pull request (#50)- Gandhi's case was recorded again on the new Planner and now credits Arleen Lorrance's 1974 book (#44)
- Links point at saidwho.online (#47)
- The home page names saidwho.online as its canonical address (#48)
- Error messages say which key was rejected and what a valid request looks like, and button text stays readable on hover (#49)
- CI pins each GitHub Action to a commit, and Dependabot keeps them updated (#50)
- A trial run finishes inside the function's 300 s limit: it stops starting new work after 180 s, every Nebius call has a time limit, and a Tavily search stops being waited on after 60 s (#51)
- On Vercel the trial stays off until both Supabase variables are set, so the daily budget is shared by every server (#51)
Full Changelog: v0.7.0...v0.8.0
v0.7.0: the home page tells the story, and the Planner names a first source
The home page now tells the whole story in a minute of scrolling, case pages say whether each run got it right, and the Planner searches for a likely first source by name and year.
Changes
- The home page opens with what Said Who? does differently, then a six-step "How it works" strip with each step's Nemotron tier or tool, the eval numbers, and how much cheaper a run was than the same calls at Nemotron 3 Ultra prices (#41)
- Gallery cards say whether the run matches the known answer, the earliest trace names its source when it can, a short legend explains what each agent does, and every page has a header (#42)
- The Planner names a likely first source with a year in one or two of its searches, and searches that only quote the saying again are dropped. On 8 test cases, each judged 5 times, right verdicts went from 18 to 27 of 40 and dates from 16 to 22 of 40, and be-the-change now finds its 1974 source (#43)
scripts/rejudge.tscan replay the Judge with chosen searches or hosts left out, andpnpm eval --cachereuses another checkout's search cache (#43)- CHANGELOG.md lists every release so far (#40)
Full Changelog: v0.6.0...v0.7.0
v0.6.0: second-judge rechecks
When the Judge calls a quote misattributed on the strength of a page that isn't worded like the saying, a second judge now checks whether that page holds the saying or only a related, older idea. The Reader also cites the source a page gives for the snippet's own sentence, not one it gives for a nearby passage.
Changes
- A check in plain code sends such a verdict to a second judge. On the third run's saved evidence, three samples each, fear-itself went from 1 of 3 right to 3 of 3, faster-horses from 0 of 3 to 2 of 3, and good-men-do-nothing from 3 of 3 to 2 of 3 (#38)
- The Reader's cited source is the work the page says the snippet's own sentence first appeared in (#39)
scripts/rejudge.tscan compare with and without the new check, and repeat page readings over several samples (#38, #39)- Hand-drawn illustrations between the README sections (#36)
- The feedback log notes that the Toloka human check was dropped (#37)
Known limit: for "Be the change", with Lorrance's 1974 line in front of it, the Judge still took Gandhi's 1913 passage as the earliest form in 2 of 3 samples (#39).
Full Changelog: v0.5.0...v0.6.0
Tagged after the fact, at the merge commit where this milestone was complete.
v0.5.0: saved runs, visitor limits and the trial access code
Every run is now saved with a link anyone can open, each visitor has a run limit, and the trial budget holds across server instances. The free trial can ask for an access code, and the home page shows a finished case before it asks for anything.
Changes
- When the run log is set up, a run that got as far as planning is saved when it ends and gets a page at
/runs/<id>. Keys and page text are never saved (#19) - Run limits per visitor, and a trial budget counted in the database so every server instance shares it. Visitors are stored as a keyed hash of their address, never the address itself (#27)
TRIAL_ACCESS_CODE: when it's set, a trial run starts only with the code, and a#code=link fills it in (#30)- The home page opens on the Einstein "insanity" case, then the other finished cases, then the form (#33)
- The third eval run, on the v0.4.0 code: 13 of 20 verdicts right on the test set, against 14 of 20 in the first run, and 10 of 10 on the held-out set. One example case recorded again from it (#35)
Full Changelog: v0.4.0...v0.5.0
Tagged after the fact, at the merge commit where this milestone was complete.
v0.4.0: the eval harness and what it showed
Said Who? can now score itself. pnpm eval runs the 20 test quotes and compares each verdict and earliest date with the known answer, and a held-out set of ten quotes gives a second number the agent was never tuned on. The first full run got 14 of 20 verdicts right with the app's mix of models, 14 of 20 with every step on Ultra and 9 of 20 with every step on Lightning (#26). The fixes that run pointed to are in this release too.
Changes
- The eval harness: runs the test set three ways, scores each run, resumes where it stopped, shares one search cache, and can run as a Nebius Serverless AI job (#22)
- The first full eval results, and the ten example cases recorded again from that run (#26)
- A held-out set of ten quotes, and every run log records the commit it ran on (#32)
- The Judge's ids are tidied before they're checked, a verdict that fails the check is never shown, the labels are defined in the prompt, and the earliest date is tied to a confirmed page (#28)
- Search queries are checked in code, and the Checker tests that a snippet is the saying and that its date sits near it on the page (#29)
- The Judge hears about a cited work only when the run read its text, dates that aren't dates are dropped, a second judge looks again when the earliest page cites an older dated source, and the planner moves to Ultra (#34)
scripts/rejudge.tsandpnpm eval --replay-planmeasure changes on saved runs with fewer paid searches (#34)- Rough edges a first-time visitor hits: why the run button is off, focus rings, contrast, share previews, a sitemap and a 404 page (#25)
- The case view: readable verdict text, model names, an "Under way" card during replays, and a timeline that no longer scrolls sideways (#31)
- Local agent notes and settings kept out of git (#24)
Full Changelog: v0.3.0...v0.4.0
Tagged after the fact, at the merge commit where this milestone was complete.
v0.3.0: the Genealogist and the lineage strip
An investigation now goes looking for the older works that pages cite, in digital libraries, and the page shows how the quote got from its first appearance to the version people share.
Changes
- The Genealogist: it takes the works that confirmed pages cite, picks up to three, and searches digital libraries for them (archive.org, Wikisource, Project Gutenberg and others), at most two rounds. What it finds goes through the same readers and checks (#17)
- The lineage strip: the Judge names the page where the quote first appears and each page where its wording, language or credit changed. Each step is checked like the Judge's other claims (#20)
- When a cited work turns up without the saying, the Judge is told, as weak evidence and in a sentence written by code (#23)
- The cost line shows the run's Nebius cost next to the same calls priced at Nemotron 3 Ultra's rates (#18)
- The planner's wordings lose stray brackets and quotation marks (#21)
Full Changelog: v0.2.0...v0.3.0
Tagged after the fact, at the merge commit where this milestone was complete.
v0.2.0: live investigations in the browser
You can now paste a quote into the web page and watch the investigation as it runs: each agent's step, a dated card for every page that carries the quote, and a verdict linked to its evidence. Ten finished cases can be opened and replayed without keys.
Changes
- The pipeline runs through one orchestrator that reports an event for every step, with a stop signal and a spend cap (#6)
POST /api/investigatestreams those events to the browser, on your own keys or on the owner's trial keys (the trial is off by default) (#8)- A failed step gets one more try, on a bigger model or with thinking off (#9)
- The live timeline and verdict page, with a dark mode (#10)
- Ten finished example cases with replays, each shown next to the test set's known answer. Six of the ten agree with it (#11)
- The usual credit is optional. When it's left blank, the planner names who the saying is usually credited to (#14)
- Fixes from the review of the live page: the trial is offered only when the budget covers a run, evidence links work inside bold or italic text, and the progress bar stops pulsing when reduced motion is on (#12)
pnpm installfinishes outside a git repo, which the deploy needed (#13)- Docs brought in line with the app, and the live demo linked (#7, #15)
Full Changelog: v0.1.0...v0.2.0
Tagged after the fact, at the merge commit where this milestone was complete.
v0.1.0: first end-to-end investigation
One command now runs a full investigation for a quote from the test set: a planner, a web search, page readers, a verifier written in plain code, and a judge. Sites that already hold the answer are kept out of the search.
Changes
- The app's base: server settings checked at startup with keys kept out of errors, Nebius and Tavily clients that only use keys passed to them, a rule for whose keys pay for each run, and CI with checks and secret scanning on every push.
- README rewritten for a general audience, plus SECURITY.md (#1)
- Security headers on every page, including a Content Security Policy (#2)
- The eval set: 20 well-known quotes with their earliest known source, checked against the source pages (#3)
pnpm investigate <case-id>runs the first investigation end to end. On its first three cases (insanity, "Gel, gel", "so much owed") it gave the expected verdict each time (#5)
Full Changelog: https://github.com/SelcukOzbilgi/saidwho/commits/v0.1.0