Skip to content

Stack Overview

Disponible en francais

This is the operating view of the Fenod stack: what should be primary, what is optional, and how the local machine setup maps to day-to-day delivery.

  • Type-safe product development with minimal ceremony
  • Fast iteration for small teams shipping to the edge
  • Reusable patterns across apps, content sites, internal tools, and AI features
  • AI-assisted development with strong constraints instead of loose code generation
  • A default path that is simple enough to teach and fast enough to ship with

TanStack Start architecture

LayerDefaultWhy
RuntimeNode 24Stable baseline for the ecosystem and team docs
Package managerpnpmFast workspaces, predictable installs, strong monorepo fit
App frameworkTanStack StartTyped full-stack React with strong router/query story
Content frameworkAstroBetter fit for content, SEO, and marketing surfaces
API layerHono + ORPCThin edge-friendly API surface with type safety
Database layerDrizzle + D1Simple SQL model aligned with Cloudflare deployment
AuthBetter AuthGood TypeScript ergonomics and D1-friendly setup
StylingTailwind v4 + shadcn/uiFast product work with a maintainable base component layer
Quality gatesVoidZero tooling + Ultracite + tsgo + Vitest/Playwright + React DoctorFast linting, formatting, testing, type safety, behavior, and React-specific security/best-practice checks
DeployWrangler + Cloudflare + AlchemyDefault hosting target and IaC path for apps, APIs, and edge services
SecretsInfisical + Cloudflare Worker secretsSafe storage, local injection, CI fetch, and runtime bindings
EditorCursor or VS CodeMature editor workflow with strong extension support
Terminal AIClaude CodeGood fit for repo-wide changes, terminal tasks, and documentation work

This machine has more than one runtime and more than one coding surface installed. That is useful, but it can also create drift.

  • node + pnpm should stay the documented default for this repo.
  • bun and deno are valuable secondary tools, not the baseline for team commands.
  • python3 + uv and rustc + cargo are strong support toolchains, but they are not the center of the product stack.
  • Cursor, VS Code, and Claude Code can coexist if each has a clear role.

For the machine-specific version snapshot, see Local Toolchain Snapshot.

VoidZero is the preferred direction for JavaScript tooling because it aligns with the stack’s goals: fast feedback, one coherent toolchain, and fewer bespoke configs. Since Cloudflare acquired VoidZero in June 2026, this direction is now tightly aligned with Cloudflare’s runtime strategy.

That is a strength and a concentration risk. Fenod accepts the vendor concentration because the integration benefits are large for a small team, but major new projects should still keep standards-based boundaries: SQL, HTTP, OpenAPI, portable TypeScript, and explicit export paths.

ToolRole in the stackAdoption posture
Vite 8Dev server and framework foundation for TanStack Start and AstroDefault for new projects
rolldown-viteVite 7 compatibility bridge with RolldownMigration bridge for existing Vite 7 apps
VitestUnit and integration tests that understand Vite configDefault
Oxlint / OxfmtHigh-performance linting and formatting foundationsDefault through Ultracite where possible
tsdownLibrary/package build toolDefault for internal packages that need published artifacts
Vite+Unified web toolchain entry pointExperimental for new prototypes until stable enough for client work

Adoption should be staged:

  1. Stable default: Vite 8, Vitest, Ultracite, tsgo, and Playwright for new projects.
  2. Migration bridge: use rolldown-vite first when upgrading an existing Vite 7 app, so bundler issues are isolated before the Vite 8 jump.
  3. Package build default: use tsdown instead of custom Rollup/tsup configs for libraries.
  4. Experimental lane: evaluate Vite+ on prototypes before standardizing it for production apps.
  • Document commands with pnpm.
  • Assume Node 24 for local development and CI unless a project says otherwise.
  • Build product apps with TanStack Start unless Astro is clearly the better fit.
  • Keep backend work thin with Hono, ORPC, Drizzle, and Better Auth.
  • Treat Cloudflare as the default deployment target, not an afterthought.
  • Reach for bun when a specific tool benefits from it.
  • Reach for deno when a script or runtime explicitly needs it.
  • Use Python or Rust for support utilities, CLIs, or ecosystem-specific tasks.
  • Avoid writing repo-level instructions that require every installed tool just because it exists on one machine.
  • Strict TypeScript gives AI sharper constraints and reduces ambiguous edits.
  • Slice-based architecture keeps changes local instead of scattering them across layers.
  • Cloudflare tooling is scriptable and works well with terminal-oriented agents.
  • Infisical keeps agents from needing plaintext .env files while still enabling deploy/test commands.
  • Good documentation narrows prompts and keeps AI output aligned with team standards.
  • Tests, typechecks, and React Doctor provide the fast feedback loop AI needs to be trustworthy before pushing or merging.
  1. Keep the stack opinionated: pnpm, Node 24, TanStack Start or Astro, Cloudflare by default.
  2. Make the AI workflow explicit instead of relying on ad hoc prompting.
  3. Add TDD earlier so AI-generated code is guided by executable behavior.
  4. Track local toolchain drift so docs match reality.
  5. Keep the root README.md lightweight and move operational detail into focused guides.