Skip to content

me-cedric/PanelShelf

Repository files navigation


PanelShelf logo

PanelShelf

Self-hosted comic & graphic novel release browser, download manager, and local library reader

Overview β€’ Features β€’ Quick Start β€’ Desktop App β€’ Development β€’ API β€’ Contributing

CI Status Latest Release MIT License TypeScript Node >=22 pnpm workspace PRs Welcome Stars Platforms


PanelShelf aggregates comic book and graphic novel releases from multiple online sources into a single, searchable, filterable catalog β€” then helps you download and read them. It's a self-hosted alternative to commercial comic trackers, built for collectors who want to curate their own digital library.

πŸ–ΌοΈ Screenshots coming soon

πŸ“‘ Table of Contents

Sections

✨ Overview

PanelShelf solves a common problem for comic collectors: releases are scattered across dozens of sites (GetComics, Digital Comic Museum, Internet Archive, ZipComic, and hundreds of RSS/WordPress feeds). Manually checking each one is tedious.

  • Aggregate β€” Add any comic release site as a "source" and PanelShelf indexes its catalog
  • Search β€” Search across your entire indexed catalog or do live searches against source sites in real-time
  • Download β€” Track download links, resolve redirect chains, and manage your download queue
  • Read β€” Import your local CBZ/CBR files and read them in the built-in comic reader
  • Desktop app β€” Optional Tauri v2 native wrapper with sidecar backend

Status: Active development. The core features are functional, but APIs and storage format may change before v1.0.


πŸš€ Features

Multi-Source Aggregation

  • Pluggable provider system β€” Each comic source site gets a provider adapter that knows how to scrape it
  • Source types: RSS/Atom feeds, WordPress sites, Digital Comic Museum, ZipComic (with Cloudflare bypass), Internet Archive, GetComics, and more
  • Auto-detection β€” Paste a URL and PanelShelf detects the source type automatically
  • Per-source refresh intervals with rate limiting
  • Dual catalog β€” Persisted SQLite index (fast offline queries) + live search results from source sites

Catalog & Search

  • Indexed catalog β€” All ingested items stored in SQLite with full filtering and sorting
  • Live search β€” Real-time search across source feeds and provider sites with progressive loading (stale-while-revalidate β€” cached results appear instantly while fresh data loads)
  • Infinite scroll β€” Smooth progressive pagination with configurable trigger distance
  • Metadata extraction β€” Automatically extracts cover art, publisher, format, file size, release date, series, issue number, and download links
  • Grid & table views β€” Toggle between visual cover grid and compact data table
  • Filters: publisher, series, format, language, source, download availability, date ranges
  • Sorting: title, release date, file size, date added
  • Saved searches β€” Bookmark filter/search combinations for quick access

Download Manager

  • Pin download links across sessions
  • Redirect chain resolution β€” Follows HTTP redirects, meta-refresh, iframes, and JS redirects to find the actual file URL
  • Concurrent downloads with progress tracking, speed, ETA, and retry logic
  • Provider labels β€” See which host (Mega, MediaFire, Dropbox, etc.) each link belongs to

Cloudflare Bypass

PanelShelf includes a multi-layer strategy for scraping Cloudflare-protected sites:

Layer Method When It's Used
1. curl_cffi TLS fingerprint impersonation (Chrome 120) Lightweight, preferred β€” Docker sidecar
2. Playwright Full headless Chromium with stealth plugin Fallback when curl_cffi fails
3. FlareSolverr Docker browser proxy (optional) Last resort for stubborn sites

Local Library & Comic Reader

  • Add local folders β€” Point PanelShelf at a directory of comics
  • Supported formats: CBZ (native), CBR (requires unrar), ZIP, RAR
  • Automatic scanning β€” Recursively walks directories and indexes all comic files
  • Cover caching β€” Extracts cover images on first scan, cached to disk
  • Full-screen reader with keyboard shortcuts (next/prev, zoom modes, progress tracking)
  • Reading progress β€” Persisted per-item, resumed across sessions
  • Format badges β€” Each comic shows its format (CBZ/CBR) in the library grid
  • Auto-scan on startup β€” Optional, scans all library folders when the server starts

