Every stack is a 10-node circuit, picked by a deterministic algorithm from a real taxonomy. Here's the whole thing.
stage 1
The taxonomy: 31 departments × 2-4 tools each
Every business has the same departments. Storage, backend, marketing, support, HR. We picked the 2-4 trending open-source tools that run each one in 2026.
Why this matters: instead of a flat list of 30 random tools, every "spin" produces a complete company — not just "Stripe + Supabase + Plausible" but "Payments department uses Stripe, Storage department uses Supabase, Analytics department uses Plausible." That's the supply-chain framing.
Core (always picked)Optional (randomly picked)
Storage / Auth
Supabase · Appwrite · PocketBase · Directus
Backend / API
FastAPI · Hono · NestJS · Django
Email Delivery
Resend · Postal · Sendy
Automation
n8n · Activepieces · Windmill
Monitoring
Sentry · Uptime Kuma · Beszel
Deploy / Infra
Coolify · Dokploy · Docker Compose
Payments
Stripe · Lemon Squeezy · Paddle
CRM / Customers
Twenty CRM · EspoCRM · SuiteCRM
HR / People
OrangeHRM · Sentrifugo · Frappe HR
Marketing
Mautic · Listmonk · Keila
Support / Chat
Chatwoot · Zammad · Plain
Scheduling
Cal.com · Easy!Appointments
Project Mgmt
Plane · Focalboard · Vikunja
Knowledge / Docs
Outline · BookStack · Wiki.js
Analytics
Plausible · Umami · PostHog
Analytics / BI
Metabase · Apache Superset · Lightdash
Finance / Accounting
Akaunting · InvoicePlane · Crater
E-commerce
Medusa · Saleor · Bagisto
Content / CMS
Ghost · Strapi · Payload
AI / LLM
Ollama · LiteLLM · Flowise
Search
Meilisearch · Typesense · Manticore
Auth / SSO
Authelia · Keycloak · Authentik
Files / Storage
MinIO · Nextcloud · Garage
Design / UI
Penpot · Excalidraw · tldraw
+ 7 more departments (Caching, Logs, Forms, Forum, Data Pipeline, Web Hosting, Product Analytics). 31 total.
↓
stage 2
The pick: 10 departments per spin
Every business needs 6 things to run, no matter what. Then we pick 4 more at random to give the company personality.
Always-on (6 core depts). A business with no storage, no backend, no email, no automation, no monitoring, and no way to deploy is not a business. So those 6 are picked every time. The tool within each core dept is randomized, but the dept always shows up.
Personality (4 optional depts). The other 25 departments get shuffled, and the first 4 are picked. This is what makes every spin feel different — one stack ends up with HR + Search + Forms + Design, the next gets Payments + CRM + Analytics + AI.
// admin/index.html, line 254function pickCircuit() {
// 1. Always pick these 6 departmentsconst coreDepts = ['Storage / Auth', 'Backend / API',
'Email Delivery', 'Automation',
'Monitoring', 'Deploy / Infra'];
// 2. Shuffle the other 25 departmentsconst optional = shuffle(DEPARTMENTS.filter(d => !coreDepts.includes(d)));
// 3. Build the circuit: 6 core + first 4 from shuffled optionalconst picked = [];
coreDepts.forEach(dept => picked.push({
dept: dept,
tool: randomFrom(dept.tools) // ← pick 1 of 2-4 tools
}));
optional.slice(0, 4).forEach(dept => picked.push({
dept: dept.name,
tool: randomFrom(dept.tools)
}));
return picked; // 10 nodes total
}
↓
stage 3
A walkthrough: one spin, traced
Here's what the algorithm does for one specific spin. The strikethroughs are tools that didn't get picked. Bold green is what made it in.
CORE: 6 departments, always picked. Tool is randomized.
Storage / Auth
Appwrite · PocketBase · Directus · Supabase
→
Supabase
Backend / API
FastAPI · Hono · NestJS · Django
→
FastAPI
Email Delivery
Resend · Postal · Sendy
→
Resend
Automation
n8n · Activepieces · Windmill
→
n8n
Monitoring
Sentry · Uptime Kuma · Beszel
→
Sentry
Deploy / Infra
Coolify · Dokploy · Docker Compose
→
Coolify
OPTIONAL: shuffle remaining 25, take first 4. The 21 not picked are skipped.
Payments
Stripe · Lemon Squeezy · Paddle
→
Stripe
CRM / Customers
EspoCRM · SuiteCRM · Twenty CRM
→
Twenty CRM
Marketing
Mautic · Listmonk · Keila
→
Mautic
Analytics
Plausible · Umami · PostHog
→
Plausible
HR / People
OrangeHRM · Sentrifugo · Frappe HR
×
not picked this spin
Search
Meilisearch · Typesense · Manticore
×
not picked this spin
…and 19 other departments not picked this spin. Each has a fresh chance next spin.
↓
stage 4
The prompt: LLM fills in the meat
The 10-node skeleton goes to an LLM with the pain point. The LLM writes the role + flow for each node, plus the product name, problem statement, and revenue model.
Important: the LLM never picks the tools — that's already done. The LLM only fills in what each tool does in this specific business. This keeps every stack honest about what its components actually are.
What goes to the LLM, simplified:
You're a startup advisor. The pain point:
"Small businesses lose hours chasing late invoices."
You MUST use this stack (each is a department + tool):
- Storage / Auth: Supabase
- Backend / API: FastAPI
- Email Delivery: Resend
- Automation: n8n
- Monitoring: Sentry
- Deploy / Infra: Coolify
- Payments: Stripe
- CRM / Customers: Twenty CRM
- Marketing: Mautic
- Analytics: Plausible
Return JSON: { productName, tagline, problem, solution,
revenueModel, mvpFeatures[], deploySteps[], targetCustomer,
circuitRoles: [ { dept, tool, role, flow } x10 ] }
The LLM call happens offline on the operator's laptop — never on the server. The output gets reviewed by hand, given a cryptographic seed + hash, and pushed to data/stacks.json.
↓
stage 5
The result: a complete company
Same 10 departments + tools, but now with roles + flows that tie everything to this specific pain point. This is what shows on the spin page.
DueNorth: invoices that chase themselves
Storage / Auth
Supabase
Holds customer + invoice data, runs row-level security per company
Backend / API
FastAPI
Business logic for invoice creation, reminder scheduling, reconciliation
Payments
Stripe
Processes invoice payments, sends webhook on receipt
CRM / Customers
Twenty CRM
Stores client contacts, deal stage, payment history per account
Marketing
Mautic
Drip campaigns for late-pay accounts, win-back for churned clients
Email Delivery
Resend
Transactional invoice receipts and payment confirmations