<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stalefish Labs</title>
    <description>The latest articles on DEV Community by Stalefish Labs (@stalefishlabs).</description>
    <link>https://dev.to/stalefishlabs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3804354%2F33f3ff10-d356-4d75-826e-d7c1cc83e41a.png</url>
      <title>DEV Community: Stalefish Labs</title>
      <link>https://dev.to/stalefishlabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stalefishlabs"/>
    <language>en</language>
    <item>
      <title>The Walls Don't Talk: How Stalefish Builds</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Fri, 04 Sep 2026 14:00:47 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/the-walls-dont-talk-how-stalefish-builds-4jjm</link>
      <guid>https://dev.to/stalefishlabs/the-walls-dont-talk-how-stalefish-builds-4jjm</guid>
      <description>&lt;p&gt;The line came out of an essay about the app Cairn, at the end of a paragraph about visual restraint, and it was meant to stay there. &lt;em&gt;The walls don't talk.&lt;/em&gt; Cairn is a room; you walk through it and notice what's there, and the walls carry color and texture and they don't address you. I wrote it to describe one app. Then I looked at the other things the studio has built and found it describing all of them.&lt;/p&gt;

&lt;p&gt;So this piece is the moment of noticing the shape. Four principles run underneath everything Stalefish makes. None of them came from a manifesto. They surfaced one product at a time, one problem at a time, and they turned out to agree with each other before anyone set out to name them. Naming them is the whole job here. Classification without interpretation. Ambient over declarative. Names that don't narrate. AI scaffolds, doesn't address. And it's all effectively part of a philosophy I didn't fully realize I had adopted until after it had formed: &lt;a href="https://michaelmorrison.com/essays/the-anti-engagement-product/" rel="noopener noreferrer"&gt;anti-engagement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Three of the four principles came out of building &lt;a href="https://dev.to/use/cairn/"&gt;Cairn&lt;/a&gt;, a self-tracking app that hasn't shipped yet. Cairn's metaphor is markers along a trail, where the trail is your daily life and the markers are things you want to track: you stack a small stone for each thing you did or that happened to you on a given day, a run or a migraine or an hour of music practice, and over weeks the pile of them shows you the shape of your time. That's the whole app. It never tells you what the shape means. The fourth principle came from &lt;a href="https://dev.to/use/sojourn/"&gt;Sojourn&lt;/a&gt;, the bedtime-story app I'm building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classification without interpretation
&lt;/h2&gt;

&lt;p&gt;Cairn lets you mark a behavior as something you're cultivating, something you're watching in yourself, or something that just happens to you. Then it stops. The idea is that simply noticing something can be very powerful, leaving you to form your own opinions on what it means. So the app stores the kind of thing that happened and does nothing else with it: no watch badge, no nudge, no Sunday-night summary announcing that you watched your drinking four times this week. The kind organizes the register. You bring the meaning.&lt;/p&gt;

&lt;p&gt;That refusal generalizes. Every Stalefish product hands you a structure for organizing your own experience and then declines to perform the interpretation the structure makes available. The structure is real. What it means is yours.&lt;/p&gt;

&lt;p&gt;Most apps that involve habits run this the other way around. They categorize your behavior so the software has something to tell you about it. Cairn categorizes so you have something to think about. On paper the categorization and the judgment are hard to tell apart. On the screen they have nothing in common.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ambient over declarative
&lt;/h2&gt;

&lt;p&gt;This is the principle that named the piece. I was trying to model continuous state — travel, injury, a window of time that colors the discrete happenings inside it. Not things you log once, but conditions you live through, which explain why a stretch of data looks the way it does. I needed to know that my bike rides and skate sessions were lagging during a certain period because I was rehabbing a knee injury. I'd spent years failing to encode that as tags, because a physical therapy tag is a discrete event and a knee injury is a shape the events sit inside, or in some cases an explanation for events that are notably missing. For example, I haven't graduated in skill or seriousness to carrying a bass guitar on a trip, so travel is a good indicator as to why I didn't practice during a certain period.&lt;/p&gt;

&lt;p&gt;Cairn got a new primitive, and it arrived wearing three layers of deliberately quiet treatment: a thin colored band, a soft background tint, a small capsule chip. Each was tuned so you could ignore the overlay completely and the app still made sense. Ambient visuals set information in front of the eye and let it decide whether to look. Declarative visuals — the badge, the banner, the count, the "you have three new" card — are built to be looked at, which means something is doing the showing. The Citizen's Daily Brief had already made a version of this call by &lt;a href="https://dev.to/read/deliberately-boring-by-design/"&gt;refusing every modern app pattern on purpose&lt;/a&gt;; Cairn arrived at the same place from a different direction.&lt;/p&gt;

&lt;p&gt;Someone talking at you. That is the thing these products try not to have. The app is the room, you are the person walking through it, and the walls can be painted and lit and patterned without any of it turning to face you. They don't talk. They just are.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/speaker-in-the-room.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/speaker-in-the-room.png" title="Same room, two manners. The wall on the left is carrying information; the one on the right has decided you need to hear about it." alt="Two halves of the same corridor. On the left a man walks past a plain wall with a green band along the baseboard, unbothered, not breaking stride. On the right, a uniformed attendant has stepped into another man's path holding a blank placard at eye level while two more attendants close in behind, and the man leans back with both hands raised" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Names that don't narrate
&lt;/h2&gt;

&lt;p&gt;The first word I reached for, adding a multi-day primitive to Cairn, was "chapter." It felt warm and literary and completely wrong: a chapter implies a narrator and a reading order, and Cairn grants itself neither. The word I kept was already sitting inside the trail metaphor. Terrain. Observational, geological, indifferent; it carries what the data model actually does and never once suggests the app is writing the story of you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/terrain-under-the-stones.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/terrain-under-the-stones.png" title="The stones don't change. The ground under them does, and that's the whole primitive." alt="A trail winding across a landscape with small stacked stone cairns standing along it at intervals. The ground changes character as the trail crosses the frame — pale dry sand, then green meadow, then dark forest, then rocky scree — while the stone stacks on top of it stay the same" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Names are the edges of a concept. A literary word inside a tool that has decided against being literature changes what you expect from it, and expectation is most of what a product is eventually allowed to become. So the vocabulary stays flat on purpose. Evocative language is the native tongue of marketing, which wants you to feel one specific thing; Stalefish words leave you to feel whatever you actually feel.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI scaffolds, doesn't address
&lt;/h2&gt;

&lt;p&gt;The fourth principle is the load-bearing one, and it came from the bedtime story app Sojourn. Sojourn's whole architecture rests on a single refusal: the AI underneath never addresses anyone. It scaffolds a bedtime story that was conceived of and ultimately edited by people (me!), and a person reads that story aloud to another person. The voice in the dark is the voice of someone you love. The model does the branching, the memory, the organization of beats — and it does all of it from behind the scenes, where the reader never meets it. &lt;em&gt;My Name Is Inigo Montoya&lt;/em&gt; is the deep version of this argument.&lt;/p&gt;

&lt;p&gt;Generalized, it reads: AI is the scaffold, and never the surface. The relationship a Stalefish product puts in front of you is with another person, or with your own organized experience (in Cairn you are your own analyst), and the software stays in the substrate holding that relationship up. The Citizen's Daily Brief runs the same arrangement in a third register — there, &lt;a href="https://dev.to/read/when-the-llm-isnt-the-product/"&gt;the model is infrastructure and the format is the product&lt;/a&gt;, closer to a database or a cron job than to anything you'd talk to. The defining AI product of this era does the reverse. The model talks to you directly: ChatGPT, Claude, Replika, character.ai, the voice assistants, the whole companion category. Those are good products for what they are. Stalefish is building the inverse class. That's the sharpest expression of the stance, though not its origin — the other three principles were already in place before a model was involved in anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the four add up to
&lt;/h2&gt;

&lt;p&gt;Read together they describe one stance, and it is not a stance about AI. Three of the four have nothing to do with models. Cairn contains no AI whatsoever, and it needs classification without interpretation, ambient over declarative, and names that don't narrate as much as anything in the portfolio — more, probably, since a self-tracking app is the one most tempted to explain you to yourself.&lt;/p&gt;

&lt;p&gt;What the four are actually about is software that wants something from you. A habit tracker interprets, so you come back to see what it noticed. A feed declares, so you always have something to react to. A year-in-review narrates, so you become the subject of a story it is telling about you. Those three moves are decades old and needed no model to invent them. The fourth is what this era added: the software addresses you directly, in the second person, so the pull is toward the thing itself. Stalefish products decline all four. What is left after the subtraction is a tool that scaffolds your attention without laying claim to it, and that leaves you holding an artifact on your own terms. The four principles are what anti-engagement looks like from inside the workshop. The most literal version I've shipped is the Brief, which &lt;a href="https://dev.to/read/no-login-required/"&gt;asks for no login and charges for nothing&lt;/a&gt; — there is no account to come back to, which is the point.&lt;/p&gt;

&lt;p&gt;None of this is a moral position. It's structural. The principles don't say the other studios are doing it wrong. They say what this studio is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Wayward question
&lt;/h2&gt;

&lt;p&gt;Wayward looks like a counterexample, so it's worth meeting head-on. The Wayward Herald is a satirical newspaper I've been working on for quite a while. It performs, it's loud, it's funny; structurally it is an attention product, seemingly everything these principles push against.&lt;/p&gt;

&lt;p&gt;It holds all four anyway, in a different key. It classifies — every reporter is a register, a beat, a bundle of tics — and never interprets their work back to you. Its surface is loud and its structure is silent: no trending column, no engagement meter, no comment thread. Its naming keeps inside the conceit, because a Herald is a paper of record for a place and a paper of record does not editorialize about itself. And its AI doesn't address the reader; reporters file stories and you read a newspaper, with no chatbot and no "ask the editor" anywhere on the page. &lt;em&gt;Two Products, Opposite Disciplines&lt;/em&gt; walks Wayward and Sojourn through all four in detail. Here it's enough that the principles survive the jump from a bedtime app to a comic broadsheet, the same jump the craft argument in &lt;a href="https://michaelmorrison.com/essays/what-ai-polish-does-to-hunter-s-thompson/" rel="noopener noreferrer"&gt;&lt;em&gt;What AI Polish Does to Hunter S. Thompson&lt;/em&gt;&lt;/a&gt; makes at the level of the sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principles aren't product decisions
&lt;/h2&gt;

&lt;p&gt;One distinction keeps this from being misread. A principle tells you what a thing is for. A product decision is what you get when you run a principle through a specific context, and two products can reach opposite decisions from the same principle and both be right. &lt;em&gt;Names that don't narrate&lt;/em&gt; pulled the evocative language out of Cairn — chapter became terrain — and let Wayward keep an entire newsroom of it, reporters with beats and grudges and a house style. Opposite calls, one stance underneath. The question was never whether a name is vivid. It's who the name is narrating. Cairn's would have been narrating &lt;em&gt;you&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The temptation to break the stance is real, and I've felt it up close. &lt;em&gt;The Multiverse I Almost Shipped&lt;/em&gt; is the time Wayward nearly bought an attention-economy move (personalization for stickiness) and set it back down.&lt;/p&gt;

&lt;p&gt;So this is not a template. Nothing here says a Stalefish product has to look like Cairn. Three of the four principles surfaced in Cairn work, which makes the visual quiet easy to mistake for the point. The point is the stance toward the person using the thing. The next product could look like nothing I've built and still be unmistakably ours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The count is four for now
&lt;/h2&gt;

&lt;p&gt;Four is the number today, not a claim of completeness. These are the principles the current products happened to need, and the next product will probably surface a fifth. I would rather find it the way I found these (already built into something before it had a name) than decide it in advance. A manifesto has to be right at the top. A body of work only has to stay consistent, and then, eventually, become legible enough that someone can read the shape straight off the wall.&lt;/p&gt;

</description>
      <category>design</category>
      <category>product</category>
      <category>software</category>
    </item>
    <item>
      <title>Two Dollars a Day to Brief a Nation</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Fri, 28 Aug 2026 17:00:52 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/two-dollars-a-day-to-brief-a-nation-nnb</link>
      <guid>https://dev.to/stalefishlabs/two-dollars-a-day-to-brief-a-nation-nnb</guid>
      <description>&lt;p&gt;I'm going to tell you what the Citizen's Daily Brief costs to run, because the number is small enough to be surprising and because the surprising part isn't the number. It's what the number does and doesn't tell you about how hard the thing was to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bill
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LLM inference: about $60 a month.&lt;/strong&gt; This is the only line that isn't free, and nearly all of it is the daily pipeline: about $2 per run every morning, Monday through Saturday, plus a heavier Opus pass on Saturday night — the weekly assessment that carries Sunday. The rest of the stack rounds to nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compute: $0/month.&lt;/strong&gt; The pipeline runs on GitHub Actions. A run takes about twenty minutes, most of it spent waiting on the model, and six runs a week plus the weekly pass comes to roughly six hundred minutes a month — well inside the free allowance. Nothing to pay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database: $0/month.&lt;/strong&gt; Supabase's free tier is more room than the CDB needs. Six tables, a few hundred rows of brief items a month, trivial query volume. It'll want a paid tier eventually as the archive grows, but "eventually" is measured in years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web hosting: $0/month.&lt;/strong&gt; A static site on Netlify's free tier, rebuilt once a day. Serving pre-rendered HTML off a CDN is the cheapest thing in the world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total: about $2 a day, call it $60 a month.&lt;/strong&gt; Weekday mornings are a flat couple of dollars off the metered bill; Saturday runs hotter when the weekly pass fires, and that one is still an estimate. The entire system — ingesting from thirty-four sources across the political spectrum, clustering the day's stories, scoring their significance by how many distinct editorial perspectives cover them, synthesizing structured assessments with confidence and agreement signals, checking its own output, and publishing a briefing document — costs about what you'd pay for a cup of coffee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Models, and Only One of Them Is Expensive
&lt;/h2&gt;