Cross-Platform Desktop App

  • Tauri v2 native wrapper for macOS, Windows, and Linux
  • Standalone backend β€” Backend compiled to a single binary via @yao-pkg/pkg, runs as a sidecar
  • Health monitoring β€” Rust backend polls the API health endpoint, logs startup progress
  • Graceful shutdown β€” Sidecar process is automatically killed when the desktop window closes
  • Native folder dialogs β€” Use the OS directory picker for library folders

REST API

  • Full OpenAPI documentation at /docs in dev mode (powered by Scalar)
  • Dark-themed API docs β€” Branded custom CSS, dark mode, interactive "Try It" for each endpoint
  • All catalog operations, source management, downloads, and library operations available via API

UI/UX

  • Dark theme β€” Built with React, Tailwind CSS, and a polished dark gradient palette
  • Toast notifications β€” In-app notifications for actions and errors
  • Onboarding dialog β€” First-run setup guide for new users
  • Responsive layout β€” Sidebar navigation, collapsible panels, hover states, and transitions

πŸ—οΈ Architecture

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚       Web Browser / Tauri WebView  β”‚
                    β”‚  (React + TanStack Query + Vite)   β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚ HTTP (REST API)
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚         PanelShelf Backend          β”‚
                    β”‚     (Fastify + TypeScript)          β”‚
                    β”‚                                     β”‚
                    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
                    β”‚  β”‚     Provider Adapters        β”‚   β”‚
                    β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚   β”‚
                    β”‚  β”‚  β”‚RSS  β”‚ β”‚DCM β”‚ β”‚ZipComicβ”‚ β”‚   β”‚
                    β”‚  β”‚  β”œβ”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚   β”‚
                    β”‚  β”‚  β”‚Get  β”‚ β”‚IA  β”‚ β”‚Manual  β”‚ β”‚   β”‚
                    β”‚  β”‚  β”‚Coms β”‚ β”‚    β”‚ β”‚URL     β”‚ β”‚   β”‚
                    β”‚  β”‚  β””β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚   β”‚
                    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
                    β”‚             β”‚                       β”‚
                    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                    β”‚  β”‚      Bypass Layer Stack        β”‚ β”‚
                    β”‚  β”‚  curl_cffi β†’ Playwright β†’ FS   β”‚ β”‚
                    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                    β”‚             β”‚                       β”‚
                    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                    β”‚  β”‚      Catalog Service           β”‚ β”‚
                    β”‚  β”‚   (Drizzle ORM + SQLite)       β”‚ β”‚
                    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                    β”‚                                     β”‚
                    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
                    β”‚  β”‚  Background Jobs (Queue)     β”‚   β”‚
                    β”‚  β”‚  Source refresh, indexing,   β”‚   β”‚
                    β”‚  β”‚  library scanning             β”‚   β”‚
                    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tech Stack

Layer Technology
Frontend React 19, TypeScript 5.7, Vite 6, TanStack React Query 5, React Router 7, Tailwind CSS 3, Lucide Icons
Backend Fastify 5, TypeScript, Drizzle ORM 0.40, better-sqlite3, Cheerio (HTML parsing), undici (HTTP), rss-parser
Database SQLite (single file, zero configuration, portable)
Desktop Tauri v2, Rust (tauri-plugin-shell, tauri-plugin-dialog)
Package Manager pnpm workspaces (monorepo)
CI (Coming soon β€” GitHub Actions)
Auth (Coming soon β€” JWT/Keycloak planned)

Project Structure

