Visual projects exploring control, trust, money, and who wins as AI reshapes everything — the lab for Sideband.
| Project | What it is |
|---|---|
| Agent-Era Infrastructure Map | Companies and protocols scored on openness and distribution across five layers of the emerging agent stack |
| U.S. GDP Status | A status page for the economy where the components are AI providers and the metric is GDP |
| Three-Body Problem | A force simulation of the three-way gravitational fight between state regulators, card networks, and open protocols |
- Astro — static site generator, renders the shell
- React — component islands (map)
- D3.js — force simulations, vendored for supply chain integrity
- Supabase — entity scores and layer data
- Vercel — deployment
Projects are framework-agnostic. Each one uses whatever fits — React, vanilla JS, D3, or plain HTML. The Astro shell wraps them with a shared header and meta tags.
git clone https://github.com/shawnyeager/sideband-lab.git
cd sideband-lab
npm install
cp .env.example .env # fill in Supabase keys if you want live map data
npm run devThe map works without Supabase credentials — it just won't load entity data. The other projects are fully static.
Each project is a standalone HTML page in public/[slug]/index.html, wrapped by an Astro route that injects the shared header and meta tags.
- Create
src/pages/[slug]/index.astro— reads the HTML file and injectsprojectHeader+projectMeta - Create
public/[slug]/index.html— your project's standalone HTML (must have<head>and<body>tags) - Add an entry to
src/content/projects.jsonwithstatus: "draft" - Add a thumbnail at
src/assets/projects/[slug].pngand an OG image atpublic/img/og/[slug].png - Set
status: "live"when ready
See CLAUDE.md for the full scaffolding template and conventions.
src/ Source code — components, pages, layouts, styles
public/ Static assets — fonts, images, project HTML
scripts/ CLI tools — screenshot capture, entity scoring, data export
supabase/ Database migrations
data/ Exported snapshots (map-entities.json)
Entity scores are computed deterministically from structured signals. An LLM reads source material and extracts factual signals (license type, governance model, operator count, etc.) — it never picks a score. A weighted formula then computes the 0-100 position on each axis from those signals.
X-axis (Closed → Open): spec_license, governance, permission_required, independent_implementations, fork_modify_allowed, tos_restrictions
Y-axis (Centralized → Distributed): deployment_model, operator_count, single_point_of_failure, self_hostable, works_offline, central_coordination_required
Same evidence in, same score out. Each score is auditable: you can trace exactly which signal contributed how many points and what source text supported it. Signal definitions and weights live in scripts/score-entities.mjs.
Issues and PRs are welcome. If you spot a bug, have a data correction for the map, or want to propose a new project idea, open an issue.