Put 500 tiny people
on your website.

A free API by Mike Jones. Because the internet used to be fun. Drop in a script, get a little pixel village of traders, chefs, DJs, wizards, and one Mike Jones — all walking around, arguing about coffee, refusing to explain themselves.

500
People
500
Activities
500
Environments
24
Archetypes
$0
Forever

Why does this exist?

An honest answer, for once.

Mike Jones has built a lot of things. Social networks with 300 million users. Funds that returned more than the GDP of a mid-sized country. Companies that got acquired for sums that look like typos.

This is not one of those things. This is better — it's 500 pixel people living their best lives on your website. They fall in love. They argue about parking. They have opinions about the Fed. None of them can see you, which is probably for the best.

Built between board meetings. Free forever because money isn't everything — joy is. (Warning: users report mild to severe delight.)

Quickstart

Three ways in. Pick your power level.

1 · Drop it in — easy mode

<!-- paste this. that's it. go touch grass. -->

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