Lascia un ricordu · Laissez un souvenir · Leave a memory
Vos invités laissent un message texte, photo, vidéo ou audio depuis leur navigateur, et le destinataire le reçoit par email le jour que chacun choisit. Pour les anniversaires, mariages, départs et toutes les fêtes.
An open-source digital guestbook. Guests record a text, photo, video or audio message in their browser, scheduled to be delivered by email on a date they choose. For birthdays, weddings, farewells and every celebration.
Libru d'Oru est la traduction corse littérale de livre d'or (
libru= livre,oru= or). Un livre d'or, version 2026 : au lieu d'une page écrite à la main, chaque invité laisse une vidéo, une photo, un mot audio ou un texte, rassemblés en un seul cadeau livré au bon moment.
- Messages multimédia : texte, photo (capture directe via la caméra), vidéo et audio, combinables dans un même message.
- Enregistrement dans le navigateur : aucune application à installer ; l'invité filme, s'enregistre ou prend une photo directement depuis la page.
- Envoi programmé par email : chaque invité choisit quand le destinataire recevra son message (demain, dans une semaine, ou une date personnalisée).
- Page d'accueil festive : compte à rebours, confettis, photo d'accueil optionnelle, choix d'un emoji.
- Dashboard admin : liste des messages, tri, suppression, statistiques, export Excel et génération d'un brouillon de mail.
- Zéro base de données : stockage en fichier JSON + médias sur disque. Simple à héberger, simple à sauvegarder.
- SEO intégré : OpenGraph + image de partage générée dynamiquement,
sitemap.xml,robots.txt, manifest PWA. - 100 % personnalisable sans toucher au code, via des variables d'environnement.
Anniversaire · Mariage · Départ en retraite · Pot de départ · Naissance · Crémaillère · Remise de diplôme Birthday · Wedding · Retirement · Farewell party · New baby · Graduation
| Framework | Next.js 14 (App Router) |
| Langage | TypeScript |
| UI | React 18 + Tailwind CSS |
| Nodemailer + node-cron | |
| Export | SheetJS / xlsx |
| Stockage | Fichier JSON + médias sur disque (data/) |
git clone https://github.com/commeass/libru-doru.git
cd libru-doru
npm install
cp .env.example .env.local # puis personnalisez
npm run devOuvrez http://localhost:3000.
- Page publique :
/ - Dashboard admin :
/admin(mot de passe défini parNEXT_PUBLIC_ADMIN_PASSWORD)
Tout se personnalise via .env.local (voir .env.example). Vous pouvez aussi éditer directement les valeurs par défaut dans src/config.ts.
| Variable | Rôle |
|---|---|
NEXT_PUBLIC_SITE_URL |
URL publique du site (SEO : OpenGraph, sitemap, canonical) |
NEXT_PUBLIC_CELEBRANT_NAME |
Prénom de la personne mise à l'honneur |
NEXT_PUBLIC_WELCOME_HEADLINE |
Grand titre de l'écran d'accueil |
NEXT_PUBLIC_WELCOME_INTRO |
Phrase d'introduction |
NEXT_PUBLIC_EVENT_DATE |
Date cible du compte à rebours (ISO) |
NEXT_PUBLIC_COUNTDOWN_LABEL |
Libellé sous le compte à rebours |
NEXT_PUBLIC_HERO_PHOTO |
Nom d'une photo dans data/media-landing/ (optionnel) |
NEXT_PUBLIC_ADMIN_PASSWORD |
Mot de passe de la page /admin |
SMTP_HOST / SMTP_PORT / SMTP_USER / SMTP_PASS |
Serveur d'envoi des emails |
RECIPIENT_EMAIL / RECIPIENT_NAME |
Destinataire des messages |
L'app fonctionne sans email : les messages sont stockés et consultables dans /admin. Pour activer l'envoi automatique à la date choisie :
- Renseignez les variables
SMTP_*etRECIPIENT_*(pour Gmail, utilisez un mot de passe d'application). - Réactivez le planificateur en décommentant l'appel
startScheduler()danssrc/app/api/messages/route.ts.
Sans SMTP, le bouton « Générer le mail » du dashboard ouvre simplement un brouillon dans votre client mail.
⚠️ Sécurité : le mot de passe admin est vérifié côté client, ce n'est donc pas une vraie protection. Ne stockez pas de données sensibles et changez le mot de passe par défaut.
Le stockage utilise le système de fichiers local (data/). Hébergez donc l'app sur un serveur Node persistant (VPS, Docker, Railway, Render, Fly.io...) plutôt que sur une plateforme serverless à système de fichiers éphémère comme Vercel, où les uploads ne survivraient pas. Pensez à sauvegarder le dossier data/.
npm run build
npm run startsrc/
config.ts # personnalisation centralisée (nom, marque, SEO)
app/
page.tsx # page publique (gate, accueil, formulaire, succès)
admin/page.tsx # dashboard admin
layout.tsx # métadonnées / SEO
opengraph-image.tsx # image de partage social générée dynamiquement
robots.ts # robots.txt
sitemap.ts # sitemap.xml
manifest.ts # manifest PWA
api/ # messages, upload, media, generate-mail
components/ # Countdown, Confetti, MediaRecorder, PhotoCapture...
lib/ # storage (JSON), mailer, scheduler, types
data/ # généré à l'exécution (messages + médias), ignoré par git
Why a Corsican name? Libru d'Oru est le calque corse exact de « livre d'or » : libru (livre) + oru (or), distinct de l'italien (libro/oro) et du français. Un clin d'œil à une langue de tradition orale et d'hospitalité, pour une app qui collectionne les voix et les souvenirs.
Les issues et pull requests sont les bienvenues. Voir CONTRIBUTING.md. Forkez, créez une branche, proposez votre amélioration.
MIT - utilisez-le, modifiez-le, partagez-le librement.
