尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Kalami est une plateforme web installable (PWA) de lecture en ligne. Des auteurs y publient des ouvrages classés par catégorie ; les lecteurs découvrent gratuitement le sommaire et un extrait, paient par carte bancaire ou Mobile Money, puis lisent dans une liseuse moderne protégée. Un assistant d'analyse stratégique (Kalami Stratégie) s'y rattachera ensuite.
/strategie) : assistant d'analyse stratégique en 9 étapes, mêmes
comptes, parcours et crédits propres — voir docs/SPRINTS-strategie.mdkalami/
├── docs/ → cahiers des charges, architecture, sprints
├── public/brand/ → logos Kalami (normal, inversé, monogramme)
├── supabase/
│ ├── config.toml → configuration de la CLI Supabase
│ ├── migrations/ → schéma SQL + politiques RLS versionnés
│ └── tests/ → tests RLS
├── src/
│ ├── app/ → pages et routes (App Router) ; globals.css = jetons
│ ├── components/ui/ → styles partagés (boutons, pastilles, cartes) et icônes
│ ├── i18n/ → textes de l'interface (fr ; en prévu en v2)
│ ├── lib/ → configuration, clients Supabase, logique métier
│ │ └── strategy/ → assistant stratégie : étapes, profil, lectures, actions
│ └── proxy.ts → traitement avant requête (redirections 301, session)
├── tests/unit/ → tests unitaires
├── tests/integration/ → tests RLS sur la base de développement
├── .env.example → variables d'environnement à définir
├── CHANGELOG.md PROJECT-TRACKER.md
npm install.env.example en .env.local et renseigner les valeurs (Supabase → Project Settings → API Keys).npx supabase link --project-ref <ref> puis npm run db:push.npm run dev puis ouvrir http://localhost:3000| Commande | Rôle |
|---|---|
npm run dev | Serveur de développement |
npm run lint / npm run typecheck | Qualité du code |
npm test | Tests unitaires |
npm run build | Build de production |
npm run db:new <nom> | Nouvelle migration SQL |
cmkouakou/Kalami ; chaque push sur main déploie en production..env.example (Preview et Production).kalami-livres.com ; domaines secondaires listés dans REDIRECT_DOMAINS.SUPABASE_SECRET_KEY contourne la RLS : uniquement côté serveur (src/lib/supabase/admin.ts).middleware.ts s'appelle désormais proxy.ts./api/livres/{id}/chapitres/{n} (clé serveur) :
la table chapters est illisible par les clients ; le seau manuscripts est privé.globals.css, thèmes Papier, Sépia, Nuit) ;
contraste AA 4,5:1 vérifié par tests/unit/contrast.test.ts./livres/{slug}/lire) décourage la copie et l'impression et affiche un
filigrane : ce sont des freins, pas une protection absolue (le texte est affiché)./auteur) : inscription libre après acceptation du contrat en vigueur ;
chaque livre (et chaque nouvelle version) passe par la validation de l'administration
(/admin/soumissions). Tant qu'aucun contrat n'est publié (/admin/contrat),
l'inscription est fermée. Les droits sont appliqués par la base (RLS + déclencheurs)./apercu/{id}) : version en attente lisible par l'auteur et l'administration
seulement, sans enregistrement de position ni d'annotations.src/lib/pdf/), gardé 24 h dans le
seau privé pdf-exports puis supprimé (tâche /api/cron/pdf, CRON_SECRET requis dans
Vercel). 3 téléchargements par droit. En local, définir CHROME_EXECUTABLE_PATH
(Chrome installé) dans .env.local./admin/textes-legaux (table
legal_documents) ; les textes livrés sont provisoires, à faire relire avant la mise
en production. Bandeau des témoins : choix consigné dans consent_records./api/cron/comptes
(même CRON_SECRET). Elle emporte les études dont l'utilisateur est propriétaire,
même partagées (avertissement affiché avant la confirmation).Voir CHANGELOG.md.
Claude Marcel
/api/paiement/checkout crée la commande au prix de la
base (create_book_order) puis une session Stripe Checkout ; seul le webhook signé
/api/stripe/webhook livre l'achat (stripe_process_event : montant contrôlé, événement
traité une fois). Le compte Stripe est partagé : seules les sessions metadata.app=kalami
sont traitées. Variables STRIPE_* : voir .env.example. Historique : /compte/achats.item: study_offer | coach_pack
(create_strategy_order : prix de strategy_offers ou du forfait, remise enseignant).
Remboursement depuis /admin/commandes seulement : API Stripe (clé d'idempotence), puis
admin_refund_order retire les droits. Un remboursement fait dans Stripe ne les retire pas./admin/codes-promo, vérifiés par la base
(promo_check dans les fonctions de commande, aperçu /api/paiement/promo). Une fois par
compte, compté au paiement. Le même écran porte l'interrupteur Stripe Tax (éteint par
défaut ; prix taxes comprises une fois allumé)./compte/achats/[commande] ; l'admin valide ou refuse dans
/admin/commandes (filtre « À valider »). Numéros marchands : /admin/mobile-money.
Les commandes non déclarées expirent après 24 h (/api/cron/commandes, CRON_SECRET).ledger_entries, brut = frais + taxes + commission + part auteur). Part de l'auteur 70 %
du net, disponible après 30 jours ; réglages et part propre par auteur dans
/admin/revenus, revenus de l'auteur dans /auteur/revenus. Frais Mobile Money par
opérateur dans /admin/mobile-money./auteur/revenus ; l'admin approuve, puis marque payé (référence + reçu facultatif) ou
refuse dans /admin/versements. Journal d'audit : /admin/journal. Reçus dans le seau
privé payout-proofs.public/sw.js) actif en production seulement. Liste blanche dans
public/sw-routes.js : seuls les fichiers statiques, les couvertures et les pages publiques
du catalogue sont gardés sur l'appareil ; liseuse, études, comptes et API jamais. Changer
VERSION dans sw.js vide les anciens caches. Icônes : node scripts/generer-icones.mjs.