https://github.com/tanq16/linksnapper
Simple bookmark manager with nested categories and fuzzy word search across the data.
https://github.com/tanq16/linksnapper
bookmark-manager bookmarker bookmarks catppuccin go golang homelab link-manager links self-hosted self-hosting tailwindcss
Last synced: 5 days ago
JSON representation
Simple bookmark manager with nested categories and fuzzy word search across the data.
- Host: GitHub
- URL: https://github.com/tanq16/linksnapper
- Owner: Tanq16
- License: mit
- Created: 2025-02-03T22:57:54.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2026-07-24T01:51:16.000Z (8 days ago)
- Last Synced: 2026-07-24T03:22:15.271Z (8 days ago)
- Topics: bookmark-manager, bookmarker, bookmarks, catppuccin, go, golang, homelab, link-manager, links, self-hosted, self-hosting, tailwindcss
- Language: JavaScript
- Homepage:
- Size: 13 MB
- Stars: 14
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README

LinkSnapper
`LinkSnapper` is a sleek and minimalist bookmark manager designed for homelab use. It supports a hierarchical category system with a simple and intuitive web interface. It's available for all operating systems and architectures as a binary as well as a multi-architecture container image.
---
- [Motivation](#motivation)
- [Features](#features)
- [Screenshots](#screenshots)
- [Installation](#installation)
- [Usage](#usage)
- [Tips and Notes](#tips-and-notes)
# Motivation
There are numerous bookmark managers available, and they're great. My personal favorites are Karakeep and Linkwarden. I also wanted a significantly simpler format of links to create a shareable repository from my bookmarks. LinkSnapper was created to be that lightweight, no-nonsense bookmark manager that just works.
# Features
### Core Functionality
- Simple bookmark management with essential details (URL, name, description, and categories)
- Multi-level path-based category support, with fuzzy match for new links
- Fuzzy word search across all links, descriptions, and descriptions to find what's needed
- REST API for bookmark management
- Intuitive navigation via breadcrumbs, folders, and links
- Clean and responsive web interface with Catppuccin Mocha theme powered by Tailwind.CSS
- Flat file storage system (`data/links.json`)
### Organization
1. Hierarchical Category System
- Create unlimited nested categories in a tree-like structure
- Easy navigation with breadcrumb trails
2. Smart (fuzzy) Category Suggestions
- Auto-suggests existing categories while adding new links
- Prevents category fragmentation
3. Quick Access Interface
- Fast link addition with minimal clicks
- Efficient search through browser's built-in search
# Screenshots
| Desktop View | Mobile View |
| --- | --- |
|
|
|
# Installation
### Docker Installation (Recommended)
```bash
docker pull tanq16/linksnapper:main
```
```bash
docker run -d \
--name linksnapper \
-p 8080:8080 \
-v linksnapper_data:/app/data \
tanq16/linksnapper:main
```
To use it with Docker compose or a container-management system like Portainer or Dockge, use this YAML definition:
```yaml
version: "3.8"
services:
linksnapper:
image: tanq16/linksnapper:main
restart: unless-stopped
ports:
- 8080:8080
volumes:
- /home/user/linksnapper:/app/data # CHANGE DIR
```
### Binary & Building from Source
You can download the required binary for your system from the project releases. If you want to build yourself, do the following:
```bash
git clone https://github.com/tanq16/linksnapper.git && \
cd linksnapper && \
make build
# or: go build .
```
This produces a `linksnapper` binary. Run it with:
```bash
./linksnapper serve
```
# Usage
Access the web interface through your browser at `http://localhost:8080/`
> [!NOTE]
> This app has no authentication, so deploy carefully. It works well with a reverse proxy like Nginx Proxy Manager and is mainly intended for homelab use.
### `linksnapper serve`
Starts the web server:
```bash
linksnapper serve -p 8080 -H 0.0.0.0 -d ./data
```
**Flags:**
- `-p, --port` - Port to listen on (default: `8080`)
- `-H, --host` - Host to bind to (default: `0.0.0.0`)
- `-d, --data` - Data directory for storage (default: `data`)
### REST API
Add Link:
```bash
curl -X POST http://localhost:8080/api/links \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"name": "Example Site",
"description": "An example website",
"path": ["Tech", "Resources"]
}'
```
Get All Links:
```bash
curl http://localhost:8080/api/links
```
Delete Link:
```bash
curl -X DELETE http://localhost:8080/api/links/{id}
```
Update Link:
```bash
curl -X PUT http://localhost:8080/api/links/{id} \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"name": "Updated Name",
"description": "Updated description",
"path": ["New", "Category", "Path"]
}'
```
# Tips and Notes
- **No authentication**: LinkSnapper has no built-in auth, so don't expose it directly to the internet. Put it behind a reverse proxy (e.g. Nginx Proxy Manager, Caddy, Traefik) with access controls, or keep it on a trusted local/VPN network.
- **Back up your data**: all bookmarks live in a single flat file at `data/links.json` (or whatever directory you pass to `-d`/`--data`). Back up this file/volume regularly since it's the only source of truth.
- **Reverse proxy**: LinkSnapper is plain HTTP with no WebSocket usage, so a standard `proxy_pass`/reverse proxy config to the container's port (default `8080`) is all that's needed.
- **Building locally**: `make build` (or `go build .`) downloads frontend assets and compiles the `linksnapper` binary in one step; run it with `./linksnapper serve`.