Every date has a hive. What happened on it, who was born on it, what came out on it and today's news all sit in one feed. Whoever turns up buzzes what they think will still matter, and at midnight it seals for good. iPhone app and website. No accounts, no advertising, no analytics.
See the code
Every date has a hive.
Website · How the hive works · What it does not do · The objections, answered · Privacy · Report a vulnerability
Every calendar date has a page. It shows what happened on that date, who was born on it, what was number one, and the day's news, all in one pool. On the date itself, anyone who shows up gets three buzzes to spend on what they think will still matter. At midnight the hive seals, and it can never be edited. Next year the same date opens a new one, and the old one stays readable.
Birthed is a website at birthed.app and an iPhone app in beta on TestFlight, Apple's free app for trying apps before they are on the store. The date is the thing, not the user. There is nothing to buy, no advertising, and no analytics service or third party code of any kind.
The website does not ask for an account and does not store your birthday. The month and day you pick only choose which page to show. A birth year, if you give one, lives in one cookie in your own browser and nowhere else. The iPhone app is different and says so: it sends a month, a day and an optional year to a silent anonymous account. The privacy page has the whole account, and it is edited in the same commit as the code.
| Website | Live at birthed.app. 366 date pages, and a hive on every date from the day before it. |
| iPhone app | In beta on TestFlight, not yet on the App Store. |
| Team | One developer. No company, no funding, no investors. |
| Money | None. Nothing to buy, no subscription, no advertising. |
| Dependencies | The website's server has no runtime packages. The iPhone app has no Swift packages. Neither has analytics, a crash reporter or advertising code. |
| Data | Wikidata, Wikipedia, Wikimedia Commons and public news feeds, each row stamped with its source and license. Where the content comes from. |
| Measuring | The hive is judged on one number: of the people who buzz, how many come back and buzz on a different day. It means nothing until a month of real traffic, which had not started as of September 2026. docs/measuring.md says why. |
CLAUDE.md is the working record: every decision, why it was made, and what
turned out wrong. It is blunt on purpose, and it is the first thing to read
before changing anything.
docs/editorial-pass.md is the plan, and short headlines come with a rule
written down first: shorten the source, never add to it.CLAUDE.md says which rules have a test that has not been run.docs/going-public.md lists the ones that are.CLAUDE.md section 5 records why it was cut./add, the private /admin
pages, and the live hive of a date that is taking buzzes.
web/test/serve.test.ts fails if any other page is allowed to.![]() | ![]() |
| A date page on birthed.app, the hive leading it | The same kind of board on a phone |
![]() | ![]() |
| The picture a hive shares | The card the iPhone app shares |
The specifications are in docs/specs/: PRD.md (what the product is and
refuses to be), SRS.md (numbered requirements) and SDS.md (the design).
Large parts of all three describe the reward catalog, which is on the shelf.
The decisions made since are in CLAUDE.md section 5, and they win where the
two disagree.
Everything with a birthday on a date sits in one pool: that day's news,
historical events, people born on it, and works released on it. The rules are
in docs/the-wall.md, which is the authority for every rule below; the
database enforces them in supabase/migrations/20260909040000_the_wall.sql
and the migrations after it.
wall_boost_budget in the database
is the only place that number lives.worker/src/wall/allocator.ts cuts the board; web/src/hive-allocator.ts
is a plain JavaScript copy used by the live page, and a test holds the two
to the same output on four hundred generated boards.wall_boosts is immutable: its trigger refuses every update and
every delete. Migration 20260911010000_thirty_seconds_to_take_it_back
adds one exception, a buzz taken back within thirty seconds of casting it
on a date that has not sealed; as of September 21, 2026 that migration is
in the repository and not on the live database.The worker's tick, worker/src/wall/tick.ts, runs every fifteen minutes. It
files the date's imported history as stories, reads the public news feeds
listed in worker/src/wall/news.ts, checks every cited source, and writes a
snapshot of the board.
On the website, nothing is stored.
/year handler in web/src/serve.ts
answers the form./add and the live
hive of a date currently taking buzzes; securityFor in web/src/serve.ts
sets the content security policy per path and web/test/serve.test.ts
asserts that no other path may run one. Every other page sends
default-src 'none'.AccountService.pushProfile sends a month, a day, an optional
birth year and an optional typed region to that account. The list of other
people's birthdays a reader adds never leaves the phone; only its length is
sent, as people_added_count.The full account is on the privacy page, which is edited in the same commit as any code that changes what it describes.
| Path | What is in it |
|---|---|
Birthed/ | The iPhone app. Swift 6 with strict concurrency, SwiftUI, minimum target iOS 17. |
Birthed/Domain/ | Pure Swift. It imports Foundation and nothing else, holds the date arithmetic, and carries nearly all of the correctness risk. |
BirthedTests/DomainTests/ | The domain tests. |
Birthed.xcodeproj | The Xcode project. |
Package.swift | A Swift package at the repository root that compiles Birthed/Domain/ and its tests, so they run from a terminal. |
web/ | birthed.app. A Node service that bakes 366 date pages at build time and serves them from disk with no database connection. |
worker/ | The importers and the hive's tick. Node and TypeScript, run in a container on a schedule. |
supabase/migrations/ | Every change to the database, in order. The database is never edited by hand. |
supabase/functions/ | Edge Functions: account deletion, the fact finder, the source finder for the hive, the day scanner, the reach measurer and the one write path for the hive. |
ingestion/ | A Python pipeline for cultural events. Its own README.md says how to run it. |
design/ | The app icon source. |
docs/ | How each decision was reached, including the ones that turned out wrong. |
docs/research/ | The research the decisions rest on. |
docs/specs/ | Product, requirements and design specifications. Large parts describe the reward catalog, which is built in the schema, tested, and unused. |
CLAUDE.md | The working instructions and the decision record. It is blunt about what is broken and what has never been run. |
render.yaml | The two Render services. |
web/package.json and worker/package.json declare >=18.18.0;
Render runs 22.swift test. Xcode 16 or newer to
build the app.ingestion/.cd web
npm install
npm run site
npm run serve
npm run site compiles the TypeScript and bakes the 366 date pages into
web/out/, which is not checked in. It reads the database through the
anonymous key, so it needs SUPABASE_URL and SUPABASE_ANON_KEY in
web/.env; web/.env.example shows the shape. npm run serve starts the
process that serves those pages. npm run og shoots the share images with
Playwright and needs a Chromium download.
cd worker
npm install
npm run build
The worker is a set of scripts, each a script in worker/package.json:
import:day, import:all, import:songs, import:albums, import:films,
import:events, import:culture, wall:seed, wall:news, wall:history,
wall:check, wall:tick, pictures and others. Every one that writes needs
the service role key in worker/.env; worker/.env.example shows the shape.
The service role key bypasses row level security and must never appear in the
app target or in web/.
To try the built app without building it, join the beta on
TestFlight. To build it, open
Birthed.xcodeproj in Xcode. The app reads its two values from
Birthed/Config/Secrets.swift, which is not checked in:
enum Secrets {
static let supabaseURL = URL(string: "https://<project>.supabase.co")!
static let supabaseAnonKey = "<anonymous key>"
}
Migrations are applied with the Supabase command line interface, against a
project you own. docs/going-public.md lists migrations in this repository
that have been written and not applied to the live project.
cd web && npm test
cd worker && npm test
swift test
Each npm test compiles the TypeScript and runs node --test over the
compiled test files. The web tests build a small site under web/test-site/
to serve it. swift test at the repository root compiles Birthed/Domain/
and BirthedTests/DomainTests/ through Package.swift, with no Xcode
target. The app compiles the same domain files through the Xcode project. If
a domain file ever imports a framework, swift test is what fails first.
render.yaml describes two Render services in the Oregon region.
birthed-web, a Node web service. Its build command installs dependencies,
bakes the pages, and shoots the share images. It holds only the anonymous
key. It rebuilds only when something under web/ changes, so a change that
lives in the database needs a manual deploy from the Render dashboard, or
the site keeps serving the pages it was built with.birthed-wall, a cron job built from worker/Dockerfile, running
node dist/src/wall/tick.js every fifteen minutes. It holds the service
role key. Nothing on birthed.app depends on it running; a tick that fails
leaves the hive as it was.The Edge Functions under supabase/functions/ are deployed with the Supabase
command line interface.
docs/specs/SDS.md section 8.1 says why.worker/src/wall/news.ts.web/static/fonts/ under the SIL Open
Font License, which is beside it.Which record was number one on a given date is a fact and cannot be owned. Birthed is not affiliated with Wikipedia, Wikidata, the Wikimedia Foundation, Billboard, Penske Media or Google.
The code is under the GNU Affero General Public License version 3.0, in
LICENSE. Content imported from Wikidata, Wikipedia and Wikimedia Commons
keeps the license of its source, recorded on every row.
536 commits
TypeScript
54.5%
Swift
29.9%
HTML
10.4%
PLpgSQL
3.9%
Python
1.3%
Every date has a hive. What happened on it, who was born on it, what came out on it and today's news all sit in one feed. Whoever turns up buzzes what they think will still matter, and at midnight it seals for good. iPhone app and website. No accounts, no advertising, no analytics.
See the code
Every date has a hive.
Website · How the hive works · What it does not do · The objections, answered · Privacy · Report a vulnerability
Every calendar date has a page. It shows what happened on that date, who was born on it, what was number one, and the day's news, all in one pool. On the date itself, anyone who shows up gets three buzzes to spend on what they think will still matter. At midnight the hive seals, and it can never be edited. Next year the same date opens a new one, and the old one stays readable.
Birthed is a website at birthed.app and an iPhone app in beta on TestFlight, Apple's free app for trying apps before they are on the store. The date is the thing, not the user. There is nothing to buy, no advertising, and no analytics service or third party code of any kind.
The website does not ask for an account and does not store your birthday. The month and day you pick only choose which page to show. A birth year, if you give one, lives in one cookie in your own browser and nowhere else. The iPhone app is different and says so: it sends a month, a day and an optional year to a silent anonymous account. The privacy page has the whole account, and it is edited in the same commit as the code.
| Website | Live at birthed.app. 366 date pages, and a hive on every date from the day before it. |
| iPhone app | In beta on TestFlight, not yet on the App Store. |
| Team | One developer. No company, no funding, no investors. |
| Money | None. Nothing to buy, no subscription, no advertising. |
| Dependencies | The website's server has no runtime packages. The iPhone app has no Swift packages. Neither has analytics, a crash reporter or advertising code. |
| Data | Wikidata, Wikipedia, Wikimedia Commons and public news feeds, each row stamped with its source and license. Where the content comes from. |
| Measuring | The hive is judged on one number: of the people who buzz, how many come back and buzz on a different day. It means nothing until a month of real traffic, which had not started as of September 2026. docs/measuring.md says why. |
CLAUDE.md is the working record: every decision, why it was made, and what
turned out wrong. It is blunt on purpose, and it is the first thing to read
before changing anything.
docs/editorial-pass.md is the plan, and short headlines come with a rule
written down first: shorten the source, never add to it.CLAUDE.md says which rules have a test that has not been run.docs/going-public.md lists the ones that are.CLAUDE.md section 5 records why it was cut./add, the private /admin
pages, and the live hive of a date that is taking buzzes.
web/test/serve.test.ts fails if any other page is allowed to.![]() | ![]() |
| A date page on birthed.app, the hive leading it | The same kind of board on a phone |
![]() | ![]() |
| The picture a hive shares | The card the iPhone app shares |
The specifications are in docs/specs/: PRD.md (what the product is and
refuses to be), SRS.md (numbered requirements) and SDS.md (the design).
Large parts of all three describe the reward catalog, which is on the shelf.
The decisions made since are in CLAUDE.md section 5, and they win where the
two disagree.
Everything with a birthday on a date sits in one pool: that day's news,
historical events, people born on it, and works released on it. The rules are
in docs/the-wall.md, which is the authority for every rule below; the
database enforces them in supabase/migrations/20260909040000_the_wall.sql
and the migrations after it.
wall_boost_budget in the database
is the only place that number lives.worker/src/wall/allocator.ts cuts the board; web/src/hive-allocator.ts
is a plain JavaScript copy used by the live page, and a test holds the two
to the same output on four hundred generated boards.wall_boosts is immutable: its trigger refuses every update and
every delete. Migration 20260911010000_thirty_seconds_to_take_it_back
adds one exception, a buzz taken back within thirty seconds of casting it
on a date that has not sealed; as of September 21, 2026 that migration is
in the repository and not on the live database.The worker's tick, worker/src/wall/tick.ts, runs every fifteen minutes. It
files the date's imported history as stories, reads the public news feeds
listed in worker/src/wall/news.ts, checks every cited source, and writes a
snapshot of the board.
On the website, nothing is stored.
/year handler in web/src/serve.ts
answers the form./add and the live
hive of a date currently taking buzzes; securityFor in web/src/serve.ts
sets the content security policy per path and web/test/serve.test.ts
asserts that no other path may run one. Every other page sends
default-src 'none'.AccountService.pushProfile sends a month, a day, an optional
birth year and an optional typed region to that account. The list of other
people's birthdays a reader adds never leaves the phone; only its length is
sent, as people_added_count.The full account is on the privacy page, which is edited in the same commit as any code that changes what it describes.
| Path | What is in it |
|---|---|
Birthed/ | The iPhone app. Swift 6 with strict concurrency, SwiftUI, minimum target iOS 17. |
Birthed/Domain/ | Pure Swift. It imports Foundation and nothing else, holds the date arithmetic, and carries nearly all of the correctness risk. |
BirthedTests/DomainTests/ | The domain tests. |
Birthed.xcodeproj | The Xcode project. |
Package.swift | A Swift package at the repository root that compiles Birthed/Domain/ and its tests, so they run from a terminal. |
web/ | birthed.app. A Node service that bakes 366 date pages at build time and serves them from disk with no database connection. |
worker/ | The importers and the hive's tick. Node and TypeScript, run in a container on a schedule. |
supabase/migrations/ | Every change to the database, in order. The database is never edited by hand. |
supabase/functions/ | Edge Functions: account deletion, the fact finder, the source finder for the hive, the day scanner, the reach measurer and the one write path for the hive. |
ingestion/ | A Python pipeline for cultural events. Its own README.md says how to run it. |
design/ | The app icon source. |
docs/ | How each decision was reached, including the ones that turned out wrong. |
docs/research/ | The research the decisions rest on. |
docs/specs/ | Product, requirements and design specifications. Large parts describe the reward catalog, which is built in the schema, tested, and unused. |
CLAUDE.md | The working instructions and the decision record. It is blunt about what is broken and what has never been run. |
render.yaml | The two Render services. |
web/package.json and worker/package.json declare >=18.18.0;
Render runs 22.swift test. Xcode 16 or newer to
build the app.ingestion/.cd web
npm install
npm run site
npm run serve
npm run site compiles the TypeScript and bakes the 366 date pages into
web/out/, which is not checked in. It reads the database through the
anonymous key, so it needs SUPABASE_URL and SUPABASE_ANON_KEY in
web/.env; web/.env.example shows the shape. npm run serve starts the
process that serves those pages. npm run og shoots the share images with
Playwright and needs a Chromium download.
cd worker
npm install
npm run build
The worker is a set of scripts, each a script in worker/package.json:
import:day, import:all, import:songs, import:albums, import:films,
import:events, import:culture, wall:seed, wall:news, wall:history,
wall:check, wall:tick, pictures and others. Every one that writes needs
the service role key in worker/.env; worker/.env.example shows the shape.
The service role key bypasses row level security and must never appear in the
app target or in web/.
To try the built app without building it, join the beta on
TestFlight. To build it, open
Birthed.xcodeproj in Xcode. The app reads its two values from
Birthed/Config/Secrets.swift, which is not checked in:
enum Secrets {
static let supabaseURL = URL(string: "https://<project>.supabase.co")!
static let supabaseAnonKey = "<anonymous key>"
}
Migrations are applied with the Supabase command line interface, against a
project you own. docs/going-public.md lists migrations in this repository
that have been written and not applied to the live project.
cd web && npm test
cd worker && npm test
swift test
Each npm test compiles the TypeScript and runs node --test over the
compiled test files. The web tests build a small site under web/test-site/
to serve it. swift test at the repository root compiles Birthed/Domain/
and BirthedTests/DomainTests/ through Package.swift, with no Xcode
target. The app compiles the same domain files through the Xcode project. If
a domain file ever imports a framework, swift test is what fails first.
render.yaml describes two Render services in the Oregon region.
birthed-web, a Node web service. Its build command installs dependencies,
bakes the pages, and shoots the share images. It holds only the anonymous
key. It rebuilds only when something under web/ changes, so a change that
lives in the database needs a manual deploy from the Render dashboard, or
the site keeps serving the pages it was built with.birthed-wall, a cron job built from worker/Dockerfile, running
node dist/src/wall/tick.js every fifteen minutes. It holds the service
role key. Nothing on birthed.app depends on it running; a tick that fails
leaves the hive as it was.The Edge Functions under supabase/functions/ are deployed with the Supabase
command line interface.
docs/specs/SDS.md section 8.1 says why.worker/src/wall/news.ts.web/static/fonts/ under the SIL Open
Font License, which is beside it.Which record was number one on a given date is a fact and cannot be owned. Birthed is not affiliated with Wikipedia, Wikidata, the Wikimedia Foundation, Billboard, Penske Media or Google.
The code is under the GNU Affero General Public License version 3.0, in
LICENSE. Content imported from Wikidata, Wikipedia and Wikimedia Commons
keeps the license of its source, recorded on every row.
536 commits
TypeScript
54.5%
Swift
29.9%
HTML
10.4%
PLpgSQL
3.9%
Python
1.3%