Home Blog Open-sourcing my bookmark manager

Screennshot for link-that

Open-sourcing my bookmark manager

In March (2024), I built a very simple bookmark manager and it has served me very well for the past 7 months. So I decided to open-source it and share it with the world. You can check it out on GitHub at roelofjan-elsinga/link-that.

Why (yet another) bookmark manager?

I know what you're thinking. Why do we need another bookmark manager? Fair point! On my search to organize interesting links, I've used a few different ways, including storing them in a text file on my desktop, using Notion for this, using the built-in bookmark manager in my browser, and trying several open source bookmark managers.

These all worked... somewhat. They were fine for use on a single device, but synchronizing them across multiple devices was a pain. And then I'm not even talking about syncing them across multiple different types of devices. Notion was my home for these links for 2 years, but it just got annoying to have to navigate their slow interface.

So annoying, in fact, that I stopped collecting links altogether. So what would any self-respecting software developer do? You guessed it! Build a bookmark manager.

The goal for this project

I've been building this bookmark manager off and on for the past 7 months. You'd think that makes this link collector a black hole of features. But that's exactly what it's not. This bookmark manager has 2 goals:

  1. Collect and store links as quickly as possible
  2. Make them easy to access at a later time.

The first goal is the most important, because slow software is not fun to use. If it's not fun to use, you won't use it and potentially miss out on great resources you could've saved. So it has to be fast.

The second goal is secondary, but it's important. You store links, because you'll want to reference them at a later point in time. So it has to be easy to access. This means it contains easy tabs for frequently used categories and a search bar that will find any link you want.

The technology stack

The technology stack for this project is as simple as I could make it. It's a plain Laravel application with plain old server-side blade templates. The styling is done with Tailwind CSS, and the database is (by default) a simple SQLite database.

The Laravel application is served by FrankenPHP, which is a lightweight web server that uses the Caddy web server. Caddy is by far my favorite web server, so it was a no-brainer to use FrankenPHP to host the application.

The deployment

Deploying this application is also a breeze.

  1. Install docker and the compose module
  2. Create a folder
  3. Create a database.sqlite file in this folder
  4. Add these contents to a docker-compose.yml file in this folder (config below)
  5. Run docker-compose up -d

The docker-compose.yml file should look something like this:

services:
  php:
    image: ghcr.io/roelofjan-elsinga/link-that:latest
    restart: always
    ports:
      - "80:80" # Or whatever port you want to use
    environment:
      - APP_KEY= # Use https://generate-random.org/laravel-key-generator to generate a new key
      - APP_TIMEZONE=UTC # Or whatever timezone you want to use
    volumes:
      - caddy_data:/data
      - caddy_config:/config
      - ./path/to/database.sqlite:/app/database/database.sqlite # Customize this path to your database
    deploy:
      resources:
        limits:
          memory: 128M # Adjust this value to your needs to prevent memory issues

# Volumes needed for Caddy certificates and configuration
volumes:
  caddy_data:
  caddy_config:

You'll have a running instance of this application in a few seconds. The database will automatically be created and the application will be accessible at http://localhost (or whatever host/port you selected).

Why the simple approach?

Why so simple? Because my goal was to make this a fool-proof, simple, and fast as possible. I want to collect links, store them, and make them easy to access later on. Some tinkering on software is always fun, but this application is build to serve a very specific purpose and do so well.

This approach has served me very well for my projects, but I think it's the most satisfying for this specific project. It always works, is very low maintenance, is fast, and "just works".

What's next?

While I want to keep this application as simple as possible, I'm always looking for ways to improve it. I'm currently looking into adding some automation to make collecting links even quicker.

Features like:

  • Automatically scrape descriptions for websites that are linked
  • Create tags on-the-fly (it's now a separate page)
  • The ability to import links from other sources
  • The ability to export links to other sources
  • Authentication for those that want to share their instance with others
Posted on: October 4th, 2024

I help you achieve great SEO, higher conversions, and help you grow your business

Contact me now to start growing your business online

Roelof Jan Elsinga