Introduction

You've got forty browser tabs open right now, and at least a dozen of them are things you meant to "read later" and never will. Bookmarks folders don't help — they turn into a graveyard of nested subfolders nobody opens again. Linkwarden solves this differently: it's a self-hosted bookmark manager that actually archives the page, not just the URL, so the link still works even after the original site changes or disappears.

This guide walks through installing Linkwarden in an LXC container on Proxmox VE 9.2, using the community helper script that handles the container creation, dependencies, and database setup for you. You don't need to know Docker, Node.js, or PostgreSQL to follow along. Every command gets explained before you run it, and every setting gets a reason attached to it.

By the time you're done, you'll have a working bookmark manager on your own hardware, reachable from any device on your network, with your data staying on your server instead of some company's servers.

What You Will Learn

  • What Linkwarden does and how it's different from a regular browser bookmark
  • Why an LXC container is a sensible way to run it on Proxmox VE
  • How to deploy the Linkwarden container using the Proxmox VE Community Scripts helper
  • How to log in, create your first collection, and save a link
  • What each part of the install command actually does
  • Common errors people hit during and after setup, and how to fix them

What Is This Feature?

Linkwarden is an open-source, self-hosted bookmark manager built to be a bit more than a bookmark manager. When you save a link, it doesn't just store the URL and a title. It can take a screenshot of the page, save a readable text version, and archive the full HTML, so if the original page goes down or gets rewritten, your copy still exists. You organize saved links into collections, tag them, and search across everything — including the text inside the archived pages, not just the titles.

It runs as a web application, which in this guide lives inside an LXC container. If that term is new to you: LXC stands for Linux Containers, and it's a way of running an isolated Linux environment that shares the host's kernel instead of emulating an entire virtual machine. That makes containers start in a couple of seconds and use a fraction of the RAM a full VM would need for the same job. Proxmox VE has built-in support for LXC containers alongside its regular KVM virtual machines, and for a single web app like Linkwarden, a container is almost always the right tool.

To get it running quickly, this guide uses a script from the Proxmox VE Community Scripts project (community-scripts.github.io/ProxmoxVE), a community-maintained collection of installer scripts that automate the boring parts — creating the container, installing dependencies, setting up the database, and configuring the app to start on boot.

Why Would You Use It?

If you've ever lost a bookmark because a site got taken down, paywalled, or "redesigned" into oblivion, you already know the problem. Regular bookmarks are just pointers. When the destination changes, the bookmark is worthless. Linkwarden keeps an actual copy, so your reference material survives even when the internet doesn't.

It's also genuinely useful for research and documentation. Say you're collecting sources for a project, saving vendor documentation pages, or building a personal knowledge base of tutorials and forum threads. A shared collection with tags and full-text search beats a Notion page full of pasted links, and unlike browser sync, it isn't tied to one browser or account.

Running it yourself means no monthly subscription, no storage cap decided by someone else, and no risk of the service shutting down and taking your saved research with it. The tradeoff is that you're responsible for backups and updates — something this guide covers in the Best Practices section.

Prerequisites

Before starting, make sure you have:

  • A working Proxmox VE host, version 8.x or 9.x (this guide was tested on 9.2)
  • At least 12 GB of free space and 2 GB of free RAM on the node you're deploying to — the default container uses 2 CPU cores, 2048 MB RAM, and a 12 GB disk
  • Root (or an equivalent admin) access to the Proxmox VE shell, either through the web console or SSH
  • A network where the Proxmox host can reach the internet, since the script downloads packages during setup
  • A rough idea of what IP address range your containers use, so you can reach Linkwarden's web interface afterward

You don't need to know anything about Node.js, PostgreSQL, or Docker — the script installs and wires up everything Linkwarden needs on its own.

Step-by-Step Tutorial

Step 1: Open the Proxmox VE Shell

Log in to the Proxmox VE web interface, click your node's name in the left-hand tree, then click >_ Shell near the top right. This opens a root terminal directly on the host, which is where the container gets created from.

Step 2: Run the Linkwarden install script

Paste this command into the shell and press Enter:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/linkwarden.sh)"

The script will ask a few questions — whether to use default settings or advanced ones. For a first install, choose the default option. It will then create a new unprivileged LXC container running Debian 13, install Node.js, PostgreSQL, and Linkwarden itself, and start the service automatically. This takes somewhere between five and ten minutes depending on your internet connection, most of it spent downloading packages.

Step 3: Find the container's IP address

Once the script finishes, it prints a summary in the shell, including the container's IP address and the port Linkwarden listens on (3000 by default). If you missed it, click on the new container in the Proxmox VE tree (it'll be named something like linkwarden), open its Summary tab, and read the IP address shown under IPs.

Step 4: Open Linkwarden in your browser

Go to http://<container-ip>:3000 in a browser on the same network. You should see Linkwarden's registration screen. The first account you create becomes the admin account, so use a real password here — this isn't a throwaway login.

Step 5: Create your first collection and save a link

After logging in, click New Collection and give it a name — something like "Homelab Docs" or "Reading List" works fine as a first test. Inside the collection, click New Link, paste a URL, and Linkwarden will fetch the page, generate a preview, and begin archiving it in the background. Give it a minute; the screenshot and full-text archive don't appear instantly.

Step 6: Set the container to start on boot

