Internal guide for developing the evjs monorepo.
- Name: evjs (fullstack framework),
@evjs/*(package scope) - Repository: evaijs/evjs
- CLI command:
ev(binary from@evjs/cli) - Linter: Biome (
npx biome check --write) - Node: ESM-only (
"type": "module"in all packages)
| Package | Path | Purpose |
|---|---|---|
@evjs/cli |
packages/cli |
CLI binary (ev dev, ev build) |
@evjs/ev |
packages/ev |
Config, plugin, and bundler types (defineConfig) |
@evjs/create-app |
packages/create-app |
Project scaffolding (npx @evjs/create-app) |
@evjs/shared |
packages/shared |
Runtime shared: errors, HTTP utils, constants |
@evjs/client |
packages/client |
Client (React + TanStack) |
@evjs/server |
packages/server |
Server (Hono) |
@evjs/build-tools |
packages/build-tools |
Bundler-agnostic server function transforms (SWC) |
@evjs/manifest |
packages/manifest |
Shared manifest schema types (ManifestV1) |
@evjs/bundler-utoopack |
packages/bundler-utoopack |
Utoopack adapter (default) |
@evjs/cli ──► @evjs/ev, @evjs/bundler-utoopack (default)
@evjs/bundler-utoopack ──► @evjs/ev, @evjs/build-tools, @evjs/manifest, @utoo/pack
@evjs/ev ──► @evjs/manifest, @evjs/shared
@evjs/shared (zero deps — runtime only)
@evjs/client ──► @evjs/shared, @tanstack/react-router, @tanstack/react-query
@evjs/server ──► @evjs/shared, hono, @hono/node-server
- Imports: All imports at top of file. Use
import typefor type-only imports. - Linting: Biome — no
any, noimport * asunless necessary. - No manual server entries: The framework generates server entry dynamically.
- No manual bundler configs: Use
ev.config.tsor convention-based defaults. - Server function files: Must start with
"use server";. We recommend the.server.tssuffix or placing them insrc/api/. - Server function exports: Must be named async function exports (no default exports).
- Module type: All packages are ESM (
"type": "module"). Use.jsextensions in relative imports within compiled output. - Config file: Named
ev.config.ts(notevjs.config.ts). - Dependency resolution: CLI uses
createRequire(import.meta.url)for reliable loader resolution.
- Create
src/api/[name].server.ts - Add
"use server";at the top - Export named async functions
- Import and use in client with
useQuery(fn)oruseMutation(fn)
- Create a new file under
src/pages/(e.g.src/pages/about.tsx) - Define route with
createRoute({ getParentRoute, path, component })and export it - Import in
src/main.tsxand add to route tree viaparentRoute.addChildren([newRoute])
- Create directory under
examples/ - Add
package.jsonwith"@evjs/ev": "*"and"@evjs/cli": "*"as devDeps,"private": true - Add
src/main.tsx+index.html - Create symlink in
packages/create-app/templates/→../../../examples/[name] - Add to
packages/create-app/scripts/restore-templates.jssymlink map - Add an e2e test in
e2e/cases/[name].ts
- Create a GitHub Release with a tag like
v0.1.0 - The release workflow automatically syncs the version to all packages and publishes to npm
- Do NOT bump versions locally — the codebase keeps
"*"for internal@evjs/*deps.
npm run build # Build all packages + examples
npm run test # Unit tests (vitest)
npm run test:e2e # E2E tests (playwright)
npm run dev # Dev mode (turborepo)
npx biome check --write # Fix lint/formatloadConfig(cwd)— loadsev.config.tsor returns undefined for convention-based defaults- Resolves the
BundlerAdapter— utoopack (the only bundler) - Calls
BundlerAdapter.build()which drives the compilation - The bundler adapter:
- Discovers
"use server"files - Applies SWC transforms (client + server variants)
- Builds the server bundle
- Emits
dist/server/manifest.jsonanddist/client/manifest.json
- Discovers
- Same config resolution as
ev build - Calls
BundlerAdapter.dev()which starts the dev server with HMR - The adapter signals
onServerBundleReadyafter server bundle is built - The CLI core auto-starts the API server via
@evjs/server/node - Sets up proxy:
/api/*→localhost:3001
The skills/ directory contains user-facing guides for building apps with evjs. If you change CLI commands, config options, or runtime APIs, please update the relevant skills.
Available skill references: init, dev, build, routing, server-fns, server-routes, config