Slip

Slip

Docker app from akshaybhandare's Repository

Overview

Slip is a lightning-fast, self-hosted visual bookmark archive and reading space. Inspired by mymind. Built with modern Node.js/TypeScript, React, and SQLite (WAL mode + FTS5 full-text indexing), it features a clean visual stream grid, distraction-free reader mode, robust tag search, and optional Bring Your Own AI (BYO-AI) integrations.
Slip Logo

Slip

A lightning-fast, self-hosted visual bookmark archive and reading space.
Inspired by mymind. Built for self-hosters, creators, and researchers.

TypeScript React SQLite Docker Unraid CA License: MIT


πŸ’¬ Slippy: "Welcome, adventurer! I am Slippy, your database mascot companion. I am here to help you store your digital lootβ€”articles, images, clips, and tagsβ€”directly on your home server. For a full gamified walkthrough on how to harness my powers, check out the official USER_GUIDE.md!"


🌟 Highlights

  • 🎨 Orderful Modern Visual Archive: Clean, high-density stream masonry grid that organizes articles, videos, design inspiration, products, and notes with zero layout glitching.
  • πŸ“± Mobile-First Architecture: 2-column mobile streams, thumb-friendly slide-up bottom sheets, touch-scrolling filter chips, and a quick-save floating action button (FAB).
  • 🧠 Smart Scraping Engine: Automatically extracts OpenGraph tags, JSON-LD structured schemas, article text, and falls back to full-page screenshots when anti-bot firewalls block metadata.
  • ⚑ Instant FTS5 Search: Full-text indexing across bookmark titles, descriptions, reader text, domain names, and tags.
  • ✨ Semantic Smart Search: Natural language conceptual search that understands conversational queries, synonyms, parent franchises, and troubleshooting intents with relevance scores and explanations.
  • πŸ“ Clips (Hierarchical Folders): Organize cards into nested collections and sub-clips (e.g. Hobbies > 3D Printing > Slips). Hidden by default with zero visual intrusion into the main stream.
  • ♻️ Recycle Clip (Soft Delete & Instant Restore): Accidental deletion protection with a non-destructive Recycle Clip, 6-second Instant Undo floating toast, optimistic zero-wait deletion/restoration, sub-clip promotion/cascade options, and safe permanent purge confirmations.
  • 🏷️ AI Auto-Tagging: Intelligently assigns tags on save, re-scrape, or card menus while strictly reusing and prioritizing your existing tag vocabulary.
  • πŸ€– Bring Your Own AI (BYO-AI): Seamlessly connect OpenAI, Anthropic Claude, Google Gemini, or local models (Ollama, Together, OpenRouter) with AES-256 encrypted database storage.
  • πŸ›‘οΈ Zero-AI Disconnected Fallback: All AI options, buttons, badges, and operations are strictly gated. When no AI provider is connected, Slip functions as classic, lightweight Slip without any AI clutter or hints.
  • πŸ“– Built-in Reader Mode: Distraction-free article reader with sanitized HTML, custom typography, and zero ads or trackers.
  • 🏷️ Interactive Tag System: Quick-tag saved links with keyboard autocompletion and one-tap saved tag reuse suggestions (+ #tag).
  • πŸ“¦ Netscape HTML Import & Export: Import from Chrome, Safari, Firefox, Edge, and Raindrop, or export your entire archive anytime.
  • πŸ”— Public Shareables: Generate secure read-only public tokens for individual bookmarks or curated tag collections.
  • πŸ›‘οΈ Self-Hosted & Private: Single SQLite database file with WAL mode, running completely on your own hardware or server.

πŸ—οΈ Architecture

                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚   Client / Browser     β”‚
                          β”‚   (Desktop & Mobile)   β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                      β”‚ HTTP / Cookie / Bearer
                                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Docker Container (Port 3000)                    β”‚
β”‚                                                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   React 18 SPA (Vite)  β”‚ ◄────────     Express Backend (TS)      β”‚  β”‚
β”‚  β”‚   Orderful Modern UI   β”‚ Static  β”‚  - Session & API Key Auth     β”‚  β”‚
β”‚  β”‚   Tag System & Masonry β”‚         β”‚  - Scraper & Queue (2 workers)β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚  - Full-Text Search (FTS5)    β”‚  β”‚
β”‚                                     β”‚  - Netscape HTML Import/Exportβ”‚  β”‚
β”‚                                     β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                             β”‚              β”‚           β”‚
β”‚                                             β–Ό              β–Ό           β”‚
β”‚                                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚                                     β”‚ bookmarks.db β”‚ β”‚ Cache Dir    β”‚  β”‚
β”‚                                     β”‚ (SQLite WAL) β”‚ β”‚ (Thumbnails) β”‚  β”‚
β”‚                                     β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                              β–Ό               β–Ό
                              /mnt/user/appdata/slip:/config (Unraid Volume)

πŸš€ Quick Start with Docker Compose

Create a docker-compose.yml file:

version: '3.8'

services:
  slip:
    image: slip:latest
    build:
      context: .
      dockerfile: Dockerfile
    container_name: slip
    restart: unless-stopped
    ports:
      - "${HOST_PORT:-3000}:${PORT:-3000}"
    volumes:
      - ./config:/config
    environment:
      - NODE_ENV=${NODE_ENV:-production}
      - PORT=${PORT:-3000}
      - HOST=${HOST:-0.0.0.0}
      - DB_PATH=${DB_PATH:-/config/bookmarks.db}
      - CACHE_DIR=${CACHE_DIR:-/config/cache}
      - PUID=${PUID:-99}
      - PGID=${PGID:-100}
      - COOKIE_SECURE=${COOKIE_SECURE:-false}
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://127.0.0.1:${PORT:-3000}/health"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

Start the container:

docker compose up -d

Open http://localhost:3000 in your browser. The first registered user is automatically provisioned as the primary Administrator.


πŸ–₯️ Unraid Server Deployment

Option 1: 1-Click Install via Community Applications (Recommended)

  1. Open your Unraid web GUI and navigate to the Apps tab.
  2. Search for Slip.
  3. Click Install β€” the official template automatically pre-configures:
    • WebUI Port: 3000 (can be mapped to any host port like 3080)
    • Appdata Volume: /mnt/user/appdata/slip -> /config
    • PUID / PGID: 99 / 100 (unraid nobody / users)
  4. Click Apply and open the WebUI!

Option 2: Manual Docker / Compose Configuration

  1. Create Appdata Directory:

    mkdir -p /mnt/user/appdata/slip
    
  2. Template / Compose Settings:

    • Host Port: 3000 -> Container Port: 3000
    • Host Path: /mnt/user/appdata/slip -> Container Path: /config
    • Variables:
      • PUID: 99 (Unraid default nobody)
      • PGID: 100 (Unraid default users)
      • NODE_ENV: production
  3. The container's built-in docker-entrypoint.sh automatically ensures all files in /config are owned by PUID:PGID so you never encounter permission errors on Unraid array shares.


πŸ’» Local Development

Prerequisites

  • Node.js 20+
  • npm

1. Setup Backend

cd backend
npm install
npm run dev

Backend runs on http://localhost:3000.

2. Setup Frontend

cd frontend
npm install
npm run dev

Frontend runs on http://localhost:5173 with automatic API proxying to backend.


πŸ§ͺ Testing

Slip has complete test coverage across both frontend and backend suites (192 tests total):

# Run backend test suite (120 tests across 9 test suites: SQLite, FTS5, Auth, Scraper, Queue, Netscape IO, AI Service, Crypto, Clips & Soft Delete)
cd backend && npm test

# Run frontend UI tests (72 tests in Vitest: TagInput, Responsive Masonry, Mobile FAB, Sync, AI Connection, Recycle Clip & Soft Delete, Note Assist)
cd frontend && npm test

βš™οΈ Environment Variables

Variable Default Description
HOST_PORT 3000 Port on your host/Unraid to access Slip (e.g. 3080).
PORT 3000 Port for the HTTP server inside the container.
HOST 0.0.0.0 Bind host address.
NODE_ENV production Node environment (production, development, test).
DB_PATH /config/bookmarks.db Absolute path to SQLite database.
CACHE_DIR /config/cache Directory where thumbnails and screenshots are cached.
PUID 99 Process user ID for Unraid file permissions.
PGID 100 Process group ID for Unraid file permissions.
COOKIE_SECURE false Set to true if hosting behind an HTTPS reverse proxy.

πŸ“„ License

MIT Β© Akshay Bhandare

Install Slip on Unraid in a few clicks.

Find Slip in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Slip Review the template variables and paths Click Install

Related apps

Details

Repository
ghcr.io/akshaybhandare/slip:latest
Last Updated2026-08-23
First Seen2026-08-22

Runtime arguments

Web UI
http://[IP]:[PORT:3000]
Network
bridge
Shell
sh
Privileged
false

Template configuration

WebUI PortPorttcp

Port used by the Slip web interface.

Target
3000
Default
3000
AppData PathPathrw

Persistent directory for storing Slip's SQLite database (bookmarks.db) and thumbnail cache.

Target
/config
Default
/mnt/user/appdata/slip
PUIDVariable

User ID to run the container (default 99 for Unraid nobody user).

Default
99
PGIDVariable

Group ID to run the container (default 100 for Unraid users group).

Default
100
COOKIE_SECUREVariable

Set to true if hosting behind an HTTPS reverse proxy.

Default
false