Skip to content

VEX-SL/linkgrid

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

100 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🌐 LinkGrid

LinkGrid Logo

A Modern Self-Hosted Link-in-Bio Platform

Beautiful β€’ Fast β€’ Full Control

GitHub Stars GitHub Forks License Node Version Status

Live Demo β€’ Report Bug β€’ Request Feature


πŸ“– Table of Contents


πŸš€ What is LinkGrid?

LinkGrid is a fully self-hosted, production-ready alternative to commercial link-in-bio platforms like Linktree and Bio.link.

Designed for:

  • πŸ‘¨β€πŸ’» 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

You Own:

  • βœ… Your data
  • βœ… Your analytics
  • βœ… Your hosting
  • βœ… Your infrastructure

No third-party tracking. No recurring fees. No vendor lock-in.


✨ Feature Highlights

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

πŸ†š LinkGrid vs Competitors

Comparison with Other Platforms

Feature LinkGrid Linktree Bio.link Carrd
Hosting Model βœ… Self-hosted ❌ SaaS only ❌ SaaS only ❌ Hosted platform
Data Ownership βœ… Full control ⚠️ Platform-owned ⚠️ Platform-owned ⚠️ Platform-owned
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 ⚠️ External scripts ⚠️ External scripts ⚠️ Varies
Pricing πŸ’Έ Free (MIT) πŸ’Έ Freemium πŸ’Έ Freemium πŸ’Έ Paid plans
Branding 🚫 None ⚠️ Free tier branding ⚠️ Free tier branding ⚠️ Free tier branding
Open Source βœ… Yes ❌ No ❌ No ❌ No
Monthly Fees βœ… None ❌ Yes ❌ Yes ❌ Yes

Key Advantages

  • 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

πŸ“Έ Screenshots

πŸŒ™ Elegant Theme (Default)

Elegant Theme

🎨 Themes Preview

Minimal Cyber Glass Terminal
Minimal Theme Cyber Theme Glass Theme Terminal Theme

πŸ–₯️ Admin Interface

Settings Page Analytics Dashboard Links Manager Live Search
Settings Analytics Admin Links Search

Note: The new dedicated /links page provides a clean, protected interface for managing your links, separate from the public view.


πŸš€ Quick Start

πŸ“¦ Installation

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 start

Access your site: Open http://localhost:3000


βš™οΈ Initial Setup

πŸ” First Login

  1. Navigate to http://localhost:3000/admin (or any protected page)
  2. Login with the default password: admin
  3. ⚠️ CRITICAL: Change your password immediately from the settings page!

🎨 Configure Your Profile

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!


πŸ–±οΈ Managing Links (Admin Interface)

LinkGrid now features a dedicated, protected page for link management: /links.

Accessing the Links Manager

  1. Go to http://your-site.com/links
  2. Log in with your admin password (shared across /admin, /settings, /links)

Features of /links Page

  • βœ… 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 /admin and /settings
  • βœ… Separate from public view β€” No risk of accidental edits while visitors browse

☁️ Cloud Storage (Optional)

If you deploy on platforms with ephemeral storage (like Replit, Glitch, etc.), you must use JSONbin.io to persist your data permanently.

πŸ“‹ JSONbin.io Setup

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

Quick Setup Steps:

  1. Create a free account at jsonbin.io
  2. Get your API Key from the dashboard
  3. 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
  4. Copy each bin's ID

Environment Variables

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-id

The app will automatically use JSONbin for all data storage if these variables are set.


πŸ“Š Analytics Dashboard

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!


πŸ”’ Security

Password Management

Default password: admin

⚠️ CRITICAL: Change the default password immediately after first login!

To Change Your Password:

  1. Go to /settings
  2. Enter your new password in the "Admin Password" field
  3. Save

The password is hashed using bcrypt before storage.

Forgot Your Password?

If you forget your password, you can:

  1. Check your JSONbin settings bin (if using cloud storage)
  2. Or reset it manually in public/data/settings.json (local storage)
  3. After reset, go to /settings and set a new password

Security Best Practices:

  • βœ… Use a strong, unique password
  • βœ… Enable HTTPS in production
  • βœ… Don't share your admin links publicly
  • βœ… Regularly backup your data
  • βœ… Set SESSION_SECRET to a long random string

πŸ“ Project Structure

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

🌐 Deployment

