Skip to content

PlinkkCorp/plinkk-web

Repository files navigation

🔗 Plinkk — Backend

Alternative moderne et professionnelle à Linktree

build bun typescript prisma fastify

Infrastructure backend moderne basée sur Bun, Fastify et TypeScript strict

FonctionnalitésArchitectureInstallationDocumentation


✨ Fonctionnalités Principales

🎨 Expérience Utilisateur

  • 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

🔐 Authentification & Sécurité

  • 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

💰 Monétisation

  • 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)

📧 Emails & Communication

  • 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

🛠️ Administration

  • 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é

⚡ Performance & Infrastructure

  • 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

🥊 Pourquoi Plinkk ?

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

Les services proposés par Plinkk

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

Tes avantages au quotidien (Pourquoi l'utiliser)

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

Les atouts majeurs (Ce qui rend Plinkk unique)

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

Comparatif : Plinkk face à la concurrence

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) ⚠️ Figée ⚠️ Restreinte
Vitesse (Code) Ultra rapide (Bun) 🐌 Moyenne 🐌 Moyenne 🐌 Moyenne
Respect Vie Privée 🛡️ Total (zéro tracking) ❌ Partage de données ⚠️ Moyen ⚠️ Moyen
Filigranes / Pubs 🚫 Aucun logo imposé ❌ Gros Logo imposé ⚠️ Logo Bento ⚠️ Logo Lnk.Bio
Sécurité Native 🔒 2FA + Magic Links ⚠️ Partielle / Payante ❌ Basique ❌ Basique
Emails Inclus 📧 Alias & Relais inclus ❌ Non ❌ Non ❌ Non
Prévisualisation 📱 Temps Réel (Sync) ⚠️ Standard ⚠️ Standard ⚠️ Standard
Statistiques (Stats) 📊 Détaillées (Inclus) ❌ Payant ⚠️ Basique ❌ Payant
Monétisation 💳 Intégration Plinkk Pro ⚠️ Payante / Restreinte ❌ Non ⚠️ Restreinte
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

Ce qu'il faut retenir de ce face-à-face :

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

🏗️ Architecture

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

Principes d'Architecture

  • 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

🛠️ Stack Technique

Core

  • RuntimeBun 1.3.10 (ultra-rapide, compatible Node.js)
  • FrameworkFastify 5.6 (serveur HTTP performant)
  • Langage — TypeScript 5.9 (strict mode)
  • Templates — EJS (Server-Side Rendering)

Base de Données

  • ORM — Prisma 7.3 (type-safe query builder)
  • Production — PostgreSQL (via @prisma/adapter-pg)
  • Développement — SQLite (option légère)
  • Migrations — Prisma Migrate

Authentification & Sécurité

  • 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

Infrastructure & Services

  • Storage — AWS S3 (@aws-sdk/client-s3)
  • Email — Resend (API transactionnelle)
  • Paiements — Stripe (webhooks, subscriptions)
  • Cron Jobsfastify-cron
  • Rate Limiting@fastify/rate-limit
  • Cache — Custom in-memory LRU cache

Outils

  • Image Processing — Sharp (resize, compress)
  • QR Codes — qrcode
  • Markdown — marked
  • Compression@fastify/compress
  • CORS@fastify/cors

🚀 Installation Rapide

Prérequis

  • Bun 1.3.10+
  • PostgreSQL 14+ (ou SQLite pour développement local)
  • Git

Installation

# 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)

🔧 Commandes Utiles

Développement

# 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

Base de Données

# 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

Scripts d'Administration

# 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:plinkks

🔐 Variables d'Environnement

Créez un fichier .env à la racine avec les variables suivantes :

Essentielles

# 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

OAuth2 (optionnel)

# 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"

Services Externes

# 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/..."

📚 Documentation

Patterns de Code

  • 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

Exemple de Route

// 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 };
  });
}

Rôles & Permissions

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 :

  1. Définir dans packages/prisma/permissions.ts
  2. Exécuter bun run seed-permissions
  3. Assigner via /admin/roles

Service Email

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

Cache

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}`);

🐳 Docker

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

🤝 Dépannage

Erreur PrismaClient is not defined

bun run prisma:generate
# ou
bun install

Modifications CSS non appliquées

Le cache peut conserver d'anciennes versions :

# Redémarrer les serveurs
bun run launch-all

Preview iframe affiche 404

Vérifiez que l'app public tourne sur le bon port et que l'URL est configurée dans .env :

PUBLIC_URL="http://localhost:3002"

Sessions ne persistent pas

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

📊 Modèles de Données Clés

Le 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

Licence Propriétaire Plinkk

© 2024-2026 Plinkk Corporation. Tous droits réservés.

Voir le fichier LICENSE pour plus de détails.


Documentation ComplèteAPI ReferenceContributing

Développé avec ❤️ par l'équipe Plinkk

Releases

No releases published

Contributors