panelshelf/
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ frontend/                # React web application
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ api/             # API client functions & validation
β”‚   β”‚   β”‚   β”œβ”€β”€ components/      # React components (13+ components)
β”‚   β”‚   β”‚   β”œβ”€β”€ hooks/           # Custom React hooks
β”‚   β”‚   β”‚   β”œβ”€β”€ types/           # TypeScript type definitions
β”‚   β”‚   β”‚   β”œβ”€β”€ constants/       # App constants
β”‚   β”‚   β”‚   β”œβ”€β”€ utils/           # Utility functions
β”‚   β”‚   β”‚   β”œβ”€β”€ App.tsx          # Root app with router
β”‚   β”‚   β”‚   └── main.tsx         # Entry point
β”‚   β”‚   └── public/              # Static assets (favicon)
β”‚   β”œβ”€β”€ backend/                 # Fastify API server
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ db/              # Drizzle schema, migrations, DB init
β”‚   β”‚   β”‚   β”œβ”€β”€ providers/       # 6+ provider adapters (scrapers)
β”‚   β”‚   β”‚   β”œβ”€β”€ routes/          # 7 route modules (catalog, sources, etc.)
β”‚   β”‚   β”‚   β”œβ”€β”€ services/        # Business logic (catalog, library scanner)
β”‚   β”‚   β”‚   β”œβ”€β”€ queue/           # Background job processing
β”‚   β”‚   β”‚   β”œβ”€β”€ config.ts        # Environment config
β”‚   β”‚   β”‚   └── index.ts         # Server bootstrap
β”‚   β”‚   β”œβ”€β”€ sidecar/             # Python curl_cffi sidecar
β”‚   β”‚   └── data/                # SQLite DB & downloads (gitignored)
β”‚   └── desktop/                 # Tauri v2 desktop wrapper (optional)
β”‚       β”œβ”€β”€ src-tauri/
β”‚       β”‚   β”œβ”€β”€ src/main.rs      # Sidecar lifecycle, health polling
β”‚       β”‚   β”œβ”€β”€ binaries/        # Compiled backend placeholder
β”‚       β”‚   β”œβ”€β”€ capabilities/    # Tauri v2 permissions
β”‚       β”‚   └── icons/           # App icons
β”‚       └── scripts/             # Icon & backend build scripts
β”œβ”€β”€ Dockerfile                   # Multi-stage production build
β”œβ”€β”€ docker-compose.yml           # Full stack with sidecar services
β”œβ”€β”€ package.json                 # Root scripts & workspace config
└── pnpm-workspace.yaml          # pnpm workspace definition

In-Memory Caching

The backend maintains three in-memory caches for live search performance:

Cache TTL Purpose
Feed URL cache 1 hour Resolved RSS/Atom feed URLs per source
Search results cache 10 min Scraped WP page results per query/page
Total pages cache 10 min Detected pagination count per source

All caches can be cleared via Settings β†’ Sources β†’ Clear Cache, or POST /api/cache/clear.


🏁 Quick Start

Prerequisites

  • Node.js >= 22 (LTS recommended)
  • pnpm >= 9 (install: npm install -g pnpm)
  • Rust (only for desktop app: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh)

Installation

# Clone the repository (or download the source)
git clone https://github.com/me-cedric/panelshelf.git
cd panelshelf

# Install all dependencies
pnpm install

# Run database migrations (creates SQLite DB)
pnpm run db:migrate

# Start development servers (API + frontend concurrently)
pnpm dev

The API starts at http://localhost:3001 and the frontend at http://localhost:5173.

Open http://localhost:5173 in your browser. The Vite dev server proxies /api requests to the backend.

Docker Quick Start

# Build and start with Docker Compose (includes curl_cffi sidecar)
docker compose up -d

# Migrations run automatically on startup
# Open http://localhost:3001

First-Time Setup

  1. Open the app in your browser
  2. Navigate to Sources (sidebar)
  3. Click Add Source to add a content source

Example: GetComics RSS feed

Name: GetComics
Type: RSS
Base URL: https://getcomics.org

Click Create Source, then click the Refresh button on the source row. The backend fetches and indexes comics from the source.

  1. Navigate to Catalog to browse indexed results and use live search.

Tip: Click the Detect button next to the URL field to auto-detect the source type from a URL.

Configuration

Environment variables:

Variable Default Description
PORT 3001 API server port
HOST 0.0.0.0 API server bind address
DATA_DIR ./data Directory for SQLite DB, cache, and downloads
DOWNLOAD_DIR ./data/downloads Download destination
MAX_CONCURRENT_DOWNLOADS 3 Max simultaneous downloads
DEFAULT_REFRESH_INTERVAL_MIN 60 Default source refresh interval (minutes)
AUTO_SCAN_ON_START false Auto-scan library sources on server start
CURL_CFFI_URL β€” curl_cffi sidecar endpoint for Cloudflare bypass
FLARESOLVERR_URL β€” FlareSolverr endpoint (alternative bypass)
LOG_LEVEL info Pino log level (trace/debug/info/warn/error/fatal)
NODE_ENV development Set to production for production mode

πŸ“– Comic Reader

PanelShelf includes a full-featured comic reader for browsing and reading your local collection directly in the browser or desktop app.

Supported Formats

