Bookmarks & read-later

linkding VPS requirements: RAM, CPU, disk, and when the plus image changes the size

By VPSfit · Sources checked · linkding website · source code · MIT

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.

ScenarioRAMvCPUWhy
Bookmarks only, base image, SQLite512 MB1Published 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 browser1 GB1Our 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 snapshots2 GB1–2The 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

ItemWhat the project saysSource
InstallDocker 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 Pilinkding docs: Installation
checked Nov 2, 2026
Image variantslatest (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 bothlinkding docs: Installation, Using Docker
checked Nov 2, 2026
Image sizesCompressed 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 archivingOnly 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 v7linkding docs: Archiving
checked Nov 2, 2026
Web serveruWSGI 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 offlinkding repo: uwsgi.ini, bootstrap.sh, docker/default.Dockerfile
checked Nov 2, 2026
DatabaseSQLite by default (WAL mode is switched on at startup); PostgreSQL optional through LD_DB_ENGINE=postgres. There is no MySQL optionlinkding docs: Options, LD_DB_ENGINE
checked Nov 2, 2026
Request limitsLD_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 hardwarelinkding docs: Options
checked Nov 2, 2026
BackupsEverything 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 versionv1.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 memoryGitHub 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

How we measure →

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 createsuperuser or set LD_SUPERUSER_NAME and LD_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:9090 on every interface (compose file), and Docker's published ports bypass UFW (Docker docs). Bind it to 127.0.0.1:9090:9090 behind Caddy or Nginx.
  • Login fails behind Nginx. Nginx rewrites the Host header by default, which breaks linkding's CSRF check, so login and other forms fail. Add proxy_set_header Host $host and X-Forwarded-Proto, or set LD_CSRF_TRUSTED_ORIGINS to 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_backup writes a ZIP of the database, snapshots, favicons and previews; copying db.sqlite3 while 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 & planRAMvCPUDisk Price / monthTermsSource
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 & planRAMvCPUDisk Price / monthTermsSource
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 & planRAMvCPUDisk Price / monthTermsSource
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.