尚未偵測到更新。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.