
![]() |
![]() |
![]() |
![]() |
Les bons lecteurs sont souvent enfermés dans un seul OS (Mihon/Tachiyomi sur Android, Paperback sur iOS) ou demandent un serveur lourd (Komga/Kavita). Inko réunit tout dans une seule base de code — web, PWA, desktop, mobile — avec un système d’extensions que tu peux étendre toi-même, et reste centré sur la lecture (pas de réseau social).
| Inko | Mihon / Tachiyomi | Paperback | Komga / Kavita | MangaDex Web | |
|---|---|---|---|---|---|
| Plateformes | Web · PWA · Desktop · Mobile | Android | iOS | Serveur + web | Web |
| Mangas et romans (texte) | ✅ | Manga | Manga | Les deux | Manga |
| Œuvres JP/CN traduites | ✅ (EN + FR) | Selon ext. | Selon ext. | Selon import | Multi |
| Extensions ouvertes | ✅ | ✅ | ✅ | ❌ | ❌ |
| Auto-hébergeable | ✅ (Node/MySQL) | ❌ | ❌ | ✅ (lourd) | ❌ |
| Sync compte (favoris, progression) | ✅ | Partiel | Partiel | ✅ | ✅ |
| Tracking AniList | ✅ (auto + manuel) | ✅ | ✅ | Partiel | — |
| Lecture hors-ligne (images + texte) | ✅ | ✅ | ✅ | ✅ | ❌ |
| Bibliothèque visible hors connexion | ✅ (miroir local) | ✅ | ✅ | ❌ | ❌ |
| Mode incognito (lecture privée) | ✅ | ✅ | ❌ | ❌ | ❌ |
| Filtres chapitres (lus / non lus) | ✅ | ✅ | ✅ | ✅ | Partiel |
| Thèmes (clair / sombre / AMOLED) + accent | ✅ | ✅ | Partiel | ✅ | Partiel |
| Palette de commandes (Ctrl/Cmd+K) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Objectifs, défis & badges de lecture | ✅ | ❌ | ❌ | Partiel | ❌ |
| Connexion Google (SSO) | ✅ | ❌ | ❌ | Selon | ✅ |
| Musique pendant la lecture | ✅ (Spotify/YouTube/local) | ❌ | ❌ | ❌ | ❌ |
| Sans framework lourd (forkable) | ✅ (Vanilla JS) | Kotlin | Swift | Kotlin/Angular | React |
I)Ctrl/Cmd+K) : recherche + navigation rapide/ recherche, r aléatoire, c continuer, b
bibliothèque, ? aide) · bouton flottant Retour en hautPrérequis : Node.js 18+, MySQL 8 (Laragon, MAMP, Docker…).
git clone https://github.com/Abdoulrazack1/Inko.git
cd Inko/server
npm install
npm run init-db # crée la base + un compte démo
npm start # http://localhost:8088
Ouvre http://127.0.0.1:8088. Les sources de référence (mangas : WeebCentral, MangaDex, SushiScan ; romans : Royal Road, NovelFull, Chireads) sont incluses et chargées au démarrage.
Astuce : certaines sources (NovelFull, proxy de couvertures) passent par
curl, présent nativement sur Windows 10+, macOS et Linux.
| Compte démo | |
|---|---|
demo@inko.app |
|
| Mot de passe | demo1234 |
Inko repose sur un framework d’extensions neutre : chaque source est un module indépendant que tu peux étendre.
// server/extensions/ma-source/index.js — source MANGA (images)
module.exports = {
id: 'ma-source', name: 'Ma Source', lang: 'fr', version: '1.0.0',
type: 'manga', // 'manga' (défaut) ou 'novel'
capabilities: ['popular', 'latest', 'search', 'manga', 'chapters', 'pages'],
async popular({ limit, offset }) { /* ... */ },
async latest ({ limit, offset }) { /* ... */ },
async search ({ q, limit, offset, filters }) { /* ... */ },
async getManga(id) { /* ... */ },
async getChapters(mangaId, { lang }) { /* ... */ },
async getPages(chapterId) { /* ... */ }, // → { pages: [{ url }] }
};
Une source de romans déclare type: 'novel' et implémente getText(chapterId)
(qui renvoie { title, content }, HTML assaini) au lieu de getPages. Ses
chapitres s’ouvrent automatiquement dans le lecteur de texte.
Dépose un dossier dans server/extensions/, redémarre, et la source apparaît dans
la page Sources.
| Source | Langue | Type | Notes |
|---|---|---|---|
| WeebCentral | EN | Manga | Source par défaut, filtres genres/statut/tri natifs |
| MangaDex | Multi | Manga | Très grand catalogue, métadonnées riches |
| SushiScan | FR | Manga | Catalogue complet via index sitemap (~2100 séries) |
| Royal Road | EN | Roman | Web novels originaux EN (LitRPG, fantasy) |
| NovelFull | EN | Roman | Light novels JP / CN / KR traduits (xianxia, isekai…) |
| Chireads | FR | Roman | Novels chinois traduits en français (fantrad) |
Application native via Electron, backend embarqué — un double-clic suffit.
cd desktop
npm install
npm run dist # Windows : dist/Inko-Setup-1.0.0.exe (NSIS) + mise à jour
# automatique de l'app installée (déploiement local)
# npm run build:win -> build seul, sans déployer
# npm run dist:mac -> .dmg npm run dist:linux -> AppImage + .deb
npm run distreconstruit et met à jour l’app installée localement (copie directe par-dessus%LOCALAPPDATA%\Programs\Inko) — fini les « retours à l’ancienne version » après un build.
npm install -g @capacitor/cli
npx cap add android && npx cap sync android && npx cap open android
Tout se configure dans l’app, sans redémarrage (ou via server/.env) :
console.cloud.google.com/apis/credentials (origines
JS autorisées : http://127.0.0.1:8088 et http://localhost:8088). Vide = bouton
Google masqué proprement, l’email reste pleinement fonctionnel.anilist.co/settings/developer (Redirect URL : http://127.0.0.1:8088/anilist.html),
colle l’ID client, puis « Connecter ». Implicit grant, le secret n’est pas requis.server/.env (SPOTIFY_CLIENT_ID + SPOTIFY_CLIENT_SECRET),
Redirect URI http://127.0.0.1:8088/api/spotify/callback. Détails dans
SPOTIFY_SETUP.md. Sans config, stations/YouTube restent dispos.Les identifiants collés dans l’app sont stockés localement
(server/config/*.json, gitignorés ; ou inko-config.json côté desktop).
inko/
*.html pages (modules indépendants)
chapitre.html / lecture.html lecteur d'images / lecteur de texte (romans)
assets/js/
api.js client REST, cache du token, proxy des couvertures
global.js header/nav, recherche, palette de commandes, comptes liés,
icônes SVG (MH.icon), incognito, routage lecteur (MH.readerHref)
theme.js thème clair/sombre/AMOLED + couleur d'accent
storage.js préférences locales + miroir bibliothèque (hors-ligne)
userdata.js notes, signets, épingles, objectifs (sync /me/settings + local)
nsfw.js, card-hover.js, music.js, downloads.js, anilist.js
{page}.js logique de chaque page (vue pure)
service-worker.js PWA : network-first (code), cache des couvertures & chapitres
desktop/ application Electron (+ scripts/deploy-local.ps1)
extensions-community/ sources de référence (mangas + romans)
server/
routes, controllers, middleware
controllers/image.controller.js proxy + cache des couvertures (curl)
extensions/loader.js chargement dynamique (type manga|novel)
config/ clés Google/AniList collées dans l'app (gitignoré)
db/schema.sql tables MySQL (migrations douces)
Principe : séparation stricte logique / vue. Chaque page ne fait que du DOM ; la
logique vit dans api.js et le backend. Vanilla JS, sans étape de build,
lisible et facile à forker.
Base /api. Voir le détail des routes.
Auth POST /auth/register, /auth/login PUT /auth/password, /auth/profile POST /auth/delete
Google GET /auth/providers POST /auth/google GET/PUT /auth/google-config
Sources GET /sources /sources/:id/mangas/*
Mangas GET /mangas/{search,popular,latest,tags,:id,:id/chapters} GET /search-all
Lecture GET /chapters/:id/pages (manga) /chapters/:id/text (roman)
Images GET /img?u=<url> (proxy + cache des couvertures)
Compte GET/PUT /me/{favorites,library,progress,lists,settings,ratings,updates} /me/export, /me/import
(notes, signets, épingles, objectifs : stockés dans /me/settings)
Read POST /me/read-chapters /me/read-chapters/bulk PUT /me/favorites/:id/category
Stats GET /me/stats /me/events /ratings/:id
Artwork GET /artwork?title=... (illustrations officielles AniList)
Spotify GET /spotify/{login,callback,status,playlists,recent,top,saved,now-playing} POST /spotify/disconnect
AniList GET /anilist/{config,similar} PUT /anilist/config
Inko est un framework de lecture neutre. Le projet ne distribue aucun contenu :
les extensions agissent comme un client personnel, à la manière de Mihon ou
Paperback, sous la responsabilité de l’utilisateur. Aucune image n’est stockée
côté serveur, aucune télémétrie. Usage strictement personnel. Voir
NOTICE.md.
Contributions bienvenues : nouvelles extensions (mangas ou romans), support EPUB/CBZ, traductions, thèmes, trackers supplémentaires (MAL, Kitsu). Ouvre une issue ou une pull request.
Distribué sous licence Apache 2.0.