Start a project
Create it
npm create fougere
pnpm create fougere
bun create fougere
yarn create fougere
It asks for a name, the fronds to start from and an app. The same project with no question:
npm create fougere my-blog --frond blog --app nuxt # a blog frond, and a Nuxt app calling it
npm create fougere my-blog --blank # the project alone — the tutorial starts here
pnpm create fougere my-blog --frond blog --app nuxt # a blog frond, and a Nuxt app calling it
pnpm create fougere my-blog --blank # the project alone — the tutorial starts here
bun create fougere my-blog --frond blog --app nuxt # a blog frond, and a Nuxt app calling it
bun create fougere my-blog --blank # the project alone — the tutorial starts here
yarn create fougere my-blog --frond blog --app nuxt # a blog frond, and a Nuxt app calling it
yarn create fougere my-blog --blank # the project alone — the tutorial starts here
The project is written for the package manager that ran the command — see the CLI. The last lines it prints are the next commands, in that package manager's words:
cd my-blog
npm install
npm run dev
cd my-blog
pnpm install
pnpm dev
cd my-blog
bun install
bun run dev
cd my-blog
yarn install
yarn dev
The fougere command
The project installs the CLI locally, so npx fougere migrate (or bunx) runs it from inside.
To type fougere alone, install it globally once:
npm install --global fougere
Inside a project, the global command hands over to the project's own CLI, so it always runs the version the project pins.
@fougere/* packages are on npm under the alpha tag: the version is the whole
promise, and the surface can still move.What you get
my-blog/
fougere.config.ts ← how the app runs: database, protocols, where each frond runs
package.json ← the project; its apps are its members once it has one
tsconfig.json ← types the fronds and the config; each app keeps its own
fronds/
blog/ ← one domain of your app (--frond blog)
entities/Post.ts
handlers/PostHandler.ts
apps/
nuxt/ ← a Nuxt app (--app nuxt), written by create-nuxt
nuxt.config.ts ← modules: ['@fougere/nuxt']
app/pages/posts.vue ← a page calling the blog
tests/boots.test.ts ← npm test: the project boots as the config places it
AGENTS.md, CLAUDE.md ← what a coding agent runs before it says it is done
Each directory under fronds/ is a frond. The folder a file sits in says
what it is — an entity in entities/, a handler in handlers/, a service in services/ — and
nothing is registered by hand. A page imports from a frond by its name, with no package.json and
no workspace entry:
import Post from '@fronds/blog/entities/Post.js';
To give a frond another name than its directory's, see How the scan reads a project.
The config it writes
// fougere.config.ts
import { defineFougere } from '@fougere/core';
export default defineFougere({
fronds: { '@fougere/log': {} },
});
@fougere/log writes two lines per call in the terminal. Nothing else is said, so the defaults hold:
every frond runs in the app's process, and rows stay in memory — the boot warns, and they are gone
when it stops. One line keeps them in SQLite: SQLite or Postgres.
Every key, with what answers it: fougere.config.ts. To learn the rest by building a blog, follow the tutorial.