iArt.ai
AI 모션 그래픽 소프트웨어, 누구나 사용할 수 있는 After Effects 대안, 텍스트 프롬프트로 몇 분 안에 애니메이션·설명 영상 제작
온라인 독서 일기장 Codex, 책을 찾고 별점 5점 만점에 평가하고 감상을 적으며 베스트 리스트를 만들고 친구가 읽는 책을 팔로우합니다
Codex is an online reading journal: find a book, rate it out of 5, write down what you thought of it, build your top list and follow what your friends are reading.
미디어TypeScript · CSSGitHub @yeezus-code온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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 |