A roadmap is a promise. This is a receipt.
Everything that shipped, dated, the fixes included.
Trend Alerts had promised a live topic since the catalogue shipped
It runs now, and it reads where reading is free. X removed its free tier in February, and a trend scan is only useful broad — broad on X is roughly 300 posts a day, about $45 a month against a $49 plan, which is the one rhythm whose arithmetic simply refuses. Hacker News needs no key at all and is earlier, which is what the promise was actually about; public GitHub search is free too.
It leaves angles rather than an alert. A notification about somebody else's news is a thing to feel behind on; an angle is a thing to write, and the decision stays yours.
Most mornings it keeps nothing, and the card says which bar they failed
Reading fifty loud topics and publishing none of them is the correct outcome on an ordinary Tuesday. "Read 41 topics, none you have standing on" is what a working rhythm looks like, and a run of quiet days should read that way rather than as something broken. Nothing is judged twice: a story already turned into an angle is never shown to the model again.
A merge is an event, and the writer was never told what happened
Twelve angles off four merged pull requests had produced no draft, and the owner had pasted his own note about one of them instead. The hooks were about the implementation; his post was about what he did and what came of it.
Quincy now pulls three quotes out of a merge — what you did, what happened, what it meant — and the writing is composed with you as the subject rather than the code. The repository's own description, homepage and topics come along, so a post is no longer written by something that does not know what the software is. The pull request body also stops being read as a transcript of somebody talking, and tables, images and links survive the flattener, which is where the measured number usually lives.
The same merge that used to produce "The first background job in the product is not a cron" now produces "I replaced a cron-shaped voice-note workflow with a background job that starts when somebody presses stop."
Every draft was told to copy its own last draft and avoid your real posts
Two lists were handed to the writer in the wrong order, one line of destructuring apart. "This is how you write, match it" arrived holding Quincy's own previous drafts, and "these already went out, do not repeat them" arrived holding the posts you actually published. So every draft this product has ever written imitated itself and steered around you. Nothing in the output showed it: the writing came back fluent, on length and plausible, just not in anybody's voice.
The writer got a 208-character summary of the 1,686 words you wrote
A rule written to stop a stranger's post being laundered into your own was firing on your own pull requests too, so the writer was handed a summary instead of the description you spent the afternoon on. Told to prefer the specific detail and given none, it wrote the general version.
The Ask field on a riff had been drawn and never connected
A labelled input and an Ask button have sat under every riff since the page shipped, and the entire submit handler was a line that cancelled the event. "More like the numbers, less product-speak" now reaches a real prompt, so a riff can be steered instead of taken as offered or thrown away.
Approving writing meant inventing a weekly commitment for one post
Approving places a post only if its channel has a free slot, so a new account could approve something and be told, correctly and unhelpfully, that it has nowhere to go. Post now publishes one approved version on the spot. It is still you sending: nothing runs on its own, and the confirmation is the second one in the product, because there is no unsend.
Connecting a channel now writes the rhythm it implies
Connecting is the moment you say "publish here", so it is the moment two real slots appear — Tuesday and Thursday at 08:00, visible on the lineup and removable in one press. Only ever on a channel with none, so reconnecting changes nothing.
A post that had already gone out still read as "going out today"
The lineup set that line from any scheduled row whatever its state, so a post published at 09:12 and a post the platform refused both read as though they were still coming. Sent now means sent, and a refusal renders in the platform's own words.
Quincy said it could see the account, not that it had read nothing of it
Asked whether it could see your past posts, Quincy answered that it had access to the connected X account and stopped there. True, and useless: it had read none of it, and one button on /sources would have changed that. It now says how much of the corpus it holds, and where the button is. It also stopped writing the handle as
@@CodeHagen.Luna at low effort, and the reason is measured rather than argued
Three models were run on the same task with the same material. The cheapest was also the fastest and wrote the sharpest hooks; the dearest cost 25x for output that was not better. Reasoning effort is now set at every call site instead of none of them.
A cheap model needs its price in the table before it needs a deploy
The price table held one model and everything else fell through to the dearest one. That table is not decoration — it is what the daily spend ceiling enforces, so a $10 day would have stopped at about thirty cents of real spend. Chat and drafting also stop sharing one setting, so going cheap on the conversation no longer goes cheap on what you publish.
A capture that gets killed now leaves nothing instead of a corpse
The first capture from the chat ran four model calls in one turn and was cut off at sixty seconds, leaving a riff that said
workingforever. The budget goes to 120 seconds, and the angles are now asked for before the row is written, so a kill leaves nothing behind rather than something stranded.The chat can put material on the desk, not only read it
You paste a script into the Studio and Quincy could only describe the desk, never put anything on it — so it offered to write the post inside the conversation, where it can never be approved or published. Pasted material now enters through the same door as everything else.
The desk offered a scrap Quincy had lost 42 hours earlier
The riff card had been honest about a stalled scrap for a while: past four minutes it says Quincy may have lost this one. The Studio greeting and the chat had not caught up, so both were offering to draft from material no angle was ever coming for.
Nobody but one laptop could install this repository
An animation inspector nothing in the product uses came from a private registry, so every contributor cloning the public repo hit the same 401 that CI did. It is optional now, and the code that loads it disappears when the package is absent.
The chat can finally read the tables the pages read
The README calls the chat the primary interface, and it was the one surface that could not name a single riff. It now reads riffs, angles, drafts, the lineup, channels and sources, and can draft an angle through the same action the button uses. Nothing in it approves, schedules or publishes.
Somebody hears about it when the scheduled work stops
A cron that fails quietly is the expensive one: approved posts sit queued until the window closes and are marked missed, and missed is terminal. All four jobs now send an email when they fail, at most one per job per hour.
The cutting room gets the ceilings the chat already had
A captured timezone takes effect on the next render
Anyone who signed up with Google had their zone read on the first visit and written straight to the row, which the signed session cookie did not know about. A Norwegian met the product with every scheduled post two hours out, on the one visit where it is explaining itself.
The editor says when the draft is your own hook
When drafting fails, the angle's hook is written into the body on purpose, so there is a line to work from rather than an error. /riffs said so and /drafts did not, so an 89-character hook sat in the editor looking like writing. The notice clears itself on the first keystroke.
A model that says nothing gets the second attempt it was promised
The sweep stops between posts, not inside one
Four high advisories leave, and the CLI stops shipping
The component CLI sat in dependencies, so a tool nobody imports was carried into every deploy along with its advisories.
pnpm audit --prodgoes from 13 to 1, and the one left exposes a development server nothing here starts.The deploy log says what this Quincy can do
Every optional variable already degrades honestly — Google hides a button, Stripe hides Subscribe — and none of it was visible to the person who just deployed. Boot now prints three required variables and nine capabilities, and for each one that is off, the consequence rather than the variable name.
Every mutating script now asks who it is about to touch
Two doors that led nowhere, and one that led too far
/wiki redirected to a route that had been deleted, so the one link whose job is to prevent a 404 was answering with one. The prototypes shipped to production behind a cookie check; preview keeps them and production answers 404.
The fixtures go, now that the tables can answer
Every push now answers to typecheck, lint and tests
The lint baseline reached zero first, because a gate that starts with known failures on it cannot be honest about new ones.
The activity graph comes alive
Quincy goes open source
The whole repository is public: the product, the plans it was built from, and the reasoning in the commits.
Both exits from first run wrote the flag and bounced you back
Every link on the first-run screen was a silent no-op
The backup script would have overwritten the backup
The first question arrived with no idea who was asking
Wiping an account to test first run was a one-way door
A verified account landed in an app that knew nothing about it
The privacy policy was public with its placeholders still in it
The card defined "Short post" and never said it writes two posts
The flattener was not a fixed point, and a backfill ran twice
A pull request description is markdown, and the card read it aloud
Brass was on every button, so nothing could mean live
Our accent colour meant two things at once: press this, and this is running. So it meant neither. The primary fill went to a neutral extreme and brass stayed only as a dot, a label, a chart mark and the text selection.
The demo fixture said GitHub was connected, so nobody could connect it
The pull request you merged, read for the part worth publishing
The price was in Stripe, and nowhere a stranger could read it
The trial is 24 hours and starts at verification, so a visitor who wanted to know the price had to spend part of the thing they were evaluating to find out. Now
/pricingis public and says $49.
Want to be in it?
Quincy is opening in small groups, in the order people asked.
Join the waitlist