&lt;p&gt;The reason the bill stays small isn't a trick. It's a decision about which model does which job.&lt;/p&gt;

&lt;p&gt;The daily brief runs on Claude Sonnet, the fast, cheap tier. Everything it does is bounded: cluster today's sources, score them against a fixed five-dimension rubric, synthesize each item into a schema I defined, check the result against the sources it came from. Constrained, repetitive, well-specified work, run dozens of times a morning, six mornings a week. Speed and price matter there, and the format itself is doing half the reasoning — when the shape of the answer is nailed down in advance, the model has less room to wander and less need for raw horsepower.&lt;/p&gt;

&lt;p&gt;The weekly assessment runs on Claude Opus, which is slower and several times the price per token. That job is the opposite shape: read the whole week and say something genuinely synthetic about it, in long form, with no schema holding its hand. It's the one task in the system that actually needs the bigger model's judgment, and because it runs once a week, I can afford to give it.&lt;/p&gt;

&lt;p&gt;There's a cheaper tier below Sonnet, too. Claude Haiku runs about a third of Sonnet's price, and if the only goal were the smallest possible bill, the daily brief would live on it. It doesn't, on purpose. The daily analysis is where the product's credibility sits — the significance calls, the assessments a reader is meant to trust before breakfast — and Haiku, capable as it is, lands just under the bar I need there. So I pay Sonnet's premium for a floor I trust, and save Opus for the once-a-week job that earns it. The smallest bill was never the target; the smallest bill I'd stake the brief on was.&lt;/p&gt;

&lt;p&gt;The same logic runs upward. There's a tier above Opus, too — Claude Fable, built for long-horizon, many-step reasoning — and a fixed-shape daily brief is close to the last thing that needs one. The day I reach for it will be because the weekly assessment outgrew Opus, not because a bigger model makes a better product.&lt;/p&gt;

&lt;p&gt;That's the entire cost-control strategy, and it isn't an AI strategy. It's the oldest instinct in operations: you don't run everything on the biggest box. You right-size the engine to the load — the cheap tier for the high-volume constrained work, the expensive one for the rare call that's worth it. A daily run costs two dollars partly because most of it never touches Opus. Treating the models as infrastructure means provisioning them like infrastructure, per job, by weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Got Cheap
&lt;/h2&gt;

&lt;p&gt;Five years ago I couldn't have built this alone. Not because the architecture is hard — it's a pipeline, a database, and a static site — but because the analytical core would have needed a room full of human analysts or a custom ML system that took months to train.&lt;/p&gt;

&lt;p&gt;That specific capability collapsed in price. Taking thirty structured records, grouping them by topic, weighing their collective significance across defined dimensions, and emitting a structured assessment used to be a research project. Today it's an API call that costs about two dollars a run. The raw reasoning got cheap.&lt;/p&gt;

&lt;p&gt;Here's the part I want to be careful about, because it's easy to draw the wrong conclusion. Cheap to run is not the same as easy to build, and the invoice hides the difference completely.&lt;/p&gt;

&lt;p&gt;Anyone can make these API calls. What took the months was everything the bill doesn't show: learning what to ask, in what order, what counts as a valid answer, and — mostly — what to throw away before it reaches a reader. The pipeline that referred to President Trump as President Biden, that renamed the mayor of New York and changed his gender mid-paragraph, that swapped one pope for his predecessor inside a single sentence — every one of those was a lesson that turned into a check, a rule, a rewritten prompt. (I wrote that story up separately, in &lt;a href="https://dev.to/read/when-the-llm-isnt-the-product/"&gt;When the LLM Isn't the Product&lt;/a&gt;.) None of it shows up as a line item. All of it is the reason the output is worth reading.&lt;/p&gt;

&lt;p&gt;So the bill is low because inference got cheap. The product is defensible because the judgment stacked on top of that cheap inference didn't get cheap at all. If the whole thing were really "three API calls and a few hundred lines of Python," it wouldn't be worth much — and it would be easy to clone. The API calls are the commodity. The accumulated judgment about how to use them is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PDB Comparison
&lt;/h2&gt;

&lt;p&gt;The real President's Daily Brief comes out of the Office of the Director of National Intelligence, drawing on the whole intelligence community. The budget isn't public, but the community's total runs around ninety billion dollars a year. The PDB is a sliver of that, and a sliver of ninety billion is still an enormous amount of money.&lt;/p&gt;

&lt;p&gt;I'm not comparing the CDB to the PDB on quality — that would be absurd. The PDB draws on classified sources, satellite imagery, signals intelligence, and human networks no public system can touch. The depth of thousands of trained professionals is not reproducible by an API call.&lt;/p&gt;

&lt;p&gt;But the &lt;em&gt;format&lt;/em&gt; — a structured assessment with explicit confidence, shown reasoning, source attribution, delivered as one finite daily artifact — turns out to be the part that carries the value for a public reader. And the format is reproducible. The intelligence community never had a reason to notice, because for them the expensive, hard part was always the gathering. For the CDB, the hard part was believing the format alone, pointed at public sources, would produce something worth reading. It does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Free Matters
&lt;/h2&gt;

&lt;p&gt;The daily brief is free, and it stays free. Not a freemium tease with the good stuff walled off — what you read is the finished brief, not a sample of a paid one. Five to nine assessed items with full trust signals, evidence panels, and source attribution, every day, no account required.&lt;/p&gt;

&lt;p&gt;That's possible because the cost to run it is about sixty dollars a month. At that number the product doesn't need to squeeze anyone. There's no tier to buy and nothing sitting behind a wall. Readers who want to fund the work can, the way public radio works, and twelve supporters at five dollars a month cover the entire model bill.&lt;/p&gt;