Format Extension Backend
CBZ (ZIP-compressed) .cbz, .zip adm-zip (native)
CBR (RAR-compressed) .cbr, .rar unrar or unar (system CLI)
PDF .pdf Planned (see roadmap)

Note: For CBR/RAR support, install unrar (macOS: brew install unrar, Ubuntu: sudo apt install unrar, Windows: download from rarlab.com) or unar (brew install unar / sudo apt install unar).

Keyboard Shortcuts

Action Key
Next page β†’ / Space
Previous page ←
First page Home
Last page End
Fit to width F (cycles: width β†’ height β†’ original)
Original size Z
Toggle shortcuts ?
Exit reader Esc

Reading progress is saved automatically between sessions. Finished comics show a green checkmark badge.


πŸ–₯️ Desktop App

PanelShelf includes an optional Tauri v2 desktop wrapper that packages the web app as a native desktop application.

Architecture

The desktop app bundles:

  • Frontend β€” Built static files served by Tauri's webview
  • Backend β€” Compiled to a standalone binary (@yao-pkg/pkg), runs as a sidecar process
  • Tauri β€” Rust wrapper that spawns the backend, monitors its health via /api/health, and kills it on window close

Building

cd packages/desktop

# Generate app icons from the SVG favicon
pnpm run icon

# Development mode (uses tsx for backend, hot-reloads frontend)
pnpm run tauri:dev

# Production build (compiles backend, builds frontend, packages .dmg/.msi/.AppImage)
pnpm run tauri:build

Platform Build Dependencies

Platform Requirements
macOS Xcode Command Line Tools (xcode-select --install)
Linux sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev
Windows Microsoft Visual Studio C++ Build Tools

Known Limitations

  • The @yao-pkg/pkg bundler may not fully support better-sqlite3's native module. If the production build fails, use Docker-based distribution or try Bun's --compile option.

🐳 Docker Deployment

The included Dockerfile uses a multi-stage build:

  1. Frontend builder β€” Installs deps, builds Vite output
  2. Backend builder β€” Installs deps, compiles TypeScript
  3. Runtime β€” Minimal node:20-alpine with dumb-init, production deps only

Run with Docker Compose:

docker compose up -d
# Open http://localhost:3001

The Compose file also includes:

  • curl-cffi-sidecar β€” Python-based TLS fingerprint bypass (enabled by default)
  • FlareSolverr β€” Optional full-browser proxy (commented out β€” uncomment to enable)

πŸ’» Development

Commands

# Start dev servers (API + frontend concurrently)
pnpm dev

# Type-check all packages
pnpm run typecheck

# Build all packages (backend + frontend)
pnpm run build

# Run database migrations
pnpm run db:migrate

# Generate Drizzle migrations (after schema changes)
pnpm --filter @panelshelf/backend run db:generate

# Push schema changes directly (dev only β€” SQLite)
pnpm --filter @panelshelf/backend run db:push

# Desktop development
pnpm run dev:desktop

# Desktop production build
pnpm run build:desktop

Adding a New Provider

Provider adapters follow the ProviderAdapter interface in packages/backend/src/providers/types.ts:

interface ProviderAdapter {
  id: string;
  name: string;
  canHandle(url: string): boolean;
  inspect(url: string, options?: ProviderInspectOptions): Promise<ProviderInspectionResult>;
  download(request: DownloadRequest): Promise<DownloadResult>;
}

To add a new provider:

  1. Create packages/backend/src/providers/<name>/index.ts
  2. Implement ProviderAdapter
  3. Register it in packages/backend/src/index.ts via registerProvider()
  4. Optionally add auto-detection logic in packages/backend/src/routes/sources.ts

curl_cffi Sidecar (for Cloudflare protection)

If you don't want to use Docker, run the Python sidecar locally:

cd packages/backend/sidecar
pip install -r requirements.txt
python3 server.py

# Then set: CURL_CFFI_URL=http://localhost:8192/fetch

πŸ“‘ API

PanelShelf exposes a REST API at http://localhost:3001/api. In dev mode, interactive API documentation is available at http://localhost:3001/docs (branded dark theme).

Endpoints