The script usually enables this automatically, but it's worth confirming. Click the container, go to Options, and check that Start at boot is set to Yes. Without this, a host reboot leaves Linkwarden offline until you start the container manually.

Commands Explained

Only one real command drives this whole setup, but it's worth breaking down since it's doing more than it looks like:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/linkwarden.sh)"
  • curl -fsSL <url> downloads the install script's contents. The -f flag makes curl fail silently on server errors instead of printing an HTML error page, -s hides the progress bar, -S shows the actual error if one occurs, and -L follows redirects, since GitHub raw URLs sometimes redirect.
  • bash -c "$(...)" takes the downloaded script text and runs it immediately through bash, without saving it to a file first.

A couple of commands are useful once the container exists, run from the Proxmox VE shell:

  • pct list — lists every LXC container on the node along with its ID and status, useful for confirming the Linkwarden container is actually running.
  • pct enter <vmid> — drops you into a root shell inside the container, replacing <vmid> with the container's ID number shown in pct list. Useful if you need to check logs or edit the configuration file directly.
  • systemctl status linkwarden — run inside the container (after pct enter), shows whether the Linkwarden service is active and, if it's crashed, the last few log lines explaining why.

Common Errors

A handful of issues come up often enough that they're worth calling out ahead of time.

Error / SymptomLikely CauseFix
Browser shows "This site can't be reached" on port 3000Container hasn't finished booting, or the wrong IP was usedWait a minute after the script finishes, then re-check the IP under the container's Summary tab
Script exits early with a curl errorThe Proxmox host has no internet access, or a firewall is blocking outbound HTTPSTest with curl -I https://github.com from the host shell; fix DNS or firewall rules first
Login page loads but registration fails silentlyPostgreSQL didn't finish initializing before the app startedReboot the container with pct reboot <vmid> and try again after a minute
Link previews and screenshots never generateThe container doesn't have enough RAM for the headless browser Linkwarden uses to render pagesIncrease RAM to at least 2048 MB (or higher for heavy use) in the container's Hardware tab, then reboot it

Troubleshooting

If Linkwarden won't load at all, start with the basics: is the container running? Check pct list from the Proxmox shell and confirm the status column says "running," not "stopped." If it's stopped, start it with pct start <vmid>.

If it's running but unreachable, ping the container's IP from another machine on the same network. No response usually means a networking mismatch — check that the container's network bridge matches the one your other VMs and containers use (normally vmbr0), under the container's Network tab.

If the page loads but throws a 500 error or a blank screen, the app itself is the problem, not the network. Enter the container with pct enter <vmid> and run journalctl -u linkwarden -n 50 to see the last 50 log lines. Database connection errors here almost always mean PostgreSQL isn't running — check it with systemctl status postgresql.

If archiving (screenshots, full page saves) consistently fails even though login and basic saving work, it's very often a memory problem. The archiving process spins up a headless Chromium instance per link, and that's the single heaviest thing this app does. Bump the container to 4 GB of RAM if you're saving a lot of links at once.

Best Practices

Back up the container regularly. A simple way is a scheduled backup job in Proxmox VE's own Datacenter > Backup section, pointed at the Linkwarden container's ID, set to run weekly. Your bookmarks and archived pages live in the container's PostgreSQL database, so a full container backup covers everything.

Keep the container updated. Linkwarden ships new releases fairly often (the script installs v2.16.0 as of this writing), and the community script itself has an update option — re-running the same install command against an existing container will offer to update it rather than reinstall from scratch.

Don't expose port 3000 directly to the internet. If you want to access Linkwarden away from home, put it behind a reverse proxy with HTTPS (Nginx Proxy Manager or Caddy both work well for this) or use something like Tailscale to reach your home network privately instead. Running an unauthenticated web app on a raw port facing the internet is asking for trouble.

Set resource limits sensibly rather than maxing everything out. Linkwarden with a handful of users and a few hundred saved links runs comfortably on the script's defaults. You only need to scale RAM up if archiving starts timing out or the UI gets sluggish with a large library.

Frequently Asked Questions

Is Linkwarden free?

Yes, it's open source under the AGPL license and free to self-host. There's also a hosted cloud version if you'd rather not run it yourself, but this guide is about the self-hosted route.

Can I run Linkwarden in a VM instead of an LXC container?

You can, but there's little reason to. It's a single lightweight web app, and a container starts faster and uses less overhead than a full VM for the same workload.

Does Linkwarden work with a browser extension?

Yes. Linkwarden has official browser extensions for Chrome and Firefox that let you save the current tab directly to your self-hosted instance without opening the web UI first.

How much storage will archived pages actually use?

It depends heavily on how many pages you save and whether full-page archiving is enabled, but budget for it to grow well past the default 12 GB disk if you're archiving hundreds of image-heavy pages. You can resize the container's disk later from the Proxmox VE web interface without reinstalling anything.

What happens if I lose the container?

Everything is gone unless you had a backup. This is exactly why the Best Practices section above isn't optional advice — set up a scheduled backup job before you start relying on Linkwarden for anything you'd actually miss.

Conclusion

Ten minutes of setup gets you a bookmark manager that actually keeps the pages you save, not just the links to them. That's a small thing until the day a source you relied on disappears from the internet and you're glad you have a copy. Between the community script handling the install and Proxmox VE's built-in backup tools keeping it safe, there's not much excuse left to keep losing track of the links that matter.