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.
Grab the latest release:
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 runyosh.exe; settings live next to it (yosh-state.json), so it leaves nothing behind and travels on a USB stick. (The bundledyosh-portable.txtmarker 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.
Download yosh-linux-x64 from the latest release,
make it executable and run it:
chmod +x yosh-linux-x64
./yosh-linux-x64 "<path>"It's a single binary. It needs a desktop session (X11 or Wayland) and a GPU driver with Vulkan support.
Download yosh-android.apk from the latest release
and install it (allow installs from your browser or file manager when Android asks).
cargo run --release -p yosh -- "<path>" [start_page]<path> 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).
- 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
.psdhandler (a "View with yosh" right-click entry is offered instead).
Pages shown larger than their source can be redrawn by an AI model a moment after they appear: the MangaJaNai models for grayscale pages, IllustrationJaNai for colour. It's an add-on that stays off until you install it from ⚙ Settings → AI upscaling → Install the add-on. yosh downloads MangaJaNaiCLI, which fetches the runtime for your GPU and the models (about 1 GB with an NVIDIA GPU).
- GPUs: NVIDIA (TensorRT, plus TensorRT-RTX on Windows), and AMD or Intel through DirectML on Windows. On Linux, NVIDIA only. Not on Android.
- Profiles:
Shift+123pick the built-in Quality, Balanced (the default) or Performance profiles.Ctrl+1…9are your own, set up in Settings → AI upscaling → Edit profiles: which model upscales gray or colour pages at which source height and scale. You can also import a MangaJaNai GUI workflow (.mwf).Uturns upscaling off or on for the current book. - Removing it: Settings → AI upscaling → Remove the add-on (the Windows uninstaller also removes it).
| 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 |
R |
rotate 90° clockwise (single-page view; resets on opening a new book) |
+ - |
zoom; drag to pan |
Ctrl+wheel |
zoom at the cursor — the pixel under it stays put, in the same steps as + - |
Z |
stretch small pages (off: a fit never scales past 100% native; zoom still can) |
U |
AI upscaling on/off for this book (needs the optional add-on; see Settings) |
Shift+1 2 3 / Ctrl+1…9 |
AI upscaling profile: built-in Quality / Balanced / Performance, or your own (Settings → AI upscaling → Edit profiles); Shift+0 turns it off |
E |
show in Explorer (opens the folder and selects the file/archive) |
I |
image info overlay |
B |
bottom seekbar (reveals near the bottom edge; click/drag to jump) |
T |
page-turn transition (slide + soft fade on flip) |
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, seekbar visibility, the page-turn transition toggle, the stretch-small-pages toggle, and the spine shadow (book-gutter shading on un-joined two-page spreads, in ⚙ Settings) are persisted.
The UI is available in English, Español, Português, Français, Deutsch, Русский, 日本語, 简体中文, 繁體中文 and 한국어. It follows the system language by default; pick another under ⚙ Settings → Language (desktop) or the options popup (Android).
The non-English translations are first drafts and haven't been reviewed by native
speakers yet — corrections are very welcome. Each language is one file in
crates/yosh-engine/src/i18n/ (es.rs, pt.rs, fr.rs,
de.rs, ru.rs, ja.rs, zh_hans.rs, zh_hant.rs, ko.rs): edit the strings, keep the
{…} placeholders, and open a pull
request. To add a language, copy en.rs; the compiler will flag any string you missed.
AVIF decode uses the image crate's native (dav1d) backend, gated behind an off-by-default feature so
the standard build stays toolchain-free:
cargo build --release -p yosh --features avif # requires nasm + dav1d (or a vendored build)cargo run --release -p yosh-engine --example seek_bench -- "<book>"— engine page throughput (read, decode, HQ resize, GPU upload) through the real decode pool.scripts/flipbench.ps1 -Base <ref> -Book "<book>"— UI frame timing (egui pass, submit/present, frame pacing) of a--features flipbenchbuild, base commit vs working tree.
crates/decode_bench and crates/present_bench are the throwaway spikes that validated the throughput
ceiling; see SPIKES_RESULTS.md.
- mpv-AnimeJaNai: Real-time anime upscaling in mpv
- VideoJaNai: Upscale video files
- MangaJaNai GUI: Upscale manga and images
- traiNNer-redux: Train your own upscaling models