Method Path Description
System
GET /api/health Health check (status, version, uptime)
GET /api/stats Catalog stats (total items, sources, downloads)
GET /api/settings Get application settings
POST /api/settings Update application settings
Catalog
GET /api/catalog List/search indexed catalog items
GET /api/catalog/:id Get single item with download links
GET /api/catalog/filters/:column Get distinct filter values
GET /api/catalog/live-search Live search across source feeds
GET /api/catalog/live-search/categories List provider categories (e.g., DCM publishers)
GET /api/catalog/live-detail Scrape download links from a detail page
GET /api/catalog/resolve-download Resolve a download URL through redirects
Sources
GET /api/sources List configured sources
POST /api/sources Create a source
PUT /api/sources/:id Update a source
DELETE /api/sources/:id Delete a source
POST /api/sources/:id/refresh Trigger source refresh
POST /api/sources/auto-detect Auto-detect source type from URL
GET /api/sources/types List available source types
Downloads
GET /api/downloads List downloads
POST /api/downloads Enqueue a download
Saved Searches
GET /api/saved-searches List saved searches
POST /api/saved-searches Save a search
DELETE /api/saved-searches/:id Delete a saved search
Cache
POST /api/cache/clear Clear all in-memory provider caches
Library
GET /api/library/sources List library sources (folders)
POST /api/library/sources Add a library folder
DELETE /api/library/sources/:id Remove a library folder
POST /api/library/sources/:id/scan Scan a library folder for comics
GET /api/library/items List library items with search/filter
GET /api/library/items/:id/page/:page Get a single page image
GET /api/library/items/:id/cover Get cover image
POST /api/library/scan-all Scan all library sources
Providers
GET /api/providers List registered providers

Live Search Example

# Browse all posts from an RSS source
curl "http://localhost:3001/api/catalog/live-search?sourceId=<source-id>&page=1"

# Search with term
curl "http://localhost:3001/api/catalog/live-search?sourceId=<source-id>&q=batman&page=1"

# Fresh data (bypass cache)
curl "http://localhost:3001/api/catalog/live-search?sourceId=<source-id>&q=batman&fresh=true"

πŸ§ͺ Testing

# Type-check all packages
pnpm run typecheck

# Run backend type-check
pnpm --filter @panelshelf/backend run typecheck

# Run frontend type-check
pnpm --filter @panelshelf/frontend run typecheck

Unit test infrastructure is planned. Contributions welcome!


🀝 Contributing

Contributions are welcome! Here's how to help:

Bug Reports & Feature Requests

  • Open a GitHub Issue
  • Include steps to reproduce for bugs
  • Describe the use case for feature requests

Pull Requests

  1. Fork the repository
  2. Create a feature branch (git checkout -b feat/amazing-feature)
  3. Make your changes
  4. Run pnpm run typecheck to verify no type errors
  5. Commit (git commit -m 'feat: add amazing feature')
  6. Push to your fork (git push origin feat/amazing-feature)
  7. Open a Pull Request

Guidelines

  • Follow the existing code style and architecture patterns
  • Provider adapters go behind the existing ProviderAdapter interface
  • Run pnpm run typecheck before committing
  • Update this README if adding significant features
  • Use Conventional Commits style (feat:, fix:, chore:, docs:, etc.)

Development Setup

See the Development section above. The project uses a standard pnpm monorepo β€” install, migrate, and run.


πŸ—ΊοΈ Roadmap

  • Unit & integration tests (Vitest for frontend, Node Test Runner for backend)
  • GitHub Actions CI β€” Type-check, lint, test on PRs
  • JWT / Keycloak authentication
  • User account management with per-user libraries
  • PDF comic support in the reader
  • OPDS feed for external reader apps (e.g., Chunky, YACReader)
  • WebSocket push for real-time download progress
  • Docker Compose health checks for all services
  • Comic reader β€” Full-screen page viewer
  • Desktop app β€” Tauri v2 native wrapper
  • Cloudflare bypass β€” curl_cffi + Playwright + FlareSolverr
  • Library management β€” Local folder scanning
  • Download manager β€” Queue, progress, redirect resolution
  • Multi-source aggregation β€” RSS, DCM, IA, ZipComic, GetComics

πŸ“œ License

Distributed under the MIT License. See LICENSE for more information.


πŸ™ Acknowledgments


GitHub β€’ Docs β€’ Quick Start β€’ Contributing

Built with ❀️ and TypeScript, Rust, and Python

About

Self-hosted comic & graphic novel release browser, download manager, and local library reader

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors