PARTUS/ DOCS

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/7

Notices 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 id

A 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-in

The 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"
For developers / Docs / PARTUS