Inko

Inko # Inko **Tes mangas et light novels, partout. Lis, suis tes séries, reprends où tu t'es arrêté.** Un lecteur de **mangas et de romans** moderne — web, PWA installable, application desktop (Electron) et mobile (Capacitor) — construit sur un système d'extensions ouvert, dans l'esprit de Mihon / Tachiyomi. Lis des mangas en images **et** des light/web novels en texte, y compris des œuvres japonaises et chinoises traduites. [![Node](https://img.shields.io/badge/Node-%E2%89%A518-339933?logo=node.js&logoColor=white)](https://nodejs.org/) [![Express](https://img.shields.io/badge/Express-4-000000?logo=express&logoColor=white)](https://expressjs.com/) [![MySQL](https://img.shields.io/badge/MySQL-8-4479A1?logo=mysql&logoColor=white)](https://www.mysql.com/) [![PWA](https://img.shields.io/badge/PWA-installable-5A0FC8?logo=pwa&logoColor=white)](https://web.dev/progressive-web-apps/) [![Electron](https://img.shields.io/badge/Desktop-Electron-47848F?logo=electron&logoColor=white)](https://www.electronjs.org/) [![License](https://img.shields.io/badge/License-Apache_2.0-D22128?logo=apache&logoColor=white)](LICENSE) [Démarrer](#installation-en-2-minutes) · [Fonctionnalités](#fonctionnalités) · [Comparatif](#pourquoi-inko--comparatif) · [Extensions](#extensions) · [Desktop](#application-desktop) · [API](#api-rest)

Aperçu

Accueil Inko

Lecteur Lecteur de musique
Catalogue et aperçu au survol Page série

Pourquoi Inko — comparatif

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

Fonctionnalités

Lecteur d’images (manga)

Lecteur de romans (light/web novels)

Bibliothèque

Objectifs, stats & gamification

Découverte

Suivi & comptes

Confort, design & vie privée


Installation en 2 minutes

Pré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  
Email demo@inko.app
Mot de passe demo1234

Extensions

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 desktop

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 dist reconstruit 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.

Application mobile

npm install -g @capacitor/cli
npx cap add android && npx cap sync android && npx cap open android

Connexion Google & comptes liés

Tout se configure dans l’app, sans redémarrage (ou via server/.env) :

Les identifiants collés dans l’app sont stockés localement (server/config/*.json, gitignorés ; ou inko-config.json côté desktop).


Architecture

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.


API REST

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

Légalité et confidentialité

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.


Contribuer

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.