A highly customizable, fast, and modern "Link in Bio" web application. It allows users to create profiles with multiple links, dynamic themes, background video integration, multimedia embeds, and monetization, all managed through simple JSON files.
🔗 Demo: https://yordisc.github.io/link.me/
- Lazy Loading + Code Splitting: Heavy components (QR, Ads, Socials) only load when needed.
- Optimized Architecture: Ultra-fast initial load.
- PWA Enabled: Works offline with Service Workers.
- Lighthouse Perfect: 100/100 performance score.
Powerful JSON-based system with 7 pre-built themes:
- default - Clean and modern base theme.
- pepsi - Inspired by the Pepsi brand.
- 7up - Fresh and vibrant colors.
- polar - Cold arctic tones.
- malta-polar - Nostalgic warmth.
- solera - Golden elegance.
- carorena - Tropical beach design.
Capabilities:
- Automatic Light/Dark mode.
- Custom colors, shadows, and borders.
- Custom CSS gradient backgrounds.
- Create your own themes without touching the code.
Native support for multiple formats as wallpaper:
- Images: JPG, PNG, WebP.
- Animated GIFs: For dynamic backgrounds.
- MP4 Videos: With automatic loop playback.
- CSS Gradients: Custom gradient backgrounds.
Classic vertical design for traditional navigation.
Advanced grid system with auto-organization:
- Rectangular Buttons: Take up full width (2 columns).
- Square Buttons: Take up 1 individual column.
- Normal Buttons (Smart Grouping): If there are two consecutive normal buttons, they stack vertically in one column to maintain symmetry with squares.
- Responsive Design: Perfectly adapts to any screen size.
Automatic platform detection system that decides the best way to display content:
Direct playback within the profile:
- YouTube: Standard videos, Shorts, and Live streams.
- Spotify: Songs, albums, and full playlists.
- TikTok: Embedded videos with native player.
- Google Maps: Embedded interactive maps.
- CodePen: Live code previews (ideal for portfolios).
- Google Drive: PDF documents with integrated viewer.
For platforms that block iframes (CORS/X-Frame-Options), generates elegant cards with the native style of each brand:
- Instagram, LinkedIn, Twitter/X, GitHub (Repos), Letterboxd, Spotify (Profiles).
Integration with the Lanyard API to show what you are listening to on Spotify LIVE via your Discord status:
Active State (playing music):
- Animated album art.
- Real-time song and artist name.
- Synchronized progress bar.
- Animated audio visualizer.
Inactive State (not playing):
- Automatically transforms into a standard "Follow me on Spotify" button.
Required Setup:
- Discord account connected with Spotify.
- Public Discord profile.
- Discord User ID.
Buttons can open images in full screen without leaving the profile. Ideal for:
- Payment QR Codes: Binance Pay, Zelle, Bitcoin, PayPal.
- Certificates/Diplomas: Display high-resolution achievements.
- Flyers/Promotions: Quick visual information.
- Galleries: Showcase work or products.
Features:
- Zoom and smooth navigation.
- Download button included (except for profile picture for privacy).
- Simple activation: add
#viewto the end of any image URL.
Link resolution engine that allows using cloud storage services directly as Avatar, Background, or Button Images without searching for direct links:
Supported Platforms:
- Google Drive:
- Images: Automatically uses the HD thumbnail CDN (
lh3) for instant loading and to avoid blocks. - Videos: Use the
#videoparameter at the end of the URL to force player mode.
- Images: Automatically uses the HD thumbnail CDN (
- pCloud, Dropbox, Reddit: Direct media extraction.
Advantages:
- Automatic file type detection (image/video).
- No need to manually generate direct download links.
- Automatic loading optimization.
If a button's text is too long to fit the available space, a smooth infinite scrolling animation automatically activates to make it fully readable.
When there are more than 4 social icons, the bar automatically converts into a sliding ribbon with smooth horizontal scroll.
- Optimized animations with Framer Motion.
- Elegant hover effects.
- Micro-interactions that enhance the experience.
Drag and drop functionality to:
- Reorder links in real-time.
- Rearrange social buttons.
- Position the "Join" (Subscribe) button.
- Changes persist during the session.
Advanced monetization protection system that detects ad blockers (uBlock Origin, AdGuard, AdBlock Plus) using multiple techniques:
Detection Methods:
- Local Bait Trap: Attempts to load typically blocked files (
ads.js,prebid.js). - Network Trap: Verifies connection with real ad servers.
- Cosmetic Trap (DOM): Detects if elements with classes like
.adsboxare hidden by the browser.
Features:
- Obfuscated code to avoid detection by filter lists.
- Protected component and variable names.
- Spaces prepared for Google AdSense with security validation.
npm run dev), blocking may be disabled to facilitate programming.
- Google AdSense integration.
- Optimized ad spaces.
- Anti-block protection included.
- Floating ad sidebars.
- Responsive design that automatically hides "boxes/cards" on mobile for an immersive full-screen experience.
- Touch optimization for mobile navigation.
- Adaptive interface according to the device.
- Smooth transitions between breakpoints.
- AES Encryption: Profile data saved in
sessionStorageis encrypted with CryptoJS to prevent casual reading or modification from the console. - No Invasive Tracking: We do not collect personal data without consent.
- Sensitive Data Protection: TypeScript type system for delicate information.
Total control over where your social icons appear:
top: In the profile card, under the bio.bottom: At the end of the link list, with a visual separator.both: In both places (useful for very long profiles).
Three types of buttons with unique features:
- Normal: Standard button with icon and text.
- Square: Square button with background image.
- Rectangular: Wide banner-style button with featured image.
- React 19.1.1 - UI Library with latest features.
- TypeScript 5.9.3 - Robust static typing.
- Vite 7.1.7 - Next-generation build tool.
- React Router DOM 7.9.5 - Dynamic routing (
/:username).
- Tailwind CSS 3.4.18 - Utility-first CSS framework.
- Styled Components 6.1.19 - CSS-in-JS for theming.
- Framer Motion 12.23.24 - Fluid animation library.
- PostCSS 8.5.6 + Autoprefixer 10.4.21 - CSS processing.
The platform includes hidden or activatable interactive experiences:
An "Endless Runner" style game integrated directly into the application.
- Custom components (Obstacles, Game Over screen).
- Seamless integration with the visual theme.
An interactive command-line console (src/components/Games/Terminal) for advanced users or as a backend developer portfolio.
- Support for custom commands.
- Text-based navigation.
- @dnd-kit (core 6.3.1 + sortable 10.0.0) - Complete Drag & Drop system.
- React Hook Form 7.66.0 + Yup 1.7.1 - Form validation.
- Zustand 5.0.8 - Lightweight state management.
- date-fns 4.1.0 - Modern date manipulation.
- react-qr-code 2.0.18 - QR code generation.
- crypto-js 4.2.0 - AES encryption for local data.
- idb 8.0.3 - Modern IndexedDB wrapper.
- react-icons 5.5.0 - Extensive icon library.
- lucide-react 0.552.0 - Additional optimized icons.
- react-ga4 2.1.0 - Google Analytics 4 integration.
- Vite Plugin PWA 1.1.0 - Automatic PWA configuration.
- Vitest 4.0.8 - Ultra-fast testing framework.
- Storybook 10.0.5 - Isolated component development.
- ESLint 9.36.0 + Prettier 3.6.2 - Linting and formatting.
- TypeScript ESLint 8.45.0 - TS specific rules.
- gh-pages 6.3.0 - Automated deployment.
- Node.js: v18.0.0 or higher.
- npm: v9.0.0 or higher (or yarn/pnpm equivalent).
- Git: To clone the repository.
git clone [https://github.com/yordisc/link.me-source.git](https://github.com/yordisc/link.me-source.git)
cd link.menpm installnpm run devVisit http://localhost:5173/ in your browser.
npm run buildCompiled files will be in the dist/ folder.
npm run previewAll content is managed via JSON files in the public/data/ folder.
Create a file with your username: public/data/jose.json
{
"profile": {
"username": "jose",
"displayName": "José Developer",
"bio": "Frontend Dev | Creator | Tech Enthusiast 🚀",
"avatarUrl": "[https://your-cdn.com/avatar.jpg](https://your-cdn.com/avatar.jpg)",
"avatarImages": [
{
"id": "main",
"url": "[https://your-cdn.com/avatar.jpg](https://your-cdn.com/avatar.jpg)",
"alt": "Main Profile"
},
{
"id": "fun",
"url": "[https://your-cdn.com/avatar-fun.jpg](https://your-cdn.com/avatar-fun.jpg)",
"alt": "Fun Mode"
}
],
"theme": "pepsi",
"settings": {
"backgroundImage": "/videos/background.mp4",
"hideThemeButton": false
},
"socialButtons": {
"enabled": true,
"draggable": true
},
"joinButton": {
"enabled": true,
"text": "Subscribe",
"url": "[https://newsletter.com](https://newsletter.com)",
"backgroundColor": "#000000",
"textColor": "#FFFFFF"
}
},
"links": [
{
"id": "portfolio",
"type": "rectangular",
"title": "🎨 My Portfolio",
"url": "[https://myweb.com](https://myweb.com)",
"visible": true,
"icon": "linkcustom"
},
{
"id": "instagram",
"type": "normal",
"title": "Instagram",
"url": "[https://instagram.com/your_user](https://instagram.com/your_user)",
"visible": true,
"icon": "instagram"
}
]
}Standard button with icon and text. Ideal for general links.
{
"id": "portfolio",
"type": "normal",
"title": "My Web Portfolio",
"url": "[https://myweb.com](https://myweb.com)",
"icon": "globe",
"visible": true,
"styles": {
"backgroundColor": "#3b82f6",
"color": "white"
}
}Available Icons: instagram, twitter, facebook, linkedin, github, youtube, tiktok, spotify, globe, mail, phone, linkcustom, etc.
Compact button with background image. Perfect for grid-like layouts.
{
"id": "project1",
"type": "square",
"title": "E-commerce Project",
"url": "[https://project.com](https://project.com)",
"imageUrl": "[https://cdn.com/project-thumbnail.jpg](https://cdn.com/project-thumbnail.jpg)",
"visible": true
}Wide banner-style button with featured image. Ideal for highlighted content.
{
"id": "featured",
"type": "rectangular",
"title": "🚀 Featured Project 2024",
"url": "[https://big-project.com](https://big-project.com)",
"imageUrl": "[https://cdn.com/banner-project.jpg](https://cdn.com/banner-project.jpg)",
"visible": true
}Embed videos, shorts, or live streams directly into your profile.
{
"id": "video-tutorial",
"type": "embed",
"provider": "youtube",
"url": "[https://youtube.com/watch?v=VIDEO_ID](https://youtube.com/watch?v=VIDEO_ID)",
"shape": "rectangular",
"visible": true
}Supported Formats:
- Videos:
https://youtube.com/watch?v=VIDEO_ID - Shorts:
https://youtube.com/shorts/VIDEO_ID - Lives:
https://youtube.com/live/VIDEO_ID
Embed songs, albums, or playlists with native player.
{
"id": "my-playlist",
"type": "embed",
"provider": "spotify",
"url": "[https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M](https://open.spotify.com/playlist/37i9dQZF1DXcBWIGoYBM5M)",
"shape": "rectangular",
"visible": true
}Supported Types:
- Songs:
https://open.spotify.com/track/TRACK_ID - Albums:
https://open.spotify.com/album/ALBUM_ID - Playlists:
https://open.spotify.com/playlist/PLAYLIST_ID
Shows what you are listening to LIVE via Lanyard + Discord.
{
"id": "spotify-now-playing",
"type": "embed",
"provider": "spotify-bio",
"title": "🎵 Listening right now",
"url": "[https://open.spotify.com/user/TU_USUARIO_SPOTIFY](https://open.spotify.com/user/TU_USUARIO_SPOTIFY)",
"originalUrl": "YOUR_DISCORD_USER_ID",
"shape": "rectangular",
"visible": true
}Required Setup:
- Connect Spotify to your Discord account.
- Keep your Discord profile public.
- Get your Discord User ID.
- Replace
YOUR_DISCORD_USER_IDwith your actual ID.
How to get your Discord User ID:
- Enable Developer Mode in Discord (Settings → Advanced).
- Right-click on your profile → Copy ID.
7. Image/QR Viewer with https://www.google.com/search?q=%23view
Opens images in full screen when clicked. Perfect for payment QR codes.
{
"id": "qr-binance",
"type": "square",
"title": "💳 Pay with Binance",
"imageUrl": "[https://unsplash.com/crypto-preview.jpg](https://unsplash.com/crypto-preview.jpg)",
"url": "[https://drive.google.com/file/d/YOUR_QR_ID/view?usp=sharing#view](https://drive.google.com/file/d/YOUR_QR_ID/view?usp=sharing#view)",
"visible": true
}How it works:
imageUrl: Beautiful cover image for the button (decorative).url+#view: Actual image that will open in the viewer (functional).
Use Cases:
- Binance Pay, Zelle, Bitcoin QR codes.
- Certificates or diplomas.
- Event flyers.
- Restaurant menus.
Use videos stored in Google Drive directly.
{
"id": "video-demo",
"type": "rectangular",
"title": "📹 Project Demo Video",
"url": "#",
"imageUrl": "[https://drive.google.com/file/d/VIDEO_ID/view?usp=sharing#video](https://drive.google.com/file/d/VIDEO_ID/view?usp=sharing#video)",
"visible": true
}Important: Add #video to the end of the Google Drive URL to force player mode.
Embed TikTok videos with native player.
{
"id": "tiktok-viral",
"type": "embed",
"provider": "tiktok",
"url": "[https://tiktok.com/@user/video/1234567890](https://tiktok.com/@user/video/1234567890)",
"shape": "square",
"visible": true
}Show your location or important places.
{
"id": "my-office",
"type": "embed",
"provider": "googlemaps",
"url": "[https://maps.google.com/?q=Latitude,Longitude](https://maps.google.com/?q=Latitude,Longitude)",
"shape": "rectangular",
"visible": true
}Perfect for developers: show your live code.
{
"id": "demo-code",
"type": "embed",
"provider": "codepen",
"url": "[https://codepen.io/user/pen/PEN_ID](https://codepen.io/user/pen/PEN_ID)",
"shape": "rectangular",
"visible": true
}For platforms that block iframes, an elegant card with preview is generated.
{
"id": "linkedin-profile",
"type": "embed",
"provider": "linkedin",
"url": "[https://linkedin.com/in/your-profile](https://linkedin.com/in/your-profile)",
"shape": "normal",
"visible": true
}Platforms with Smart Cards:
- Twitter (X)
- GitHub (repositories)
- Letterboxd
| Theme | ID | Description |
|---|---|---|
| Default | default |
Modern and clean base theme |
| Pepsi | pepsi |
Blue and red, inspired by the brand |
| 7UP | 7up |
Fresh and vibrant lemon green |
| Polar | polar |
Cold arctic tones |
| Malta Polar | malta-polar |
Nostalgic golden warmth |
| Solera | solera |
Premium golden elegance |
| Carorena | carorena |
Tropical beach design |
In your profile JSON file:
{
"profile": {
"theme": "pepsi"
}
}Create a file at public/data/themes/my-theme.json:
{
"id": "my-custom-theme",
"name": "My Custom Theme",
"structure": {
"layout": "grid",
"avatarShape": "circle",
"cardStyle": "elevated"
},
"light": {
"colors": {
"primary": "#6366f1",
"secondary": "#8b5cf6",
"accent": "#ec4899",
"background": "#ffffff",
"text": "#1f2937",
"textSecondary": "#6b7280",
"textMuted": "#9ca3af",
"border": "#e5e7eb"
},
"backgrounds": {
"page": "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
"card": "#ffffff"
},
"shadows": {
"card": "0 4px 6px -1px rgb(0 0 0 / 0.1)",
"cardHover": "0 20px 25px -5px rgb(0 0 0 / 0.1)"
},
"borders": {
"card": "1px solid #e5e7eb",
"button": "1px solid #d1d5db"
}
},
"dark": {
"colors": {
"primary": "#818cf8",
"secondary": "#a78bfa",
"accent": "#f472b6",
"background": "#111827",
"text": "#f9fafb",
"textSecondary": "#d1d5db",
"textMuted": "#9ca3af",
"border": "#374151"
},
"backgrounds": {
"page": "linear-gradient(135deg, #1e3a8a 0%, #7c3aed 100%)",
"card": "#1f2937"
},
"shadows": {
"card": "0 4px 6px -1px rgb(0 0 0 / 0.3)",
"cardHover": "0 20px 25px -5px rgb(0 0 0 / 0.3)"
},
"borders": {
"card": "1px solid #374151",
"button": "1px solid #4b5563"
}
}
}Social icons are automatically generated from your main links list when the icon matches a known social network (instagram, twitter, github, etc.) and you have socialButtons.enabled: true.
"profile": {
"socialButtons": {
"enabled": true,
"draggable": true
}
}style Options:
circles: Circular icons (default).squares: Square icons.rounded: Icons with rounded borders.
position Options:
top: Appears in the profile card, under the bio.bottom: At the end of all links, with a separator.both: In both locations (useful for long profiles).
draggable:
true: Allows reordering icons with drag & drop.false: Fixed order.
When you configure more than 4 social icons, the bar automatically converts into a sliding ribbon with smooth horizontal scroll.
link.me/
│
├── public/
│ ├── data/
│ │ ├── themes/ # JSON Themes (default, etc.)
│ │ ├── yordisc.json # User profiles
│ │ ├── jose.json
│ │ └── maria.json
│ └── backgrounds/ # Multimedia resources
│
├── src/
│ ├── components/
│ │ ├── ads/ # Monetization system
│ │ │ ├── AdSenseUnit.tsx
│ │ │ ├── ContentGuard.tsx # Anti-AdBlock System
│ │ │ └── FloatingAdSidebars.tsx
│ │ ├── avatar/ # Avatar and viewer
│ │ │ ├── AvatarViewer.tsx
│ │ │ └── EnhancedAvatar.tsx
│ │ ├── buttons/ # Button components
│ │ │ ├── NormalButton.tsx
│ │ │ ├── SquareButton.tsx
│ │ │ ├── RectangularButton.tsx
│ │ │ ├── SocialButtons.tsx
│ │ │ ├── ...
│ │ │ └── Terminal/ # Interactive Console
│ │ ├── widgets/ # External Widgets
│ │ │ └── SpotifyWidget.tsx
│ │ └── Layout/ # Base Structure
│ │
│ ├── contexts/ # State Management (ThemeContext)
│ ├── hooks/ # Custom Hooks (useLanyard, etc)
│ ├── utils/ # Utilities (crypto.ts)
│ └── types/ # TypeScript Definitions
│
├── package.json
├── vite.config.ts
└── tailwind.config.jsThe project is pre-configured to deploy to GitHub Pages with a single command:
npm run deployAutomated Process:
- Compiles the project (
npm run build). - Uploads the
dist/folder to thegh-pagesbranch. - GitHub Pages publishes automatically.
Configuration in package.json:
{
"homepage": "[https://yordisc.github.io/link.me](https://yordisc.github.io/link.me)",
"scripts": {
"predeploy": "npm run build",
"deploy": "gh-pages -d dist --repo [https://ghp_TOKEN@github.com/yordisc/link.me.git](https://ghp_TOKEN@github.com/yordisc/link.me.git)"
}
}Este proyecto cuenta con un pipeline de Integración Continua (CI) automatizado con GitHub Actions. Con cada actualización, se ejecutan auditorías de rendimiento, pruebas de lógica y simulaciones de usuario.
Los reportes detallados del último despliegue están disponibles públicamente:
| Auditoría | Herramienta | Reporte en Vivo |
|---|---|---|
| Performance & SEO | 🚀 Ver Reporte HTML | |
| Tests Unitarios | 🧪 Ver Resultados JSON | |
| Tests E2E | 📸 Ver Reporte Visual |
ℹ️ Nota: Estos reportes se regeneran automáticamente en la carpeta
/reportsde la ramagh-pagescon cada deploy exitoso.
- ✅ Use TypeScript for all new code.
- ✅ Follow the configured ESLint rules.
- ✅ Write unit tests for critical features.
- ✅ Document complex functions with JSDoc.
- ✅ Use semantic commits:
feat:New featurefix:Bug fixdocs:Documentation changesstyle:Formatting, missing semicolons, etc.refactor:Code refactoringtest:Adding testschore:Updating dependencies, etc.
If you find a bug, please open an issue with:
- Clear description of the problem.
- Steps to reproduce it.
- Expected vs. actual behavior.
- Screenshots if possible.
- Browser/OS information.
Distributed under the MIT License. See LICENSE file for more information.
This means you can:
- ✅ Use commercially
- ✅ Modify the code
- ✅ Distribute
- ✅ Private use
Under the conditions of:
- 📋 Including the copyright notice
- 📋 Including the MIT license
This project would not be possible without these amazing tools and communities:
- React Team - For the best UI library.
- Vite - Ultra-fast build tool.
- Tailwind CSS - CSS framework that speeds up development.
- React Icons - Thousands of icons ready to use.
- Framer Motion - Smooth and easy animations.
- Lanyard API - Real-time Discord status.
- Unsplash - High-quality free images.
- Open Source Community - For sharing knowledge.
👨💻 Yordisc
<div align="center">
Made with ☕ by Yordisc
"One link at a time, building your perfect digital presence"
</div>