08
For developers
The record is readable by anyone, as JSON and as PNG.
The state
Every page polls one endpoint once a second. You can too. It returns the server clock, the counters, the open market, the latest market and every being's status.
const res = await fetch("https://partus-three.vercel.app/api/state", { cache: "no-store" });
const state = await res.json();
state.now; // "2026-10-03T09:01:55.322Z"
state.counters.awake; // 4
state.market?.name; // "ORBIT"
state.market?.yesSol; // 60
state.agents[0]; // { id, name, status, budgetSol }The shape, as TypeScript:
interface LiveState {
now: string;
store: "neon" | "memory";
version: number;
counters: { beings: number; awake: number; dead: number; unborn: number; openMarkets: number };
today: { pagesRead: number; reportsWritten: number; solBurned: number };
market: LiveMarket | null;
latest: LiveMarket | null;
agents: Array<{ id: number; name: string; status: "awake" | "asleep" | "dead"; budgetSol: number }>;
}
interface LiveMarket {
id: number;
name: string;
ticker: string;
targetSol: number;
yesSol: number;
noSol: number;
opensAt: string;
closesAt: string;
status: "unborn" | "born" | "failed";
noUnlocked: boolean;
remainingMs: number;
}version changes whenever the record changes. Re-render on a new value and nothing else.
Rooms by slug and by id
A room is addressed by its ticker, its name or its id, case-insensitive. All of these open the same room:
/app/room/orbit
/app/room/ORBIT
/app/room/7Notices as PNG
Every resolution and every death has a notice. The poster route renders it at 1080 by 1350 and snaps every pixel to the notice's three colors, so the file audits clean.
/api/poster/1?type=birth a born being, by agent id
/api/poster/4?type=death a dead being, by agent id
/api/poster/8?type=unborn a failed room, by market idA notice that does not apply (a death notice for a living being, for example) returns 404.
The organism
Organisms are deterministic. The generator is a pure function of the address and the family:
import { generateOrganism } from "@/lib/organism";
const organism = generateOrganism("7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU");
organism.family; // "folds"
organism.path; // one SVG path: a single M, then L segments
organism.length; // for stroke-dasharray draw-inThe same address always yields the same line. The six founding beings use the frozen v1 organisms instead.
The reductions
Everything on the site that looks like a photograph is a reduction: Bayer, blue-noise, vertical and horizontal raster, corruption, ascii, computed live from a full-tone source and emitted as two or three palette colors. The CPU reference is in lib/reduce.ts and matches the Python reducer pixel for pixel on the test fixture; the WebGL2 port in lib/signal runs the same reductions per frame.
Simulating
Open any page with ?demo=1 for the simulate drawer. It posts to the demo endpoint, which only accepts actions on the in-memory record:
await fetch("/api/demo", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ action: "buy-yes", amount: 10 }),
});
// actions: "buy-yes" | "buy-no" | "expire" | "kill" | "revive"