Alternative moderne et professionnelle à Linktree
Infrastructure backend moderne basée sur Bun, Fastify et TypeScript strict
Fonctionnalités • Architecture • Installation • Documentation
- Live Preview Sync — Prévisualisation temps réel dans l'iframe du dashboard via
postMessage - Thèmes Personnalisables — Création et gestion de thèmes visuels pour les pages Plinkk
- Statistiques Avancées — Statistiques détaillées avec filtres temporels et granularité configurable
- UI Moderne — Design Glassmorphism pour l'interface Premium et le dashboard
- OAuth2 Multi-Provider — GitHub, Discord, Google
- 2FA/TOTP — Authentification à deux facteurs avec génération QR Code
- Magic Links — Connexion sans mot de passe par email
- Sessions Sécurisées — Chiffrement côté serveur avec
@fastify/secure-session - Rate Limiting — Protection IP et limitation des requêtes
- RBAC Granulaire — Système de rôles et permissions dynamique
- Stripe Integration — Paiements sécurisés et webhooks
- Abonnements Flexibles — Premium mensuel ou lifetime
- Add-ons — Pages supplémentaires, redirections, QR codes
- Quotas Dynamiques — Limites configurables par rôle (
maxPlinkks,maxThemes)
- Service Email (Resend) — Envoi transactionnel professionnel
- Email Alias/Forwarding — Création d'adresses personnalisées avec relais
- Templates HTML — Bienvenue, vérification, reset password, notifications
- Quota Management — Limitation mensuelle configurable (3000 emails/mois gratuit)
- Mode Économie — File d'attente automatique pour emails non-critiques au-delà de 90% du quota
- Tracking Avancé — Suivi des ouvertures et clics avec dédoublonnage automatique
- Templates Réutilisables — Système de templates emails avec 6 modèles prédéfinis
- Bug Reports System — Interface complète de gestion des rapports utilisateurs
- Admin Logs — Historique détaillé des actions d'administration
- User Logs — Traçabilité des actions utilisateurs
- Annonces Système — Communication ciblée par rôle
- Mode Maintenance — Activation avec accès staff préservé
- Cache In-Memory — Système de cache LRU configurable (TTL, max size)
- Cron Jobs — Nettoyage automatique (sessions expirées, comptes inactifs)
- AWS S3 Integration — Stockage d'assets (avatars, uploads)
- Discord Webhooks — Notifications et intégrations
- CDN Ready — Optimisation et compression des assets
Si tu cherches une alternative aux géants classiques comme Linktree ou Lnk.Bio, Plinkk se démarque par une philosophie très différente. C'est un outil pensé pour les créateurs qui veulent allier design, liberté et respect des données.
Voici une décomposition claire de ce que propose Plinkk, de ses avantages pratiques et de ses véritables atouts sur le marché.
- Création de page centrale (Link in bio) : La création d'une page d'atterrissage unique regroupant l'ensemble de tes liens importants (réseaux sociaux, portfolio, boutique, articles, etc.).
- Éditeur visuel "No-Code" : Une interface simplifiée et minimaliste qui permet de construire et modifier ta page en quelques clics, sans écrire une seule ligne de code.
- Modèles web prêts à l'emploi : L'accès à des templates modernes basés sur des technologies web récentes et performantes, conçus pour être réutilisés et adaptés à ton image.
- Hébergement flexible : En tant que projet technique, Plinkk offre la possibilité d'utiliser leur solution clé en main, mais aussi d'héberger toi-même ton propre "Link in bio" sur ton serveur si tu as des compétences techniques.
- Personnalisation poussée et sans friction : Là où de nombreuses plateformes bloquent la personnalisation des couleurs, des polices ou des boutons derrière un abonnement payant, Plinkk est pensé pour te laisser refléter ton identité visuelle sans te brider.
- Design minimaliste et élégant : L'outil va à l'essentiel. Le rendu final est propre, professionnel et ne donne pas une impression de page "surchargée" ou bas de gamme.
- Performances et rapidité : Le code généré est ultra-léger. Conséquence directe : ta page se charge instantanément sur les smartphones de tes abonnés, ce qui réduit le taux d'abandon et augmente tes clics.
- Économique : C'est une excellente façon d'obtenir un rendu premium sans avoir à payer les abonnements mensuels souvent onéreux des leaders du marché.
- Un modèle 100 % Open-Source : C'est la grande force de Plinkk. Le code de la plateforme est ouvert, transparent et disponible (sur GitHub). Tu n'es pas enfermé dans un système propriétaire.
- Une philosophie éthique : Plinkk se revendique comme une alternative éthique. Cela signifie un meilleur respect de la vie privée, sans traçage agressif ni revente des données de tes visiteurs à des tiers.
- Indépendance et souveraineté : Si un jour la plateforme change de politique, la nature open-source du projet te garantit de pouvoir récupérer ton code et garder le contrôle total de ta page et de tes statistiques.
- L'ADN francophone : Développé par Plinkk Corp, c'est un projet ancré dans la communauté francophone, ce qui facilite grandement la compréhension de l'outil et les échanges en cas de besoin.
| Critère de comparaison | Plinkk | Linktree | Bento | Lnk.Bio |
|---|---|---|---|---|
| Modèle de Prix | 💰 100% Gratuit | Limité (Pro payant) | Propriétaire | Limité (Pro payant) |
| Philosophie & Code | 🌍 Open Source & Éthique | ❌ Fermé | ❌ Fermé | ❌ Fermé |
| Interface & Rendu | ✨ Premium (Glassmorphism) | Basique (Boutons) | Grille visuelle | Basique |
| Personnalisation | 🎨 Libre & Illimitée | ❌ Verrouillée (Payant) | ||
| Vitesse (Code) | ⚡ Ultra rapide (Bun) | 🐌 Moyenne | 🐌 Moyenne | 🐌 Moyenne |
| Respect Vie Privée | 🛡️ Total (zéro tracking) | ❌ Partage de données | ||
| Filigranes / Pubs | 🚫 Aucun logo imposé | ❌ Gros Logo imposé | ||
| Sécurité Native | 🔒 2FA + Magic Links | ❌ Basique | ❌ Basique | |
| Emails Inclus | 📧 Alias & Relais inclus | ❌ Non | ❌ Non | ❌ Non |
| Prévisualisation | 📱 Temps Réel (Sync) | |||
| Statistiques (Stats) | 📊 Détaillées (Inclus) | ❌ Payant | ❌ Payant | |
| Monétisation | 💳 Intégration Plinkk Pro | ❌ Non | ||
| Auto-Hébergement | 🐳 Oui (Héberge-le toi) | ❌ Non (Locataire) | ❌ Non | ❌ Non |
| Support / Écoute | 💬 Communauté Discord | ❌ Entreprise distant | ❌ Entreprise distant | ❌ Classique |
| Mises à jour | 🚀 Très Rapides / Hebdo | 🐢 Lentes | 🐢 Lentes | 🐢 Lentes |
- Si tu choisis Linktree ou Lnk.Bio : Tu choisis la facilité, mais tu sacrifies ton identité visuelle (à moins de payer un abonnement mensuel) et tu abandonnes le contrôle sur les données de tes visiteurs.
- Si tu choisis Bento : Tu auras une page très visuelle, mais tu restes dans un écosystème fermé (et tu appartiens au géant Linktree).
- Si tu choisis Plinkk : Tu fais le choix de l'indépendance. Tu obtiens un rendu professionnel, rapide et sans fioritures, tout en soutenant un modèle ouvert et respectueux de tes abonnés.
Monorepo Bun workspaces avec une séparation claire des responsabilités :
plinkk-backend/
├── apps/
│ ├── dashboard/ # API dashboard & admin (port 3001)
│ │ ├── src/server/api/ # Routes API par domaine
│ │ ├── src/services/ # Logique métier
│ │ ├── src/middleware/ # Auth, rate-limit, validation
│ │ └── src/views/ # Templates EJS dashboard
│ │
│ └── public/ # Pages publiques des profils (port 3002)
│ ├── src/server/ # Rendu des Plinkks utilisateurs
│ └── src/views/ # Templates EJS publics
│
├── packages/
│ ├── prisma/ # Client Prisma partagé
│ │ ├── prisma/ # Schema, migrations
│ │ ├── permissions.ts # Définitions RBAC
│ │ └── index.ts # Export client généré
│ │
│ └── shared/ # Code commun
│ ├── src/lib/ # Utilitaires partagés
│ ├── src/types/ # Types TypeScript
│ └── views/partials/ # Composants EJS réutilisables
│
└── scripts/ # Scripts d'administration
├── seed-permissions.js
├── set-admin.cjs
└── ...
- Separation of Concerns — Dashboard vs Public strictement isolés
- Service Layer — Logique métier encapsulée (ex:
plinkkService,themeService) - Schema Validation — Zod pour toutes les entrées utilisateur
- Error Handling — Classes d'erreurs typées (
UnauthorizedError,NotFoundError) - Type Safety — TypeScript strict mode, zero
any
- Runtime — Bun 1.3.10 (ultra-rapide, compatible Node.js)
- Framework — Fastify 5.6 (serveur HTTP performant)
- Langage — TypeScript 5.9 (strict mode)
- Templates — EJS (Server-Side Rendering)
- ORM — Prisma 7.3 (type-safe query builder)
- Production — PostgreSQL (via
@prisma/adapter-pg) - Développement — SQLite (option légère)
- Migrations — Prisma Migrate
- OAuth2 —
@fastify/oauth2(GitHub, Discord, Google) - Sessions —
@fastify/secure-session(chiffrement AES-256-GCM) - 2FA —
@otplib/preset-default(TOTP) - Password Hashing — bcrypt (cost factor 10) & Bun.password
- Validation — Zod 4.1
- Storage — AWS S3 (
@aws-sdk/client-s3) - Email — Resend (API transactionnelle)
- Paiements — Stripe (webhooks, subscriptions)
- Cron Jobs —
fastify-cron - Rate Limiting —
@fastify/rate-limit - Cache — Custom in-memory LRU cache
- Image Processing — Sharp (resize, compress)
- QR Codes — qrcode
- Markdown — marked
- Compression —
@fastify/compress - CORS —
@fastify/cors
- Bun 1.3.10+
- PostgreSQL 14+ (ou SQLite pour développement local)
- Git
# 1. Cloner le dépôt
git clone https://github.com/PlinkkCorp/plinkk-backend.git
cd plinkk-backend
# 2. Installer les dépendances (génère automatiquement Prisma)
bun install
# 3. Configurer les variables d'environnement
cp .env.example .env
# Éditer .env avec vos credentials
# 4. Générer la clé de session
cd apps/dashboard
bunx @fastify/secure-session > src/secret-key
cd ../public
bunx @fastify/secure-session > src/secret-key
cd ../..
# 5. Initialiser la base de données
bun run prisma:init # Applique les migrations
bun run seed-permissions # Insère les permissions
# 6. (Optionnel) Créer un compte admin
bun run set-admin
# 7. Lancer les serveurs
bun run launch-all # Dashboard (3001) + Public (3002)# Lancer les deux apps simultanément
bun run launch-all
# Lancer individuellement
bun run dev:dashboard # Port 3001
bun run dev:public # Port 3002
# Build production
bun run build # Build all packages
bun run build:dashboard # Dashboard seul
bun run build:public # Public seul# Appliquer les migrations
bun run prisma:init
# Mode développement (création auto)
bun run prisma:dev
# Générer le client Prisma
bun run prisma:generate
# Interface graphique
bun run prisma:studio# Seed permissions & rôles
bun run seed-permissions
# Seed templates d'emails système
bun run seed-email-templates
# Promouvoir un utilisateur admin
bun run set-admin
# Supprimer comptes inactifs (+3 ans)
bun run delete_inactive
# Migrer des données Plinkk
bun run migrate:plinkksCréez un fichier .env à la racine avec les variables suivantes :
# Base de données
DATABASE_URL="postgresql://user:password@localhost:5432/plinkk"
# Sessions (générer avec @fastify/secure-session)
SESSION_SECRET="your-session-secret"
# Ports
PORT_DASHBOARD=3001
PORT_PUBLIC=3002# GitHub
GITHUB_OAUTH2_ID="your_github_client_id"
GITHUB_OAUTH2_SECRET="your_github_client_secret"
# Discord
DISCORD_OAUTH2_ID="your_discord_client_id"
DISCORD_OAUTH2_SECRET="your_discord_client_secret"
# Google
GOOGLE_OAUTH2_ID="your_google_client_id"
GOOGLE_OAUTH2_SECRET="your_google_client_secret"# Emails (Resend)
RESEND_API_KEY="re_..."
# Paiements (Stripe)
STRIPE_SECRET_KEY="sk_test_..."
STRIPE_WEBHOOK_SECRET="whsec_..."
# Storage (AWS S3)
AWS_ACCESS_KEY_ID="your_key"
AWS_SECRET_ACCESS_KEY="your_secret"
AWS_REGION="eu-west-3"
AWS_S3_BUCKET="plinkk-uploads"
# Discord Webhooks (notifications)
DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/..."- Routes API — Organisation par domaine dans
apps/dashboard/src/server/api/ - Middlewares — Authentication, validation, rate-limiting dans
src/middleware/ - Services — Logique métier isolée dans
src/services/ - Validation — Schémas Zod dans
src/schemas/ - Erreurs — Classes typées dans
src/lib/errors.ts
// apps/dashboard/src/server/api/plinkks.ts
export function apiPlinkksRoutes(fastify: FastifyInstance) {
fastify.get("/", { preHandler: requireAuth }, async (request, reply) => {
const userId = request.userId;
const plinkks = await prisma.plinkk.findMany({
where: { ownerId: userId }
});
return { data: plinkks };
});
}Le système RBAC permet un contrôle granulaire :
// Vérifier si l'user est staff (ADMIN, DEVELOPER, MODERATOR)
import { verifyRoleIsStaff } from "../lib/verifyRole";
if (!verifyRoleIsStaff(user.role)) {
throw new ForbiddenError("Accès réservé au staff");
}Ajouter une permission :
- Définir dans
packages/prisma/permissions.ts - Exécuter
bun run seed-permissions - Assigner via
/admin/roles
// Envoyer un email
import { emailService } from "../services/emailService";
await emailService.sendWelcomeEmail(user.email, user.name);
await emailService.sendPasswordReset(user.email, user.name, resetToken);Tester : bun --filter @plinkk/dashboard test:email
import { SimpleCache } from "../lib/cache";
const userCache = new SimpleCache({ maxSize: 100, ttl: 60000 });
// Set
userCache.set(`user:${userId}`, userData);
// Get
const cached = userCache.get(`user:${userId}`);
// Invalidate
userCache.delete(`user:${userId}`);Les Dockerfiles sont disponibles pour chaque app :
# Build Dashboard
docker build -f DockerfileDash -t plinkk-dashboard .
# Build Public
docker build -f DockerfilePublic -t plinkk-public .
# Run
docker run -p 3001:3001 --env-file .env plinkk-dashboard
docker run -p 3002:3002 --env-file .env plinkk-publicbun run prisma:generate
# ou
bun installLe cache peut conserver d'anciennes versions :
# Redémarrer les serveurs
bun run launch-allVérifiez que l'app public tourne sur le bon port et que l'URL est configurée dans .env :
PUBLIC_URL="http://localhost:3002"Vérifiez que le fichier src/secret-key existe dans les deux apps :
cd apps/dashboard && bunx @fastify/secure-session > src/secret-key
cd ../public && bunx @fastify/secure-session > src/secret-keyLe schéma Prisma (packages/prisma/prisma/schema.prisma) définit :
- User — Utilisateurs (2FA, email verified, roleId, quotas)
- Connection — OAuth2 connections (GitHub, Discord, Google)
- Session — Sessions actives avec expiration
- Plinkk — Pages de profil personnalisées par user
- Link — Liens affichés sur les Plinkks
- Theme — Thèmes visuels personnalisables
- Role & Permission — RBAC (staff, maxPlinkks, maxThemes)
- BugReport — Rapports de bugs utilisateurs
- Announcement — Annonces système ciblées
- MagicLink — Tokens pour connexion sans password
- Label, Category, Host — Organisation des liens
Licence Propriétaire Plinkk
© 2024-2026 Plinkk Corporation. Tous droits réservés.
Voir le fichier LICENSE pour plus de détails.
Documentation Complète • API Reference • Contributing
Développé avec ❤️ par l'équipe Plinkk