Start a project

Create it

npm 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

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

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.

Alpha. The @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.

Built with Fougere and Nuxt, hosted on GitHub Pages.