Lynx is an open-source, self-hosted link manager that helps you gather all your digital touchpoints in a single page, with secure authentication and a fully customizable design.
- Lynx
- π Quick Start
- π Changelog
- π To-Do / Next Steps
- π¨βπ» Developed With
- π License
- π [Try Lynx Demo on Railway] https://lynx-demo.paoloronco.it]
- Admin Panel: [https://lynx-demo.paoloronco.it/admin]
- Login:
- User:
admin
- Password:
demo123
(the password can't be changed)
- User:
- π¨ Full Customization β personalize colors, themes, fonts, text alignment, and layouts.
- π Flexible Link Management β create classic links, bulleted lists, or text cards (full-card clickable).
- πΌ Rich Media Support β add icons, emojis, or images to your links.
- π Admin Dashboard β manage profile, links, and themes in a clean UI.
- π¦ Import/Export β backup and restore links & themes in JSON with one click.
- π Deploy Anywhere β easy setup on Railway, Render, Docker, GCP, DigitalOcean, Fly.io, and more.
- π± Mobile-First β responsive design that looks great on any device.
- π Standalone by Design β lightweight, no Firebase/Supabase required.
- β‘ Fast & Modern β built with Vite, React, and Tailwind CSS.
- π Password Security β bcryptjs hashing (12 salt rounds).
- π‘ Token-Based Auth β JWT with signed tokens (7-day expiry).
- πΎ Database Protection β parameterized queries for SQLite, preventing SQL injection.
- πͺ Safe Sessions β HttpOnly + SameSite cookies to mitigate XSS/CSRF risks.
- π Code Transparency β fully open-source for audits and improvements.
Credentials:
User: admin
Password: ChangeMe123!
(prerequisite: Node.js 18+)
git clone https://github.com/paoloronco/Lynx.git
cd Lynx
npm install
npm run build
cd server
npm install
cd ..
npm run start
Public β http://localhost:3001
Admin β http://localhost:3001/admin
You can run Lynx directly using the pre-built image from Docker Hub.
-
Pull the image
docker pull paueron/lynx:latest
-
Start the container
docker run -d --name lynx \ -p 8080:8080 \ -e NODE_ENV=production \ -e PORT=8080 \ paueron/lynx:latest
Once started, the app will be available at:
-
Optional environment variables
-
JWT_SECRET β secret key used to sign JWT tokens. If not set, a random key will be generated at runtime (
β οΈ highly recommended to set this in production). -
PORT β the internal server port (default: 8080).
-
NODE_ENV β Node.js environment (default: production).
-
-
Data persistence (recommended)
docker run -d --name lynx \ -p 8080:8080 \ -e NODE_ENV=production \ -e PORT=8080 \ -e JWT_SECRET="your-very-secret-key" \ -v lynx_data:/app/server \ paueron/lynx:latest
You can deploy Lynx on Railway in a few steps:
- Go to Railway Dashboard β New β GitHub Repo
- Connect GitHub repo (Lynx)
- Set the following commands:
- Build Command
npm install && npm run build && cd server && npm install
- Start Command
npm run start
- Build Command
- Click Create and wait for the deployment β¨
- Add a public domain in the settings
- Render
- DigitalOcean App Platform
- Fly.io (Docker)
- Heroku (Container)
- Google Cloud Run (Container)
- Vercel (Node.js / Static)
- Netlify (Static + Functions)
- AWS Elastic Beanstalk
- Azure App Service
- Koyeb (Serverless Containers)
- CapRover (Self-hosted PaaS)
- Dokku (Self-hosted PaaS)
- Coolify (Self-hosted PaaS)
- Northflank
- Qovery
- Cyclic.sh
- Glitch
- Replit
- Stormkit
- Appwrite (Functions/Containers)
- Supabase (Edge Functions)
- Updated title to: βLynx β Your personal links hubβ
- Profile
- Bio now supports line breaks (
whitespace-pre-line
) - Empty bio is automatically hidden (no blank space left)
- Social links are hidden when empty
- Profile picture now displays correctly
- Bio now supports line breaks (
- Links
- Consistent text color applied across title, description, and URL
- Improved Text Card rendering: Link name on the first line, URL on the second line (with horizontal scroll for long URLs)
- Added support for image/emoji next to links
- Added ability to insert either:
- Text Card β full card with only text, entire card clickable via a single link
- Bulleted List β list with a title and multiple links underneath
- Option to export/import links as JSON
- Bug fixes in rendering icons, removing cards, and updating links
- Fixed bugs with icons, card removal, and link updates
- Extended customization: choose font, size, and alignment for links
- Theme
- Removed duplicate βContentβ tab (was redundant with name + bio)
- Partially removed Typography tab β now integrated into Links and Profile sections for better UX
- Export/Import now properly saves and restores themes
- UI
- Updated footer to:
Powered by Lynx | Lynx - Your personal links hub
- Possibility to change the
title
andmeta description
- Updated footer to:
- Code
- Code cleaning & refactoring: removing unnecessary parts, obsolete code, and unused dependencies (e.g., leftover Supabase or Firebase integrations).
π¨βπ» Developed With
- ChatGPT
- Claude
- Lovable
π License
MIT License
Copyright (c) 2025 Paolo Ronco
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.