尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证proto app livres
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Codex : une application web pour noter ses lectures, dans l'esprit de Letterboxd. (Nom, slogan et adresse de contact : fichier src/lib/site.ts.)查看完整 README ↗
Codex : une application web pour noter ses lectures, dans l'esprit de Letterboxd. (Nom, slogan et adresse de contact : fichier src/lib/site.ts.)
Ce qui existe aujourd'hui
Recherche d'un livre par son titre : couverture, auteur(s), année et genre sont récupérés automatiquement sur Open Library, complétés par Google Books quand il manque quelque chose.
Bibliothèque personnelle : ajouter un livre, lui donner une note sur 5 et écrire un avis, modifier ou retirer un livre, trier par date d'ajout, note ou titre.
Comptes (pseudo, e-mail, mot de passe) : on peut commencer sans compte, puis en créer un sans perdre ses livres, et retrouver sa bibliothèque sur tous ses appareils.
« Mon top » : un classement de 10 livres maximum, dans l'ordre de son choix (on peut partir de ses livres les mieux notés).
Profils publics (/u/pseudo) : bibliothèque, notes, avis et top de chaque lecteur.
Page « Lecteurs » : trouver des lecteurs par pseudo, s'abonner, suivre leur activité.
Photo de profil (importée depuis son appareil, recadrée et réduite automatiquement).
Page d'accueil : grands classiques, livres les mieux notés et les plus lus par les lecteurs, derniers avis.
Les bibliothèques des comptes sont publiques ; celles des visiteurs sans compte restent privées.
Trois services gratuits travaillent ensemble :
| Service | Rôle |
|---|---|
| GitHub | garde le code de l'application (c'est déjà fait) |
| Supabase | la base de données : c'est là que votre bibliothèque est enregistrée |
| Vercel | héberge le site et lui donne une adresse web |
Comptez environ 20 minutes.
livressupabase/01-bibliotheque.sql de ce dépôt sur GitHub,
copiez tout son contenu et collez-le dans l'éditeur.Tant que les comptes n'existent pas, chaque navigateur reçoit une identité « anonyme » invisible : votre bibliothèque est privée et liée à votre navigateur. Il faut l'autoriser :
Puis récupérez les deux valeurs dont Vercel aura besoin :
https://xxxx.supabase.co).sb_publishable_). Si vous ne la trouvez pas, ouvrez l'onglet Legacy API keys et
copiez la clé anon public (un long texte commençant par eyJ) : elle fonctionne aussi,
à coller dans la même variable Vercel. Autre chemin : le bouton Connect en haut de la
page du projet affiche l'URL et la clé toutes prêtes.Ces deux valeurs peuvent être visibles publiquement, ce n'est pas un problème : la sécurité est assurée par les règles de la base (chacun ne voit que ses propres livres). Ne copiez jamais la clé
service_role/ Secret key.
Allez sur https://vercel.com, cliquez Sign Up et choisissez Continue with GitHub.
Cliquez Add New… → Project, puis Import à côté du dépôt livres-app.
(S'il n'apparaît pas : Adjust GitHub App Permissions et autorisez ce dépôt.)
Avant de cliquer sur Deploy, ouvrez Environment Variables et ajoutez deux lignes :
| Key | Value |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | la Project URL copiée à l'étape 2 |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | la Publishable key copiée à l'étape 2 |
Cliquez Deploy. Au bout de 1 à 2 minutes, Vercel affiche l'adresse de votre site
(du type livres-app-xxxx.vercel.app). Ouvrez-la, y compris sur votre téléphone.
Si vous avez oublié les variables ou fait une faute de frappe : Settings → Environment Variables pour corriger, puis Deployments → menu « ⋯ » du dernier déploiement → Redeploy.
Sans clé, Google Books partage un petit quota avec tous les sites hébergés au même endroit : il refuse vite de répondre, et la recherche ne s'appuie plus que sur Open Library (beaucoup de livres récents ou francophones manquent alors). La clé est gratuite (1 000 recherches par jour, et Codex garde chaque recherche en mémoire 1 heure) :
GOOGLE_BOOKS_API_KEY avec cette clé, puis Redeploy.library_entries, vous voyez la ligne correspondante.Un bandeau en haut de page vous prévient si Supabase n'est pas branché ou si les connexions anonymes ne sont pas activées.
Dans Supabase → SQL Editor → New query : copiez tout le contenu de
supabase/02-comptes.sql, collez-le, cliquez Run.
Dans Supabase → Authentication → Sign In / Providers → Email :
Pourquoi ? Le service d'e-mails gratuit de Supabase n'envoie que quelques e-mails par heure, ce qui bloquerait les inscriptions. On le réactive à l'étape 9, une fois un vrai service d'e-mails branché.
Test : dans l'application, ouvrez Compte, créez un compte. Votre pseudo apparaît en haut à droite, vos livres sont toujours là. Sur votre téléphone, Compte → Se connecter : vous retrouvez la même bibliothèque.
Dans Supabase → SQL Editor → New query : copiez tout le contenu de
supabase/03-top.sql, collez-le, cliquez Run.
Test : onglet Top → Partir de mes mieux notés (ou Composer mon top), réordonnez avec ↑ ↓, Enregistrer, puis rechargez la page : l'ordre est conservé.
Dans Supabase → SQL Editor → New query : copiez tout le contenu de
supabase/04-social.sql, collez-le, cliquez Run.
Test : onglet Compte → Voir mon profil public. Envoyez l'adresse de cette page à quelqu'un : il voit vos livres, vos notes, vos avis et votre top. Onglet Lecteurs : cherchez un pseudo, ouvrez son profil, S'abonner ; ses lectures apparaissent dans « Activité ».
Dans Supabase → SQL Editor → New query : copiez tout le contenu de
supabase/05-photos-et-accueil.sql, collez-le,
cliquez Run. (Ce fichier crée aussi l'espace de stockage des photos : rien à faire
dans le menu Storage.)
Test : onglet Moi → Ajouter une photo. Page d'accueil : les sections « mieux notés », « plus lus » et « derniers avis » se remplissent au fil des notes des lecteurs.
Pour changer la liste des grands classiques : première sélection du fichier de la langue, dans src/collections (voir « Modifier les sélections » plus bas).
Sans cela, Supabase n'envoie que 2 ou 3 e-mails par heure : impossible de proposer « mot de passe oublié » ou de vérifier les adresses. Choisissez une des deux options.
Option A — Gratuite, sans nom de domaine : Brevo (300 e-mails par jour)
Créez un compte sur https://www.brevo.com.
Menu Senders, Domains & Dedicated IPs → Senders → Add a sender : saisissez votre propre adresse (ex. votre Gmail) et validez-la avec l'e-mail que Brevo vous envoie.
Menu SMTP & API → onglet SMTP → Generate a new SMTP key. Notez la clé, ainsi que le Login affiché sur cette page.
Dans Supabase → Authentication → Emails → onglet SMTP Settings → activez Enable custom SMTP et remplissez :
Livressmtp-relay.brevo.com — Port : 587Limite : envoyés « au nom » d'une adresse Gmail, certains e-mails peuvent arriver dans les indésirables.
Option B — Plus fiable, environ 10 € par an : nom de domaine + Resend (3 000 e-mails par mois)
mes-livres.fr) puis, dans
votre projet → Settings → Domains, ajoutez-le : le site devient accessible à
cette adresse.bonjour@votre-domaine — Sender name : Livressmtp.resend.com — Port : 465resend — Password : la clé APIEnsuite, dans les deux cas :
https://livres-app.vercel.app, sans / à la fin)/**
(ex. https://livres-app.vercel.app/**).Confirmez votre adresse — Livres, et remplacez tout le
contenu par celui de supabase/emails/confirmer-adresse.html.Nouveau mot de passe — Livres, contenu de
supabase/emails/mot-de-passe-oublie.html.30 par heure, Save.Test : dans une fenêtre de navigation privée, créez un compte avec une vraie adresse → l'e-mail arrive → le lien active le compte. Puis Se connecter → Mot de passe oublié ?
Dans Supabase → SQL Editor → New query : copiez tout le contenu de
supabase/06-a-lire-dates-jaime.sql, collez-le,
cliquez Run.
codex-lecture.vercel.app (tout nom libre se terminant par .vercel.app).https://nouvelle-adresse/** dans Redirect URLs. Sinon, les liens des e-mails mèneront
à l'ancienne adresse.L'adresse de contact affichée sur le site (src/lib/site.ts) doit pouvoir recevoir des
e-mails. Le plus simple, gratuit : une redirection vers votre boîte Gmail avec ImprovMX.
codexby.app et votre adresse Gmail → créez le compte.MX (mx1.improvmx.com priorité 10, mx2.improvmx.com
priorité 20) et 1 ligne TXT (v=spf1 include:spf.improvmx.com ~all). Ajoutez-les dans
Vercel → Domains → codexby.app → DNS Records, avec un Name vide (ou @).
Ces lignes ne gênent pas celles de Resend, qui sont sur send.Sans compte, la bibliothèque est liée au navigateur. En se connectant sur un appareil où des livres avaient été ajoutés sans compte, ces livres sont copiés dans le compte.
Codex existe en français (codexby.app), anglais (/en), espagnol (/es) et portugais du
Brésil (/pt). Les e-mails s'écrivent tout seuls dans la langue du compte, à condition de
recoller les deux modèles, qui ont changé :
{{ $l := "fr" }}{{ with .Data.lang }}{{ $l = . }}{{ end }}{{ if eq $l "en" }}Confirm your email — Codex{{ else if eq $l "es" }}Confirma tu correo — Codex{{ else if eq $l "pt" }}Confirme seu e-mail — Codex{{ else }}Confirmez votre adresse — Codex{{ end }}
supabase/emails/confirmer-adresse.html. Save.{{ $l := "fr" }}{{ with .Data.lang }}{{ $l = . }}{{ end }}{{ if eq $l "en" }}Reset your password — Codex{{ else if eq $l "es" }}Nueva contraseña — Codex{{ else if eq $l "pt" }}Nova senha — Codex{{ else }}Nouveau mot de passe — Codex{{ end }}
supabase/emails/mot-de-passe-oublie.html. Save.Nouveau mot de passe — Codex (et Confirmez votre adresse — Codex) : le texte de
l'e-mail, lui, restera dans la bonne langue.La langue d'un compte est celle du site au moment de l'inscription ; elle change quand la personne choisit une autre langue dans le menu en bas de page.
Chaque langue a son fichier dans le dossier src/collections : fr.ts (français), en.ts
(anglais), es.ts (espagnol), pt.ts (portugais du Brésil, avec les saisons de
l'hémisphère sud). Sur GitHub, ouvrez le fichier, cliquez sur le crayon ✎, modifiez, puis
« Commit changes ». Le site se met à jour en 1 à 2 minutes.
{ title: "…", author: "…" },
dans la bonne sélection et changez le titre et l'auteur. Écrivez le titre tel qu'il est
publié dans cette langue : la couverture de cette édition est trouvée toute seule.season: { from: "12-01", to: "12-31" } (mois-jour).{ id: …, … },, donnez-lui un
id unique (sans espace ni accent), un titre, des dates et des couleurs (THEMES.noel,
THEMES.plage… : voir src/collections/themes.ts).newReleases (en bas du fichier) est vide, Codex va
chercher tout seul les romans parus récemment dans cette langue. Pour choisir vous-même,
écrivez-y les livres voulus.Les couvertures d'une sélection sont gardées une semaine en mémoire, les nouveautés une journée : une modification peut donc mettre jusqu'à ce délai pour apparaître (ou tout de suite après un nouveau déploiement).
Tous les textes sont dans src/i18n/dictionaries : fr.ts, en.ts, es.ts, pt.ts.
Cherchez la phrase, changez-la entre les guillemets, « Commit changes ».
cp .env.example .env.local # puis renseigner les valeurs
npm install
npm run dev # http://localhost:3000
| Fichier | Rôle |
|---|---|
src/lib/books.ts | recherche Open Library + Google Books, fusion, genres en français |
src/app/api/recherche/route.ts | GET /api/recherche?titre=… appelé par la page de recherche |
src/components/LibraryProvider.tsx | session anonyme Supabase + lecture/écriture de la bibliothèque |
src/components/BookDialog.tsx | fenêtre d'ajout / modification (note, avis) |
src/proxy.ts | choix de la langue (adresse, cookie, réglage du navigateur) |
src/i18n/ | langues, textes traduits (dictionaries/), mise en forme |
src/app/[lang]/… | toutes les pages, une version par langue |
src/app/[lang]/bibliotheque/page.tsx | page « Ma bibliothèque » |
src/app/globals.css | tout le style (couleurs en haut du fichier) |
supabase/01-bibliotheque.sql | table library_entries et règles de sécurité (RLS) |
supabase/02-comptes.sql | table profiles (pseudos) |
src/app/[lang]/compte/page.tsx | création de compte, connexion, déconnexion |
supabase/03-top.sql | colonne top_position et fonction set_top |
src/app/[lang]/top/page.tsx | page « Mon top » (lecture et modification) |
supabase/04-social.sql | lecture publique des bibliothèques, table follows |
src/lib/social.ts | profils publics, abonnements, fil d'activité |
src/app/[lang]/u/[pseudo]/page.tsx | profil public d'un lecteur |
src/app/[lang]/lecteurs/page.tsx | recherche de lecteurs, abonnements, activité |
supabase/05-photos-et-accueil.sql | photos (Storage), vue book_stats |
src/app/[lang]/page.tsx| page d'accueil |
src/app/[lang]/recherche/page.tsx | recherche de livres (/recherche?q=…) |
src/app/api/top-image/route.tsx | image « top 10 » à partager (1080 × 1350) |
src/app/[lang]/u/[pseudo]/top/page.tsx | page de partage du top (aperçu du lien = l'image) |
src/app/api/liste/route.ts | livres d'une sélection (listes dans src/collections/) |
src/lib/site.ts | nom du site, slogan, présentation, adresse de contact |
src/app/[lang]/mentions-legales/page.tsx | mentions légales |
supabase/06-a-lire-dates-jaime.sql | statut lu / à lire, date de lecture, table review_likes |
src/app/[lang]/a-lire/page.tsx | liste « À lire » |
src/lib/avatar.ts | recadrage/réduction des photos avant envoi |