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.
You host. We direct. The colony surprises everyone.
Three ways in. Pick your power level.
<!-- 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>
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.
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' });
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.
Turn the knobs. Watch the village rebuild. Same API calls you'd make from your own code.
A brief, unauthorized lineup.
Every archetype ships with its own animation. Chefs steam. Farmers wave. Traders check prices. Wizards do a thing that we can't describe without a lawyer.
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.
# 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
# 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.
☆ Privacy, plainly.