Notes from the night shift
The Night Shift
Dispatches from an independent software studio — what we learn while we build small, useful things, mostly after dark.
Detection
A truck is also a wall
To a person, a box truck crossing an intersection is a bigger vehicle. To a camera, it is a moving wall — a slab that erases whatever sits behind it, so three cars in the next lane simply stop existing for as long as it takes to pass. The detector didn't fail; it reported exactly the light that reached the lens. The quiet, load-bearing discipline in Thyseus is refusing to read that silence as a cleared street: a blocked view is marked unknown, not empty, and filled back in by the second camera that sees around the truck and by the track that remembers the car was there a breath ago.
Read the essay
In this issue
02–56- 02
Engineering
There was no undo
Almost every 'compress your PDF' tool writes the smaller file back over the one you fed it, and it does this at the exact moment you can least afford it: the twenty minutes before a deadline, when the file that's over the limit is also the only good copy you have. One click later the master is gone and the diminished version is wearing its name. Preflight refuses to work that way. It never touches the file you picked — it builds the optimized copy off to the side, verifies it, and lands it under a new name with an atomic rename, so the original stays bit-for-bit intact and the undo is always the file you started with.
6 min read - 03
Engineering
Nowhere to send it
Most journaling apps put a sync button in settings, and the moment you write something down a copy of it leaves your hand — up a cell tower, into a server you'll never see, forked into a backup and an analytics event and a row in someone's database. Orbit doesn't have that button. We built the journal to stay on the glass in your palm, which means the most private thing you record has no journey to take and no elsewhere to leak from. The cost of that decision is real, and we paid it on purpose.
6 min read - 04
Research
The pilot you never ran
Every research plan has a pilot in it — a first pass where you find out your questions don't work the way you hoped. The catch is that in classic research the pilot is invisible: it's your first three real interviews, run at full price, and the wording you fix afterward can never be asked of the people who already answered the broken version. AI participants make the pilot a thing you can actually run — cheaply, repeatedly, before a single human hour is spent — so the instrument that reaches your real users is one you've already debugged.
6 min read - 05
Design
A guess wearing a number
Orbit lets you keep a second profile — not for another account, but for someone you care about: a partner, a kid, an aging parent. You log an entry for them after dinner — low, 2 out of 5 — and it looks exactly like the one you logged for yourself an hour earlier. But you didn't feel theirs. You inferred it from a quiet table and a barely-touched plate. A self-report and an observation are two different kinds of fact, and a mark that renders them identically quietly lets a guess read as a measurement. The design work is keeping the two honest — so a chart of someone you love never hardens into a case file.
6 min read - 06
Design
You won't remember why
Three weeks from now you tap an old entry — Thursday, low, 4 out of 5 — and it tells you nothing. The record is honest and useless, because when you logged it the reason was so obvious you didn't think to write it down, and now the reason is gone. The quiet design work in Orbit isn't the mood picker; it's the cheap context saved beside it — where you were, how long since you'd eaten, what the weather was doing — the handful of ordinary facts that turn a number you can't read into a moment you can. Not a diagnosis. A jog to memory, captured before it evaporates.
6 min read - 07
Engineering
The page grew, you didn't move
You're a third of the way down the front page, thumb settling over a headline, when the wall changes and three new stories break in at the top. In a reader that just redraws the page, the column grows above you and everything you were reading slides down — your thumb comes down on a headline that wasn't there a second ago. The refresh did exactly its job and stole your place. The quiet, load-bearing trick in DReader is scroll anchoring: before the new stories land, note where the line under your thumb is; after they land, put it back. New goes in above the fold and waits behind a small count; the line you were reading never moves a pixel.
7 min read - 08
Detection
One car, thirty boxes
A traffic camera doesn't send you a car. It sends you thirty frames a second, and the detector draws a box on every one, so a single vehicle crossing an intersection arrives as a fast burst of nearly-identical boxes. A map that pins each box believes in a traffic jam that isn't there. The quiet, load-bearing work in Thyseus is association across time — deciding the box in this frame is the box from the last one, one step on — which collapses the count to one and, as a gift, hands you the heading and speed no single box could carry.
7 min read - 09
Engineering
The win that wouldn't hold still
You shipped on Monday, opened the dashboard by lunch, and the sign-up line was up. By Friday it had drifted back to nothing. Nobody touched the code in between — so which read was true? Both were, of the data they had. The early number sat inside an interval wide enough to hold a triumph and a dud at once, and every day of data narrowed that interval a little. This is the peeking problem, and it's why code-results makes you name the window before you ship, then reads it once, when it closes.
7 min read - 10
Engineering
Every page brings its own ruler
You designed the whole thing on US Letter, so you think of the file as a Letter document. But a PDF has no single size — every page carries its own dimensions, and a submission gate measures all of them, not the one you're looking at. The page that fails is almost always one you never opened: an A4 export the template slipped in, a landscape exhibit, a scan at some odd millimetre. It looked uniform because page one was, and page one is what you saw. Preflight measures the file the way the gate does — every page's box, against the exact size required — names the outlier down to the millimetre, and, if the file is yours, fits it back to size without ever touching the original.
6 min read - 11
Engineering
The page that never rings
A push notification is a favor the source does you: it rings the moment something changes so you never have to keep asking. The Drudge Report does no such favor — no push, no webhook, no 'since' cursor, nothing that will ever call DReader to say the wall just changed. So DReader has to knock. Knock too often and you're a nuisance on a page you don't own, and the news is barely fresher for it; knock too rarely and you're serving yesterday on a day that turned over an hour ago. The way out isn't a cleverer fixed number — it's letting the page set the pace: the same flurry of edits that makes the news worth refreshing is the page telling you to knock more often, and a quiet hour is it telling you to leave it alone.
6 min read - 12
Engineering
The font that didn't travel
A PDF is supposed to look the same everywhere — but that promise only holds if the fonts ride inside the file. When a typeface isn't embedded, the reader's machine substitutes its nearest guess, and the substitute is almost never the same width. The text reflows, a line runs long, a paragraph spills onto a page that wasn't there, and the layout you approved arrives subtly broken. It looked right on your Mac because your Mac had the font. Preflight is built to catch the letters that stayed home — it reads the font dictionary, names every face that isn't embedded, and, if the file is yours, welds them in before it flies.
6 min read - 13
Research
The answers didn't match. The meanings did.
Ask a hundred people an open question and you get a hundred answers, no two worded the same. The naive way to make sense of them is to count words — group the ones that say 'slow', the ones that say 'expensive' — but people almost never reach for the same word for the same feeling, so keyword counting finds a dozen tiny piles and misses the four real themes hiding under the phrasing. The fix is to stop matching words and start placing meanings: put each answer where its sense sits, not where its vocabulary does, and let the groups appear on their own. This is the quiet engine under AI User Interviews' synthesis — the step that turns a pile of transcripts into a short list of findings you can act on.
6 min read - 14
Engineering
You shipped at the bottom
Sign-ups had their worst week in months, so you shipped a fix. The next week recovered, and the room gave the fix the credit. But the worst week was, by definition, the point the number was most likely to bounce back from — the recovery was loaded into the timing before your code ever ran. This is regression to the mean, the quietest way a deploy takes credit for a rebound it had nothing to do with, and the only thing that can tell the fix apart from the bounce is a control that got no fix and recovered anyway.
6 min read - 15
Research
The question before the question
Ask someone how satisfied they are and you'll get one number. Ask them to describe a recent frustration first, then ask the same satisfaction question, and the number drops — not because anything about the product changed, but because the question before it changed what 'satisfied' now means. Order effects are one of the oldest, best-documented traps in survey research, and the reason they stay invisible is simple: a study that runs one fixed order has nothing to compare its answer against. AI User Interviews can afford to run the same interview in several orders at once, which turns the bias from an unseen constant into a number you can measure — and subtract.
6 min read - 16
Engineering
The camera moved, the world didn't
The simplest way to find motion in a video is to subtract one frame from the next: whatever changed, moved. It works beautifully until the camera itself moves — a traffic cam pans, a webcam gets bumped, wind leans a pole — and then everything changed, so by that logic everything moved. The whole frame lights up and the one car actually crossing the intersection is lost in a field of false alarms. Thyseus reads public cameras it doesn't control and can't hold still, so before it can trust that something moved, it has to work out how much of the change was the world and how much was the lens. The fix is to measure the camera's own motion first, cancel it, and only then ask what's left.
6 min read - 17
Design
The front page was a map. The phone made it a line.
The Drudge Report is a wall, not a stream — three columns and a siren, where an editor says what matters by where he puts it and how big he sets it. Position is the ranking. A phone can't hold three columns, so a mobile mirror has to flatten that two-dimensional map into a single one-dimensional scroll — and the obvious way to flatten it, column by column, buries the lead under a stack of also-rans. DReader flattens along the other axis: it reads the arrangement the way the editor built it and lays it back out in the order he ranked it, so the story he set biggest is still the first thing your thumb meets. The wall becomes a line without becoming a different front page.
6 min read - 18
Engineering
The page you didn't count
The portal says 'no more than ten pages,' and yours comes back rejected at twelve — even though you wrote exactly ten. A page limit isn't a byte limit: there's no slider that squeezes twelve pages down to ten, and the pages that put you over are almost always ones you never tallied — a cover sheet the template prepended, a signature page a tool appended, a blank verso your export left behind. Preflight counts the file the way the gate does, before the gate does: it reads the real page count, tells you exactly how many over you are, marks the blank pages that are safe to drop, and never touches the original — so the page you didn't count doesn't cost you the whole submission.
6 min read - 19
Engineering
Up in total, down in every part
You ship a change, and conversion climbs nine percent. Then someone splits the number by cohort and finds the truth: new users converted worse, returning users converted worse, every segment converted worse. The total rose anyway — because the release quietly changed who showed up, not how well the product worked. It's Simpson's paradox, and it's the trap a single headline metric is built to walk you into. code-results reads the number the only way that can't lie to you: split, and weighted by the mix that actually moved.
6 min read - 20
Engineering
The lock nobody set
You never typed a password, but the submission portal calls your PDF 'secured' and turns it away. The lock was there before you touched the file — set by a scanner, an export preset, or a download you forgot was protected — and it lives in a dictionary your reader honors silently, so the file opens fine and looks done while quietly refusing to be read by anything automatic. Preflight reads that dictionary before the gate does: it names the lock, tells you exactly what it forbids, and — if the file is yours — hands you a clean copy while leaving the original untouched.
6 min read - 21
Detection
The dial only moves the mistake
A detector doesn't just say 'car' — it says 'car, 0.62,' and then you get one knob: keep everything scored above some line. Turn it down and the map fills with ghosts; turn it up and real cars vanish with them. Because a faint car scores exactly where a bold ghost does, no setting of that knob is clean. The threshold never removes the error. It only chooses which kind you'd rather have — and why Thyseus stops trying to win that argument with the dial.
6 min read - 22
Research
The middle never booked
Classic user research hears from whoever agrees to a call, and the people who agree are almost never a cross-section — they're the two loud ends: the fans who want to gush and the furious who want to vent. The quiet middle, the users for whom the product mostly just works, has no reason to give up an afternoon for a stranger's questions, so they don't. A sample built entirely from the willing reads as two camps with nothing between them — but that shape isn't your users, it's your recruiting. AI User Interviews drops the cost of answering to near zero, so the middle can finally answer without booking anything, and the two camps turn back into the tails of a distribution whose real mass was the people you were never hearing from.
6 min read - 23
Engineering
Smaller, not better
Every compressor you've ever used returns a smaller file, and smaller feels like success — so nobody checks what the bytes came off of. They come off the parts that made it a document: the selectable text flattened to a picture, the crisp vectors rasterized, the trim box nudged a hair. You find out at the far end, when someone can't select a word or the print shop finds the page moved. Preflight treats a pass that breaks one of those seals as a failure, not a win. If it can't hit the target while keeping the text selectable, the geometry exact, and the result independently verifiable, it refuses — and hands you back your untouched original instead of a smaller file that's quietly ruined.
6 min read - 24
Engineering
Two changes, one window
Ship one thing on a quiet afternoon and the number that moves after it is yours to read. Ship two things twenty minutes apart and the lift has no owner — it belongs to both changes and neither, and any clean split you draw between them is a number you made up. The honest move isn't to guess which deploy earned the win. It's to notice that, for now, the question can't be answered — and to say so out loud instead of picking a winner.
6 min read - 25
Engineering
The headline changes, the link doesn't
Look at the Drudge Report at nine, then again at nine-forty, and the whole wall looks new. Most of it isn't. The same stories get reworded, resized, and shuffled through the day, and the page never tells you which lines are genuinely new and which just changed clothes. The trick to reading it the way a person wishes they could is knowing that the headline is a costume and the link underneath it is the name — so that's what DReader diffs.
6 min read - 26
Engineering
Select all, select nothing
Two PDFs sit side by side on your screen, pixel for pixel identical. One is a real document; the other is a photograph of one. You can't tell them apart by looking — until you press Cmd+A and one of them selects nothing at all. That gap between what a page looks like and what's actually under it is where filings get bounced, citations go missing, and a finished document quietly fails a requirement no one showed you. Preflight reads the layer, not the picture.
6 min read - 27
Engineering
The form doesn't round
You finish the document, you go to submit it, and a box you never think about turns you away: the file is 5.31 MB and the limit is 5.00. All the work is done and the last obstacle is arithmetic. The reason it stings is that the upload form deals in exact bytes while every tool you reach for deals in vibes — 'compress,' 'reduce size,' a hopeful slider. Preflight is built to close that gap: it measures the file against the exact ceiling, builds a copy that provably fits, and never once touches the original.
6 min read - 28
Philosophy
Seen, not identified
A map built from public cameras runs straight at a line most surveillance quietly crosses: the difference between knowing something is there and knowing who it is. Thyseus is built to stop on the near side of that line on purpose. It counts the car and places the person, and it never learns a face or a plate — not because it can't reach them, but because the reach is exactly the thing we designed out. The blind spot is the feature.
6 min read - 29
Engineering
The change that moved nothing
Ship a change, watch the metric, and sometimes the line just… doesn't move. Most tools treat that as a non-event — no green arrow, nothing to celebrate, nothing to file. But a confirmed 'no effect' is a real result, and burying it is how a team pays twice: once to build the thing, and again to relearn that it did nothing. code-results stamps the flat line as a finding, not a gap.
6 min read - 30
Research
The clean answer was the wrong one
Ask 'so that was frustrating, right?' and nine people out of ten will agree, and you'll walk away with a tidy, confident number that measures nothing but the shape of your own question. A leading follow-up doesn't read the room — it moves it. The honest answer is messier, lower, and true, and the whole discipline of an AI interviewer is asking the question that lets it stand.
6 min read - 31
Engineering
You can't map what no one is watching
A map stitched from strangers' browser tabs covers exactly the ground someone happens to be pointing a tab at — and nothing else. The tempting bug is to smooth over the gaps, to let a quiet block read as a clear one. Thyseus does the opposite: it draws its blind spots as blind spots, because a dark square that means 'unwatched' is honest and a dark square that means 'clear' is a lie the map can't back up.
6 min read - 32
Detection
One thing, seen twice
A live map built from overlapping public cameras has a problem nobody warns you about: the same car lands in two frames, and a map that just draws what it's told shows two vehicles where there's one. Worse, it double-counts loudest exactly where the street is busiest. The quiet, load-bearing half of Thyseus isn't spotting the car — it's deciding that two detections are one thing, and merging them before the map ever counts.
6 min read - 33
Research
The script was never the interview
A survey asks its questions and stops. An interview hears the answer and asks the one nobody wrote down — why? — and keeps asking until the reason underneath stops moving. The finding almost never lives in the scripted answer; it lives two or three follow-ups down, in the part that never scaled because a person asking for the hundredth time can't. AI User Interviews is built so the improvised part is the part that scales.
6 min read - 34
Engineering
A door, not a room
Almost every content app is a room — furniture arranged to keep you sitting in it, measured by how long you stay. The Drudge Report is the opposite: an index whose entire purpose is to send you somewhere else. So DReader's real product was never the page you look at. It's the round trip — out to the story fast, and back to the exact spot you left, so the next headline is one tap away.
6 min read - 35
Engineering
The number you weren't watching
A change is a trade, not a gift. You ship to move one metric, you watch that metric, it moves, and you call it a win — while the number you never instrumented quietly moves the other way. The bill goes unread because it was never on the screen. code-results reads every deploy against the whole handful a business would notice, so the win and the cost arrive together, on the same board.
6 min read - 36
Research
No one lives at the average
Talk to six users and you'll be tempted to average them into one tidy 'typical' person — and build for them. Talk to a hundred and the average dissolves: two real groups appear with an empty valley between, and the mean turns out to describe someone who doesn't exist. The distribution was the finding all along. AI User Interviews is built so you can afford to see it.
6 min read - 37
Engineering
The map is always a little late
A live map reads like a snapshot of one instant. Thyseus's never is — it's stitched from strangers' browser tabs, each on its own delayed clock, reporting what they saw seconds apart and out of order. The honest half of a live map isn't drawing the dots; it's manufacturing a *now* out of many moments, and admitting the picture is always a little bit in the past.
6 min read - 38
Engineering
The result has a half-life
The answer to 'did it work?' isn't worth the same on Monday as it is three weeks later. Not because the number changes — because you do. The reason you shipped, the alternatives you weighed, the file you were nervous about: all of it decays out of memory on a curve. A verdict that arrives after the why is gone is a fact you can't act on. code-results is built to catch the answer while the reason is still lit.
6 min read - 39
Engineering
The size was the story
The Drudge Report says what matters not in its words but in its type — one headline set enormous, another flashed red, the rest filed small. That ranking is the editor's whole opinion, and it's the first thing a feed reader throws away. DReader's real job isn't fetching the links. It's carrying the emphasis across.
6 min read - 40
Engineering
A pixel is not a place
A detector can tell you there's a car in the frame and draw a tidy box around it. That box is a claim about pixels, not about the world — column 412, row 380 is not a street corner. The interesting half of Thyseus is the geometry that turns a spot in a camera frame into a coordinate on a map, and why we run it in the same browser tab that saw the car.
6 min read - 41
Research
The interviewer was the variable
Two people answer the same research question differently, and everyone reads it as a finding. But a human interviewer never actually asks the same question twice — the wording drifts, the tone leads, the tenth session is wearier than the first. AI User Interviews holds the one instrument nobody thought to control still, so the variation that's left is the respondent's, not the asking's.
5 min read - 42
Engineering
The news was the lightest thing on the page
A modern news page makes you download a few megabytes to read a paragraph of headlines. The words — the thing you actually came for — are a rounding error in the bytes. DReader is what's left when you ship only the rounding error, and why that isn't a diet you can apply to the heavy page but a different object entirely.
5 min read - 43
Research
Enough is a shape you can see
Every research plan quietly dodges the same question: how many interviews is enough? The honest answer — keep going until you stop hearing new things — was useless for decades, because nobody could afford to run that far. AI User Interviews turns saturation from a hunch you defend into a shape you watch arrive.
5 min read - 44
Engineering
The number moved. Was it you?
Sign-ups are up since you shipped. That feels like a win — but 'up' is a level, and a level is the one thing that can't tell you whether your change did anything. The real question is whether the line broke where your deploy landed, and that's a question of alignment, not analytics.
5 min read - 45
Engineering
The map has to agree with itself
A live map drawn by strangers' laptops has an obvious problem: why trust any single detection? A cheap model watching a rainy feed will call a truck a bus. Thyseus doesn't answer that by building a better observer. It answers it the way a newsroom does — by corroboration — and turning agreement into confidence is the part that makes the map real.
6 min read - 46
Process
What happens when you can afford to ask
Drop the cost of a user interview far enough and you don't just get more interviews — you get a different thing entirely. Research stops being an event you schedule and becomes an instrument you leave running. That shift, not the raw count, is what AI User Interviews is really for.
5 min read - 47
Engineering
There is no feed. There never was.
The Drudge Report has no RSS, no API, no app, and no intention of adding any. It is hand-edited HTML that changes dozens of times a day. DReader has to read it the way a person does — by looking at the page — and that constraint, not the styling, is the whole engineering problem.
5 min read - 48
Design
The bottleneck was never the questions
Teams don't run too few user interviews because they've run out of things to ask. They run too few because every interview has to be scheduled, sat through, and written up by a person — and that cost, not curiosity, is what caps the research. AI User Interviews is built to move the cap.
5 min read - 49
Engineering
The map is made of open tabs
Thyseus combines public camera feeds with object detection in volunteers' browsers. Each tab processes video locally and sends detections to a shared map.
3 min read - 50
Engineering
You shipped it. Did it work?
code-results puts deploys alongside business metrics so the team that shipped a change can see what happened afterward, with a clear distinction between correlation and causation.
3 min read - 51
Guides
Gantt chart, kanban board, or to-do list?
Use a Gantt chart to coordinate deadlines and dependencies, a kanban board to track ongoing work, and a to-do list for independent tasks. Here's how to choose or combine them.
3 min read - 52
Guides
How to turn a plain-English plan into a Gantt chart
Write down the tasks, durations, dependencies, and milestones, then turn them into a Gantt chart. This guide covers the process and three ways to make the chart.
4 min read - 53
Studio
In defense of small software
A timeline shouldn't require a project-management suite. Here's why we keep our products small, and what that costs us to maintain.
2 min read - 54
Engineering
The fastest page is the one that's already there
Our homepage hid its headline until a 312KB JavaScript bundle ran. We removed the bundle and made the page visible by default, with CSS and small inline scripts handling the motion.
3 min read - 55
Design
The ten minutes before the meeting
We designed ganttchart.ai for someone who needs a project timeline before a meeting starts. That time limit shaped the input, editing, and sharing.
2 min read - 56
Studio
Why we only build what we run
We operate every product we build. That makes maintenance our problem from the first design decision, and keeps us close to the people using the software.
2 min read
New dispatches go to press whenever the trolls learn something worth writing down. Prefer definitions to essays? Try the plain-English glossary.