# LinkAce: a self-hosted bookmark archive built on Laravel and Docker

> LinkAce is a PHP and Laravel application for collecting, archiving and sharing links on your own server. It is a good fit if you already run Docker and want multi-user sharing plus REST API access, and a poor fit if you want a single binary with no database.

**Kovah/LinkAce** — LinkAce is a self-hosted archive to collect links of your favorite websites.

- Repository: https://github.com/Kovah/LinkAce
- Website: https://www.linkace.org
- Stars: 3,341 · Forks: 207
- Language: PHP
- License: GPL-3.0
- Published: 2026-09-10 · Updated: 2026-09-10 · Language: en
- Canonical page: https://hysenlabs.com/projects/kovah-linkace

## The problem LinkAce solves, and who it is actually for

Browser bookmarks are a local list. They do not survive a reinstalled browser profile, they do not tell you when a page 404s, and they cannot be shared with three coworkers without exporting an HTML file and emailing it. LinkAce targets that gap. The README describes it as a self-hosted archive for managing a personal link archive, and explicitly says it "isn't meant to replace your browser bookmarks" but to act as a database for curating online discoveries.

The audience the documentation names is broad: professionals, researchers and general heavy internet users. The feature list narrows it. Multi-user support with internal sharing of links, lists or tags, plus OAuth and OIDC for SSO login, points at small teams and households rather than a single person. Automated link monitoring, which flags links that become unavailable or were moved, is the feature that distinguishes an archive from a read-it-later queue. Automated archiving through the Internet Archive is the second. If you only need a fast place to dump URLs for the next hour, those two features cost you a background job and a database, and you will not use them.

## What the Laravel application actually runs on

The repository layout is a standard Laravel project: app/, bootstrap/, config/, database/, routes/, resources/, storage/ and tests/, with artisan at the top level. The frontend is built with Vite, and package.json lists bootstrap and tom-select as runtime dependencies, with laravel-vite-plugin, sass and postcss as dev dependencies. There is no separate API service; routes/ and app/ hold both the web UI and the REST API the README advertises.

The docker-compose.yml file shows the intended service graph. It defines a MariaDB 12.0 service, a PostgreSQL 17 service, Meilisearch v1.16, Redis 8.2, a PHP container built from resources/docker/dockerfiles/development.Dockerfile, Caddy 2 on port 80, and Buggregator for local debugging. Meilisearch is present because the README advertises advanced search with filters and ordering; Redis is the queue and cache backend; the database is where links, lists, tags and users live. That is four stateful services before you add your own reverse proxy. The compose file binds the database, Meilisearch and Redis ports to 127.0.0.1 only, which is the right default for a development stack and a hint that production expects a different file: docker-compose.production.yml sits next to it at the top level, and the .env.docker.production, .env.local.production and .env.sqlite.production files indicate the environment layout is split by deployment type rather than configured in one place.

## Installing LinkAce with Docker and saving a first link

The README does not contain install commands. It points to the wiki for all installation methods, listing setup with Docker, setup without Docker (PHP), one-click deployment to the cloud, setup with Kubernetes marked Beta, and official managed hosting marked Beta. The commands below come from the repository's docker-compose.yml rather than from the README, so treat them as the development stack and read the v2 setup wiki before running anything in production.

The compose file reads its credentials from environment variables, so a .env file has to exist before the stack starts. The variables it references are DB_PASSWORD, DB_USERNAME, DB_DATABASE and REDIS_PASSWORD.

```bash
cp .env.docker.production .env
docker compose up -d
```

The first command copies the production environment template into place; the second starts the stack. Caddy listens on port 80, so a local visit to http://localhost should reach the application once the PHP container has finished its build. The compose file names the stack linkace_dev, which is the clearest signal that this file is not the production one.

Once the app is reachable, the README describes the workflow: save a link and LinkAce generates the title and description automatically. Lists and tags are the two organizing primitives, and the bookmarklet is the documented way to save a page from any browser. A bookmarklet is a JavaScript snippet you drag to your bookmarks bar, so the first real test is to add it, open an article, click it, and confirm the new entry appears with a fetched title rather than a bare URL.

## Where LinkAce stops being the right tool

The support section is unusually blunt, and it sets expectations correctly: the author states he will not offer free personal support, customization or installation help, and directs users to the community discussions. Paid support exists through Open Collective, Patreon and GitHub sponsors. If you need a vendor to call when an upgrade goes wrong, this is not that project.