Cloud Platforms (Railway / Render / Heroku)

  1. Push your repository to GitHub
  2. Connect to your platform (Railway/Render/Heroku)
  3. Set environment variables as needed
  4. Set start command: node index.js
  5. Done! πŸŽ‰

For ephemeral platforms (Replit, Glitch, etc.) β€” must use JSONbin.io for persistent storage.

VPS / Self-Hosted (Recommended)

Using PM2 for Process Management:

# 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

Recommended Production Setup:

  • βœ… NGINX reverse proxy
  • βœ… HTTPS (Let's Encrypt)
  • βœ… Firewall rules
  • βœ… Regular backups of public/data/

πŸ—οΈ System Architecture

For Developers: Technical deep-dive into how LinkGrid works.

Frontend Layer

  • Pure Stack: HTML / CSS / JavaScript (Vanilla, no frameworks)
  • Theming: CSS Variables β€” all themes defined in style.css
  • Dynamic Rendering: index.html fetches 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

Backend Layer

  • Server: Node.js + Express
  • Storage: JSON files (local) OR JSONbin.io (cloud)
  • Analytics Pipeline:
    1. User clicks a link
    2. Frontend sends POST /api/click
    3. Server extracts IP, geolocation (via ip-api.com + geoip-lite), device type
    4. Server updates statistics (local file or JSONbin)
  • Admin Authentication: Session-based using express-session with bcrypt password hashing

Environment Variables:

  • NODE_ENV β€” production or development
  • SESSION_SECRET β€” secret for session encryption
  • JSONBIN_KEY, *_BIN_ID β€” for cloud storage

Data Flow (Local Storage)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Browser   β”‚  ───► β”‚   Express API   β”‚  ───► β”‚   JSON Files    β”‚
β”‚(index.html) β”‚       β”‚   (index.js)    β”‚       β”‚ (public/data/)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β–²                                                   β”‚
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        (static files)

Data Flow (Cloud Storage)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Browser   β”‚  ───► β”‚   Express API   β”‚  ───► β”‚   JSONbin.io    β”‚
β”‚(index.html) β”‚       β”‚   (index.js)    β”‚       β”‚  (Cloud API)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β–²                                                   β”‚
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        (static files)

Design Principles

  • ⚑ Minimal dependencies β€” No heavy frameworks
  • πŸš€ High performance β€” Lightweight runtime
  • πŸ”§ Easy extensibility β€” Clean, modular code
  • πŸ“Š Transparent data flow β€” Simple to understand and modify

πŸ“ˆ Performance Philosophy

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.


πŸ›£οΈ Roadmap

βœ… Completed Features

  • 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

🚧 Planned Features

  • 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

🧩 Extending LinkGrid

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.


⚠️ Important Notes

  1. Change Default Password: The default password is admin β€” change it immediately from /settings!

  2. Privacy Compliance: The analytics system records IP addresses (to determine country). Be aware of privacy regulations (GDPR, CCPA).

  3. Backup Your Data: Regularly backup your data:

    • Local storage: public/data/ folder
    • Cloud storage: JSONbin.io dashboard
  4. HTTPS in Production: Always use HTTPS when deploying publicly to protect your admin password and session cookies.

  5. 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.

  6. Environment Variables: Never commit .env file to Git. Use your hosting platform's secret management.

  7. 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.

  8. No More AdminPanel on Main Page: The adminPanel option has been completely removed. All link management now happens in the dedicated /links page, making the public view cleaner and safer.


🀝 Contributing

Contributions are what make the open-source community amazing! Any contributions you make are greatly appreciated.

How to Contribute:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Commit your changes: git commit -m 'Add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. Open a Pull Request

Guidelines:

  • Follow clean code principles
  • Avoid unnecessary dependencies
  • Performance-first mindset
  • Write clear commit messages

πŸ“œ License

MIT License β€” Free for personal and commercial use.

See LICENSE for more information.


β˜• Support the Project

If you like LinkGrid, consider supporting development:

Buy Me a Coffee

⭐ Star the repository β€” it helps others discover LinkGrid!


πŸ“¬ Contact

VEX – @VEX_SL_ – hamzaowad1713@gmail.com

Project Link: https://github.com/VEX-SL/linkgrid


Made with ❀️ and JavaScript

⭐ Star us on GitHub β€” it helps!

About

A fast, modern, and fully customizable link-in-bio page to showcase your social profiles, portfolio, and personal links. Lightweight, responsive, and perfect for creators and developers.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors