Stop paying $15/mo for Linktree. LinkBreeze is a free, self-hosted link hub: fast, customizable, with built-in analytics. Install in one command.
Β π Live DemoΒ Β Β·Β Β π Demo Dashboard
| π Multi-Page Support Unlimited pages, each with its own slug, theme, links and analytics |
π¨ Themes + Customizer 11 presets plus a full token-based customizer with import/export |
| π Privacy-first Analytics Views, clicks, referrers, devices. Cookieless, IPs hashed, auto-pruned |
π§ Migration Wizard Import from Linktree, Bento, Hopp.bio, LittleLink or any HTML/JSON export |
| π Self-Hosted Your data, your server. No trackers, no ads, no subscription |
π³ One-Command Install One curl command. Auto-detects Docker or Podman and you are live |
| π± Embed Widgets YouTube, Spotify, SoundCloud, Vimeo and Bandcamp on your page |
π― QR Codes Auto-generated, custom colors, avatar or favicon center, SVG/PNG up to 1024px |
β‘ Zero client-side JavaScript. Loads in under 300ms. Pure server-rendered HTML.
β¨ Β All features
- π Link Management - Add, reorder and customize unlimited links with drag-and-drop
- π Auto-Favicon Links - Links automatically show the target site's favicon, no icon uploads needed
- πΌοΈ Link Thumbnails - Add images to your links for visual preview cards
- β° Link Scheduling - Schedule links to appear or disappear automatically with date/time controls
- π·οΈ Custom Redirect Slugs - Stable, shareable
/go/your-nameshort links that survive delete-and-recreate - π External Analytics - Inject Plausible, Umami, Matomo or Google Analytics with one paste
- πΌοΈ Social Preview (OG) Images - Share cards auto-rendered from your page's theme, or upload your own with fit, position and zoom control
- βοΈ Custom CSS - Fine-tune your page with raw CSS injection
- π§ Email Capture - Collect subscriber emails on your public page, export to CSV
- π Update Notifications - Dashboard banner when a new version is available. No phone-home, no auto-update
- π Fast Admin Panel - Everything above from one clean, instant dashboard
One command. Zero config. Live in 30 seconds:
curl -fsSL https://linkbreeze.omnirise.dev/install.sh | bashThe script detects Docker or Podman, pulls the image and starts the container. Run it with sudo bash and answer y to also enable auto-start on boot.
Then open http://localhost:3000 - the setup wizard takes under 30 seconds.
π Β Want to inspect the script before running it?
curl -fsSL https://linkbreeze.omnirise.dev/install.sh -o install.sh
less install.sh
bash install.shPrefer a different method? Expand one below.
π³ Β Docker
No Node.js, no npm, no config files. Multi-arch images: linux/amd64 and linux/arm64 (Raspberry Pi 3/4/5, Apple Silicon, ARM VPS).
Linux / macOS / Windows CMD:
docker run -d --name linkbreeze --restart unless-stopped -p 3000:3000 -v linkbreeze-data:/app/data docker.io/omnirise/linkbreeze:latestWindows PowerShell - use backticks for line breaks:
docker run -d `
--name linkbreeze `
--restart unless-stopped `
-p 3000:3000 `
-v linkbreeze-data:/app/data `
docker.io/omnirise/linkbreeze:latestDatabase migrations run automatically on container startup.
π§© Β Docker Compose
Create a docker-compose.yml:
services:
linkbreeze:
image: docker.io/omnirise/linkbreeze:latest
ports:
- "3000:3000"
volumes:
- linkbreeze-data:/app/data
restart: unless-stopped
volumes:
linkbreeze-data:docker compose up -dUpgrade: docker compose pull && docker compose up -d Β· Logs: docker compose logs -f linkbreeze
Prefer building from source? git clone https://github.com/Manak-hash/LinkBreeze.git && cd LinkBreeze && docker compose up -d --build
βοΈ Β Coolify
- + New Resource β Docker Compose Empty
- Paste the compose file from the section above
- Set a domain (e.g.
links.yourdomain.com) - Coolify handles Let's Encrypt automatically - Click Deploy
π¦ Β Synology NAS
Container Manager (DSM 7.2+):
- Pull the image
docker.io/omnirise/linkbreeze:latest(Image β Add, if not found) - Create a container: name
linkbreeze, port3000 β 3000, volume/docker/linkbreeze/data β /app/data, restart policyUnless stopped - Click Done - live at
http://<nas-ip>:3000
Data persists in the volume across image updates.
π§ Β Podman
podman run -d --name linkbreeze --restart unless-stopped -p 3000:3000 -v linkbreeze-data:/app/data docker.io/omnirise/linkbreeze:latestPermission errors on the volume? Run podman volume create linkbreeze-data first. The install script at the top detects Podman automatically.
π₯οΈ Β Portainer
- Stacks β Add stack, name it
linkbreeze - Paste the compose file from the Docker Compose section above
- Click Deploy the stack
Updates: Stacks β linkbreeze β Editor β Pull and redeploy.
π¨ Β Manual (without Docker)
Requires Node.js 18+.
git clone https://github.com/Manak-hash/LinkBreeze.git
cd LinkBreeze
npm install
cp .env.example .env
# Edit .env to set your SECRET_KEY and DATABASE_PATH if needed
npm run db:migrate
npm run devFor production: npm run build && npm start
π Β Go live on your domain
Once deployed, your page is at https://your-domain.com/your-slug.
- Point your domain's A record to your server IP
- Expose port 3000 or put a reverse proxy in front
- Done
Ready-made compose files live in examples/ - one self-contained file per scenario:
| What you want | Use this file |
|---|---|
| Automatic TLS, no manual config | docker-compose.caddy.yml or docker-compose.https-portal.yml |
| Automatic TLS with a dashboard (Traefik) | docker-compose.traefik.yml |
| No open ports (zero-trust) | docker-compose.cloudflare-tunnel.yml |
| You already use Nginx + Certbot | docker-compose.nginx.yml |
| Scheduled backups from the UI (no sidecar) | Built in - enable in Settings -> Data |
| Scheduled SQLite backups (raw dump sidecar, S3 offsite) | docker-compose.with-backup.yml |
| Running on Kubernetes | kubernetes.yaml |
Caddy (recommended - auto HTTPS):
links.example.com {
reverse_proxy localhost:3000
}
Nginx:
server {
server_name links.example.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Cloudflare Tunnel (no open ports, no domain purchase needed):
cloudflared tunnel --url http://localhost:3000Click to expand
| Public Page | Admin Dashboard |
![]() |
![]() |
| Links | Profile |
![]() |
![]() |
| Theme | Live Preview Pane |
![]() |
![]() |
| Settings [General] | Settings [Appearance] |
![]() |
![]() |
| Settings [Security] | Settings [Data] |
![]() |
![]() |
| Feature | Linktree | LinkStack | LittleLink | Shako | LinkBreeze |
|---|---|---|---|---|---|
| Price | Free - $35/mo | Free | Free | Free | Free |
| Admin Panel | β | β | β | β | β Fast |
| Multi-Page | β | β | β | β | β Unlimited |
| Auto-Favicon Links | β | β | β | β | β |
| Migration Wizard | β | β | β | β | β |
| Built-in Analytics | Basic, full is paid | Basic | β | β | β Full & private |
| Email Capture | Paid | β | β | β | β |
| Embed Widgets | Partial | β | β | β | β |
| Link Scheduling | Paid | β | β | β | β |
| Themes | Paid | Limited | CSS only | Config file | β Full token system |
| QR Codes | β | β | β | β | β Customizable |
| Self-Hosted | β | β | β | β | β |
| Page Load | Hosted | PHP app | Fast (static) | Fast (static) | <300ms, zero JS |
All configuration is via environment variables. .env.example is the canonical reference - copy it and every variable is documented inline, including the wallet blocks.
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Server port |
DATABASE_PATH |
./data/linkbreeze.db |
SQLite database file path |
BACKUP_DIR |
./data/backups |
Scheduled-backup storage directory (keep inside the persistent ./data volume) |
BACKUP_MIN_FREE_MB |
50 |
Skip writing backups when free space drops below this |
SECRET_KEY |
Auto-generated | HMAC signing key for sessions |
EXTRA_SCRIPT_SRC |
(empty) | Space-separated analytics domains for CSP (e.g. plausible.io umami.is) |
π³ Β Wallet pass variables (Google Wallet / Apple Wallet)
| Variable | Description |
|---|---|
GOOGLE_WALLET_ISSUER_ID |
Numeric issuer ID from the Google Pay & Wallet Console. Enables "Add to Google Wallet" buttons |
GOOGLE_WALLET_SERVICE_ACCOUNT_JSON |
Service-account JSON (client_email + private_key) authorized for the Wallet API |
APPLE_WALLET_CERT_PEM |
Pass Type ID signing certificate (PEM). Enables "Add to Apple Wallet" buttons |
APPLE_WALLET_KEY_PEM |
Private key matching the signing certificate (PEM) |
APPLE_WALLET_KEY_PASSPHRASE |
Passphrase for the signing key, if encrypted |
APPLE_WALLET_WWDR_PEM |
Apple WWDR intermediate certificate (PEM) |
APPLE_WALLET_TEAM_ID |
Your 10-character Apple Team ID |
APPLE_WALLET_PASS_TYPE_ID |
Your Pass Type ID (must start with pass.) |
Every public page renders a share block with a "Save contact" button (universal vCard, always on). The wallet buttons light up automatically when the credentials above are configured. Google Wallet: free issuer account, but passes only save for whitelisted test users until Google grants production access. Apple Wallet: requires a paid Apple Developer account and installs from Safari only. Passes are static snapshots - the QR on the pass always opens the live page. Settings β Integration shows per-wallet credential status and warns when the Apple signing certificate is about to expire.
Using external analytics? Paste your provider snippet into Settings β Integration β Analytics script, then add the provider's domain to EXTRA_SCRIPT_SRC so CSP allows it (e.g. EXTRA_SCRIPT_SRC=plausible.io umami.is). Rebuild after changing it - CSP is baked into the build.
Runtime settings (page slug, title, SEO, theme) are managed via the admin dashboard and stored in the database - no code changes needed.
11 presets are included out of the box: Aurora (animated flagship), Glassmorphism, Neon Cyberpunk, Editorial Paper, Terminal Mono, Pastel Soft, Brutalist, Retro Sunset, Minimal Light, 8-Bit Retro and Frutiger Aero.
ποΈ Β What the customizer controls
The theme engine is a CSS custom property (--lb-*) token system - every color, radius, shadow and font on the public page is a token.
- Background - 8 types (solid, gradient, radial, mesh, aurora, animated gradient, image, pattern) with angle, overlay and opacity controls
- Colors - accent, secondary, text, muted text, card background, card border (hex or rgba)
- Typography - 15 curated Google Fonts, font scale, weight, letter spacing - or upload your own woff2/woff (max 2 MB). Uploaded fonts are served same-origin, embedded in theme exports and carried through backups
- Card style - 7 link styles (pill, rounded, sharp, glass, outline, neon, pixel), hover effects, button size, corner radius, border width, shadow strength
- Layout - container width, alignment (left/center/right), density (compact/normal/relaxed)
- Effects - glow with custom color, glass blur, noise texture, reveal animation
- Duplicate / import / export - clone any theme as an editable copy and share it as JSON
Contributing Β· Security Policy Β· Changelog Β· Troubleshooting Β· Architecture Decisions Β· Configuration reference
Source: GitLab (canonical public mirror, synced automatically) Β· GitHub Β· Image: docker.io/omnirise/linkbreeze
Issues and PRs are welcome on either forge.
Contributions are welcome! See CONTRIBUTING.md for guidelines.
MIT - do whatever you want. See LICENSE.
Built by Manak-hash Β· An OmniRise project.

![Public Page [Aurora Theme]](/Manak-hash/LinkBreeze/raw/main/public/screenshots/Public-Page(Aurora).jpeg)





![Settings Page [General Tab]](/Manak-hash/LinkBreeze/raw/main/public/screenshots/Settings(General).jpeg)
![Settings Page [Appearance Tab]](/Manak-hash/LinkBreeze/raw/main/public/screenshots/Settings(Appearance).jpeg)
![Settings Page [Security Tab]](/Manak-hash/LinkBreeze/raw/main/public/screenshots/Settings(Security).jpeg)
![Settings Page [Data Tab]](/Manak-hash/LinkBreeze/raw/main/public/screenshots/Settings(Data).jpeg)