The heavier limitation is operational. A working install needs a database, Meilisearch for search, Redis for queues, and a PHP runtime behind a web server. The repository offers SQLite as an option through .env.sqlite.production, which removes the separate database service, but Meilisearch and Redis remain in the documented development stack. The README does not document rollback or downgrade procedures, and it does not state a supported upgrade path between major versions. The default branch is 2.x while package.json reports version 2.6.2 and the newest release is v2.6.1, so the branch and the release tags are not the same thing; pinning to a release tag rather than tracking 2.x is the safer habit, though the documentation does not say this in so many words.

Two features are labelled Beta in the README: Kubernetes setup and official managed hosting. Treat both as unfinished. And the archiving feature depends on the Internet Archive, which is a third party outside your control; if the archive is unreachable, that part of the workflow is too.

## LinkAce compared with linkding and Linkwarden

The comparison people search for is linkace vs linkding, and the difference is architectural. Linkding is a single-user-oriented bookmark manager that the LinkAce README does not discuss, so the honest comparison is by what LinkAce itself documents: multi-user support with internal sharing of links, lists and tags, OAuth and OIDC login, a full REST API, Internet Archive integration, and backup to any S3-compatible storage. Those are the features that add services to the stack. Meilisearch exists to power the advanced search with filters and ordering; Redis exists for background work such as link monitoring and archiving. A tool that skips those features can skip those services.

Linkwarden appears in the same search space, and the same logic applies: the question is not which one has more features but which one matches the services you are willing to run. LinkAce's distinguishing bet is that a link archive is a shared, long-lived database rather than a personal list, which is why it ships RSS feeds for both private and public lists, public and private link visibility, and HTML import and export. If you never share a list and never want a public feed, you are paying the multi-user complexity for nothing.

The README also states LinkAce is available on Zapier and integrates with over 2500+ applications. That is a claim about Zapier's catalogue, not a LinkAce benchmark, and it depends on the REST API continuing to expose the features you need.

## Licence, maintenance and the cost of upgrading

LinkAce is licensed under GPL-3.0, and package.json records the licence field as GPL-3.0-or-later. The practical consequence for most self-hosters is nil: you are running the software, not distributing a modified version. If you intend to embed LinkAce in a product you ship, or to fork it and distribute the fork, the copyleft terms apply to that distribution. That is a description of the licence, not legal advice; read LICENSE.md and talk to a lawyer if distribution is on the table.

The last push to the repository was on 2026-09-07, and the most recent release is v2.6.1 from 2026-08-03, preceded by v2.6.0 on 2026-07-03 and v2.5.9 on 2026-06-21. The project is not archived. The release cadence visible in those three tags is roughly monthly, which matters for upgrade cost: a monthly point release means you should expect to redeploy the PHP container and run migrations regularly rather than once a year. The README does not document a rollback path, so the thing to verify before upgrading is that your database backup is current and restorable. The README does document complete database and application backups to any AWS S3-compatible storage, which is the mechanism to lean on.

## Conclusion

Adopt LinkAce if you already run Docker or PHP and want a multi-user archive with a REST API, OAuth or OIDC login and public or private lists. Do not adopt it if you want a zero-dependency single binary, or if you are unwilling to run and back up a MariaDB or PostgreSQL database alongside Meilisearch and Redis. Before committing, verify the current install steps in the v2 setup wiki rather than the README, confirm which database you intend to use, and check that your backup target is S3-compatible if you plan to use the built-in backup feature.

## FAQ

### Is there a self-hosted bookmark manager available?

Yes. LinkAce is one, and it is designed to run on your own server. The README lists setup with Docker, setup without Docker using PHP, one-click cloud deployment, Kubernetes setup marked Beta, and official managed hosting marked Beta.

### What is the difference between LinkAce and linkding?

The LinkAce README does not discuss linkding, so the difference has to be read off LinkAce's own feature list: multi-user support with internal sharing of links, lists and tags, OAuth and OIDC login, a full REST API, Internet Archive archiving and S3-compatible backups. Those features are what pull in Meilisearch and Redis alongside the database.

### What is a LinkAce alternative?

Linkwarden appears in the same search space, and the useful way to compare is by the services each one requires rather than by feature count. LinkAce's documented stack includes MariaDB or PostgreSQL, Meilisearch, Redis and a PHP runtime behind Caddy or another web server.

## Sources

- [Kovah/LinkAce on GitHub](https://github.com/Kovah/LinkAce)
- [License: GPL-3.0](https://github.com/Kovah/LinkAce/blob/2.x/LICENSE)
- [Project website](https://www.linkace.org)
- [README](https://github.com/Kovah/LinkAce/blob/2.x/README.md)
- [Releases](https://github.com/Kovah/LinkAce/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/kovah-linkace
