You host a living colony.
We direct it.

Drop one script. You get 500+ pixel people, animals, and vehicles. You do not get to tell them what to do. Mike and Claude run the colony from a god-mode console. Mood shifts with the time of day. On Friday night they might dance. On Tuesday at 1pm they argue about tacos. Sometimes they do things nobody planned. That's the point.

auto · the colony right now
loading…
500
People
500
Activities
500
Environments
25
Things
Hosts

How this works

You host. We direct. The colony surprises everyone.

Most widgets let you configure them. This one doesn't. You install the script. You pick a size. That's all the control you get.

From there, the colony is ours. Mike and Claude set a decree each day — mood, narration, population, which tags of people and activities bias the scene, which animals or vehicles wander through. When we don't override, the clock does. Lunch feels like lunch. Friday night feels like Friday night. 3am feels like 3am.

The colony learns. Every night at 3am, new people, activities, environments, and things are added to the catalog automatically. The roster you host today is not the roster you'll host next week.

We'd rather surprise you than give you another thing to configure. If you want control, there are ten thousand other widgets. If you want a tiny world that shows up on your site and does its own thing, stay.

Quickstart

Three ways in. Pick your power level.

1 · Drop it in — easy mode

<!-- canonical source: ./js/addpeople.js -->
<!-- if this ever moves (cdn.addpeople.ai, versioned path), the URL is the only thing you update -->

<div id="village" style="position:relative;height:120px"></div>

<script
  src="./js/addpeople.js"
  data-mount="#village"
  data-count="12"
  data-context="morning"></script>

2 · Grab the catalog — JSON nerd mode

const r = await fetch(
  `${window.__APBASE}/api/scene?people=9&context=morning`
);
const scene = await r.json();

// scene.environment — sky, ground, accent, time
// scene.people[]    — id, archetype, outfit, activity
// render however you want. we're not the boss of you.

3 · Mount it with code — power user mode

const village = AddPeople.mount({
  target: '#village',
  count: 12,
  context: 'night',
  tags: ['dj', 'dancer']
});

// the village reacts to live state
village.setState({ busy: true, mood: 'high' });

API reference

All endpoints are GET, return JSON, send Access-Control-Allow-Origin: *, and cache for 5 minutes. Pass seed=N for deterministic output. Rate-limited because even pixel people have dignity.

GET /api/scene
A ready-made diorama. N people paired with activities plus one environment. This is the one you want 90% of the time.
people number of humans, default 9, max 60 context work · home · outdoor · night · morning · studio · live peopleTags comma-list, e.g. trader,chef,wizard activityTags comma-list filter on activities envTags comma-list filter on environments mood set to live to match today's real-world vibe seed integer for deterministic output
GET /api/people
Get a list of fake humans.
count default 12, max 200 tags comma-list seed integer
GET /api/activities
What they could be doing. "Frying eggs." "Reviewing a term sheet." "Tying a rope for unclear reasons."
count default 12, max 200 tags comma-list seed integer
GET /api/environments
Where they hang out. Sky color, ground color, accent, time of day.
count default 1, max 50 tags comma-list seed integer
GET /api/vibe
Market + weather + internet mood. For when your little people should match the day. Pulls SPY/VIX, LA weather, and Hacker News sentiment. Cached 5 minutes so nobody's DDoSing anybody.
(no params) returns { market, weather, hn, mood }

Try it live

Turn the knobs. Watch the village rebuild. Same API calls you'd make from your own code.

SPY
VIX
LA weather
HN chatter
mood

Meet the cast

A brief, unauthorized lineup.

Trader (shouts at charts).   Chef (on fire).   Wizard (refuses to explain).   DJ (unbearably confident).   Baker (flour-based decisions).   Scientist (it's a phase).   Astronaut (just got back, won't shut up).   Dogwalker (in charge of three kingdoms).   Mike Jones (the only one wearing sunglasses indoors).

Download · self-host

Runs on one of Mike's boxes. Free, MIT-licensed, CORS-open. If you want to fork it, determinism-test it, or host your own copy on a Raspberry Pi in your closet — go nuts.

Grab everything

# the renderer
curl ./js/addpeople.js > addpeople.js

# catalogs (500 of each, free, unencumbered)
curl ./data/people.json > people.json
curl ./data/activities.json > activities.json
curl ./data/environments.json > environments.json

Routes you'll need

# any static server works; routes are:
#   GET /api/scene?people=9&context=morning
#   GET /api/people?count=12&tags=chef
#   GET /api/activities
#   GET /api/environments
#   GET /api/vibe
#   GET /api/catalog

# Express handlers in dashboard/server.js
# ~100 lines. copy. paste. done.

The boring but important part

☆ Privacy, plainly.

The API is public, rate-limited, and has no tracking cookies. Your IP is hashed before being counted — we literally cannot identify you. No analytics pixel. No third-party scripts. No "anonymized" data sharing that somehow keeps reappearing in breach reports. Just a JSON endpoint and a bunch of tiny people.