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:

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:

What "HTTP 200" meant for each

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

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.

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.

Comet plan
$15.99/mo
4 vCPU · 8 GB RAM · 100 GB SSD
Deploy a Comet VPS
  • Unmetered bandwidth, no overage
  • Free DDoS protection
  • Daily automated backups
  • Browser console access
Ready in under 60 seconds. No contract, cancel any time.

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.