---
title: "Modules"
description: "Optional packages the cli switches on or off, grouped, with the profiles that pick them."
url: https://plate.findmalek.engineer/docs/modules
markdown: https://plate.findmalek.engineer/docs/modules.md
group: "Modules"
---

# Modules

A module is a package plus the code and env keys that depend on it. Turn one off and the cli deletes its package, its env block and every line between the `@findplate:<module>` and `@end` markers in the template.

Everything that is not a module is the [core](https://plate.findmalek.engineer/docs/project-structure.md#core-and-modules), and is always generated.

Pick a profile with `--profile minimal|standard|everything`, list exact modules with `--modules storage,ai,docs,email`, or choose in the prompt. `--modules` wins over `--profile`.

## Profiles

| Profile | Picks |
| --- | --- |
| `minimal` | no modules, just the core. Add some later with `findplate add` |
| `standard` | `storage`, `ai`, `docs`, `rate-limit`. The default with `-y` |
| `everything` | every module that runs without a server of your own |

`everything` leaves out `umami`, `openobserve`, `glitchtip`, `infisical` and `langfuse`. They only work once you host the matching server, so switching them on by default would hand you code that does nothing. Add them one by one with `--modules` or in the checklist when you run the server.

## Available

Each module has a page with what it adds, its env keys, how to remove it and how to swap it. The last column shows the profiles that include it.

### Product pages

| Module | Profiles | What it adds |
| --- | --- | --- |
| [`i18n`](https://plate.findmalek.engineer/docs/i18n.md) | everything | next-intl in web and dashboard with English and French, a language switcher and hreflang in the sitemap |
| [`docs`](https://plate.findmalek.engineer/docs/docs-module.md) | standard, everything | `apps/docs`. A fumadocs site on Next with pages about your project |
| [`waitlist`](https://plate.findmalek.engineer/docs/waitlist.md) | everything | email signup on the landing page, signups listed in the dashboard |
| [`roadmap`](https://plate.findmalek.engineer/docs/roadmap.md) | everything | public `/roadmap` from the repo's GitHub milestones |
| [`status`](https://plate.findmalek.engineer/docs/status.md) | everything | public `/status` with live checks of api, database, web and dashboard |

### Platform

| Module | Profiles | What it adds |
| --- | --- | --- |
| [`storage`](https://plate.findmalek.engineer/docs/storage.md) | standard, everything | `packages/storage`. Uploads to any S3 API: Garage, R2, AWS, MinIO |
| [`ai`](https://plate.findmalek.engineer/docs/ai.md) | standard, everything | `packages/ai`. Vercel AI SDK with Groq, OpenAI or Anthropic |
| [`rate-limit`](https://plate.findmalek.engineer/docs/rate-limiting.md) | standard, everything | per route and ip limits on the api, in memory or on Upstash Redis |
| [`flags`](https://plate.findmalek.engineer/docs/flags.md) | everything | `packages/flags`. Typed feature flags: code defaults, env overrides, rollouts edited in the dashboard |
| [`jobs`](https://plate.findmalek.engineer/docs/jobs.md) | everything | `packages/jobs`. Background jobs and cron on your Postgres with pg-boss, optional separate worker |
| [`webhooks`](https://plate.findmalek.engineer/docs/webhooks.md) | everything | `packages/webhooks`. Signature checks for inbound webhooks: hmac, svix, secret header |

### Notifications

| Module | Profiles | What it adds |
| --- | --- | --- |
| [`notification`](https://plate.findmalek.engineer/docs/notification.md) | everything | `packages/notification` and `apps/email`. Email, Telegram and WhatsApp behind one notifier, branded react-email templates and a preview app |

### Analytics

| Module | Profiles | What it adds |
| --- | --- | --- |
| [`databuddy`](https://plate.findmalek.engineer/docs/databuddy.md) | everything | cookieless analytics in web and dashboard |
| [`umami`](https://plate.findmalek.engineer/docs/umami.md) | custom, needs a server | umami script in web and dashboard |

### Observability and secrets

| Module | Profiles | What it adds |
| --- | --- | --- |
| [`logger`](https://plate.findmalek.engineer/docs/logger.md) | everything | `packages/logger`. Json logs with request ids and redaction in api, web and dashboard |
| [`openobserve`](https://plate.findmalek.engineer/docs/openobserve.md) | custom, needs a server | otel traces from the api to OpenObserve |
| [`glitchtip`](https://plate.findmalek.engineer/docs/glitchtip.md) | custom, needs a server | sentry sdk in api, web and dashboard, pointed at GlitchTip |
| [`infisical`](https://plate.findmalek.engineer/docs/infisical.md) | custom, needs a server | `pnpm dev:secrets` runs dev with infisical |
| [`langfuse`](https://plate.findmalek.engineer/docs/langfuse.md) | custom, needs a server | Langfuse traces for AI SDK calls (needs `ai`) |

## What each module needs from you

The cli lists this before it asks for keys, and `findplate doctor` warns about any key still empty in `.env`, with the page to get it from. Every key is optional at creation time.

| Module | Needs |
| --- | --- |
| `ai` | one of [Groq](https://console.groq.com/keys), [OpenAI](https://platform.openai.com/api-keys) or [Anthropic](https://console.anthropic.com/settings/keys) |
| `notification` | any of a [Resend API key](https://resend.com/api-keys), a bot token from [@BotFather](https://t.me/BotFather) and a [Kapso API key](https://app.kapso.ai); each channel turns on with its keys |
| `databuddy` | a [Databuddy client id](https://app.databuddy.cc) |
| `umami`, `glitchtip`, `langfuse` | a self-hosted server, plus a website id, DSN or key pair from it |
| `openobserve`, `infisical` | a self-hosted server |

## Dependencies between modules

`langfuse` requires `ai`, and `notification` requires `webhooks`. The cli turns required modules on for you and says so in the prompt, so `--modules langfuse` generates `ai,langfuse`.

The self-hosted ones also have a compose snippet each in [self-hosted tools](https://plate.findmalek.engineer/docs/self-hosted.md).
