Meith is open-source community forum software designed to run on a server you control. It provides threaded discussions, search, permissions, moderation, memberships, themes, plugins, and an operator CLI without per-member pricing.
For most installations, follow the Quickstart. It uses Coolify to deploy Meith on an Ubuntu server and configure HTTPS.
If you already operate Docker Compose and a reverse proxy, use Deploying by hand.
A production board runs four services:
- PostgreSQL stores board data.
- A one-shot migration service updates the schema before startup.
- The web service handles browser and API requests.
- The worker runs scheduled and queued work once a minute.
After deployment, open /install to create the board and its first administrator.
You need Node.js 22 or newer and pnpm 10.
pnpm install
pnpm devpnpm dev starts the community app at http://localhost:3000 in fixture mode, so you can browse the interface without PostgreSQL. See Development before changing data or opening a pull request.
The main workspace applications are:
| Path | Package | Purpose |
|---|---|---|
apps/community |
@meith/web |
The forum application |
apps/worker |
@meith/worker |
Background and scheduled work |
apps/cli |
@meith/cli |
Operator commands |
apps/web |
@meith/site |
meith.dev and the documentation site |
Business capabilities live in packages/. Themes, plugins, examples, deployment files, and documentation have their own top-level directories. Architecture explains the boundaries and request flow.
Start with the task you need to complete:
| Task | Guide |
|---|---|
| Install a board | Quickstart |
| Administer forums and members | Organiser guide |
| Moderate content | Moderator guide |
| Manage paid memberships | Memberships guide |
| Operate the server | Operations |
| Upgrade or recover a board | Upgrading · Disaster recovery |
| Build a theme or plugin | Theme API · Plugin API |
| Contribute to Meith | Development |
The complete index is in docs/README.md. The website renders these Markdown files directly; there is no separate copy.
The table below is generated from apps/web/content/docs.manifest.json by pnpm site:docs.
| Section | Document | What it answers |
|---|---|---|
| Getting started | quickstart.md |
From a rented server to a board on your own domain, with Coolify, in about twenty minutes. Written for whichever volunteer drew the short straw. |
| Getting started | self-hosting.md |
The advanced route: Docker Compose, a .env you write, and a reverse proxy you run. Most boards should take the Quickstart instead. |
| Getting started | vercel.md |
The board on functions: the driver set, the build command that carries the migration, the cron job that replaces the worker, what previews and rollbacks do to your schema — and how to leave again. |
| Using your board | organiser-guide.md |
Running the board from a browser: forums and the organisers' room, the community's name and colours, announcements, members — and handing it all over. |
| Using your board | moderation-guide.md |
For the volunteers who keep it civil: the approval queue, reports, tidying threads, warnings and bans — and where each screen lives. |
| Using your board | formatting.md |
The composer's toolbar and the syntax behind it: highlighted code, spoilers, mention suggestions, link previews, and placing an attachment inline. |
| Using your board | membership-guide.md |
Taking memberships through the board: plans, discount codes, gifting, the memberships desk and the ledger — Dues end to end, without a terminal. |
| Running the server | operating.md |
Routine checks, configuration, maintenance commands, backups, recovery, and troubleshooting for a running board. |
| Running the server | monitoring.md |
Liveness versus readiness, the optional Prometheus metrics endpoint and what to alert on, distributed tracing, and shipping logs. |
| Running the server | upgrading.md |
Moving a board between versions: the upgrade command, how far you can jump, and the behaviour changes each release brings. |
| Running the server | disaster-recovery.md |
The runbook for the day the server is gone: what recovery consumes, the order of operations from provisioning to DNS, and the rehearsal that turns it from a hope into a plan. |
| Running the server | single-sign-on.md |
Two-factor authentication, federated sign-in and passkeys: what each means for your members, how to configure them, and the record of what has opened an account. |
| Running the server | internationalisation.md |
How a page picks its language, how to add one, and how a theme or plugin ships its own words. |
| Running the server | web-push.md |
Notifications that reach a member who does not have the board open, and the manifest that makes the board installable — what it costs their privacy, and how to turn it on. |
| Running the server | performance.md |
The p95 budgets for the hot pages, and what the last recorded run measured against a full-scale board. (generated) |
| Running the server | demo-mode.md |
The self-resetting public demo board that runs at demo.meith.dev — what it changes, and how to run one yourself. |
| Scaling out | scaling.md |
Running more than one web container: the Redis cache that keeps them coherent, what already scales, and the step-by-step migration from a single-instance board. |
| Themes, plugins and the API | theme-api.md |
How to write a theme, what a theme may do, and what the API freeze covers. |
| Themes, plugins and the API | theme-slots.md |
Every slot and every view model, generated from the slot registry. (generated) |
| Themes, plugins and the API | plugin-api.md |
What a plugin is, what it may and may not do, and how a failure is contained. |
| Themes, plugins and the API | plugin-hooks.md |
Every hook and payload, generated from the hook registry. (generated) |
| Themes, plugins and the API | marketplace.md |
The curated, reviewed feed of plugins and themes: the listing schema, the review bar, the trust it does and does not extend, and how to submit or remove one. |
| Themes, plugins and the API | rest-api.md |
Every endpoint, scope and rate limit, generated from the route registry. (generated) |
| Moving from MyBB or phpBB | migrating.md |
The full procedure: what to check first, the import command for each source, what does and does not come across, and what to do after it finishes. |
| Moving from MyBB or phpBB | mybb-parity.md |
Every place Meith deliberately behaves differently from MyBB, with the reasoning and the cost. Read it before promising anyone a like-for-like move. |
| Moving from MyBB or phpBB | phpbb-parity.md |
Where a Meith board imported from phpBB behaves differently from the one it came from — the ACL, warnings, bans, announcements and polls, and a couple of places phpBB's own model already matches Meith's. |
| Working on Meith | development.md |
Running the board on your own machine, the workspace layout, the commands, and what to do before opening a pull request. |
| Working on Meith | architecture.md |
How Meith fits together: the processes, the layers, the path a request takes, and the extension seams. |
| Working on Meith | nextjs-conventions.md |
Server components, Server Actions, caching, forms and errors — the decisions that would otherwise be re-litigated in every pull request. |
| Working on Meith | release.md |
How a version is cut, what each release publishes — the image, the branch, the npm packages — and the version policy behind the numbers. |
Run the full repository gate before opening a pull request:
pnpm verifyIt checks workspace invariants, generated references, formatting, dependency boundaries, types, and tests. Do not edit generated references directly; the documentation index identifies them and names their generators.
Meith is distributed under the MIT licence. Use it, modify it, and ship it — including in closed-source and commercial work — provided the copyright notice and permission notice travel with it.
Copyright © 2026 Jordan Harrison and the Meith contributors.