{"id":25743925,"url":"https://github.com/tanq16/linksnapper","last_synced_at":"2026-07-26T07:00:29.955Z","repository":{"id":275672673,"uuid":"926819219","full_name":"Tanq16/linksnapper","owner":"Tanq16","description":"Simple bookmark manager with nested categories and fuzzy word search across the data.","archived":false,"fork":false,"pushed_at":"2026-07-24T01:51:16.000Z","size":13664,"stargazers_count":14,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-07-24T03:22:15.271Z","etag":null,"topics":["bookmark-manager","bookmarker","bookmarks","catppuccin","go","golang","homelab","link-manager","links","self-hosted","self-hosting","tailwindcss"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tanq16.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-03T22:57:54.000Z","updated_at":"2026-07-24T01:51:20.000Z","dependencies_parsed_at":"2025-02-04T00:24:00.735Z","dependency_job_id":"0c76348c-c88a-45d3-90b2-77163e75f2aa","html_url":"https://github.com/Tanq16/linksnapper","commit_stats":null,"previous_names":["tanq16/linksnapper"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/Tanq16/linksnapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flinksnapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flinksnapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flinksnapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flinksnapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tanq16","download_url":"https://codeload.github.com/Tanq16/linksnapper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flinksnapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35904303,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-26T02:00:06.503Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bookmark-manager","bookmarker","bookmarks","catppuccin","go","golang","homelab","link-manager","links","self-hosted","self-hosting","tailwindcss"],"created_at":"2025-02-26T10:32:01.704Z","updated_at":"2026-07-26T07:00:29.938Z","avatar_url":"https://github.com/Tanq16.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"/assets/logo.png\" alt=\"LinkSnapper Logo\" width=250px /\u003e\u003cbr\u003e\n\u003ch1 align=\"center\"\u003eLinkSnapper\u003c/h1\u003e\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/tanq16/linksnapper/actions/workflows/release.yml\"\u003e\u003cimg src=\"https://github.com/tanq16/linksnapper/actions/workflows/release.yml/badge.svg\" alt=\"Release Build\"\u003e\u003c/a\u003e\u0026nbsp;\u003ca href=\"https://github.com/Tanq16/linksnapper/releases\"\u003e\u003cimg alt=\"GitHub Release\" src=\"https://img.shields.io/github/v/release/tanq16/linksnapper\"\u003e\u003c/a\u003e\u0026nbsp;\u003ca href=\"https://hub.docker.com/r/tanq16/linksnapper\"\u003e\u003cimg alt=\"Docker Pulls\" src=\"https://img.shields.io/docker/pulls/tanq16/linksnapper\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003c/p\u003e\n\n`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.\n\n---\n\n- [Motivation](#motivation)\n- [Features](#features)\n- [Screenshots](#screenshots)\n- [Installation](#installation)\n- [Usage](#usage)\n- [Tips and Notes](#tips-and-notes)\n\n# Motivation\n\nThere 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.\n\n# Features\n\n### Core Functionality\n\n- Simple bookmark management with essential details (URL, name, description, and categories)\n- Multi-level path-based category support, with fuzzy match for new links\n- Fuzzy word search across all links, descriptions, and descriptions to find what's needed\n- REST API for bookmark management\n- Intuitive navigation via breadcrumbs, folders, and links\n- Clean and responsive web interface with Catppuccin Mocha theme powered by Tailwind.CSS\n- Flat file storage system (`data/links.json`)\n\n### Organization\n\n1. Hierarchical Category System\n    - Create unlimited nested categories in a tree-like structure\n    - Easy navigation with breadcrumb trails\n2. Smart (fuzzy) Category Suggestions\n    - Auto-suggests existing categories while adding new links\n    - Prevents category fragmentation\n3. Quick Access Interface\n    - Fast link addition with minimal clicks\n    - Efficient search through browser's built-in search\n\n# Screenshots\n\n| Desktop View | Mobile View |\n| --- | --- |\n| \u003cimg src=\"/assets/d.png\" alt=\"Desktop\" /\u003e | \u003cimg src=\"/assets/m.png\" alt=\"Mobile\" /\u003e |\n\n# Installation\n\n### Docker Installation (Recommended)\n\n```bash\ndocker pull tanq16/linksnapper:main\n```\n\n```bash\ndocker run -d \\\n--name linksnapper \\\n-p 8080:8080 \\\n-v linksnapper_data:/app/data \\\ntanq16/linksnapper:main\n```\n\nTo use it with Docker compose or a container-management system like Portainer or Dockge, use this YAML definition:\n\n```yaml\nversion: \"3.8\"\nservices:\n  linksnapper:\n    image: tanq16/linksnapper:main\n    restart: unless-stopped\n    ports:\n      - 8080:8080\n    volumes:\n      - /home/user/linksnapper:/app/data # CHANGE DIR\n```\n\n### Binary \u0026 Building from Source\n\nYou can download the required binary for your system from the project releases. If you want to build yourself, do the following:\n\n```bash\ngit clone https://github.com/tanq16/linksnapper.git \u0026\u0026 \\\ncd linksnapper \u0026\u0026 \\\nmake build\n# or: go build .\n```\n\nThis produces a `linksnapper` binary. Run it with:\n\n```bash\n./linksnapper serve\n```\n\n# Usage\n\nAccess the web interface through your browser at `http://localhost:8080/`\n\n\u003e [!NOTE]\n\u003e 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.\n\n### `linksnapper serve`\n\nStarts the web server:\n\n```bash\nlinksnapper serve -p 8080 -H 0.0.0.0 -d ./data\n```\n\n**Flags:**\n- `-p, --port` - Port to listen on (default: `8080`)\n- `-H, --host` - Host to bind to (default: `0.0.0.0`)\n- `-d, --data` - Data directory for storage (default: `data`)\n\n### REST API\n\nAdd Link:\n\n```bash\ncurl -X POST http://localhost:8080/api/links \\\n-H \"Content-Type: application/json\" \\\n-d '{\n    \"url\": \"https://example.com\",\n    \"name\": \"Example Site\",\n    \"description\": \"An example website\",\n    \"path\": [\"Tech\", \"Resources\"]\n}'\n```\n\nGet All Links:\n\n```bash\ncurl http://localhost:8080/api/links\n```\n\nDelete Link:\n\n```bash\ncurl -X DELETE http://localhost:8080/api/links/{id}\n```\n\nUpdate Link:\n\n```bash\ncurl -X PUT http://localhost:8080/api/links/{id} \\\n-H \"Content-Type: application/json\" \\\n-d '{\n    \"url\": \"https://example.com\",\n    \"name\": \"Updated Name\",\n    \"description\": \"Updated description\",\n    \"path\": [\"New\", \"Category\", \"Path\"]\n}'\n```\n\n# Tips and Notes\n\n- **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.\n- **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.\n- **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.\n- **Building locally**: `make build` (or `go build .`) downloads frontend assets and compiles the `linksnapper` binary in one step; run it with `./linksnapper serve`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanq16%2Flinksnapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanq16%2Flinksnapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanq16%2Flinksnapper/lists"}