https://github.com/the-database/yosh
A lean, high-throughput local manga/comic reader in Rust
https://github.com/the-database/yosh
Last synced: about 2 months ago
JSON representation
A lean, high-throughput local manga/comic reader in Rust
- Host: GitHub
- URL: https://github.com/the-database/yosh
- Owner: the-database
- Created: 2026-06-01T05:04:20.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2026-06-04T05:02:42.000Z (about 2 months ago)
- Last Synced: 2026-06-04T05:23:49.263Z (about 2 months ago)
- Language: Rust
- Homepage:
- Size: 441 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# yosh
A lean, high-throughput local manga/comic reader in Rust (`winit` + `wgpu` + `egui`). Its defining
feature is zero-hitch page turning and continuous scrolling, built on a parallel decode-ahead pipeline:
worker threads decode pages full-res, downscale (CPU or GPU), upload to GPU textures, and feed a bounded
ring buffer ahead of the read position, so page changes are just texture swaps.
## Install (Windows)
Grab the latest [release](https://github.com/the-database/yosh/releases):
- **`yosh-setup-x64.exe`** — installer (per-user, **no admin**). Adds a Start Menu shortcut and lets
you tick which file types open in yosh — **comic archives** (`.cbz .cbr .cb7`), **images**
(`.png .jpg .jpeg .webp .gif .bmp .avif`), or both. For a type another app already owns (e.g. `.png`
→ Photos), Windows keeps that default until you confirm yosh once via right-click → *Open with* →
*Choose another app* (or Settings → Apps → Default apps) — installers can't change it silently.
- **`yosh-windows-x64-portable.zip`** — portable build. Unzip anywhere and run `yosh.exe`; settings
live next to it (`yosh-state.json`), so it leaves nothing behind and travels on a USB stick. (The
bundled `yosh-portable.txt` marker enables this; delete it to use the normal `%APPDATA%` location.)
- **`yosh-windows-x64.exe`** — the bare single executable (settings in `%APPDATA%`).
The installer/exe are unsigned, so SmartScreen may warn on first run — choose *More info → Run anyway*.
## Build & run
```sh
cargo run --release -p yosh -- "" [start_page]
```
`` is a folder of images, or a `.cbz/.zip`, `.cbr/.rar`, or `.7z/.cb7` archive. With no argument,
yosh opens the library grid (if a library folder was set) or shows the keys overlay.
Default `cargo build` needs no system libraries (pure-Rust decoders).
## Formats
- Sources: image folders, CBZ/ZIP, CBR/RAR (UnRAR), 7z/CB7.
- Images: PNG, JPEG, WebP, GIF, BMP, JPEG XL (.jxl), PSD, ICO, TIFF, TGA, DDS, OpenEXR, Radiance
HDR, QOI, PNM. AVIF is **opt-in** (see below).
- Animated GIF and animated WebP play back, with a mini panel for play/pause and frame stepping.
- ICO files step through their contained resolutions ("layers") in that same panel.
- PSD shows the flattened composite (8-bit RGB); it's browsable in folders/archives but is **not**
registered as a default `.psd` handler (a "View with yosh" right-click entry is offered instead).
## Controls (press F1 in-app for the full list)
| | |
|---|---|
| Flip | ← → (reading-direction aware), ↑ ↓ / Space / PgUp · PgDn; click a left/right **edge**; wheel |
| `Home` / `End` | first / last page |
| `[` / `]` | previous / next book (folder or archive) |
| Views | `9` fit window · `8` fit width · `0` 100% (1:1) · `7` two-page L→R · `6` two-page R→L |
| `S` / `D` / `C` / `O` | spread ↔ single · direction RTL↔LTR · continuous scroll · shift spread pairing |
| `J` | seek mode: **step** (see every page) ↔ **jump** (skip ahead) |
| `+` `-` | zoom; drag to pan |
| `I` | image info overlay |
| `B` | bottom seekbar (reveals near the bottom edge; click/drag to jump) |
| `G` | show/hide the animation panel (animated GIF / WebP) |
| double-click | fullscreen (middle of the page); `F11` also toggles |
| `Esc` | quit |
Reading position (per volume), reading direction, fit, layout, spread offset, scroll, seek mode,
and seekbar visibility are persisted.
## AVIF (optional)
AVIF decode uses the `image` crate's native (dav1d) backend, gated behind an off-by-default feature so
the standard build stays toolchain-free:
```sh
cargo build --release -p yosh --features avif # requires nasm + dav1d (or a vendored build)
```
## Benchmarks
`crates/decode_bench` and `crates/present_bench` are the throwaway spikes that validated the throughput
ceiling; see `SPIKES_RESULTS.md`.