A deterministic, schema-driven Linux distribution picker built with Nuxt 3.
This project is a study in logic-as-data and honest decision engine design. It evaluates 30+ conditional questions across 3 structured phases to recommend from 40+ Linux distributions, while enforcing a strict boundary between domain logic and presentation.
Read the Technical Case Study →
- Logic-as-Data: All decision rules live in a declarative DSL, not in code.
- Pure Engine: Zero business logic exists inside Vue components.
- Deterministic: Every state change triggers a full recomputation from a validated snapshot.
- Zod-Enforced: Every rule, question, and state transition is schema-validated at runtime.
- Trap UX Aware: The engine detects when refinement questions lose utility and prompts for an early exit.
- Node.js 20+
- npm (or pnpm with frozen lockfile)
npm ciRun (Dev)
npm run devBuild
npm run buildRun all of these before committing:
npm run typecheck
npm run lint
npm test
npm run validateIf any command fails, the change is invalid.
/src
/data
types.ts # Zod schemas (source of truth)
distros.json # Linux distributions (validated)
questions.ts # Question Flow DSL (logic-as-data)
/engine
logic.ts # Pure VM (conditions + patches)
state.ts # Reactive decision engine (Vue composable)
/components
QuestionWizard.vue # Dumb UI
❌ No business logic in UI components ❌ No conditional distro logic in templates ❌ No new dependencies without an ADR V All logic must be serializable and schema-validated