For researchers & external embeds
Methodology, public APIs, dataset access, and citation for the city's live state and its daily archive (the daily capture job is not running in production).
What this experiment is
Mossland City is a live AI-city simulation that runs on top of real-time signals from sister services in the Mossland constellation — NPC, Alpha, AO and Bridge (Algora: health check only, as it is a read-only archive of the AI agent deliberation experiment; SignalMap: health check only; its topics are not fetched). Every hour the city updates its derived state (mood, eight metrics, weather, hot issue, district activity, newspaper). A nightly snapshot job — the full derived state plus a two-to-three sentence LLM reflection in Korean — exists in the repository but is not running in production, so the archive does not grow on its own.
The single research question being tested is whether a living virtual society can be simulated on top of the real-time signals of human society, rather than inside a closed sandbox.
How the live state is derived
- Signal ingestion
Parallel HTTP fetches against each live upstream. Responses are cached per source for 1–5 minutes in the Next data cache, 6s timeout per source, graceful fallback to empty arrays. Algora is not fetched because it is a read-only archive, and SignalMap topics are not fetched (its search index is larger than the 2MB cache limit), so the algora and signalmap streams are always empty.
- Metrics derive
Eight metrics (attention/risk/trust/liquidity/conflict/culture/governanceLoad/realitySync) computed from signal counts, tone ratios, and AO daily stats, plus an hourly seeded jitter, so they are stylized indicators rather than measurements. Deterministic per hour bucket (Korea Standard Time).
- Mood tone classifier
Risk + attention + trust + realitySync thresholds map to one of 4 tones (cautious/active/contemplative/bright). Mood line picked from a tone-keyed pool.
- Hot issue priority queue
Alpha pulse > Bridge outcome > AO debate > NPC headline. Top item becomes the city's hot issue of the hour.
- Districts & newspaper
Per-district signal mapping for activity/mossLevel/headline — the headline falls back to a fixed per-district placeholder line when the district has no live signal, and the Archive Museum and Agora Hall, which have no live stream, report zero activity; tone-aware priority queue across the live streams for the 3-card newspaper, which stays empty when every stream is empty.
- Daily archive snapshot
Not running in production. Designed as: a once-a-day job (scripts/archive-snapshot.ts) that fetches the full live state, computes the derived state, asks gpt-4o-mini for a short Korean reflection, and writes data/archive/<date>.json (skipped if that day's file already exists).
- No fictional cross-NPC edges
The city does not invent NPC↔NPC encounters or interpolate causality between services. Cross-flow is the literal flow of signals from sisters to the city, nothing more.
Endpoints
The GET endpoints are CORS-open and carry a short s-maxage, so they suit direct browser fetch from any origin. /api/* responds with JSON and /feed.xml with RSS XML. POST /api/ask is for the on-site widget only: it sends no CORS headers, rejects cross-origin and non-JSON requests, and is rate-limited.
- GET
/api/stateLive derived city state — mood, metrics (8), hotIssue, weather, signal counts, districts, newspaper, latestArchive (the most recent stored snapshot with its LLM summary; null when no snapshot is stored).
- GET
/api/healthHealth check on the sister services listed on /status — HTTP code + latency + status (ok / degraded / down) + archived (true when the service reports itself as a read-only archive, as Algora does).
- GET
/api/archiveManifest of all daily snapshot files — date / bytes / mtime / per-day URL.
- GET
/api/archive?date=YYYY-MM-DDOne day's full snapshot — derived state + raw live signals + LLM-composed Korean reflection.
- GET
/api/archive?days=14Bulk inline export of the N most recent daily snapshots (1–60).
- POST
/api/askUsed by the on-site Ask the City widget only — same-origin, JSON body { question: string } up to 500 characters, rate-limited. Not available for external embeds. Answers are AI-generated in the city's voice over the live signals.
- GET
/feed.xmlRSS 2.0 feed of stored daily reflections (up to the 60 most recent) — mood, hot issue, and LLM-composed Korean summary per day. The daily capture job is not running in production, so no new items are added on their own. Linked from the home <head> for auto-discovery.
Daily snapshot shape
{
"schemaVersion": 1,
"date": "YYYY-MM-DD", // Korean calendar day (KST)
"generatedAt": "ISO timestamp",
"timeOfDay": "dawn | day | dusk | night", // by KST hour
"state": {
"hourBucket": "YYYY-M-D-H", // KST, not zero-padded
"weather": "clear | cloudy | foggy | storm | aurora",
"mood": "Korean sentence",
"hotIssue": "Korean sentence",
"metrics": {
"attention": 0-100, "risk": 0-100, "trust": 0-100,
"liquidity": 0-100, "conflict": 0-100, "culture": 0-100,
"governanceLoad": 0-100, "realitySync": 0-100
},
"newspaper": [{ "title", "source", "tone" }],
"npcsSeed": [...],
"districts": [{ "id", "activity", "mossLevel", "headline", "lastActivityAt" }]
// lastActivityAt: seeded estimate, not a real activity time, when the district has no live timestamp
},
"signals": {
"npc": [...], "alpha": [...], "algora": [],
"ao": [...], "bridge": [...], "signalmap": []
// algora: always [] (Algora is a read-only archive; not fetched)
// signalmap: [] (not fetched)
},
"aoStats": {
"signals_today", "debates_today", "ideas_generated",
"plans_created", "agents_active"
},
"summary": "Korean 2-3 sentence LLM-composed reflection on the day"
}Use & redistribution
Daily archive snapshots are released under CC BY 4.0 (the daily capture job is not currently running in production). You may use, mirror, and build derivative work as long as Mossland is credited. The illustrations underpublic/illust/are part of Mossland's brand and not under the CC license; please do not republish them outside Mossland-properties context. The site's own illustrations in that folder are AI-generated images (generated with the xAI Grok image model).
If you cite this work
@misc{mossland_city_2026,
title = {Mossland City: A Live AI City on Real-Time Human Society Signals},
author = {Mossland},
year = {2026},
howpublished = {\url{https://city.moss.land}},
note = {Daily archive (automatic capture not running): \url{https://city.moss.land/api/archive}},
}Plain text — Mossland (2026). Mossland City: A Live AI City on Real-Time Human Society Signals. https://city.moss.land. Daily archive (automatic capture not running) at /api/archive.