&lt;p&gt;And that changes the design. When your operating cost is five hundred dollars a month, you need hundreds of subscribers, or ads, or a venture round, and every one of those pushes you toward engagement optimization and attention farming. When it's sixty, you need a few people who find it useful. The CDB can afford to be boring — no infinite scroll, no personalization, no engagement metrics, designed for read-and-leave instead of read-and-stay — because it doesn't have to strip-mine your attention to survive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;Worth listing, because almost every line is free:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLM inference&lt;/td&gt;
&lt;td&gt;Claude (Sonnet daily, Opus weekly)&lt;/td&gt;
&lt;td&gt;~$60/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline compute&lt;/td&gt;
&lt;td&gt;GitHub Actions&lt;/td&gt;
&lt;td&gt;$0 (free tier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;$0 (free tier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web hosting&lt;/td&gt;
&lt;td&gt;Netlify&lt;/td&gt;
&lt;td&gt;$0 (free tier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;Registrar&lt;/td&gt;
&lt;td&gt;~$12/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source ingestion&lt;/td&gt;
&lt;td&gt;RSS feeds&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push notifications&lt;/td&gt;
&lt;td&gt;Expo Push&lt;/td&gt;
&lt;td&gt;$0 (free tier)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The only paid line is the inference, and it's the cheapest thing on the invoice relative to what it produces. Everything else is free or a rounding error. That isn't a monument to clever engineering — the architecture is ordinary. It's a monument to how good free-tier infrastructure has quietly become. The cleverness, such as it is, lives in the prompts and the checks, and those are plain text files.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means
&lt;/h2&gt;

&lt;p&gt;The CDB exists because structured reasoning turned into an API call, and everything around that API call turned free. A product that would have taken a team and a budget five years ago now takes one person and a coffee-money bill.&lt;/p&gt;

&lt;p&gt;I think this pattern repeats: an expensive analytical process becomes a cheap call, and the cheap call unlocks a product format that used to be uneconomical. The CDB is an early instance because the briefing format was already well-defined and the inputs were public and free. The same move is sitting there in any domain where structured reasoning was the bottleneck.&lt;/p&gt;

&lt;p&gt;But the cheap call is the beginning of the work, not the end of it. The question worth asking isn't "what can AI do" — it can do plenty, most of it impressive demos and mediocre products. The question is "what valuable format was too expensive to produce until now, and what would it take to produce it &lt;em&gt;well&lt;/em&gt;?" The first half is a search. The second half is where the years go.&lt;/p&gt;

&lt;p&gt;For the CDB, the answer was a daily intelligence briefing for the public. Two dollars a day. One brief a day. Everyone gets the same one. That's the product, and it's only possible because the economics of analytical reasoning collapsed while nobody was looking — and only worth anything because collapsing the cost of reasoning did nothing to collapse the cost of judgment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The &lt;a href="https://dev.to/"&gt;Citizen's Daily Brief&lt;/a&gt; is a free daily intelligence briefing from &lt;a href="https://stalefishlabs.com" rel="noopener noreferrer"&gt;Stalefish Labs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>github</category>
      <category>llm</category>
    </item>
    <item>
      <title>No Login Required</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Fri, 28 Aug 2026 17:00:45 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/no-login-required-3k3b</link>
      <guid>https://dev.to/stalefishlabs/no-login-required-3k3b</guid>
      <description>&lt;p&gt;Open the Citizen's Daily Brief on the web and look for the login button. There isn't one. No "sign up free" banner, no account wall, no email box that slides up after thirty seconds to learn who you are before it'll let you read. You land on today's brief and you read it.&lt;/p&gt;

&lt;p&gt;That absence is the most deliberate thing about the product. It says what the CDB is meant to be: a shared briefing anyone can read, that asks nothing of you in return.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Whole Thing Is Free
&lt;/h2&gt;

&lt;p&gt;Everything the system publishes is free, and I mean the whole catalog. The daily brief — five to nine assessed items with trust signals, evidence panels, source attribution, confidence levels — runs free Monday through Saturday. The Weekly Assessment that carries Sunday, the longer piece that pulls the week's threads into trend analysis and a couple of deeper dives, is free. The archive going back to the first edition is free. The FICINT dossiers, the fictional-intelligence experiments that read like declassified case files, are free. So is the podcast feed.&lt;/p&gt;

&lt;p&gt;No item is blurred behind a "subscribe to read" overlay. No evidence panel is locked. There's no premium tab.&lt;/p&gt;

&lt;p&gt;This matters most for the daily brief, whose whole value is that it's a &lt;em&gt;common&lt;/em&gt; reference — everyone opens the same one. A daily brief that showed paying readers a fuller version would stop being shared; it would be a tiered product wearing a civic face. So that one is settled: the brief everybody reads is the same brief, and it isn't for sale.&lt;/p&gt;

&lt;h2&gt;
  
  
  So Where's the Money?
&lt;/h2&gt;

&lt;p&gt;Running the whole operation costs about sixty dollars a month, nearly all of it model inference. Readers who find it useful can cover that, the way you'd chip in to a public radio station during a pledge drive. Support is voluntary, and it lives on the web, at &lt;a href="https://citizensdailybrief.org/account" rel="noopener noreferrer"&gt;citizensdailybrief.org/account&lt;/a&gt;. Here's the part that catches people off guard: the iOS and Android apps have no way to take it — to chip in from the app, you step out to the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/honor-system-stand.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/honor-system-stand.png" title="No clerk, no turnstile. Take a brief; leave a coin if it was worth one." alt="A sidewalk newsstand run on the honor system: one person reads a single-page brief while another drops a coin into an unattended jar beside the free stack, no clerk in sight" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Making It Harder to Pay Me
&lt;/h2&gt;

&lt;p&gt;That's on purpose, and it cost me the easy version to do it.&lt;/p&gt;

&lt;p&gt;The frictionless move is an in-app "Support" button wired straight into Apple and Google's purchase systems. One tap, Face ID, done. I don't use it. Apple and Google take up to 30% of in-app payments, and their rules reach further into what counts as a "purchase" than most people expect. Send support to the web through Stripe instead and that cut stays with the project. It also keeps two app stores' content rules out of the internals of a civic product.&lt;/p&gt;

&lt;p&gt;Under the practical reason sits a better one. The instant support runs through the app as a purchase, the app has to know who paid. That means entitlement checks, a paid-versus-free fork in the code, and a standing little temptation to let the free side go thin so the paid side looks worth the money. Keep the money on the web and the app never learns who supports it. It has nothing to gate, so it gates nothing.&lt;/p&gt;

&lt;p&gt;Supporters get no extra content. There's no early edition, no members-only dossier waiting behind a sign-in. What a supporter gets is a receipt and the brief kept running for everyone, themselves included. When I write about it I try to say precisely that: the Daily Brief is free, and if the work is useful to you, you can help keep it going.&lt;/p&gt;

&lt;p&gt;It's the shape of &lt;em&gt;Letters from an American&lt;/em&gt;, Wikipedia, NPR, ProPublica. The writing is the public good. Paying for it is a separate choice you make because you want the thing to keep existing, not because you're buying your way past a wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Login Is Actually For
&lt;/h2&gt;

&lt;p&gt;If reading never needs an account, what's the sign-in for? Two narrow jobs.&lt;/p&gt;

&lt;p&gt;On the web, supporters sign in so their support follows them across devices and their receipts land somewhere durable. That account manages support and nothing else — no profile, no saved preferences, no personalization engine quietly warming up in the background. We're glad you're reading, and glad to hear from you. We just have no interest in getting into your business the way an attention-economy app does.&lt;/p&gt;

&lt;p&gt;In the app, you can sign in with Apple or Google if you want the morning push notification, since a push has to attach to a device a real person owns. It's optional. Skip it and the app still opens straight to the brief.&lt;/p&gt;

&lt;p&gt;Reading — daily, weekly, archive, FICINT, podcast — never asks. On any surface, on the web or in the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Do and Don't Track
&lt;/h2&gt;

&lt;p&gt;The website runs exactly one analytics tool, and it's about the lightest one going: GoatCounter. It counts pageviews and referrers, sets no cookies, collects no personal data, and builds no profile that trails you from page to page. So I can see that a brief drew some number of reads, and that a few visitors arrived from a link someone posted — but not who you are, not what you read before or after, not how long any item held you. Aggregate tallies at the door, and that's the ceiling. I could run heavier tooling; I've chosen not to.&lt;/p&gt;

&lt;p&gt;The native apps go a step further than that, and I'd sooner say so than let a tidy slogan paper over it. They use Mixpanel to see how the apps get used — which screens, how often — behind a switch in Settings that actually stops the events from firing when you flip it off. It doesn't watch your reading. There's no per-item tracking, no behavioral profile, nothing sold or handed to anyone. They aren't built to learn what you read most so they can show you more of it. It's purely product analytics, not just crash logs, and calling that "no tracking" would be exactly the kind of small overstatement this whole project is built to avoid.&lt;/p&gt;

&lt;p&gt;There's a story, probably apocryphal, about a fan who stopped Bob Dylan on the street. "You don't know who I am, but I know who you are." Dylan: "Let's keep it that way." That's roughly the arrangement we're after. You know the brief; the brief has no interest in working out who you are.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Levers I Left Unplugged
&lt;/h2&gt;

&lt;p&gt;None of this is free to me in the currency that grows a product. I can't A/B test a headline against readers I refuse to measure. There's no funnel to tune, because no one's being converted. I can't send a "we miss you" email, because I never took your address, and honestly, chasing you back isn't the kind of relationship the CDB is built for. Every one of those is a lever other products pull hard, and I've unplugged them deliberately.&lt;/p&gt;

&lt;p&gt;The wager is that a civic briefing earns its readers by being trustworthy, a little boring, and the same for everybody — and that the machinery of growth is the same machinery that would corrode the trust the briefing runs on. So there's no wall to get past. Just today's brief, and a choice that stays entirely yours: whether to help pay for tomorrow's.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The &lt;a href="https://dev.to/"&gt;Citizen's Daily Brief&lt;/a&gt; is a free daily intelligence briefing from &lt;a href="https://stalefishlabs.com" rel="noopener noreferrer"&gt;Stalefish Labs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Order of Discovery</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Tue, 28 Jul 2026 17:36:26 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/the-order-of-discovery-5bbf</link>
      <guid>https://dev.to/stalefishlabs/the-order-of-discovery-5bbf</guid>
      <description>&lt;p&gt;Open any item in the &lt;a href="https://citizensdailybrief.org" rel="noopener noreferrer"&gt;Citizen's Daily Brief&lt;/a&gt; and there's a short chronology hanging off a thin vertical rule directly under the opening paragraph. Usually three or four entries. Grey dates in sans-serif, descriptions in the same Georgia as the body text, no dots, no icons, no color. Nothing to click. It's just there, the way a footnote is there.&lt;/p&gt;

&lt;p&gt;That component was supposed to be something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Spec Asked For
&lt;/h2&gt;

&lt;p&gt;The original spec of the app placed the timeline inside the expandable evidence panel, item five of six, between the common-ground checklist and the source list. It sketched the component like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mar 9, 6:00pm   o  Federal Reserve releases policy statement
Mar 9, 6:03pm   o  AP reports rate decision
Mar 9, 6:15pm   o  Bloomberg analysis published
Mar 9, 6:30pm   o  Markets adjust expectations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Minute precision, a type indicator on every row, and a claim in the spec's own commentary that this was "genuinely novel — no other news product shows readers how a story developed, which sources were first, and whether official action preceded or followed reporting."&lt;/p&gt;

&lt;p&gt;Look at those four rows again. Two are events: the Fed releases a statement, markets move. Two are publications: AP files, Bloomberg publishes. The mock is quietly doing two different jobs in one column, and I didn't notice until I tried to generate the data for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Kinds of Clock
&lt;/h2&gt;

&lt;p&gt;Most news timelines answer &lt;em&gt;when did this happen&lt;/em&gt;. A bill was introduced Monday, the committee voted Wednesday, the chamber voted Friday. That's a chronology of events, and it's the one every news product uses.&lt;/p&gt;

&lt;p&gt;The other chronology answers &lt;em&gt;when did we find out&lt;/em&gt;. A wire service filed at 7:41 AM. A national broadcaster picked it up at 4:58 PM. A government statement landed the next morning. Same story, different question.&lt;/p&gt;

&lt;p&gt;Philosophically the event exists whether or not anyone reports it, and happened when it happened. Practically, for a reader trying to form an accurate picture, the reporting &lt;em&gt;is&lt;/em&gt; the event. The story that breaks at 2 PM on a wire is a different epistemic object than the same story once a specialist publication has contextualized it twelve hours later. The facts can be identical while your understanding of them is not.&lt;/p&gt;

&lt;p&gt;Intelligence analysts treat this as data in its own right. A story that surfaces informally, then gets wire confirmation, then gets official acknowledgment has a different information signature than one that opens as an official announcement and gets explained backward by reporting. The first pattern suggests something leaked. The second suggests something was managed. Neither tells you which story matters more, and both tell you something about the environment the story came out of.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Got Built Instead
&lt;/h2&gt;

&lt;p&gt;So in the CDB, the two kinds of timing ship as two separate components.&lt;/p&gt;

&lt;p&gt;The timeline under the lede is the event clock. It runs at day granularity with a rough time-of-day qualifier, and it exists to give you the shape of the story before you read the analysis, the beats as they unfolded over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/first-clock-timeline.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/first-clock-timeline.png" title="The event clock. Day granularity, no time zone, no dots — and note that entries fold in who reported what when it's load-bearing." alt="A Citizen's Daily Brief item on European wildfires, with a five-entry chronology below the opening paragraph running from "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The discovery clock lives one layer down, in the Articles section of the evidence panel. Every source gets its outlet, its role in the assessment, its headline, and its publication time to the minute in Eastern time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/second-clock-articles.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/second-clock-articles.png" title="The discovery clock. Sixteen articles, six perspectives, every filing timestamped." alt="The expanded evidence panel's Articles section: sixteen sources counted by outlet type, each with a role label like CORROBORATES or ADDS CONTEXT and a timestamp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two corroborate each other, which is the useful part. Take the July 27 wildfire item. Its first timeline entry is dated &lt;em&gt;Jul 26 (early)&lt;/em&gt; and reads, in part, &lt;em&gt;Reuters and FT first report Bordeaux threat.&lt;/em&gt; That's a checkable claim. Scroll the source list past the international and national outlets to the wire block and there they are: Financial Times filed at 7:41 AM, Reuters at 8:37 AM, both on the 26th, both earlier than anything else in the cluster of sixteen. The assessment says an outlet was first. The source list hands you the timestamp to test it with.&lt;/p&gt;

&lt;p&gt;Which is all the wildfire item's timing proves. It's the ordinary case, and the ordinary case has no tell in it. A fire is a fire, the wires get there first, everyone else catches up across eighteen hours, and the sequence tells you nothing you didn't already assume. That's the right answer for most stories, and most stories are most of the brief.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the Sequence Is the Story
&lt;/h2&gt;

&lt;p&gt;The archive holds the other kind too. On June 30 the Supreme Court upheld state bans on transgender athletes in school sports. The first source in that item is a report of the ruling at 10:04 AM, classed primary because it broke the news of an official action. The second is at 10:06. Then 10:15, 10:17, 10:43, 11:05, 11:18 — twenty-eight sources, and everything past the first two minutes is commentary on a document that was already public. Official action, then a wave of reaction that couldn't have started earlier because until 10:04 there was nothing to react to. A scheduled release looks exactly like that.&lt;/p&gt;

&lt;p&gt;Six weeks earlier the shape is inverted. On May 15 the brief carried "US Justice Department preparing to indict former Cuban President Raúl Castro." The Guardian filed at 1:31 PM. The New York Post at 3:47. Reuters at 4:35 and again at 5:17, AP at 5:50, ABC at 6:08. Nothing in the cluster gets classed as a primary source until 6:33 PM, five hours behind the first report. A story about a forthcoming indictment circulated most of an afternoon before anything official caught up with it. The word &lt;em&gt;preparing&lt;/em&gt; in that headline is doing a lot of work, and the timestamps are where you can watch it work.&lt;/p&gt;

&lt;p&gt;I'd put a caveat on the second one. "Primary" is the assessor's judgment about what a source is doing in the cluster, not a certificate that the source is an official document, so a five-hour gap is evidence rather than proof. But it's evidence the reader can see and weigh, which is the entire point of putting the timestamps there.&lt;/p&gt;

&lt;p&gt;Splitting the two clocks was an accident of implementation that turned out to be a better design than the spec. The event chronology belongs above the fold because it's orientation, and every reader needs it. The discovery chronology belongs behind a disclosure because it's an audit trail, and an audit trail presented as narrative starts to look like the story rather than the receipt for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Field That Never Shipped
&lt;/h2&gt;

&lt;p&gt;The original schema for a timeline entry was &lt;code&gt;{event_time, event_type, label}&lt;/code&gt;. That &lt;code&gt;event_type&lt;/code&gt; was the hook for a categorization pass I'd planned: color-coded dots, blue for wire services, green for government sources, orange for international outlets. Informative at a glance.&lt;/p&gt;

&lt;p&gt;It was also subtly dishonest. Color coding implies categories that map onto significance, and these don't. A government source isn't inherently more credible than a wire service. An international outlet isn't inherently more or less important than a domestic one. The scheme would have encoded editorial judgments I had no business making and no way to defend. Worse, for this project: style for style's sake.&lt;/p&gt;

&lt;p&gt;So the dots never got built, and the field never got populated. What the pipeline emits is &lt;code&gt;{date, event}&lt;/code&gt;. I checked: 2,912 timeline entries across 925 published items, every single one that shape. The frontend still carries a fallback branch that reads &lt;code&gt;event_time&lt;/code&gt; and &lt;code&gt;label&lt;/code&gt; if &lt;code&gt;date&lt;/code&gt; and &lt;code&gt;event&lt;/code&gt; are missing. It has never fired. Somewhere in &lt;code&gt;briefUtils.ts&lt;/code&gt; there's a four-line &lt;code&gt;return&lt;/code&gt; for a schema that lost an argument and has been dead code ever since.&lt;/p&gt;

&lt;p&gt;The monochrome version that shipped in its place makes you read the entries instead of scanning the colors. Each one gives you the date and what happened, and where the reporting is the point, it says so in plain text: &lt;em&gt;Reuters and FT first report Bordeaux threat.&lt;/em&gt; You form your own view of the source landscape. This is the same instinct that runs through the rest of the product's &lt;a href="https://dev.to/read/deliberately-boring-by-design/"&gt;deliberately plain design&lt;/a&gt; — present the information, don't nudge the judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bug the Timeline Caused
&lt;/h2&gt;

&lt;p&gt;Here's the part I didn't anticipate. The timeline is generated in the same JSON payload as the prose, but for a while it wasn't shown to any of the &lt;a href="https://dev.to/read/guardrails-not-gatekeepers/"&gt;validation passes&lt;/a&gt; that check the prose.&lt;/p&gt;

&lt;p&gt;On June 25 the brief carried an item on the New York mayoral primary that called its subject "Zohran Mamdani" in the timeline and "Zoe Mamdani," with female pronouns, in the body. Both came out of the same model call. The grounded self-review that should have caught it never saw the timeline field, so it checked a body that was internally consistent and passed it.&lt;/p&gt;

&lt;p&gt;That item is the opening example in &lt;a href="https://dev.to/read/when-the-llm-isnt-the-product/"&gt;When the LLM Isn't the Product&lt;/a&gt;, which takes up the general problem: a model writing a confident falsehood inches from a structured field that had the name right the whole time. The part that belongs here is narrower and more embarrassing. The field with the name right in it was the timeline, and nothing was reading it.&lt;/p&gt;

&lt;p&gt;That produced two fixes. The fact-check prompt now renders the timeline as plain lines and reads it alongside the prose. And there's a deterministic check, &lt;code&gt;name_consistency.py&lt;/code&gt;, that walks every field in an item, including nested structures, and flags any surname appearing with two different given names. No model call, no name catalog, just a regex and a set. Heuristic and admittedly crude — two genuinely different people sharing a surname in one item will trip it — so a conflict triggers regeneration rather than a silent edit.&lt;/p&gt;

&lt;p&gt;Structured output that no reviewer reads is structured output you're publishing unverified. The timeline was the field that taught me that, which is a mildly humiliating thing to learn from a list of dates.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Haven't Built
&lt;/h2&gt;

&lt;p&gt;The pipeline doesn't detect patterns in the discovery record. If three outlets file the same fact within four minutes of each other, that's a coordinated release or a shared wire origin, and it's a materially different signal from three outlets confirming independently across six hours. The data supports the inference. Nothing in the code draws it. That felt like over-engineering for v1 and it still does, though it's the first thing I'd look into adding if the panel ever expands.&lt;/p&gt;

&lt;p&gt;The other one took me a while to think through, because it turns out not to be a bug. The Articles list isn't sorted chronologically. In the wildfire item the list opens at 3:21 AM, jumps back to 11:58 PM the previous night, then forward to 7:32 AM. The times are all there and the order ignores them.&lt;/p&gt;

&lt;p&gt;Nobody chose that order. Sources carry a &lt;code&gt;display_order&lt;/code&gt; the publisher assigns by walking the cluster's source indices, and those indices come from &lt;code&gt;fetch_all_sources&lt;/code&gt;, which iterates the feed list in &lt;code&gt;sources.py&lt;/code&gt; top to bottom. That file happens to be written in rough &lt;a href="https://dev.to/read/thirty-four-feeds-and-a-philosophy/"&gt;perspective&lt;/a&gt; blocks: the official feeds first, then international and left-leaning, public media, broadcast, specialist and tech, wire, business, political trade, with the right-leaning outlets in a block near the bottom. The panel inherits that grouping without a sort ever being written.&lt;/p&gt;

&lt;p&gt;That list has a first job, though, and the inherited order happens to serve it. The toggle above the panel reads "16 sources, 6 perspectives," and the significance model weights editorial diversity over raw outlet count, so what the panel most needs to show is spread — whether a story is carried across the spectrum or only by one wing of it. Contiguous blocks by camp show that at a glance.&lt;/p&gt;

&lt;p&gt;The order arrived by accident. It stays on purpose, because the two jobs aren't worth the same. Spread is the one a reader can't rebuild for themselves; you'd have to tally outlets by camp to see it. Sequence they can rebuild, because every timestamp is printed right there next to the outlet. And the wildfire item is the reminder that on most days reading them in order tells you nothing: a leak or a managed release is the exception; editorial breadth is every item, every day. Given one axis to sort on, it should be the one that can't be recovered by eye.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Receipt for the Receipt
&lt;/h2&gt;

&lt;p&gt;Most readers will never open the evidence panel. Of the ones who do, most won't cross-reference the timestamps against the timeline. I'm fine with that. What matters is that the brief &lt;em&gt;can&lt;/em&gt; be audited, by anyone, on the spot, without asking me for anything. The evidence ships with the item, every item, whether or not a single reader opens it. It isn't a corrections page written after somebody catches you.&lt;/p&gt;

&lt;p&gt;Confidence and agreement are the system's judgments, and they're labeled as such. Common ground and key disagreements are the system's reading of the sources. The two clocks are the closest thing in the product to raw material: here is when it happened, here is when we heard, here is the gap between them. Everything else in the item is built on top of those, and if the assessment and the timestamps disagree, the timestamps win.&lt;/p&gt;

&lt;p&gt;That's a smaller promise than "trust us." It's the only one an automated brief has any standing to make.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The &lt;a href="https://dev.to/"&gt;Citizen's Daily Brief&lt;/a&gt; is a free daily intelligence briefing from &lt;a href="https://stalefishlabs.com" rel="noopener noreferrer"&gt;Stalefish Labs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Vault Opens: Three Tall Tales Decks Never Made It to Print, Until Now</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Fri, 24 Jul 2026 03:05:00 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/the-vault-opens-three-tall-tales-decks-never-made-it-to-print-until-now-443k</link>
      <guid>https://dev.to/stalefishlabs/the-vault-opens-three-tall-tales-decks-never-made-it-to-print-until-now-443k</guid>
      <description>&lt;p&gt;This series has spent its first few weeks on the almosts. Tall Tales &lt;a href="https://dev.to/read/how-tall-tales-almost-ended-up-in-starbucks/"&gt;almost ended up in Starbucks&lt;/a&gt;. It &lt;a href="https://dev.to/read/the-cracker-barrel-edition-that-almost-was/"&gt;almost got a custom edition at Cracker Barrel&lt;/a&gt;. I &lt;a href="https://dev.to/read/pitching-a-card-game-to-70-dead-retailers/"&gt;pitched it to 70 retailers&lt;/a&gt;, most of them now out of business. What I haven't talked about is what I made &lt;em&gt;for&lt;/em&gt; those almosts — the cards I wrote for editions that never went to print. They've been sitting in spreadsheets for twenty-three years. Today they go online.&lt;/p&gt;

&lt;p&gt;There were three unreleased decks.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Discovery Edition&lt;/strong&gt;, about 35 cards, was the nature-leaning expansion: cryptids, weird-but-true biology, lost-explorer lore. It's the deck I had the most fun writing, and the one I'd bring back first.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Hollywood Edition&lt;/strong&gt;, about 33 cards, was pop culture and movie trivia. It sat closest to the original Pocket Edition in voice, which would have made it the safe next release.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Down Home Edition&lt;/strong&gt;, about 60 cards, was the &lt;a href="https://dev.to/read/the-cracker-barrel-edition-that-almost-was/"&gt;Cracker Barrel pitch&lt;/a&gt; — folksy, Americana, regional, the most divergent of the three.&lt;/p&gt;

&lt;p&gt;"Designed but never shipped" can sound like a polite way to say "a few notes in a drawer." These weren't that. They were finished cards — written, answered, fact-checked, formatted, color-coded by edition — that simply never met a printing press. They lived in a handful of master spreadsheets, and every row was colored by its fate. Blue meant it shipped in the Pocket Edition. Green was Discovery, brown was Hollywood, red was Down Home. For twenty-three years those cells sat in their colors, complete and unread. Well, mostly complete: some rows trail off into empty columns, a question written and its answers never filled in — cards caught mid-thought when the whole effort stopped.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/card-spreadsheet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/card-spreadsheet.png" title="The master spreadsheet, rows colored by their fate. The gaps are cards that never got finished." alt="The master Tall Tales spreadsheet, every row color-coded by edition — brown for Hollywood, red for Down Home, pale yellow for base-game extras, green for Discovery. Some rows have empty answer columns where a card was started but never finished." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without a plan to relaunch a card game to put them back in the world, I decided to give them a new life directly on the web. I built a card viewer: every card gets its own page and its own URL, with the unreleased cards stamped &lt;strong&gt;Never Printed&lt;/strong&gt;. No box, no rulebook, no reprint, no Kickstarter to run. Just the cards, readable and free to anyone curious enough to look.&lt;/p&gt;

&lt;p&gt;I wanted each card individually indexed: a page holding a small piece of content that didn't exist on the web before — a fact, a question, a strange little story with its own address. People searching for the kind of trivia these cards are made of can now land on them, and every one of those pages points quietly back to the original 2003 Pocket Edition, &lt;a href="https://dev.to/play/talltales/"&gt;still for sale while supplies last&lt;/a&gt;, and to a "let me know if Tall Tales ever comes back" list for anyone who wants more than the few hundred boxes I have left. I'm not hiding the funnel. I'm just not going to dress it up as more than it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/TTPEBox3D.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/TTPEBox3D.jpg" title="The Pocket Edition: the deck that shipped." alt="The 2003 Tall Tales Pocket Edition box — the blue rows of the spreadsheet, and the only deck of the five that made it to cardstock." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two ways in, if you want them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/play/talltales/cards/"&gt;Browse the decks&lt;/a&gt;, sorted by edition, Never-Printed cards included.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/play/talltales/play/"&gt;Draw a random card&lt;/a&gt; — shuffling, basically, except every draw is a shareable link.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What this isn't: a comeback announcement. Whether any of these three decks ever gets manufactured is a decision for later. I'll let engagement decide. If the web version finds an audience and the notify list fills up, that tells me something. If it doesn't, that tells me something else, and the cards still get to exist either way.&lt;/p&gt;

&lt;p&gt;There was a fifth color in the spreadsheets, too: pale yellow, for base-game material that didn't make the original Pocket Edition cut. All five collections sat untouched together — a finished game, three finished expansions, and a pile of extras, visible only to me. As of today, four of those colors are online. The yellow stays in the file for now; if the rest proves out, it becomes the pool I'd draw a refresh from.&lt;/p&gt;

&lt;p&gt;Three decks that never got printed, printed at last — just not on cardstock.&lt;/p&gt;




&lt;p&gt;The remaining copies of Tall Tales Pocket Edition are &lt;a href="https://dev.to/play/talltales/"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Cracker Barrel Edition That Almost Was</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Wed, 22 Jul 2026 13:33:41 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/the-cracker-barrel-edition-that-almost-was-kcp</link>
      <guid>https://dev.to/stalefishlabs/the-cracker-barrel-edition-that-almost-was-kcp</guid>
      <description>&lt;p&gt;I'm a native Nashvillian, which is increasingly rare these days. I grew up with Cracker Barrel as a road trip staple, complete with the vintage candy in the gift shop, the triangle peg game, and endless biscuits. The company is based in Lebanon, Tennessee, half an hour east, and after getting an initial soft reply via a cold letter writing campaign about them carrying our card game Tall Tales, I learned I had a surprisingly direct connection to the top. I ended up getting a real sit-down, inside the building, with the founder and CEO himself, to show him the game. A truly rare opportunity for someone with zero marketing experience trying to launch a new game.&lt;/p&gt;

&lt;p&gt;I brought our $12.95 Tall Tales Pocket Edition that had shipped at Toy Fair, and entered the foyer of Cracker Barrel's then corporate HQ. At that time their HQ was a restored 10,000 square foot mansion called The Mitchell House, which was originally part of the Castle Heights Military Academy. I had somehow managed to get a sit down with their founder and CEO, and Castle Heights graduate, Dan Evins, who was very kind and seemed to maybe appreciate the pluckiness of me trying to pitch a locally created product directly to the top. We talked a bit and he eventually passed me on to their buyer, Karen Smith. That meeting, in October 2002, is where the story starts to unravel. She named the problem with selling Tall Tales into Cracker Barrel without hedging. Their retail floor runs on nostalgia: tin signs, wooden toys, the candy your grandparents' grandparents ate, the rocking chairs out front, a healthy dose of UT Vols big orange paraphernalia. Tall Tales, with its stylized cryptid creatures, weird-but-true trivia, and its faintly mischievous voice, read as too modern and a shade too edgy for that shelf. She wasn't knocking the game, just its place on that particular shelf, and she had it right.&lt;/p&gt;

&lt;p&gt;Most pitches end at the no. This one turned into a design brief. I'm a designer, so what I heard in her critique was an assignment. Instead of leaving I offered to build Cracker Barrel their own version of the game, and she was open to it, so I drove home and did it. &lt;em&gt;Tall Tales Down Home Edition&lt;/em&gt;: artwork redrawn in a warmer, folksier register, card content rewritten toward their audience, a "Cracker Barrel Exclusive" badge on the front of the box. I dropped the price from $12.95 to $9.95, with a $5.00 wholesale cost, to land where their shoppers expected an impulse buy to sit. The margin was painfully thin. Honestly, at those numbers we'd have run at a loss for a while, until the print quantities climbed enough to bring the unit cost down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/tt-down-home-box-front.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/tt-down-home-box-front.jpg" title="The Down Home Edition prototype: a Cracker Barrel exclusive that never shipped." alt="The Tall Tales Down Home Edition prototype box — the " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By the time I came back with the follow-up pitch, in November 2003, I'd changed the words around it too. The first time, I'd sold a game. Now I called it "family entertainment akin to your books on tape" — borrowing a category Cracker Barrel already stocked and understood, the audiobooks people bought for long drives. Same product. I'd just learned to describe it in their language. And it wasn't marketing B.S.; our game really was the perfect road trip game. Still is, actually.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/tt-down-home-box-back.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/tt-down-home-box-back.jpg" title="The back panel, rewritten for the Cracker Barrel shopper." alt="The back of the Down Home box, with the rewritten Tall Tale / Topper / Zinger copy and a 1998–2003 Stalefish Labs line." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The piece I was proudest of never ran. I designed table-topper playable ads, the little tent cards that stand between the salt and pepper and the peg board game, so a family eating biscuits waiting on their entrees could read about the game, play a sample card, and then grab a copy on the way out past the register. The placement was the whole idea: catch people in the idle fifteen minutes before the food arrives, in the exact building where the product is for sale. It seemed like a no-brainer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/tt-down-home-box-side-2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/tt-down-home-box-side-2.jpg" title="Sample content from a box side panel, tuned for the family table." alt="A Down Home side panel — a sample prompt (" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then it went the way these things sometimes go: without warning, the buyer pulled the plug. No drama, no explanation that made it into the file. Down Home went from "let's do this" to silence, and I never got the post-mortem. A budget, a reorg, a category reset, a champion who moved on — one of the ordinary ways a deal dies inside a big company. I'll never know which one it was.&lt;/p&gt;

&lt;p&gt;The deal falling through stung, but deals fall through, and that's not the part that stayed with me. The design pivot did. Re-imagining Down Home as its own edition forced me to build a working model of a customer I'd never pictured — "the Cracker Barrel shopper" — and design backward from her. Where would she be standing the first time she saw the box? What price would feel like a treat instead of a decision she had to weigh? I was a kid doing brand strategy with none of the vocabulary for it, only because a buyer had told me no in a way specific enough to answer. I don't think I missed by much.&lt;/p&gt;

&lt;p&gt;Oddly, all these years later, the Down Home Edition would still fit Cracker Barrel. The art still sits in the project folder, a few directories over from the edition that actually shipped — a whole game, tailored to a restaurant chain, that exists only as files. The box that almost was, parked next to the box that was. You win some, you lose some, you hopefully learn a little either way.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>When the LLM Isn't the Product</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Tue, 21 Jul 2026 13:31:04 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/when-the-llm-isnt-the-product-34dm</link>
      <guid>https://dev.to/stalefishlabs/when-the-llm-isnt-the-product-34dm</guid>
      <description>&lt;p&gt;One morning in late June, the pipeline that builds the Citizen's Daily Brief generated an item calling the mayor of New York City "Zoe Mamdani." A few words later it called him "herself," with the same easy confidence it brings to everything.&lt;/p&gt;

&lt;p&gt;The mayor of New York is Zohran Mamdani. He had not, in the intervening hours, changed his first name or his gender. The model had invented both and written them down without a flicker of doubt, in clean declarative prose, sitting inches from a structured data field that had his name spelled right the whole time.&lt;/p&gt;

&lt;p&gt;I could tell you this is a story about an AI making a mistake. Yet another "don't trust the insane hallucinating machine" take. Most AI writing this year is, one way or another, a story about the AI: here's what ours can do, watch it generate and analyze and predict, look how smart it is. The model plays the lead.&lt;/p&gt;

&lt;p&gt;I want to tell you the opposite story. The interesting thing about the Zoe incident is the field three inches away that was correct, and the unglamorous machinery that now compares the two before anything reaches you. That machinery is the product. The model is a part I could swap out.&lt;/p&gt;

&lt;p&gt;The Citizen's Daily Brief uses Claude for every analytical step in its pipeline: clustering news sources, scoring significance, synthesizing assessments, generating weekly analyses. LLM inference is literally the most expensive line item in the budget, which is admittedly not saying much when everything else runs on free tiers. And yet if you ask me what the product actually is, the answer has nothing to do with AI.&lt;/p&gt;

&lt;p&gt;The product is the format.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Format Is the Innovation
&lt;/h2&gt;

&lt;p&gt;The Citizen's Daily Brief is a finite daily artifact with a fixed structure. Five to nine items, each with a headline, a "what changed" section, a "why it matters" assessment, a "what's next" forward look, and an evidence panel showing sources, confidence, agreement, and the points where the sources disagree. Published once per day. Same brief for everyone. No personalization, no infinite scroll, no engagement optimization. I don't want your attention, I want you informed.&lt;/p&gt;

&lt;p&gt;A single item, stripped to its bones, reads something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;EU fines AliExpress €550 million for counterfeit and illegal goods under the Digital Services Act&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;What changed:&lt;/em&gt; The European Commission issued a record €550 million fine against AliExpress, the Alibaba-owned platform, for failing to keep illegal, unsafe, and counterfeit goods off its marketplace.&lt;br&gt;
&lt;em&gt;Why it matters:&lt;/em&gt; It sets a concrete enforcement benchmark for the Digital Services Act: a signal that the EU will levy heavy penalties on large non-European platforms that don't police their own marketplaces.&lt;br&gt;
&lt;em&gt;What's next:&lt;/em&gt; Whether Alibaba appeals through the EU courts, and whether other big platforms tighten their moderation preemptively.&lt;br&gt;
&lt;em&gt;Evidence:&lt;/em&gt; 5 sources · confidence: moderate · sources broadly agree.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the product. Not "AI-powered news analysis." Not "intelligent news curation." A &lt;em&gt;briefing document&lt;/em&gt;. A specific format borrowed from the intelligence community and adapted for public consumption.&lt;/p&gt;

&lt;p&gt;The AI enables the format. It doesn't &lt;em&gt;constitute&lt;/em&gt; the format. Swap out Claude for a team of human analysts and the product would be identical: same structure, same trust signals, same editorial voice. It would just cost a thousand times more, take longer, and apply the methodology less consistently. A human analyst has bad days. The pipeline runs the same rubric every morning at the same hour, in the same mood, which is no mood at all.&lt;/p&gt;

&lt;p&gt;This framing — AI as infrastructure rather than product — inverts the typical narrative, and I think it's the more honest way to think about most AI applications. Once the novelty wears off, and the AI equivalents of all the early iOS fart apps have gone away, I suspect that this is what we'll be left with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure Means Invisible
&lt;/h2&gt;

&lt;p&gt;When you use an app backed by PostgreSQL, nobody tells you about the database. You don't see "Powered by Postgres" in the footer. The product team doesn't write blog posts about their query optimizer. The database is infrastructure: essential, invisible, valued for staying up rather than for being clever.&lt;/p&gt;

&lt;p&gt;That's how I think about the LLM in the CDB pipeline. It's a reasoning engine that sits between structured input and structured output, transforming data according to well-defined constraints. It's called via API, returns JSON, and is validated before its output reaches anyone. If it goes down, the pipeline retries once and then skips the day. If it produces garbage or inadvertently reassigns the mayor of New York a new first name and gender, the validator catches it.&lt;/p&gt;

&lt;p&gt;The LLM doesn't talk to users. It doesn't have a chat interface. Readers never interact with it, never prompt it, never see its raw output. They see the &lt;em&gt;formatted result&lt;/em&gt; of its work, wrapped in a structure that I designed and validated against rules that I wrote. The LLM provides the analytical reasoning. Everything else — what questions to ask, what format to require, what counts as valid output, how to present it — is product design.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Learned People's Names
&lt;/h2&gt;

&lt;p&gt;Back in March, that same pipeline referred to President Trump as President Biden.&lt;/p&gt;

&lt;p&gt;My first fix was the obvious one. I handed the model a block of current officeholders — the president, the cabinet, a handful of world leaders — and injected it into every prompt. Here is who currently holds which office; do not get this wrong. It worked. It was also a hack, and I knew it while I was writing it. A hardcoded who's-who goes stale the moment a secretary resigns (or more likely in this case, is fired) and it only covers the names I thought to list.&lt;/p&gt;

&lt;p&gt;So I tore it out. Instead of telling the model who's who, the pipeline now reads the day's own sources and extracts the (role → name) pairings itself, trusting one only when at least two independent sources corroborate it. I added a rule for a specific failure I kept seeing: a current and former holder of the same title getting swapped inside a single item, Pope Leo XIV becoming Pope Francis halfway through a paragraph. Two sources, grounded in the corpus, disambiguated by office. Cleaner. More general. I figured names were solved.&lt;/p&gt;

&lt;p&gt;Then June, and Zoe.&lt;/p&gt;

&lt;p&gt;What made the Zoe miss different is the part I keep coming back to. The model got the name &lt;em&gt;right&lt;/em&gt; in the structured timeline field and &lt;em&gt;wrong&lt;/em&gt; in the prose, in the same item, seconds apart. No amount of "here is who currently holds office" catches that, because the system already knew who he was. It just contradicted itself on the way out the door. It felt less like hallucination than like the machine forgetting, mid-sentence, something it had known a field ago.&lt;/p&gt;

&lt;p&gt;The fix wasn't a smarter prompt. It was dumber than that, on purpose: a deterministic check, plain code, no model call, that reads every field of an item and flags any surname that appears with two different first names. If "Mamdani" shows up as both "Zohran" and "Zoe," the item never ships. I also let the prose-writing step see the structured timeline it was supposed to match, and added a weekly pass that re-checks every name against the week's own items.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/name-check.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/name-check.png" title="The name check, in spirit. One surname wearing two different first names, and the item is pulled before it reaches you. Plain code, no model call, nothing to have a bad day." alt="A conveyor of briefing items with one flawed item flagged and dropped into a reject bin" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That check, in its first version, was too eager. It started flagging ordinary words that happened to look like colliding names, and I spent a following evening teaching it the difference. The fix needed a fix. This is what maintaining infrastructure actually feels like — not a triumphant demo, but a series of small, specific, slightly embarrassing corrections that make the thing quietly harder to break.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Trust
&lt;/h2&gt;

&lt;p&gt;Here's where the infrastructure framing earns its keep.&lt;/p&gt;

&lt;p&gt;When the AI is the product, users have to trust the AI. They have to believe the model is smart enough, unbiased enough, reliable enough. Every hallucination story and every "AI confidently wrong" headline chips at that faith, and the product is only ever as credible as the model behind it.&lt;/p&gt;

&lt;p&gt;When the AI is infrastructure, trust shifts to the system around it. You don't have to believe the model never invents a name. From experience, it does. You have to believe that when it does, something boring and deterministic is standing between the mistake and your screen. The confidence levels, the agreement signals, the cited sources sitting right there under each item: those are all versions of the same promise. Not &lt;em&gt;trust the model&lt;/em&gt;, but &lt;em&gt;check the work — here's the work&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is the intelligence community's oldest move. The President's Daily Brief doesn't say "trust us because we're smart." It says here's what we assessed, here's the evidence, here's our confidence, here's what we still don't know. Credibility comes from the shown reasoning. Zoe is the reason I believe that, and not just quote it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Someone Already Read the Spread
&lt;/h2&gt;

&lt;p&gt;There's a class of tools I admire that comes at this from the other end. Take one story, line up how outlets across the spectrum covered it, tag each source for bias and reliability, and surface the gaps — the piece the left led with and the right ignored. The promise is media literacy: here's the whole spread, now you can see the spin and decide for yourself.&lt;/p&gt;

&lt;p&gt;The Brief points the same distrust of the single feed at the opposite workflow. Instead of handing you the spread, it reads the spread and hands you the assessment: one item, what changed, why it matters, how sure it is, where the sources fight, what's still unknown. The spectrum still does the work — significance scoring literally weights a story by how many distinct editorial perspectives are covering it — but that happens upstream, in the pipeline, so it never lands on your plate as twelve headlines to reconcile before breakfast.&lt;/p&gt;

&lt;p&gt;These are peers aimed at the same disease from different directions. One says &lt;em&gt;see everything and trust yourself&lt;/em&gt;; the other says &lt;em&gt;here's the call, and here's the work behind it.&lt;/em&gt; I built the second because most mornings I don't want to run a media-bias seminar. I want the brief, and I want to be able to check why it says what it says.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boring on Purpose
&lt;/h2&gt;

&lt;p&gt;A product built to show off the model has a shelf life. It's thrilling in the demo and thinner every month after, because the novelty was doing the work, and novelty is the one ingredient guaranteed to spoil. When the trick stops being surprising, there has to be something left.&lt;/p&gt;

&lt;p&gt;So the Daily Brief is boring on purpose. Nobody opens it and thinks "wow, an AI wrote this." They open it and think "what happened yesterday." The format is decades old, the content is just the world, and the whole thing is dressed to be trusted rather than to impress. There's no reveal to wear off, because there was never a reveal. If I've done my job right, the AI part of this project recedes to the background just like the Postgres database you don't care about. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/reading-the-brief.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/reading-the-brief.png" title="The whole product experience: one page, a coffee, the phone face-down. When you reach the end, you're done — there's no next thing to scroll to." alt="A person reading a single printed one-page brief at a kitchen table, phone face-down" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This means the product doesn't need AI to get better over time for users to keep coming back. And it doesn't need to write flowery prose. All it really needs is for &lt;em&gt;current events&lt;/em&gt; to keep happening, for the world to keep spinning with us on it, which is a reasonably safe bet. The AI really just needs to keep doing its job reliably — clustering, scoring, synthesizing, validating — the same way a database just needs to keep storing and retrieving data reliably.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What IS the Product?
&lt;/h2&gt;

&lt;p&gt;If the AI is infrastructure, the product is the answer to a design question: &lt;em&gt;what format would make a busy person feel genuinely informed in ten minutes?&lt;/em&gt; Every decision in the app is downstream of that one sentence.&lt;/p&gt;

&lt;p&gt;Five to nine items, because fewer than five misses something and more than nine feels like homework. Significance scoring, so the day sorts itself by weight instead of by whatever broke last. Confidence and agreement on every item, because a busy person deserves to know how sure the assessment is before they act on it. A "what's next" on every item, because knowing where a story is heading is half of being informed about it. One brief a day, and then nothing, because the second scroll of the morning has never once made anyone wiser. The AI executes all of this at a scale I couldn't touch by hand. The judgment underneath it — what to ask, what to require, what counts as good enough to ship — is mine, and it's the part that took the years.&lt;/p&gt;

&lt;p&gt;So here's the test I'd hand any AI founder. Describe your product without saying "AI," and see if it still sounds like something a person would want.&lt;/p&gt;

&lt;p&gt;Mine survives it: a daily briefing that tells you the handful of things that actually mattered yesterday, shows you how confident it is and what its sources fight about, and then leaves you alone until tomorrow. A think tank could produce that. A very dedicated journalist could produce that. The AI is how it gets produced cheaply enough to give away, which is the only reason it exists, but it's not why you'd read it. If your product only holds up while the AI is still a novelty, you don't have a product yet. You have a fart app with a subscription page.&lt;/p&gt;

&lt;p&gt;That's not a modest role for the model to play. Databases don't get enough credit either. But it is an honest one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The &lt;a href="https://dev.to/"&gt;Citizen's Daily Brief&lt;/a&gt; is a free daily intelligence briefing from &lt;a href="https://stalefishlabs.com" rel="noopener noreferrer"&gt;Stalefish Labs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Pitching a Card Game to 70 Dead Retailers</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Tue, 07 Jul 2026 20:33:32 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/pitching-a-card-game-to-70-dead-retailers-1b7j</link>
      <guid>https://dev.to/stalefishlabs/pitching-a-card-game-to-70-dead-retailers-1b7j</guid>
      <description>&lt;p&gt;There's a folder sitting on my computer in the Tall Tales project named, with no imagination whatsoever, "Cover Letters." Inside are 113 of them, written across 2002 and 2003, most addressed by hand to a specific buyer at a specific retail chain I hoped would carry the game — about seventy retailers in all, since the bigger chains got more than one letter. I looked the addresses up one at a time and tailored every letter. Most of those companies are now dead.&lt;/p&gt;

&lt;p&gt;Not struggling. Not pivoting. Gone.&lt;/p&gt;

&lt;p&gt;Tower Records. KB Toys. Blockbuster. Hollywood Video. Borders. Zany Brainy. Musicland. The Discovery Channel Stores. I pitched all of them. FAO Schwarz, which has changed hands so many times since that the name now means more than the company does. Spencer Gifts, which mostly lives online and in the few malls that somehow outlasted the rest. Reading the list back is less a review of a sales campaign than a walk through a cemetery where I happen to know every name on the stones.&lt;/p&gt;

&lt;p&gt;There's a shorter list that stings a little more: the retailers that are still standing and still said no. Walgreens. REI. Cabela's. Bass Pro. Hallmark. Barnes &amp;amp; Noble. Target. Caribou Coffee. Peet's. There's no era-ended excuse to soften those. No casket I can look at and delusionally think, "my game might've saved them." No, they're still out there selling things today. The thing they declined to sell was mine.&lt;/p&gt;

&lt;p&gt;Partway through the campaign I decided the way to cut through was to write to people instead of companies, and those letters are the best thing in the folder. The idea was an end-around on the corporate buyers: drum up interest directly with people tied to the game — some named on its cards, some just kindred spirits — and with a few in the press who might talk it up.&lt;/p&gt;

&lt;p&gt;I wrote to G. Gordon Liddy of Watergate infamy — the game had a card about him — and couldn't help adding a note: "Dancing Queen wasn't released until 1976, so you would've really been ahead of your time to have hummed it during the Watergate incident." I wrote to Penn &amp;amp; Teller, pitching Tall Tales as "a game in the same spirit as your show &lt;em&gt;Bullshit!&lt;/em&gt;" I wrote to Terry Gross at &lt;em&gt;Fresh Air&lt;/em&gt; with a line I still mostly believe: "we like to think we're resurrecting the lost art of storytelling."&lt;/p&gt;

&lt;p&gt;None of the people answered. A few stores did.&lt;/p&gt;

&lt;p&gt;That's the quietly brutal part. Out of 113 letters, the return was a thin scatter of form rejections and, mostly, silence. Two addresses turned into something real. Starbucks wrote back, evaluated the game, and passed — a near-miss with &lt;a href="https://dev.to/read/how-tall-tales-almost-ended-up-in-starbucks/"&gt;its own story&lt;/a&gt;. Cracker Barrel went further than any of them: I met the founder/CEO and designed a custom edition of the game before they ultimately decided to pass. That one earned &lt;a href="https://dev.to/read/the-cracker-barrel-edition-that-almost-was/"&gt;its own story&lt;/a&gt;, too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/two-replies-in-113.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/two-replies-in-113.png" title="113 letters out. Two real replies — one of them nearly a yes." alt="A grid of 113 small envelopes, all silent charcoal but two picked out in green" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what I couldn't see then and can't unsee now. In 2002, mailing 113 letters to toy buyers, music chains, outdoor outfitters, Watergate burglars, and magicians was a real distribution strategy. There were that many doors, and a small company with a clever product and a roll of stamps could plausibly reach a national shelf. Run the same campaign in 2026 and it falls apart on contact. Half the companies don't exist. The survivors buy through distributors and category managers stacked ten deep, and a cold letter from a one-person game company would reach a recycling bin, assuming it arrived at all. The road I was walking got paved over. That doesn't even touch the weirdness of mailing a physical letter to a celebrity now.&lt;/p&gt;

&lt;p&gt;So the folder has become something other than a sales archive. It's a core sample of a specific American retail moment — the one just before big-box consolidation and the internet finished rearranging the shelves. 113 envelopes to seventy-odd retailers, a whole landscape of places you could once walk into and find a strange little card game. Most of those places are gone now.&lt;/p&gt;

&lt;p&gt;The letters outlived the companies they were written to. I kept them anyway, the way I kept the games.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Guardrails, Not Gatekeepers</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Fri, 26 Jun 2026 05:04:47 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/guardrails-not-gatekeepers-44f4</link>
      <guid>https://dev.to/stalefishlabs/guardrails-not-gatekeepers-44f4</guid>
      <description>&lt;p&gt;The Citizen's Daily Brief has no human editor. No one reviews the assessments before publication. No one approves the significance rankings. No one checks whether the confidence levels feel right. The pipeline runs, the brief publishes, and readers see the output of an entirely automated system.&lt;/p&gt;

&lt;p&gt;That sounds reckless. It isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Editorial Instinct
&lt;/h2&gt;

&lt;p&gt;The first version of the pipeline had a manual human review step. After synthesis, the brief items were written to a staging table, and I'd review them each morning before flipping them to "published." It was comfortable. I could catch errors, adjust wording, add context. I felt like a responsible steward of the product.&lt;/p&gt;

&lt;p&gt;It lasted three days. On day four, I realized the review step was doing two things: occasionally catching formatting issues (the LLM forgot a field, a headline was too long) and making me feel better. The formatting issues were mechanical — I was doing the same checks every time. And the "feeling better" part was actually the problem.&lt;/p&gt;

&lt;p&gt;Because what I was really doing was applying editorial judgment to the output. Did this assessment feel right? Was the confidence level appropriate? Should this story really be ranked above that one? These are the exact kinds of subjective editorial decisions that the pipeline was designed to make transparent and systematic. By inserting myself as a reviewer, I was undermining the system's consistency and putting a human hand back in the output, one readers couldn't see and couldn't audit. That hand was the exact thing the CDB was built to remove.&lt;/p&gt;

&lt;p&gt;So I replaced myself with a validator. Mechanical rules. No judgment, no feelings, no editorial instinct. Just constraints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/desk-empty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/desk-empty.png" title="The morning review lasted three days. Nobody sits here now; the brief ships anyway." alt="An empty desk by a window in early light: a closed laptop, a cold mug, the chair pushed back" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Validator Checks
&lt;/h2&gt;

&lt;p&gt;The validator is a Python module that runs after synthesis and before publication. It checks every brief item against a set of structural rules, and it either passes or fails each item. There's no "close enough." There's no "use your best judgment." It's binary.&lt;/p&gt;

&lt;p&gt;The first checks are structural. Every required field has to be present and non-empty: headline, what_changed, why_it_matters, confidence, agreement, all mandatory. (The what_to_watch field is nullable; some days there genuinely isn't a clear next step to watch for.) This catches the occasional LLM omission where a field comes back present but empty. Length limits sit alongside the schema. Headlines run under 200 characters, what_changed is held to one to three sentences, why_it_matters can't exceed a paragraph. The format is built for fast reading, and an LLM given room will happily write three paragraphs where one would do. The limit is "be concise" rewritten as something a machine can enforce.&lt;/p&gt;

&lt;p&gt;Then the check that does the most work: trust signal consistency. High confidence requires two or more independent sources. You can't claim it from a single report. That's moderate at best, and the validator says so. "Broad agreement" works the same way; it takes multiple sources actually agreeing, and one source can't agree with itself. The rule exists because the LLM sometimes over-indexes on a single strong source. If the White House issues a clear, detailed statement, the model might reach for high confidence because the source is authoritative. Authoritative or not, single-source confidence is moderate by definition, full stop. The White House might be wrong, might be incomplete, might be framing strategically. High confidence requires independent confirmation.&lt;/p&gt;

&lt;p&gt;The last shape rule the validator enforces is a floor. A valid brief needs at least three items; if fewer than three clear every other check, the whole brief is skipped, so a source outage or a quiet news day can't ship readers one or two items that don't add up to a picture of anything. There's a ceiling too — nine items — but the validator never checks it. That limit lives upstream, at selection, where the model is told to mark at most the nine most significant stories and to prefer fewer on a quiet day. The floor is a hard gate; the ceiling is a guideline the brief rarely reaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Publish Nothing" Principle
&lt;/h2&gt;

&lt;p&gt;The validator's response to a failed check is simple. Nothing publishes. Better no item than an incomplete one.&lt;/p&gt;

&lt;p&gt;If an individual item fails validation, it's dropped. The remaining items are renumbered and checked against the minimum count. If the brief still has three or more valid items, it publishes without the failed item. If it drops below three, the entire brief is skipped for the day.&lt;/p&gt;

&lt;p&gt;This is the "publish nothing rather than publish garbage" principle, taken from intelligence analysis, where an assessment that can't meet the sourcing and confidence bar is held back rather than shipped with a hedge attached. A briefing that carries a wrong or weak call is worse than no briefing at all, because the bad call could get acted on. Better to skip a day and keep the trust contract intact than to publish something under the bar.&lt;/p&gt;

&lt;p&gt;In practice, this has triggered twice during testing. Both times, a source outage produced an unusually thin input set (fewer than ten source records when the pipeline normally ingests twenty to thirty), and the resulting clusters didn't produce enough significant stories to fill a brief. Both times, skipping was the right call. A three-item brief based on a handful of sources wouldn't have met the product's standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Mechanical Beats Editorial
&lt;/h2&gt;

&lt;p&gt;Once I decided high confidence takes two or more sources, that became true for every item, every day. A human editor would hold to it most mornings, and "most mornings" is exactly the gap. Say the only source on a Federal Reserve rate decision is the Fed itself — authoritative, detailed, the kind of source a careful editor waves through on instinct. The validator has no instinct. It counts sources, finds one, marks the confidence down to moderate.&lt;/p&gt;

&lt;p&gt;This consistency is the point. If "high confidence" meant one thing on a Tuesday and another on a Friday, or one thing rested and another rushed, the term would be worth nothing. Mechanical validation is what keeps it worth something: every trust signal in every brief, measured against the same criteria.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/same-line.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/same-line.png" title="The same bar, every item, every day. That flat line is the whole product." alt="A row of identical cylinders filled to exactly the same line, their levels forming one straight horizontal" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rule underneath all of this: an editorial decision you can write as code is one you make once, deliberately, and one a reader can audit later. If a quality criterion requires subjective judgment — "does this assessment feel balanced?" — it's not a criterion, it's a vibe. And vibes don't scale, don't reproduce, and don't earn trust. A constraint you can express as a Boolean check in Python is a constraint that readers can understand, evaluate, and trust. It still strikes me as odd, even having created this thing, that this is a decision system where the cold, binary logic of a machine is a better option than a careful, conscientious human.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints as Design Decisions
&lt;/h2&gt;

&lt;p&gt;Every rule in the validator started as a question I asked about quality, and the answer got encoded permanently.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Should a brief item be allowed to claim high confidence based on a single source?&lt;/em&gt; No. → Rule: &lt;code&gt;if confidence == "high" and source_count &amp;lt; 2: fail&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Should items be allowed to have empty "what changed" fields?&lt;/em&gt; No, because "what changed" is the most important field — it's the reason the item exists. → Rule: &lt;code&gt;if not what_changed or len(what_changed.strip()) == 0: fail&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Should headlines be allowed to be arbitrarily long?&lt;/em&gt; No, because long headlines aren't headlines — they're summaries wearing a headline costume. → Rule: &lt;code&gt;if len(headline) &amp;gt; 200: fail&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Should a brief with only two items be published?&lt;/em&gt; No, because two items doesn't give readers a meaningful picture of the day. → Rule: &lt;code&gt;if len(valid_items) &amp;lt; 3: skip_brief()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Each of these is a judgment call. But they're judgment calls made once, deliberately, with time to think — not judgment calls made at 5 AM under time pressure while reviewing a specific brief's output. The validator is the accumulation of my best editorial thinking, frozen in code where it applies consistently forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Validator Can't Catch
&lt;/h2&gt;

&lt;p&gt;The validator is not a fact-checker. It can't verify that the LLM's assessments are accurate. It can't determine whether "why it matters" is insightful or obvious. It can't judge whether the significance rankings reflect the day's actual priorities. And that's not its job.&lt;/p&gt;

&lt;p&gt;These are real limitations. The system's defenses against analytical errors are different from validation: they're the constrained input (curated sources, not the open web), the structured prompts (tight field constraints that reduce the surface area for hallucination), and the trust signals (which give readers the tools to evaluate each assessment themselves).&lt;/p&gt;

&lt;p&gt;The validator handles the structural layer. Did the output conform to the schema? Are the trust signals internally consistent? Are the field lengths within bounds? These are the questions that mechanical rules can answer, and answering them mechanically is more reliable than answering them editorially.&lt;/p&gt;

&lt;p&gt;The analytical layer — is this assessment correct? — is ultimately a question for readers. The validator ensures they receive well-structured, internally consistent items. The evidence panel ensures they have the data to evaluate those items. The methodology page ensures they understand how the system works. Together, they hand the gatekeeping to readers themselves. No human stands in for them.&lt;/p&gt;

&lt;p&gt;Guardrails, not gatekeepers. A gatekeeper makes calls no one else can see. A guardrail is a rule on the methodology page, in plain Python, applied the same way every morning, and any reader who doubts a call can pull it up and check it. The CDB has no editor. It also has nothing an editor would have kept off the page.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The &lt;a href="https://dev.to/"&gt;Citizen's Daily Brief&lt;/a&gt; is a free daily intelligence briefing from &lt;a href="https://stalefishlabs.com" rel="noopener noreferrer"&gt;Stalefish Labs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deliberately Boring by Design</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Fri, 26 Jun 2026 05:04:46 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/deliberately-boring-by-design-bda</link>
      <guid>https://dev.to/stalefishlabs/deliberately-boring-by-design-bda</guid>
      <description>&lt;p&gt;Every app I've built at Stalefish Labs has personality, and the underlying purpose of each has usually tilted toward fun. Ridewise transforms weather data into trail conditions to get you outside riding with friends. Muster in many ways acts as a session-based Instagram for helping people get together and share experiences. Even a smaller web experiment like the Jump Simulator, which is fundamentally a physics calculator, has ghost trails and animated motorcycles flying through the air. It's kind of a modern &lt;a href="https://youtu.be/vCimuL6tGTM?si=SyJZkg5QzpgyDIF2&amp;amp;t=259" rel="noopener noreferrer"&gt;Fuji Hakayito&lt;/a&gt; that hopefully doesn't lead to epic jump fails in real life. What I'm saying is I like making things that are fun to use.&lt;/p&gt;

&lt;p&gt;The Citizen's Daily Brief has none of that. And it's the most interesting design decision I've made.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Anti-Pattern Pattern
&lt;/h2&gt;

&lt;p&gt;Open the Daily Brief and you'll find a single column of text on a near-white background. Serif typeface. No hero images. No cards with rounded corners and subtle shadows. No gradient accents. No animated transitions. No skeleton loading screens. The whole thing looks like it was printed on government letterhead and scanned to PDF, except it's implemented as a website and iOS and Android apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/cdb-brief.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/cdb-brief.png" title="One brief item — Georgia for the assessment, sans-serif for the scaffolding, and no photo to tell you how to feel about it." alt="A Citizen's Daily Brief item: a serif headline and body in a single column with no images, above a sans-serif source timeline" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The toned-down design wasn't laziness or a placeholder that stuck. Every element of the design is a conscious rejection of something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No personalization.&lt;/strong&gt; Everyone gets the same brief. Your brief is my brief is everyone's brief. There's no algorithm deciding you care more about tech than foreign policy, no engagement model learning that you linger on economic stories. One brief, one audience, one shared reality. No personalized information bubble.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No engagement optimization.&lt;/strong&gt; Nothing is designed to keep you on the page. No related stories sidebar. No "you might also like" recommendations. No notifications begging you to come back and stay a while. The ideal user session is: open, read, close, go live your life.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No hero images.&lt;/strong&gt; News images are editorial choices disguised as objectivity. A protest photo can frame the same event as righteous or chaotic depending on the shot. The brief has no images because images are opinions wearing the costume of documentation. Text forces you to engage with what happened rather than how a photo editor decided it should feel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No infinite scroll.&lt;/strong&gt; The brief has between five and seven items. You read them, and you're done. There is no "more content below the fold" because there is no fold. The brief is finite. There's one a day, and each one ends. That's the feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Boring Is the Point
&lt;/h2&gt;

&lt;p&gt;The aesthetic isn't arbitrary. It's a big part of the idea.&lt;/p&gt;

&lt;p&gt;The Citizen's Daily Brief is modeled on the President's Daily Brief, the intelligence document delivered to the U.S. President every morning. The PDB isn't designed to be engaging. It's designed to be trusted. It communicates through structure, precision, and restraint. It says: this is what we think you need to know, this is how confident we are, and this is what we don't know. The format is the credibility.&lt;/p&gt;

&lt;p&gt;When I started designing the CDB, I prototyped a version with visual cards for a nicer layout. Each brief item was a styled card with a topic tag pill, a headline, expandable sections, and a colored confidence indicator. It looked like a modern news app. It looked &lt;em&gt;great&lt;/em&gt;. And although it was pretty, it felt completely wrong.&lt;/p&gt;

&lt;p&gt;The visual polish created an expectation of entertainment. I worried readers would approach it the way they approach any well-designed content feed — skimming for what catches their eye, looking for the most interesting card, treating it as a buffet. But the brief is a checklist. Every item is there because the system carefully determined it matters, and the order is the order of significance. Skimming defeats the purpose.&lt;/p&gt;

&lt;p&gt;The institutional aesthetic solves this. When something looks like a government report, you read it like a government report. Top to bottom, item by item, with the implicit understanding that someone (or in this case, some &lt;em&gt;thing&lt;/em&gt;) already did the work of deciding what matters and in what order. You're not browsing. You're being briefed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonts for Comprehension
&lt;/h2&gt;

&lt;p&gt;The typeface choice tells you everything about the intent. The body text is set in Georgia, a serif face that says "document" and "permanence." It's the typeface of printed reports, academic papers, and the kind of writing that expects to be taken seriously. Almost every modern app and news site has moved to sans-serif faces — Inter, SF Pro, Roboto — because they feel clean, fast, and contemporary.&lt;/p&gt;

&lt;p&gt;Georgia feels slow. That's the point. You read Georgia at the speed of comprehension, not the speed of scrolling.&lt;/p&gt;

&lt;p&gt;The metadata — topic tags, dates, confidence labels — uses a sans-serif. This creates a visual hierarchy that separates the institutional voice of the assessment from the mechanical voice of the system's metadata. The brief items speak in Georgia. The scaffolding speaks in sans-serif. When content is stripped bare, you process it differently without thinking about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Color Non-Palette
&lt;/h2&gt;

&lt;p&gt;The CDB uses exactly two colors: near-black text on a near-white background, with a single accent of slate blue for interactive elements and topic tags. Not pure black on pure white (that's actually harder to read), not the warm off-whites that lifestyle brands use, and certainly not a kaleidoscope of dopamine-grasping color. The CDB uses a cool, institutional near-white that reads as "official."&lt;/p&gt;

&lt;p&gt;The slate blue (#2c4a6e) was chosen specifically because it's boring. It doesn't evoke tech (that would be a brighter blue), it doesn't evoke urgency (that would be red), and it doesn't evoke nature or wellness (that would be green or teal). And I'm a guy who can't get enough earth tones, but I wanted a "just the facts" look here. So it evokes... filing cabinets. Government websites. The blue of a seal on an official document. It's a color that communicates authority through its complete lack of personality.&lt;/p&gt;

&lt;p&gt;There are no gradients. The brief items cast no shadows. No color-coded categories. The trust signal indicators use bars rather than color alone, because one of the accessibility rules I follow is never relying solely on color to convey information. But even without that rule, I'd have avoided it. Color-coding news categories is an editorial choice — it teaches readers that "politics" is red and "technology" is blue, creating categorical associations that the brief deliberately avoids.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Costs to Be Boring
&lt;/h2&gt;

&lt;p&gt;Oddly enough, I learned that restraint is more work than expression. Every modern CSS framework, every component library, every design system is optimized for making things look polished and engaging. Building something that looks deliberately institutional means fighting your tools at every step.&lt;/p&gt;

&lt;p&gt;I stripped the shadows off the brief items that carried them by default. I overrode the border-radius values that rounded the reading surface automatically. I resisted transition animations that made elements fade and slide. I kept links to a quiet treatment: slate blue, underlined on hover, with none of the sliding underline animations modern sites layer on. The short timeline of dated developments that runs under each brief item reads as plain monochrome dots, not the colored, animated progress rail the component shipped with.&lt;/p&gt;

&lt;p&gt;The evidence panel — the expandable section under each brief item that shows its sources, how strongly they agree, and how each camp framed the story — was the hardest to keep boring. It's full of data that begs to be charted: confidence and agreement levels, source counts, a breakdown of framing across the spectrum. Every instinct says to make these visually rich. Instead, they're rendered in the same institutional style as everything else. Simple bars. Plain checklists. Labeled paragraphs. The data speaks for itself without visual embellishment telling you how to feel about it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/cdb-evidence.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/cdb-evidence.png" title="The evidence panel: confidence, agreement, common ground, and framing — rich data, rendered in plain bars and text." alt="The expandable evidence panel showing confidence and agreement bars, a common-ground checklist, and how the story was framed across outlets" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contrast Is the Brand
&lt;/h2&gt;

&lt;p&gt;Here's the thing that makes all this work: the Citizen's Daily Brief exists in a portfolio alongside apps with personality. Open Wheelers has fantasy F1 animations and visual stats that show which drivers have scored you the most points and where your picks overlapped with rival managers. Muster has interactive in-or-out declarations and post-session media sharing and comments. The Ramp Designer has a 3D rendered skateboard ramp you can flip, spin, and explode. Sojourn paints a rich, layered bedtime storytelling experience complete with reader-triggered audio foley effects and subtle fireflies lingering in the interstitial animations. When someone discovers that the same studio made &lt;em&gt;all of these things&lt;/em&gt;, the CDB's austerity becomes a statement rather than a limitation.&lt;/p&gt;

&lt;p&gt;It says: we know how to make things engaging. We chose not to. And that choice is itself the most engaging thing about the product.&lt;/p&gt;

&lt;p&gt;The design philosophy is countercultural. In an attention economy where every app fights to monetize your time, the CDB is designed to give your time back. Most products signal credibility through visual sophistication; this one earns it through the quality of its assessments and the transparency of its reasoning. The design world's highest compliment is "delight." The CDB aims for something rarer: trust.&lt;/p&gt;

&lt;p&gt;Restraint is harder than flourish, and for a product asking to be trusted, it's the whole job. The brief shows up, tells you what it thinks you need to know, and gets out of the way. Then it waits until tomorrow.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The &lt;a href="https://dev.to/"&gt;Citizen's Daily Brief&lt;/a&gt; is a free daily intelligence briefing from &lt;a href="https://stalefishlabs.com" rel="noopener noreferrer"&gt;Stalefish Labs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Using Fun to Repair the American Family</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Wed, 24 Jun 2026 13:30:42 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/using-fun-to-repair-the-american-family-gm5</link>
      <guid>https://dev.to/stalefishlabs/using-fun-to-repair-the-american-family-gm5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mama used to roll her hair, back before the central air. We'd sit outside and watch the stars at night. She'd tell me to make a wish, and I'd wish we both could fly. Don't think she's seen the sky, since we got the satellite dish.&lt;/em&gt;&lt;br&gt;
— James McMurtry, "Levelland"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Decline of the American Front Porch
&lt;/h2&gt;

&lt;p&gt;Prior to World War II, the front porch represented the American ideal of family. The porch, in essence, was an outdoor living room, where the family could retire after the activities of a long day. In the evenings, as the outdoor air provided a cool alternative to the stuffy indoor temperatures, the entire family would move to the front porch. The children might play in the front yard or the friendly confines of the neighborhood, while the parents rocked in their chairs, dismissing the arduous labors and tasks of the day into relaxation and comfort. Stories might be told, advice garnered, or songs sung. What the family room of post World War II America would become, existed first as the front porch.&lt;/p&gt;

&lt;p&gt;The porch did something else as well, something easy to overlook now that the porches are mostly gone. It faced the street. A porch was a room with one wall left open, and a whole block of them turned an ordinary street into something larger than a row of houses. Neighbors passing on the sidewalk were in plain view and near enough to greet; a wave could slow into a conversation, and a conversation could end with someone climbing the steps to sit a while. News and gossip and small kindnesses moved house to house in the evening air. Children roamed the block under the loose, shared attention of every adult sitting out, all of whom knew whose child was whose. So the front porch did more than move a family outdoors for the evening. Every household sat in view of every other, night after night, and out of that ordinary visibility a neighborhood held itself together.&lt;/p&gt;

&lt;p&gt;In the period immediately after World War II, the American front porch became a relic of the past, an architectural feature and cultural symbol no longer important to Americans. The primary technological change that spurred this abandonment of the front porch was the proliferation of the American automobile. The new technological development of air conditioning further aided in the decline of the front porch. Providing a cool(er) environment indoors, the front porch was no longer needed as a cool shaded area during the day or as a place to enjoy the cool night air. Families remained indoors comfortably, and a primary use of the front porch was no longer needed. Air conditioning, in a sense, also contributed to another technological development which would affect the front porch: the television. The television, which could exist only inside, provided endless hours of entertainment indoors. As a result, family life shifted from the porch to a family room or television room, where families could watch the evening news, sporting events, or the early sitcoms, all while enjoying the newly invented "television dinner." No longer would families relax outside on the front porch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/porch-gone-dark.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/porch-gone-dark.png" title="Don't think she's seen the sky, since we got the satellite dish." alt="A porch gone dark, the stars washed out by the glow indoors" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;America had become overtly more individualistic and less community oriented during this period. At the same time, the traditional American importance given to the family had declined. Familial structure and relations had changed, lending to less family interaction and family time. While this connection to the decline of the front porch is a stretch, it certainly may have played a role.&lt;/p&gt;

&lt;p&gt;By the 1960's, the front porch had disappeared in the new architectural forms and houses sweeping the country. Technological and cultural forces had pushed porches to the back or side yard, or had eliminated them altogether. American society had changed, and with this change the front porch no longer stood as an American cultural symbol. Few Americans noticed this change, and the front porch disappeared into the realm of American memory. In many ways, family interaction disappeared along with front porches.&lt;/p&gt;

&lt;p&gt;We don't say any of this to wish the era back. That world was, for a great many people, a worse one to live in, and its neighborly streets were never equally open to everyone who might have walked down them. What disappeared that we'd actually want returned is narrow: the plain habit of being in easy view of other people, evening after evening. That habit belongs to no particular decade, which is the only reason we think it can be had again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bringing Families Back Together
&lt;/h2&gt;

&lt;p&gt;So, is the solution to the problem of lost family interaction to lead a porch building campaign across the country? Probably not. America has permanently changed since the days when the front porch served as the glue holding our communities together. However, this doesn't mean that the fight to restore interaction to families has been lost. The challenge is to figure out ways to work with and around technology to bring people together in different ways.&lt;/p&gt;

&lt;p&gt;Technology really isn't a bad thing, we just need to figure out when and where it is the most beneficial in our lives. It isn't too hard to see that a family that sits in front of the television every night will be less connected than a family that communicates around a dinner table. Or more to the point, a family that plays a social game together will have shared more and grown closer than a family that goes to watch a movie.&lt;/p&gt;

&lt;p&gt;America is a highly entertainment driven culture, and we don't aim to change that. In fact, we're all for entertainment. What we're suggesting is that people entertain themselves in ways that help enrich the relationships they have with other people. We've found that one of the best forms of entertainment for fostering relationships is traditional games such as board games, trivia games, scavenger hunts, and the like. We regularly play such games at gatherings with friends and family. We've found that people are pleasantly surprised at how much fun it can be to connect with other people socially in the context of a game.&lt;/p&gt;

&lt;p&gt;The fact of the matter is that you really don't need a front porch to become a part of your community or get closer to your family and friends. You just need to make an effort to interact with them, preferably in a fun setting.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's a Vital Part of Growing Up
&lt;/h2&gt;

&lt;p&gt;Watch a child play a game. It looks like nothing — like time being pleasantly killed. It isn't. The six-year-old losing at Candy Land is learning that the world doesn't always break her way, and that you stay at the table anyway. The boy fidgeting through someone else's turn is practicing the single hardest thing a small person ever has to do, which is wait. Kids at a game are settling rules, catching each other cheating, arguing out what counts as fair, and reading the face across the board to decide whether a bluff is real. None of that is printed on the box. All of it is the point.&lt;/p&gt;

&lt;p&gt;Play is how people learn to be people. It is the first safe place a child gets to try on cooperation and competition and get them wrong without anything real breaking. You can lose at checkers and the sun still comes up the next morning. You can win and discover, fast, that gloating costs you the next invitation. The stakes are small enough to risk and big enough to teach — which happens to be exactly the size of stakes a person grows on.&lt;/p&gt;

&lt;p&gt;We never stop needing that. A family around a card table is doing the same work the children are: a teenager and a grandfather made briefly equal, both at the mercy of the same rules and the same rotten luck of the draw. A couple can learn more about each other over a board on a quiet Tuesday than over a month of sitting side by side facing the same screen. The reunion that might have been an afternoon of careful small talk turns instead into a tournament nobody shuts up about for the next ten years. A good game hands people a reason to stay in the same room and something to do once they're in it. For anyone who has ever run dry of things to say to someone they love, that is no small gift.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/equal-at-the-table.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/equal-at-the-table.png" title="Made briefly equal — same rules, same rotten luck of the draw." alt="A teenager and a grandfather, made briefly equal by the same cards" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the part the front porch used to handle without anyone naming it. The porch wasn't magic. It was a place that made staying together easy and gave people something to do while they did it. Take away the porch and the need stays right where it was. What's gone is the easy way of meeting it, so the need goes looking for somewhere else to land.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Build Games
&lt;/h2&gt;

&lt;p&gt;Here is what we are for. We make games because a good one does something almost nothing else does this cheaply or this well: it gets people to look at each other. Set a deck of cards down between two people who have run out of things to say, and watch them find something. That is the entire business we are in. It is also, as it happens, why a company that wants to repair the American family would start by &lt;a href="https://dev.to/play/talltales/"&gt;making a game&lt;/a&gt; rather than building a porch.&lt;/p&gt;

&lt;p&gt;We have nothing against the television, or the automobile, or the cool dry air pouring out of the vents. They won. They were never really the enemy, and we have no interest in fighting a war we'd lose and shouldn't win. What we'd like to fix is smaller and a lot closer to home: the ordinary evening that quietly dissolves into everyone alone in the same house. There's a cure for that, and you can hold it in two hands and set it on a table.&lt;/p&gt;

&lt;p&gt;You don't need a porch. You need a table, a few people you'd like to know a little better, and a reason to stay a while longer. We intend to spend our years making the reason. Pull up a chair.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;A note, added much later. We drafted this in our founding year, when the screen we worried about was the one in the living room. There are more screens now, and they are far better company than any television ever managed to be — in your pocket, tuned to you, refreshed without end, and lately able to answer back when you talk to it. The first social network in this country ran on front porches, open to the street and refreshed each evening by whoever happened to walk past. We have spent the decades since rebuilding it indoors, behind glass. None of that softens the argument. It sharpens it. The question we started with is the one still on the table: when, and where, does the technology actually carry you toward the people in the room instead of away from them? We began as a game company and grew into something wider, a studio for whatever seems worth making — from that first printed deck to a skate ramp you design on a screen and then go build, to a jump simulator, to apps and odd little web experiments that have nothing to do with cards. The form keeps changing; the job underneath it hasn't. Get people into the same room, the same yard, the same patch of real ground. That is still the porch's old work, and still the wager behind everything we make.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Thirty-Four Feeds and a Philosophy</title>
      <dc:creator>Stalefish Labs</dc:creator>
      <pubDate>Tue, 23 Jun 2026 21:00:39 +0000</pubDate>
      <link>https://dev.to/stalefishlabs/thirty-four-feeds-and-a-philosophy-5fd4</link>
      <guid>https://dev.to/stalefishlabs/thirty-four-feeds-and-a-philosophy-5fd4</guid>
      <description>&lt;p&gt;The Citizen's Daily Brief ingests news from thirty-four RSS feeds. That number started at twenty-seven, and grew incrementally during testing. It grew because the original list had a gap that would have undermined credibility: it didn't include enough sources from across the political spectrum to claim it was seeing the full picture. The CDB isn't a political product — it's apolitical by design, and keeping it that way meant expanding the source feeds.&lt;/p&gt;

&lt;p&gt;The source strategy is one of the most opinionated decisions in the project, and it's worth explaining not just what the sources are but why the list looks the way it does, and what changed when I realized the initial philosophy was incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  The List
&lt;/h2&gt;

&lt;p&gt;The thirty-four feeds fall into three tiers based on what kind of content they provide:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 1: Full-text, free access sources.&lt;/strong&gt; These are outlets where the RSS feed provides substantial content — headlines, summaries, and often full article text — without requiring a subscription or scraping. (No scraping anywhere in the pipeline, by the way — more on that later.) This tier includes government sources (White House, Federal Reserve, Congress.gov), international outlets (BBC World and BBC US/Canada, The Guardian US and World editions, Al Jazeera), public broadcasting and national news (NPR, PBS NewsHour, ABC News, CBS News), specialist publications (SCOTUSblog, ProPublica, Defense One, STAT News, Carbon Brief), and tech (Ars Technica).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 2: Metadata via Google News filters and direct feeds.&lt;/strong&gt; For wire services and outlets that don't offer rich RSS feeds, the pipeline pulls metadata — headlines, publication timestamps, and short summaries — through Google News topic filters or direct RSS. This covers AP, Reuters, Financial Times, Wall Street Journal, The Hill, Politico, War on the Rocks, The Verge, Fox News, New York Post, Washington Examiner, Daily Wire, Breitbart, National Review, and MSNBC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 3: Breadth signal.&lt;/strong&gt; Google News Top Stories serves as a general-purpose signal for what the broader media landscape considers significant. It's not a primary source for any assessment, but it helps the clustering algorithm identify stories that are getting widespread attention even if they're not covered by the Tier 1 sources. Keep in mind that's a key requirement of the CDB: actually figuring out what qualifies as legit news you need to be aware of, separating signal from noise.&lt;/p&gt;

&lt;p&gt;That's it. Thirty-four feeds, publicly disclosed, using only RSS and public APIs. No scraping, no expensive subscriptions, no API keys to news providers, no behind-the-scenes data deals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ingest Broadly, Weight by Diversity
&lt;/h2&gt;

&lt;p&gt;The original version of the CDB ingested from twenty-seven sources. The list was carefully curated but had a structural blind spot: it included no explicitly partisan outlets from either side. Early on I thought that might be a benefit, but I later came to view it as a fail. No Fox News, no Breitbart, no MSNBC. The reasoning was sound on its face — opinion-primary outlets add editorial framing that complicates the clustering step, and excluding them kept the input clean.&lt;/p&gt;

&lt;p&gt;The problem became clear when I thought about what happens downstream. The CDB claims to tell you "the most significant things that happened today." But if the source pool doesn't include outlets that millions of Americans actually read, the system can't detect stories that those outlets emphasize. A story that Fox News, the Washington Examiner, and the Daily Wire all lead with — but that NPR and the Guardian ignore — is invisible to a pipeline that only ingests NPR and the Guardian. That's not a clean input set. That's a blind spot. And a key motivator of the CDB from the outset was to pierce the information bubbles we all too easily live inside.&lt;/p&gt;

&lt;p&gt;So the principle shifted: &lt;strong&gt;ingest broadly, weight by editorial diversity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Partisan sources belong in the ingestion pool. They help the pipeline see stories that only one side of the spectrum covers. But significance should not be inflated by volume from a single editorial perspective. When five outlets that share the same editorial stance all cover the same story, that's not five independent signals — it's one signal amplified five times.&lt;/p&gt;

&lt;p&gt;This is where editorial perspectives come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Editorial Perspectives
&lt;/h2&gt;

&lt;p&gt;Every source in the CDB's feed list is tagged with an &lt;code&gt;editorial_perspective&lt;/code&gt; — a label that identifies which editorial grouping the outlet belongs to. These aren't bias labels, even though a few of them do reflect bias. They're structural groupings based on observable editorial positioning and the kinds of stories each outlet tends to emphasize.&lt;/p&gt;

&lt;p&gt;The twelve perspective groups are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;wire&lt;/strong&gt; — AP, Reuters. Factual, non-editorial wire services focused on who/what/when/where.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;public_media&lt;/strong&gt; — NPR, PBS NewsHour. US publicly funded outlets with a mandate for balanced coverage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;broadcast&lt;/strong&gt; — ABC News, CBS News. US commercial broadcast networks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;left_leaning&lt;/strong&gt; — The Guardian, ProPublica, MSNBC. Outlets with left-of-center editorial positioning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;right_leaning&lt;/strong&gt; — Fox News, New York Post, Washington Examiner, Daily Wire, Breitbart, National Review. Outlets with right-of-center editorial positioning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;business&lt;/strong&gt; — Wall Street Journal, Financial Times. Business and financial press with market-oriented framing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;international&lt;/strong&gt; — BBC, Al Jazeera. Non-US headquartered international outlets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;political_trade&lt;/strong&gt; — The Hill, Politico. DC insider and political trade press.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;official&lt;/strong&gt; — White House, Federal Reserve, Congress.gov. Government primary sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;specialist&lt;/strong&gt; — SCOTUSblog, STAT News, Defense One, Carbon Brief, War on the Rocks. Domain-specific expert outlets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tech&lt;/strong&gt; — Ars Technica, The Verge. Technology-focused outlets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aggregator&lt;/strong&gt; — Google News Top Stories. Algorithm-curated, not counted as a perspective.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing worth flagging: the perspective list groups by outlet, but the "thirty-four feeds" count is by feed. A few outlets — BBC and The Guardian, for example — contribute multiple regional feeds, which is why the math doesn't line up exactly if you start counting rows.&lt;/p&gt;

&lt;p&gt;The significance scoring system uses these perspective groups to measure editorial diversity. A story covered by four sources across four different perspectives (say, wire + right_leaning + public_media + business) is genuinely more significant than one covered by five sources that all share the same perspective (say, five right_leaning outlets). The pipeline counts distinct perspectives, not distinct URLs.&lt;/p&gt;

&lt;p&gt;Even the most well-intentioned "I read everything" reader can't realistically aggregate this breadth manually, let alone weight stories by perspective distinction on top of it. This is one of those places where AI has a real, structural advantage over a human trying to do the same job. Most of us who proudly claim to "listen to all sides" are quietly outmatched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Consider a story about a proposed regulation. If it's covered by AP (wire), NPR (public_media), Fox News (right_leaning), and the Wall Street Journal (business), that's four editorial perspectives. The story has cross-spectrum significance. Different kinds of outlets, with different audiences and different editorial priorities, all judged it worth covering.&lt;/p&gt;

&lt;p&gt;Now consider a different story covered by Fox News, the Daily Wire, Breitbart, the New York Post, and the Washington Examiner. That's five outlets but one editorial perspective: right_leaning. The story might be genuinely important — or it might be amplified within one editorial ecosystem without resonating across the broader media landscape.&lt;/p&gt;

&lt;p&gt;The old system would have scored the second story higher (five sources beats four). The new system scores the first story higher (four perspectives beats one). This is the correct behavior for a product that claims to assess significance rather than measure attention. The CDB isn't concerned with attention — it's concerned with significance, which (in theory at least) makes it pretty unique as an aggregated information source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wire Service Syndication
&lt;/h2&gt;

&lt;p&gt;There's a subtlety worth naming in how wire services interact with the perspective counting: syndication. Without accounting for it, a single AP story republished by every outlet in the country would look like the most diverse coverage in the world. When AP publishes a story, multiple outlets routinely republish AP's copy, sometimes with their own byline, sometimes crediting AP explicitly. If NPR runs an AP story and CBS runs the same AP story, the pipeline shouldn't count those as three perspectives (wire + public_media + broadcast). It's one perspective (wire) with two republications, not three independent voices.&lt;/p&gt;

&lt;p&gt;The pipeline detects wire service syndication through two methods: explicit wire credits in titles, summaries, or bylines ("[AP]", "(Reuters)", "By Associated Press"), and title similarity matching against known wire articles. Articles identified as syndicated wire copy are tagged so the perspective counter attributes them to the wire perspective rather than their republishing outlet's perspective.&lt;/p&gt;

&lt;p&gt;This prevents the most common source of inflated independence scores: widely syndicated wire copy being counted as independent editorial coverage from each outlet that ran it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Not in the List
&lt;/h2&gt;

&lt;p&gt;The absences are as deliberate as the inclusions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paywalled sources as signals only.&lt;/strong&gt; The Wall Street Journal and Financial Times are included as Tier 2 sources via Google News metadata. Their feeds provide headlines and short summaries — enough for the clustering algorithm to register that a story is getting business and financial coverage, but not enough for the pipeline to build an assessment on their reporting alone. In other words, they can contribute to &lt;em&gt;whether&lt;/em&gt; a story counts as significant (via the business perspective), but not to &lt;em&gt;what the assessment actually says&lt;/em&gt;. The New York Times and Washington Post remain excluded. The principle stands: the CDB's assessments should be built on information that readers can independently verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No social media.&lt;/strong&gt; Twitter, Reddit, and other social platforms are excluded entirely. There's a real cost here — social media is genuinely useful for early signal on breaking stories, and the CDB will sometimes be later to a story than someone scrolling X would be. But for a product whose contract with the reader is confidence and verification, that ambiguity is disqualifying. A trending topic on social media might be genuinely significant, or it might be algorithmically amplified noise, and the CDB's trust contract can't accommodate sources where that distinction is unresolvable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No aggregators beyond the breadth signal.&lt;/strong&gt; Aside from the Google News Tier 3 feed, no aggregation services are included. Aggregators are redistributors, not sources. Including them would inflate source counts without adding genuine perspective diversity. Sources only — aggregating aggregators doesn't add information, it just adds noise that looks like signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RSS Constraint
&lt;/h2&gt;

&lt;p&gt;The entire ingestion layer runs on RSS feeds and public APIs. No scraping. This is a philosophical choice as much as a technical one.&lt;/p&gt;

&lt;p&gt;Scraping creates a legal and ethical gray area that undermines the CDB's credibility. If the product is built on the premise of transparency and trust, building it on scraped data contradicts that premise. RSS feeds are an explicit invitation to consume content programmatically. Scraping is taking content that wasn't offered for that purpose.&lt;/p&gt;

&lt;p&gt;The RSS constraint also keeps the pipeline simple and reliable. RSS feeds are standardized, well-supported, and rarely change their format. Scrapers break constantly — every time a website redesigns, every time a class name changes, every time a CDN configuration shifts. A pipeline that depends on scraping is a pipeline that requires constant maintenance. A pipeline that depends on RSS feeds runs unattended for months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolving the List
&lt;/h2&gt;

&lt;p&gt;You might be wondering at this point: how flexible is the source list? It certainly isn't fixed. It grew from twenty-seven to thirty-four when the need for cross-spectrum coverage became clear, and it may grow again. But additions follow the same principles: maximize diversity across editorial perspectives, prefer full-text over metadata-only, prefer RSS over scraping, and keep the total count manageable enough that full disclosure remains meaningful.&lt;/p&gt;

&lt;p&gt;The most likely future additions are non-English international sources (through translated feeds) and government sources from other major democracies. As sources evolve, each addition will be documented publicly as part of the methodology.&lt;/p&gt;

&lt;p&gt;What won't change is the core principle, the one that took a rewrite to actually land: ingest broadly so no perspective is invisible. Weight by editorial diversity so no single perspective dominates. Thirty-four feeds, twelve perspective groups (eleven of which count toward significance), each one chosen for a reason. That's the source strategy.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The &lt;a href="https://dev.to/"&gt;Citizen's Daily Brief&lt;/a&gt; is a free daily intelligence briefing from &lt;a href="https://stalefishlabs.com" rel="noopener noreferrer"&gt;Stalefish Labs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>software</category>
    </item>
  </channel>
</rss>
