- What is LinkGrid?
- Feature Highlights
- LinkGrid vs Competitors
- Screenshots
- Quick Start
- Initial Setup
- Managing Links
- Cloud Storage (Optional)
- Analytics Dashboard
- Security
- Project Structure
- Deployment
- System Architecture
- Performance Philosophy
- Roadmap
- Extending LinkGrid
- Important Notes
- Contributing
- License
- Support
- Contact
LinkGrid is a fully self-hosted, production-ready alternative to commercial link-in-bio platforms like Linktree and Bio.link.
- π¨βπ» Developers β Full backend control and customization
- π¨ Creators β Beautiful themes without coding
- π’ Agencies β White-label solution for clients
- π Privacy-focused users β Your data stays yours
- πΌ SaaS builders β Foundation for link management products
- β Your data
- β Your analytics
- β Your hosting
- β Your infrastructure
No third-party tracking. No recurring fees. No vendor lock-in.
| Feature | Description |
|---|---|
| π¨ 5 Built-in Themes | Minimal, Cyber, Glass, Terminal, Elegant |
| βοΈ Web-Based Settings | Configure everything from /settings page β no code needed |
| π Built-in Analytics | Track clicks, countries, devices, and hourly activity from /admin |
| π Live Search | Instant filtering with result count |
| π±οΈ Dedicated Links Manager | Separate protected page (/links) for full CRUD and drag & drop |
| πΌοΈ Automatic Favicons | Icons are fetched automatically from websites |
| π Secure Authentication | Passwords hashed with bcrypt, session-based login |
| βοΈ Cloud Storage Ready | Use JSONbin.io for persistent data on ephemeral platforms |
| π Blazing Fast | Pure vanilla JS, no heavy frameworks |
| π± Fully Responsive | Looks perfect on any device |
| βΏ Accessibility Ready | Respects prefers-reduced-motion, keyboard navigation |
| π MIT Licensed | Free for personal and commercial use |
| Feature | LinkGrid | Linktree | Bio.link | Carrd |
|---|---|---|---|---|
| Hosting Model | β Self-hosted | β SaaS only | β SaaS only | β Hosted platform |
| Data Ownership | β Full control | |||
| Analytics | β Self-controlled | π Third-party scripts | π Platform analytics | π Limited (paid) |
| Customization | β Full CSS control | π¨ Template-based | π¨ Basic only | π¨ Flexible (complex) |
| Backend Access | β Full access | β No access | β No access | β No access |
| Performance | β‘ Lightweight | |||
| Pricing | πΈ Free (MIT) | πΈ Freemium | πΈ Freemium | πΈ Paid plans |
| Branding | π« None | |||
| Open Source | β Yes | β No | β No | β No |
| Monthly Fees | β None | β Yes | β Yes | β Yes |
- Full Backend Control β Extend, modify, and customize everything
- Own Your Analytics β No external tracking scripts
- No SaaS Lock-in β Export your data anytime
- Privacy-First β Your data never leaves your server
- Developer-Friendly β Clean codebase, easy to extend
| Minimal | Cyber | Glass | Terminal |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Settings Page | Analytics Dashboard | Links Manager | Live Search |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Note: The new dedicated
/linkspage provides a clean, protected interface for managing your links, separate from the public view.
Requirements: Node.js 18+
# Clone the repository
git clone https://github.com/VEX-SL/linkgrid.git
# Navigate to directory
cd linkgrid
# Install dependencies
npm install
# Start the server
npm startAccess your site: Open http://localhost:3000
- Navigate to
http://localhost:3000/admin(or any protected page) - Login with the default password:
admin β οΈ CRITICAL: Change your password immediately from the settings page!
Visit http://localhost:3000/settings to customize:
- Theme β Choose from 5 beautiful themes
- Profile Photo β Upload your picture
- Name & Bio β Your personal information
- Footer Text β Customize the footer
- Search β Enable/disable live search
- Password β Change your admin password
Everything is managed from the web interface β no coding required!
LinkGrid now features a dedicated, protected page for link management: /links.
- Go to
http://your-site.com/links - Log in with your admin password (shared across
/admin,/settings,/links)
- β Full CRUD β Create, read, update, delete links
- β Drag & Drop β Reorder links instantly with visual feedback
- β Automatic Favicons β See icons as you type "auto"
- β
Admin-style UI β Dark theme consistent with
/adminand/settings - β Separate from public view β No risk of accidental edits while visitors browse
If you deploy on platforms with ephemeral storage (like Replit, Glitch, etc.), you must use JSONbin.io to persist your data permanently.
We've created a dedicated page that contains all the JSON code you need β ready to copy & paste.
π Visit the preparation page: https://links--vex-sl.replit.app/prepare
This page includes:
- β The exact JSON for Settings, Links, and Statistics bins
- β Step-by-step instructions for creating bins on JSONbin.io
- β Copy buttons for each JSON block (no manual typing!)
- β All required environment variables explained
- Create a free account at jsonbin.io
- Get your API Key from the dashboard
- Use our prep page to copy and create three bins:
- Settings bin β paste the settings JSON
- Links bin β paste the links JSON
- Statistics bin β paste the empty stats structure
- Copy each bin's ID
Create a .env file (or set environment variables in your hosting platform):
NODE_ENV=production
SESSION_SECRET=your-strong-random-string-64-chars
JSONBIN_KEY=your-jsonbin-master-key
SETTINGS_BIN_ID=your-settings-bin-id
LINKS_BIN_ID=your-links-bin-id
STATS_BIN_ID=your-stats-bin-idThe app will automatically use JSONbin for all data storage if these variables are set.
Visit /admin to see:
- β Total clicks across all links
- π Per-link statistics with last click time
- π Top countries where your visitors are from
- π± Device breakdown (Desktop, Mobile, Tablet)
- β° Hourly activity chart
All analytics are stored locally (or in JSONbin) β no third-party tracking services!
Default password: admin
- Go to
/settings - Enter your new password in the "Admin Password" field
- Save
The password is hashed using bcrypt before storage.
If you forget your password, you can:
- Check your JSONbin settings bin (if using cloud storage)
- Or reset it manually in
public/data/settings.json(local storage) - After reset, go to
/settingsand set a new password
- β Use a strong, unique password
- β Enable HTTPS in production
- β Don't share your admin links publicly
- β Regularly backup your data
- β
Set
SESSION_SECRETto a long random string
linkgrid/
βββ index.js # Express server (backend)
βββ package.json # Node.js dependencies
βββ public/
β βββ index.html # Main public page
β βββ admin.html # Analytics dashboard
β βββ settings.html # Settings page
β βββ admin-links.html # Dedicated links manager page
β βββ prepare.html # Prep page for JSONbin setup
β βββ style.css # All themes & styles
β βββ script.js # Frontend logic
β βββ profile.jpg # Your profile photo
β βββ favicon.png # Site favicon
β βββ data/ # Local storage (when not using JSONbin)
β βββ settings.json
β βββ links.json
β βββ statistics.json
βββ screenshots/ # For README
- Push your repository to GitHub
- Connect to your platform (Railway/Render/Heroku)
- Set environment variables as needed
- Set start command:
node index.js - Done! π
For ephemeral platforms (Replit, Glitch, etc.) β must use JSONbin.io for persistent storage.
# Install PM2 globally
npm install -g pm2
# Start LinkGrid with PM2
pm2 start index.js --name linkgrid
# Save PM2 configuration
pm2 save
# Setup PM2 to start on system boot
pm2 startup- β NGINX reverse proxy
- β HTTPS (Let's Encrypt)
- β Firewall rules
- β
Regular backups of
public/data/
For Developers: Technical deep-dive into how LinkGrid works.
- Pure Stack: HTML / CSS / JavaScript (Vanilla, no frameworks)
- Theming: CSS Variables β all themes defined in
style.css - Dynamic Rendering:
index.htmlfetches data via JavaScript - Favicon Auto-fetch: Icons are automatically fetched from
icons.duckduckgo.com - Live Search: Real-time filtering of links
- Drag & Drop: Implemented with SortableJS
- Server: Node.js + Express
- Storage: JSON files (local) OR JSONbin.io (cloud)
- Analytics Pipeline:
- User clicks a link
- Frontend sends
POST /api/click - Server extracts IP, geolocation (via ip-api.com + geoip-lite), device type
- Server updates statistics (local file or JSONbin)
- Admin Authentication: Session-based using
express-sessionwith bcrypt password hashing
NODE_ENVβ production or developmentSESSION_SECRETβ secret for session encryptionJSONBIN_KEY,*_BIN_IDβ for cloud storage
βββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Browser β ββββΊ β Express API β ββββΊ β JSON Files β
β(index.html) β β (index.js) β β (public/data/) β
βββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β² β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
(static files)
βββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Browser β ββββΊ β Express API β ββββΊ β JSONbin.io β
β(index.html) β β (index.js) β β (Cloud API) β
βββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β² β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
(static files)
- β‘ Minimal dependencies β No heavy frameworks
- π High performance β Lightweight runtime
- π§ Easy extensibility β Clean, modular code
- π Transparent data flow β Simple to understand and modify
LinkGrid is designed for speed and efficiency:
- β‘ Lightweight runtime
- π¦ No heavy framework bundles
- πΎ Minimal memory footprint
- π Fast initial paint
- βοΈ Efficient event handling
Scales vertically β Perfect for VPS deployment.
- Multi-theme system
- Web-based settings page
- Admin analytics dashboard
- Profile avatar
- Drag & drop reorder
- Live search
- Automatic favicons
- bcrypt password hashing
- JSONbin.io cloud storage integration
- Dedicated links manager page (
/links) with admin UI
- Theme builder (custom CSS editor)
- Import / Export links
- Docker support
- Multi-user system
- Role-based access control
- Database mode (MongoDB / PostgreSQL)
- API key system
- Webhook support
- Custom domain manager
- Plugin system
For Developers: LinkGrid is designed for modification. You can:
- π Replace JSON storage with a database
- π¨ Create custom themes
- π Add middleware
- π Build custom analytics dashboards
- π Integrate external APIs
Developer-first architecture β easy to extend and customize.
-
Change Default Password: The default password is
adminβ change it immediately from/settings! -
Privacy Compliance: The analytics system records IP addresses (to determine country). Be aware of privacy regulations (GDPR, CCPA).
-
Backup Your Data: Regularly backup your data:
- Local storage:
public/data/folder - Cloud storage: JSONbin.io dashboard
- Local storage:
-
HTTPS in Production: Always use HTTPS when deploying publicly to protect your admin password and session cookies.
-
Ephemeral Storage Platforms: If deploying on Replit, Glitch, etc., you must use JSONbin.io for persistent data β otherwise all data will be lost on restart.
-
Environment Variables: Never commit
.envfile to Git. Use your hosting platform's secret management. -
Use Our Prep Page: For quick JSONbin setup, visit https://links--vex-sl.replit.app/prepare β it contains all the code you need to copy.
-
No More AdminPanel on Main Page: The
adminPaneloption has been completely removed. All link management now happens in the dedicated/linkspage, making the public view cleaner and safer.
Contributions are what make the open-source community amazing! Any contributions you make are greatly appreciated.
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow clean code principles
- Avoid unnecessary dependencies
- Performance-first mindset
- Write clear commit messages
MIT License β Free for personal and commercial use.
See LICENSE for more information.
If you like LinkGrid, consider supporting development:
β Star the repository β it helps others discover LinkGrid!
VEX β @VEX_SL_ β hamzaowad1713@gmail.com
Project Link: https://github.com/VEX-SL/linkgrid
Made with β€οΈ and JavaScript
β Star us on GitHub β it helps!









