Bookmarks & read-later
linkding VPS requirements: RAM, CPU, disk, and when the plus image changes the size
linkding is a self-hosted bookmark manager: tags, Markdown notes, read-it-later, sharing, browser extensions, a REST API and optional page archiving, in one Django container with SQLite by default. The base image is one of the lightest apps you can put on a VPS. Published readings put it at about 150 MB idle, and the maintainer says to expect around 230 MB after it has run for a while. The one choice that changes the server size is the plus image, which runs a headless Chromium to save each bookmarked page as an HTML snapshot; the docs say that needs at least 1 GB of RAM. If you read old threads about linkding eating 8 GB, that was a uWSGI file-descriptor bug, fixed in the image since 1.38.1.
Sizing guide
Our recommendations, derived from the sourced figures below. Not measurements.
| Scenario | RAM | vCPU | Why |
|---|---|---|---|
| Bookmarks only, base image, SQLite | 512 MB | 1 | Published readings are 148–232 MB for the container. 512 MB leaves room for the OS and Docker if nothing else runs; add swap. A 1 GB plan is more comfortable with a reverse proxy and another small app. We haven't measured it on a VPS yet. |
| Base image next to other apps, or archiving from your browser | 1 GB | 1 | Our estimate. linkding's share stays around 230 MB; the rest is for neighbours. Saving pages with the SingleFile browser extension stores snapshots without Chromium on the server, so it doesn't raise RAM, only disk. |
| Plus image with server-side HTML snapshots | 2 GB | 1–2 | The docs say Chromium needs at least 1 GB of RAM, and the maintainer says to plan around 1 GB of available memory. 2 GB keeps the OS and the web app out of swap while a snapshot renders. A second vCPU makes snapshots faster; it isn't required. |
Official requirements
| Item | What the project says | Source |
|---|---|---|
| Install | Docker only, from Docker Hub (sissbruecker/linkding) or GHCR. One container, web UI on port 9090, data in /etc/linkding/data. The image has no initial user: create one with manage.py createsuperuser or the LD_SUPERUSER_NAME option. ARM images exist, so it runs on a Raspberry Pi | linkding docs: Installation checked Nov 2, 2026 |
| Image variants | latest (basic functionality), latest-plus (adds HTML snapshots; "significantly larger image size", "more runtime memory to run Chromium", "more disk space for storing HTML snapshots"), and experimental Alpine versions of both | linkding docs: Installation, Using Docker checked Nov 2, 2026 |
| Image sizes | Compressed amd64 download for 1.47.0: 142 MB for the base image, 51 MB for Alpine, 602 MB for plus and 401 MB for plus-alpine (Docker Hub tag listing; unpacked on disk they're larger) | Docker Hub: sissbruecker/linkding tags checked Nov 2, 2026 |
| Server-side archiving | Only in the plus image, and on automatically there. singlefile-cli drives headless Chromium with uBlock Origin Lite to save each new bookmark as one HTML file; links to PDFs are downloaded instead. "Running Chromium requires significantly more memory, at least 1 GB of RAM", and the plus image isn't built for ARM v7 | linkding docs: Archiving checked Nov 2, 2026 |
| Web server | uWSGI with processes = 2 and threads = 2, plus a separate background task processor (Huey) for metadata, favicons, previews and snapshots. The Dockerfiles set UWSGI_MAX_FD=4096. LD_DISABLE_BACKGROUND_TASKS turns the task processor off | linkding repo: uwsgi.ini, bootstrap.sh, docker/default.Dockerfile checked Nov 2, 2026 |
| Database | SQLite by default (WAL mode is switched on at startup); PostgreSQL optional through LD_DB_ENGINE=postgres. There is no MySQL option | linkding docs: Options, LD_DB_ENGINE checked Nov 2, 2026 |
| Request limits | LD_REQUEST_TIMEOUT defaults to 60 seconds; raise it for big bookmark imports. LD_REQUEST_MAX_CONTENT_LENGTH is unset by default, so uploads aren't size-limited; the docs suggest it to stop "uploading large files that might cause the server to run out of memory". LD_SINGLEFILE_TIMEOUT_SEC (60 s) may need raising on low-powered hardware | linkding docs: Options checked Nov 2, 2026 |
| Backups | Everything is in the data folder: db.sqlite3, assets (snapshots and uploads), favicons and previews. python manage.py full_backup writes one ZIP of all of it (SQLite only); the docs warn that just copying db.sqlite3 "is not transaction safe" | linkding docs: Backups checked Nov 2, 2026 |
| Current version | v1.47.0, released 13 Sep 2026. It adds SSRF protection for server-side requests, CORS for the REST API, only schedules snapshot tasks when snapshots are pending, and streams assets instead of reading them fully into memory | GitHub releases: linkding v1.47.0 checked Nov 2, 2026 |
What people report in practice
Individual reports, not controlled tests. Versions, hardware and settings differ, so treat these as data points, not guarantees.
-
linkding idled at 148 MB of RAM and 566 MB of total Docker disk shortly after the documented install on a clean 2 vCPU / 8 GB VM. In the same sweep Wallabag read 58 MB and Karakeep, which also runs a browser for archiving, 679 MB
Independent test of 96 self-hosted apps, Google Cloud e2-standard-2, 28 Sep 2026. Idle with no users or bookmarks; base image
Blog SelfHost Atlas: Self-hosted app RAM usage, 96 apps measured (2026) · checked Nov 2, 2026
-
A user saw the base container start at about 180 MB and reach 232 MiB after 10–12 hours. The maintainer found no leak: memory grows with the charset_normalizer caches used when fetching page titles and with cached templates, then levels off. "For an installation of the base image, memory usage should hover ... somewhere around 230 MB. For the plus image you should plan with around 1 GB of available memory"
GitHub issue, Feb to Apr 2024, answered by the maintainer
GitHub GitHub sissbruecker/linkding #634: Probable memory leak · checked Nov 2, 2026
-
Containers jumped to about 8–9 GB within seconds of starting, with nothing else happening. The cause was uWSGI sizing itself to the host's open-file limit (one user's showed 1073741816). Setting UWSGI_MAX_FD=4096 or a Docker ulimit brought it down to about 160 MB idle and 170–180 MB in normal use
GitHub issue, Apr 2023 to Nov 2024, many reports on Arch, Fedora and Raspberry Pi; fixed in the image by PR #990 (1.38.1, Feb 2025)
GitHub GitHub sissbruecker/linkding #453: uwsgi causing excessive memory consumption · checked Nov 2, 2026
-
With the container limited to 1 CPU and 256 MB, opening a 500 MB asset in the web UI got a uWSGI worker killed (signal 9), because the file was read fully into memory. Fixed in 1.47.0 by streaming assets
GitHub issue, Aug 2026, with a reproduction; fix in PR #1482
GitHub GitHub sissbruecker/linkding #1455: Asset view reads entire file into memory, causing OOM crash · checked Nov 2, 2026
-
Choosing a web-page saver, one user wrote that linkding with headless Chrome "'eats' at least 1G of RAM". Replies suggested Readeck ("barely 30mb ram on sqlite") or pairing the base linkding with the SingleFile browser extension instead
r/selfhosted thread, Sep 2026. Opinions, not measurements
Reddit r/selfhosted: Which saver of web-pages to use? · checked Nov 2, 2026
Our measurements: coming soon
We haven't measured linkding yet, so there are no VPSfit lab numbers on this page. When we do, they'll show the app version, the plan it ran on, the date, and the raw data. Here's what we'll record:
- Idle and 24-hour RAM of linkding 1.47 (base image, SQLite) on a 512 MB and a 1 GB plan
- RAM and time to import a 10,000-bookmark Netscape HTML export on a 1 GB plan
- Peak RAM and CPU of the plus image while creating HTML snapshots, and average snapshot size on disk
- Whether a 1 GB plan with swap can run the plus image without OOM kills during an import
What drives linkding's RAM use
A small Django app that levels off
The base image is two uWSGI workers plus a background task processor, and it idled at 148 MB in one test (SelfHost Atlas). Memory rises a little as page-title caches and templates fill, to about 230 MB, then stops growing (#634). The number of bookmarks barely matters for RAM; tens of thousands of rows are small for SQLite.
Chromium is the real cost
With the plus image, every new bookmark starts a headless Chromium to save the page. That's what needs the extra gigabyte (archiving docs), and a large import queues one snapshot per bookmark. If you only want snapshots sometimes, keep the base image and send pages from the SingleFile browser extension to linkding's API instead.
Disk: snapshots, previews and favicons
The install itself is about 566 MB of Docker disk for the base image (SelfHost Atlas); the plus image download alone is about four times the base one (Docker Hub). After that, the data folder grows with HTML snapshots, uploaded files and PDFs in assets, plus downloaded favicons and preview images (backup docs). We haven't measured a typical snapshot size, so watch du -sh data/assets for your first few weeks.
Gotchas on a VPS
- Old threads about 8 GB of RAM. Before 1.38.1, uWSGI could reserve memory for every possible file descriptor and use 8 GB or more at startup (#453). Current images set
UWSGI_MAX_FD=4096(PR #990). If you run an old pinned tag and see it, upgrade or set that variable yourself. - Create a user, and don't leave the login open. The image starts with no account, so either run
createsuperuseror setLD_SUPERUSER_NAMEandLD_SUPERUSER_PASSWORD(docs). Leaving the password empty creates a user that can only sign in through an auth proxy. Put the login behind HTTPS, or keep it private and reach it through a tunnel such as Pangolin. - Port 9090 is public by default. The example compose file publishes
9090:9090on every interface (compose file), and Docker's published ports bypass UFW (Docker docs). Bind it to127.0.0.1:9090:9090behind Caddy or Nginx. - Login fails behind Nginx. Nginx rewrites the
Hostheader by default, which breaks linkding's CSRF check, so login and other forms fail. Addproxy_set_header Host $hostandX-Forwarded-Proto, or setLD_CSRF_TRUSTED_ORIGINSto your URL. Caddy needs no changes (reverse proxy docs). - Bookmarking internal URLs since 1.47. 1.47.0 added SSRF protection, so linkding no longer fetches titles, previews or PDF snapshots from private and local addresses (options). If you bookmark services on your own network or VPN, list those hosts or ranges in
LD_ALLOWED_INTERNAL_HOSTS. HTML snapshots are only partly covered: the browser can still load embedded resources from internal hosts. - Cap uploads on a small plan. Upload size is unlimited by default. On a 512 MB or 1 GB VPS set
LD_REQUEST_MAX_CONTENT_LENGTH, which the docs suggest to stop large uploads running the server out of memory (options), and give the container a memory limit so a bad request restarts linkding instead of freezing the VPS. - Back up with full_backup, not cp.
python manage.py full_backupwrites a ZIP of the database, snapshots, favicons and previews; copyingdb.sqlite3while it runs isn't transaction safe (backup docs). With PostgreSQL you back up the database and the data folder separately. Copy the ZIP off the server.
Cheapest plans that fit
linkding, base image, SQLite, on its own: 1 GB RAM and 1+ vCPU
Threshold: Published readings of 148–232 MB for the container. Not yet measured by us (source). Only plans with at least 1 vCPU are listed.
| Provider & plan | RAM | vCPU | Disk | Price / month | Terms | Source |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 8 GB | 4 shared | 100 GB SSD | €4.40 excl. VAT · ≈ $4.93 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Vultr Cloud Compute Regular 1 GB | 1 GB | 1 shared, previous-gen Intel | 25 GB SSD | $5.00 before tax |
Monthly price, hourly billing | vultr.com checked Oct 28, 2026 |
| DigitalOcean Basic 1 GiB | 1 GB | 1 shared | 25 GB SSD | $6.00 before tax |
Monthly cap, per-second billing | digitalocean.com checked Oct 28, 2026 |
| Contabo Cloud VPS 6 | 12 GB | 6 shared | 200 GB SSD (or 100 GB NVMe) | €6.00 excl. VAT · ≈ $6.73 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
linkding base image next to a proxy and other small apps: 1 GB RAM and 1+ vCPU
Threshold: Our estimate, not a measurement: about 230 MB for linkding plus room for neighbours (source). Only plans with at least 1 vCPU are listed.
| Provider & plan | RAM | vCPU | Disk | Price / month | Terms | Source |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 8 GB | 4 shared | 100 GB SSD | €4.40 excl. VAT · ≈ $4.93 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Vultr Cloud Compute Regular 1 GB | 1 GB | 1 shared, previous-gen Intel | 25 GB SSD | $5.00 before tax |
Monthly price, hourly billing | vultr.com checked Oct 28, 2026 |
| DigitalOcean Basic 1 GiB | 1 GB | 1 shared | 25 GB SSD | $6.00 before tax |
Monthly cap, per-second billing | digitalocean.com checked Oct 28, 2026 |
| Contabo Cloud VPS 6 | 12 GB | 6 shared | 200 GB SSD (or 100 GB NVMe) | €6.00 excl. VAT · ≈ $6.73 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
linkding plus image with server-side HTML snapshots: 2 GB RAM and 1+ vCPU
Threshold: Docs: Chromium needs "at least 1 GB of RAM"; 2 GB adds headroom for the OS and the web app. Our estimate (source). Only plans with at least 1 vCPU are listed.
| Provider & plan | RAM | vCPU | Disk | Price / month | Terms | Source |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 8 GB | 4 shared | 100 GB SSD | €4.40 excl. VAT · ≈ $4.93 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Contabo Cloud VPS 6 | 12 GB | 6 shared | 200 GB SSD (or 100 GB NVMe) | €6.00 excl. VAT · ≈ $6.73 |
24-month term (effective monthly rate) | contabo.com checked Oct 28, 2026 |
| Vultr Cloud Compute Regular 2 GB | 2 GB | 1 shared, previous-gen Intel | 55 GB SSD | $10.00 before tax |
Monthly price, hourly billing | vultr.com checked Oct 28, 2026 |
| Hostinger KVM 1 | 4 GB | 1 AMD EPYC | 50 GB NVMe | $11.99 intro $6.49 before tax |
Prepaid intro rate; renews at $11.99/mo | hostinger.com checked Oct 28, 2026 |
Prices checked Oct 28, 2026 on each provider's official pricing page. EUR prices converted at the ECB rate of Oct 27, 2026 (1 € = $1.115) only for ranking. See all plans on the cheapest 4 GB VPS page.