Self-hosted alternatives to Notion exist, but they are not interchangeable, and some want more from your server than the README suggests. We ran five from their official Docker setups on one PrivateByte VPS and measured what each costs before you type a word into it.
Using an AI coding agent? There's a ready-made prompt at the end of this guide. Copy that instead of this article.
What this is, and what it is not
This is a measurement of the hosting side: start time, idle memory, disk, and whether the web page answers. Every number is from our own runs, with the method at the end.
It is not a hands-on review. The test rules said no accounts, sign-ins or passwords, so we never created a workspace or wrote a page. Feature statements come from each project's documentation and repository. Where a tool forced account or single sign-on setup first, we report that as a finding and measure only the services.
Which five, and why
On 22 October 2026 we checked each repository and kept Notion-style tools (pages, blocks, workspaces) that run in Docker and are actively maintained.
| Tool | Stars | Last push | Latest release |
|---|---|---|---|
| Outline | about 41,000 | 22 Oct 2026 | v1.11.0, 12 Oct 2026 |
| AFFiNE | about 73,800 | 22 Oct 2026 | stable v0.27.4, 18 Aug 2026; daily canary builds |
| AppFlowy | about 77,600 (app) | 21 Oct 2026 | app v0.14.10, 21 Oct 2026 |
| Docmost | about 22,100 | 21 Oct 2026 | v0.96.0, 8 Sep 2026 |
| SiYuan | about 46,900 | 22 Oct 2026 | v3.8.8, 20 Oct 2026 |
AFFiNE's Compose file uses the stable image, built on 18 August, while the project ships canary builds daily. We left out Trilium (a personal knowledge base) and BookStack (a book-and-chapter wiki, now managed on Codeberg). Neither is a blocks-and-collaboration tool in the Notion sense.
What each one needs, from the official docs
Outline needs PostgreSQL 14+ and Redis 4+. Its docs state 512 MB RAM as the minimum and recommend 1 GB or more. The catch is sign-in: Outline does not support email-and-password. You must configure a provider (Slack, Google, Microsoft Entra, Discord, generic OIDC and others) or email "magic links", which need an SMTP server. The licence is Business Source License 1.1: free to run for yourself or your team, not to resell as a hosted service, and the 1.11.0 release converts to Apache 2.0 on 12 October 2030. SAML, audit logs and the Confluence importer need a paid licence.
AFFiNE needs PostgreSQL (the pgvector build for AI features) and Redis 6 or 7. The docs ask for about 1.5 GB of free disk, at least four CPU cores, 2 GB of RAM for basic use and 4 GB for long documents. The first visitor creates the admin. Self-hosted workspaces are capped at 10 seats without a Team licence. Read the licence: the repository is MIT outside its backend folder, which has a separate Enterprise-style licence with a Community Edition carve-out. We could not settle from the text what that means for the image you pull.
AppFlowy is the unusual one. The old open-source server repository is archived, and its README points to a commercial server codebase, released as Docker images with a Compose file in a separate "SelfHost-Commercial" repository. The client apps are AGPL-3.0; the server runs under AppFlowy's commercial self-hosted licence. The Free Tier includes one user seat, up to three guest editors, unlimited workspaces, version history and page publishing. SAML, OIDC and LDAP need a paid Seed plan or above. The stack is eleven containers: Postgres with pgvector, Redis, MinIO, an auth service, API server, worker, search, AI, admin console, web app and nginx. The vendor's sizing guide lists 4 vCPUs and 16 GiB for 100 concurrent users on one host, and states no minimum for a tiny install.
Docmost needs PostgreSQL and Redis, keeps files on local disk by default (S3 optional), and opens on a setup page where you create the workspace. The core is AGPL-3.0. Files in its ee folders are under an enterprise licence, and the docs list "Bases, SSO, AI, Audit logs, and SCIM" as enterprise features. No minimum resources are published.
SiYuan is one container and a workspace folder: no database, cache or object storage. You set a lock-screen access code, and its README warns that without one anyone can read your data. It is AGPL-3.0, with paid "PRO" features for S3 and WebDAV sync and official cloud sync. The README lists limits for Docker: browser only (no desktop or mobile app connections), no PDF, HTML or Word export, and no Markdown file import. No minimum resources are published.
What you can do on day one, per the docs
From documentation only, not from use:
- Outline: a team knowledge base with a real-time collaboration service, integrations (Slack, GitHub, Linear, Figma and others) and webhooks. We did not find a databases view in the pages we read.
- AFFiNE: documents and an infinite whiteboard in one canvas, with database-style views, local-first editing and optional AI. The closest to "everything is a block".
- AppFlowy: documents plus databases, with kanban and grid views shown in its README, and an AI service in the stack.
- Docmost: a wiki with spaces, permissions, groups, comments, page history, search, attachments and diagrams. Databases ("Bases") are enterprise.
- SiYuan: a personal block notebook with two-way links, a database table view, flashcards and Markdown editing.
What we measured
One PrivateByte Comet VPS (4 vCPU, 8 GB RAM, 100 GB disk, Ubuntu 24.04, Docker 29.9.2, Compose 5.6.1). Each tool ran alone, from its official Compose file or docker run line, three cold starts each, with empty data before every start. Times are from docker compose up -d to the web UI answering HTTP 200, with images already pulled.
| Tool | Containers | Start to HTTP 200 (median, range) | Idle RAM, containers (median, range) | Idle RAM, whole server above baseline | Image size | Disk used after first start | One-off pull |
|---|---|---|---|---|---|---|---|
| SiYuan | 1 | 3.9 s (3.5 to 4.0) | 45.4 MiB (44.9 to 45.6) | +55 MiB (37 to 58) | 453 MB | 771 MiB | 4.9 s |
| Docmost | 3 | 8.1 s (8.0 to 8.2) | 477.5 MiB (476.6 to 480.9) | +529 MiB (512 to 535) | 1.94 GB | 1,919 MiB | 30.8 s |
| Outline | 3 | 19.3 s (18.4 to 19.5) | 273.2 MiB (271.7 to 273.7) | +315 MiB (311 to 323) | 2.43 GB | 2,384 MiB | 26.6 s |
| AppFlowy | 11 | 19.6 s (19.1 to 20.3) | 556.0 MiB (548.0 to 568.2) | +708 MiB (698 to 714) | 3.27 GB | 3,174 MiB | 23.1 s |
| AFFiNE | 3 + 1 one-shot migration | 21.7 s (21.6 to 22.9) | 225.2 MiB (223.1 to 226.0) | +280 MiB (273 to 325) | 1.74 GB | 1,730 MiB | 12.7 s |
"Image size" is Docker's total for the stack, shared layers counted once. "Disk used" is the rise in the server's used space, images included. "Idle" is 120 seconds after the first 200, nobody logged in. The container figure sums docker stats; the whole-server figure is the rise in free -m used memory, which includes Docker's own overhead.
Reading the table:
- SiYuan is in a class of its own: one container, 45 MiB, up in four seconds. Its first start wrote about 340 MiB beyond the image.
- Docmost is the heaviest of the three-container stacks on RAM, at about 480 MiB, most of it the Node app itself (425 MiB). It is also the quickest to start of the multi-service tools.
- AFFiNE and Outline use about half that, around 225 and 273 MiB.
- AppFlowy is the biggest on every axis: eleven containers, about 3.3 GB of images, about 560 MiB idle. PostgreSQL alone held 245 MiB.
- No tool restarted, except AppFlowy's search container: six restarts in the first seconds of every run, waiting for the database, then stable.
What "HTTP 200" meant for each
- Docmost:
/answers 200 and shows the setup page. Whoever reaches the port first creates the workspace. - AFFiNE:
/answers a redirect to/admin/setup, which answers 200. Same first-visitor rule: the first person to open it creates the admin account. - AppFlowy:
/redirects to/app, which answers 200. Itsdeploy.envships public default credentials (admin password, signing secret, MinIO keys). Change them before exposure; we ran it on loopback only. - SiYuan:
/answers 401 without an access code. The lock screen at/check-authanswers 200, and that is what we timed. - Outline:
/and the health route answer 200, but nobody can sign in. We asked the server for its sign-in methods and got an empty list. The page loads and leads nowhere.
One more Outline finding: the Compose file in its Docker docs did not start as written. The Redis service points at a /redis.conf that is never mounted (the volume line is commented out), so Redis exits and Outline loops on "Retrying redis connection". We deleted that one command line and it worked.
Control runs
A closed port returned 000, so a 000 to 200 switch in the logs is a real start. A plain nginx container, started twice as a known-good baseline, answered 200 in 0.54 s and 0.43 s and used 4.7 MiB, so the harness reads a trivial service correctly. The three runs per tool agree within about two seconds, shown as the ranges above.
Who each one is for, and what to pick
- SiYuan: one person, private notes, smallest footprint. Mind the Docker limits, and that syncing to your own storage is paid.
- Docmost: a small team that wants a wiki on one VPS. No outside services, three containers, about eight seconds to start, and we found no seat limit stated for the free edition.
- AFFiNE: documents plus a whiteboard, up to ten people. Read the licence files first, and expect a slow-moving stable line.
- Outline: a team that already has an identity provider. A polished wiki, but sign-in is delegated by design.
- AppFlowy: one person who wants the Notion-like app with their own sync. One seat free, the heaviest stack, commercial server software.
On sizing: all five idled comfortably on the 8 GB Comet, none above about 700 MiB over the empty server. AFFiNE recommends four cores, which Comet has. We did not test smaller plans, so a lighter tool on Orbit is a bet from these numbers, not a result. Real use climbs; AFFiNE's docs cite peaks near 1 GB merging a large document.
Which need external services
The Compose files bundle PostgreSQL and Redis, so none needs a database elsewhere. Two lean on other things.
- Outline is the poor fit for a single small VPS unless you already run single sign-on. It needs a Google, Slack, Microsoft, Discord or OIDC app, or an SMTP service for magic links. Running your own identity provider adds more containers.
- AppFlowy needs nothing outside for one user, but team sign-in is a paid feature and the vendor's sizing starts at 4 vCPUs and 16 GiB for 100 users.
- AFFiNE, Docmost and SiYuan work on their own. Email is optional for AFFiNE and Docmost, as are AFFiNE's OAuth and AI keys. SiYuan syncs to third-party storage only on a paid plan.
How we measured
On a fresh Ubuntu 24.04 server with Docker installed from get.docker.com:
docker system prune -af --volumes # clean slate between tools
docker compose pull # timed once
docker compose down -v # empty data before each run
docker compose up -d # start the clock
until [ "$(curl -s -o /dev/null -L -m 3 -w '%{http_code}' http://127.0.0.1:PORT/)" = 200 ]; do sleep 0.5; done
sleep 120 # idle
docker stats --no-stream # sum the MemUsage column
free -m; df -m /; docker system df # server RAM, disk, image size
Ports were published on 127.0.0.1 only, so no setup page was reachable from the internet. Compose files came from each project's docs (Outline's minus its HTTPS proxy). Secrets were generated per run.
Not measured: any sign-in, editing, search, import, export, AI, client app, backup or upgrade; real users; smaller plans; HTTPS. Pull time was timed once per tool, so it has no spread. Tags are latest or stable, so your numbers will reflect whatever is current when you run them.
Do it with an AI agent
Paste this into Claude Code or Cursor to try one of the tools on your own server and check the same things we did.
Prompt for an AI agent
Deploy ONE self-hosted Notion alternative to a fresh Ubuntu 24.04 VPS using the project's official Docker Compose or docker run instructions, and report what it costs. I will tell you which tool: Outline, AFFiNE, AppFlowy (SelfHost-Commercial repo), Docmost or SiYuan. If I have not said, ask me first.
ASSUME you run on my own machine and SSH to the server. The server address is SERVER_IP. Key-based SSH as root works.
STEPS:
1. Check the server is empty: "docker ps -a" and "ls". If anything is running or a deploy directory exists, STOP and ask me.
2. Install Docker with the official convenience script from get.docker.com. Show "docker --version" and "docker compose version".
3. Fetch the Compose file from the project's own documentation or repository (not from a blog). Generate any secrets with "openssl rand -hex 32" on the server and keep them in a chmod 600 file. Never print them.
4. Publish the web port on 127.0.0.1 ONLY (for example "127.0.0.1:3000:3000"). Do not bind to 0.0.0.0, because first-run setup pages let the first visitor create the admin account.
5. "docker compose pull", then "docker compose up -d". Record seconds until the web UI returns HTTP 200 with: curl -s -o /dev/null -L -m 3 -w '%{http_code}' URL from the server.
6. Wait 120 seconds. Record "docker stats --no-stream", "free -m", "df -m /" and "docker system df".
RULES:
- Never create an account, sign in, or enter a password in the app. I do that in the browser.
- Outline has no password login. If you deploy Outline, tell me it needs a sign-in provider or SMTP before anyone can log in, and stop there.
- AppFlowy's deploy.env ships default credentials. Tell me, and do not expose its ports publicly until I replace them.
- If the official Compose file fails to start, show me the container logs. Do not improvise a fix without telling me what you changed.
- Nothing destructive. Do not run "docker system prune" if anything else is on the server.
VERIFY, AND SHOW ME THE OUTPUT OF EACH:
- "docker compose ps" -> all services running (a one-shot migration container may show Exited 0)
- the HTTP 200 check, and the time it took
- NEGATIVE CONTROL, from MY machine: curl -m 5 http://SERVER_IP:PORT -> this MUST fail or time out. If it answers, the port is exposed. Stop and tell me.
- the RAM, disk and image-size numbers from step 6
Do not tell me a step succeeded without the command output that proves it. If a check fails, stop and report the actual error.The agent never creates the admin account, so no password passes through a chat log.
Other Docker self-hosts we have written up: Vaultwarden, Uptime Kuma and Plausible Analytics.
Deploy your VPS
Run your own workspace on a server you control.
The Comet plan is the server we measured on, with room for any of the five. Smaller plans are likely enough for the lighter tools, but we have not tested them.
- Unmetered bandwidth, no overage
- Free DDoS protection
- Daily automated backups
- Browser console access
Common questions
What is the lightest self-hosted Notion alternative? In our runs, SiYuan: one container, 45 MiB idle, a four-second start. It is built for one person.
Which one works for a team with no outside services? Docmost and AFFiNE both start without an identity provider or SMTP. AFFiNE caps free self-hosted workspaces at 10 seats.
Why can't I sign in to Outline? It has no email-and-password login. Connect a sign-in provider (Google, Slack, Microsoft, OIDC) or set up SMTP for magic links.
Is AppFlowy open source to self-host? The apps are AGPL-3.0, but the maintained server is commercial software with a free tier of one seat and three guests. The old open-source server repository is archived.
Do these replace Notion's databases? We did not test that. Per the docs, AFFiNE and AppFlowy have database views, SiYuan a table view, and Docmost keeps databases in its enterprise edition.