A roadmap is a promise. This is a receipt.

Everything that shipped, dated, the fixes included.

RSS

    • 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 working forever. 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 --prod goes 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 /pricing is public and says $49.

Want to be in it?

Quincy is opening in small groups, in the order people asked.

Join the waitlist