No description
Find a file
2024-03-17 10:04:05 +01:00
.devcontainer Bump dependencies (#618) 2024-01-28 22:50:51 +01:00
.github/workflows Try fix workflow config 2024-03-17 09:59:04 +01:00
assets Add apple-touch-icon reference in header (#282) 2022-07-03 06:05:20 +02:00
bookmarks Include web archive link in /api/bookmarks/ (#655) 2024-03-17 10:04:05 +01:00
docker Build improvements (#649) 2024-03-16 15:57:23 +01:00
docs Include web archive link in /api/bookmarks/ (#655) 2024-03-17 10:04:05 +01:00
scripts Add support for OIDC (#389) 2024-03-16 23:42:46 +01:00
siteroot Add option for custom CSS (#652) 2024-03-17 01:11:59 +01:00
.coveragerc Exclude tests from coverage 2021-05-14 23:45:32 +02:00
.dockerignore Build improvements (#649) 2024-03-16 15:57:23 +01:00
.env.sample Add database options (#406) 2023-05-18 09:31:13 +02:00
.gitattributes Added Dev Container support (#474) 2023-05-21 13:35:00 +02:00
.gitignore Fix static file dir warning (#350) 2022-10-05 10:00:13 +02:00
background-tasks-wrapper.sh Create snapshots on web.archive.org for bookmarks (#150) 2021-09-04 22:31:04 +02:00
bootstrap.sh Persist secret key in data folder (#620) 2024-01-28 23:58:03 +01:00
CHANGELOG.md Update CHANGELOG.md 2024-03-16 10:48:25 +01:00
docker-compose.yml Fix docker-compose.yaml to import variables from env file 2021-11-10 12:19:56 +01:00
install-linkding.sh Provide automated setup script 2019-12-26 18:49:10 +01:00
LICENSE.txt Add license 2019-12-24 11:03:08 +01:00
Makefile Add black code formatter 2024-01-27 11:29:16 +01:00
manage.py Implement basic bookmark page 2019-06-27 08:09:51 +02:00
package-lock.json Build improvements (#649) 2024-03-16 15:57:23 +01:00
package.json Build improvements (#649) 2024-03-16 15:57:23 +01:00
pytest.ini Support Open Graph description (#602) 2024-01-27 10:28:46 +01:00
README.md Add support for OIDC (#389) 2024-03-16 23:42:46 +01:00
requirements.dev.in Bump dependencies (#618) 2024-01-28 22:50:51 +01:00
requirements.dev.txt Bump django from 5.0.1 to 5.0.2 (#625) 2024-03-16 07:21:58 +01:00
requirements.in Add support for OIDC (#389) 2024-03-16 23:42:46 +01:00
requirements.txt Add support for OIDC (#389) 2024-03-16 23:42:46 +01:00
rollup.config.mjs Build improvements (#649) 2024-03-16 15:57:23 +01:00
SECURITY.md Update SECURITY.md 2022-05-21 10:46:27 +02:00
supervisord.conf Setup logging for background tasks 2022-09-11 07:50:08 +02:00
uwsgi.ini Allow to log real client ip in logs when using a reverse proxy (#398) 2023-05-18 09:34:55 +02:00
version.txt Bump version 2024-03-16 11:27:17 +01:00

Overview

Introduction

linkding is a bookmark manager that you can host yourself. It's designed be to be minimal, fast, and easy to set up using Docker.

The name comes from:

  • link which is often used as a synonym for URLs and bookmarks in common language
  • Ding which is German for thing
  • ...so basically something for managing your links

Feature Overview:

  • Clean UI optimized for readability
  • Organize bookmarks with tags
  • Add notes using Markdown
  • Read it later functionality
  • Share bookmarks with other users
  • Bulk editing
  • Automatically provides titles, descriptions and icons of bookmarked websites
  • Automatically creates snapshots of bookmarked websites on the Internet Archive Wayback Machine
  • Import and export bookmarks in Netscape HTML format
  • Installable as a Progressive Web App (PWA)
  • Extensions for Firefox and Chrome, as well as a bookmarklet
  • Light and dark themes
  • SSO support via OIDC or authentication proxies
  • REST API for developing 3rd party apps
  • Admin panel for user self-service and raw data access

Demo: https://demo.linkding.link/ (see here if you have trouble accessing it)

Screenshot:

Screenshot

Installation

linkding is designed to be run with container solutions like Docker. The Docker image is compatible with ARM platforms, so it can be run on a Raspberry Pi.

linkding uses an SQLite database by default. Alternatively linkding supports PostgreSQL, see the database options for more information.

🧪 Alpine-based image

The default Docker image (latest tag) is based on a slim variant of Debian Linux. Alternatively, there is an image based on Alpine Linux (latest-alpine tag) which has a smaller size, resulting in a smaller download and less disk space required. The Alpine image is currently about 45 MB in compressed size, compared to about 130 MB for the Debian image.

To use it, replace the latest tag with latest-alpine, either in the CLI command below when using Docker, or in the docker-compose.yml file when using docker-compose.

Warning

The image is currently considered experimental in order to gather feedback and iron out any issues. Only use it if you are comfortable running experimental software or want to help out with testing. While there should be no issues with creating new installations, there might be issues when migrating existing installations. If you plan to migrate your existing installation, make sure to create proper backups first.

Using Docker

To install linkding using Docker you can just run the latest image from Docker Hub:

docker run --name linkding -p 9090:9090 -v {host-data-folder}:/etc/linkding/data -d sissbruecker/linkding:latest

In the command above, replace the {host-data-folder} placeholder with an absolute path to a folder on your host system where you want to store the linkding database.

If everything completed successfully, the application should now be running and can be accessed at http://localhost:9090.

To upgrade the installation to a new version, remove the existing container, pull the latest version of the linkding Docker image, and then start a new container using the same command that you used above. There is a shell script available to automate these steps. The script can be configured using environment variables, or you can just modify it.

To complete the setup, you still have to create an initial user, so that you can access your installation.

Using Docker Compose

To install linkding using Docker Compose, you can use the docker-compose.yml file. Copy the .env.sample file to .env, configure the parameters, and then run:

docker-compose up -d

To complete the setup, you still have to create an initial user, so that you can access your installation.

User Setup

For security reasons, the linkding Docker image does not provide an initial user, so you have to create one after setting up an installation. To do so, replace the credentials in the following command and run it:

Docker

docker exec -it linkding python manage.py createsuperuser --username=joe --email=joe@example.com

Docker Compose

docker-compose exec linkding python manage.py createsuperuser --username=joe --email=joe@example.com

The command will prompt you for a secure password. After the command has completed you can start using the application by logging into the UI with your credentials.

Alternatively you can automatically create an initial superuser on startup using the LD_SUPERUSER_NAME option.

Reverse Proxy Setup

When using a reverse proxy, such as Nginx or Apache, you may need to configure your proxy to correctly forward the Host header to linkding, otherwise certain requests, such as login, might fail.

Apache

Apache2 does not change the headers by default, and should not need additional configuration.

An example virtual host that proxies to linkding might look like:

<VirtualHost *:9100>
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://linkding:9090/
    ProxyPassReverse / http://linkding:9090/
</VirtualHost>

For a full example, see the docker-compose configuration in jhauris/apache2-reverse-proxy

If you still run into CSRF issues, please check out the LD_CSRF_TRUSTED_ORIGINS option.

Caddy 2

Caddy does not change the headers by default, and should not need any further configuration.

If you still run into CSRF issues, please check out the LD_CSRF_TRUSTED_ORIGINS option.

Nginx

Nginx by default rewrites the Host header to whatever URL is used in the proxy_pass directive. To forward the correct headers to linkding, add the following directives to the location block of your Nginx config:

location /linkding {
    ...
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Instead of configuring header forwarding in your proxy, you can also configure the URL from which you want to access your linkding instance with the LD_CSRF_TRUSTED_ORIGINS option.

Managed Hosting Options

Self-hosting web applications still requires a lot of technical know-how and commitment to maintenance, in order to keep everything up-to-date and secure. This section is intended to provide simple alternatives in form of managed hosting solutions.

Documentation

Document Description
Options Lists available options, and describes how to apply them
Backups How to backup the linkding database
Troubleshooting Advice for troubleshooting common problems
How To Tips and tricks around using linking
Keyboard shortcuts List of available keyboard shortcuts
Admin documentation User documentation for the Admin UI
API documentation Documentation for the REST API

Browser Extension

linkding comes with an official browser extension that allows to quickly add bookmarks, and search bookmarks through the browser's address bar. You can get the extension here:

The extension is open-source as well, and can be found here.

Community

This section lists community projects around using linkding, in alphabetical order. If you have a project that you want to share with the linkding community, feel free to submit a PR to add your project to this section.

Acknowledgements + Donations

PikaPods

PikaPods has a revenue sharing agreement with this project, sharing some of their revenue from hosting linkding instances. I do not intend to profit from this project financially, so I am in turn donating that revenue. Big thanks to PikaPods for making this possible.

See the table below for a list of donations.

Source Description Amount Donated to
PikaPods Linkding hosting June 2022 - September 2023 $163.50 Internet Archive

JetBrains

JetBrains has previously provided an open-source license of IntelliJ IDEA for the development of linkding.

Development

The application is open source, so you are free to modify or contribute. The application is built using the Django web framework. You can get started by checking out the excellent Django docs. The bookmarks folder contains the actual bookmark application, siteroot is the Django root application. Other than that the code should be self-explanatory / standard Django stuff 🙂.

Prerequisites

  • Python 3.10
  • Node.js

Setup

Create a virtual environment for the application (https://docs.python.org/3/tutorial/venv.html):

python3 -m venv ~/environments/linkding

Activate the environment for your shell:

source ~/environments/linkding/bin/activate[.csh|.fish]

Within the active environment install the application dependencies from the application folder:

pip3 install -r requirements.txt -r requirements.dev.txt

Install frontend dependencies:

npm install

Initialize database:

mkdir -p data
python3 manage.py migrate

Create a user for the frontend:

python3 manage.py createsuperuser --username=joe --email=joe@example.com

Start the Node.js development server (used for compiling JavaScript components like tag auto-completion) with:

npm run dev

Start the Django development server with:

python3 manage.py runserver

The frontend is now available under http://localhost:8000

Tests

Run all tests with pytest:

pytest

Formatting

Format Python code with black, and JavaScript code with prettier:

make format

DevContainers

This repository also supports DevContainers: Open in Remote - Containers

Once checked out, only the following commands are required to get started:

Create a user for the frontend:

python3 manage.py createsuperuser --username=joe --email=joe@example.com

Start the Node.js development server (used for compiling JavaScript components like tag auto-completion) with:

npm run dev

Start the Django development server with:

python3 manage.py runserver

The frontend is now available under http://localhost:8000