Skip to content

zParik/Qyra

Repository files navigation


Why Qyra?

Acrobat wants a subscription. Online PDF sites want your files. Qyra wants neither.

It's a desktop app that does the PDF work you actually do: view, mark up, merge, split, convert, OCR, protect. Everything runs locally. Nothing phones home. Open source under GPL-3.0.

Feature overview

Features

Viewer

  • Tabbed multi-document interface with persistent session
  • Virtualized page list, thumbnails, zoom, rotate, search
  • Outline (bookmarks), document metadata, recent-files library

Annotation

  • Freehand ink with pressure (perfect-freehand), highlighter, sticky notes
  • Shapes, stamps, text boxes, comments
  • Form filling, redaction (true content removal), watermarks, page numbers
  • Flatten annotations into the page

Page operations

  • Merge multiple PDFs into one
  • Split by range or page count
  • Reorder via drag-and-drop
  • Remove, rotate, crop pages

Conversion

  • PDF → images (PNG/JPEG, per page)
  • Images → PDF
  • PDF → plain text or layout-preserving text
  • PDF → Word (.docx)
  • OCR scanned pages via Tesseract.js, fully offline

Security

  • Password protect (AES-128/256)
  • Unlock (with password)
  • Compress and optimize

Download

Grab a build from Releases, or nightly artifacts from the latest Actions run.

Platform Formats
Windows .msi, .exe (NSIS)
Linux .deb, .rpm, .AppImage
macOS .dmg, .app.tar.gz
Android .apk

Linux on Wayland

The AppImage is patched to use the system libwayland-client.so, and WebKitGTK's DMA-buf renderer is disabled at startup. If you still hit issues:

LD_PRELOAD=/usr/lib/libwayland-client.so ./Qyra.AppImage

Development

Prerequisites

  • Node.js 20+
  • Rust toolchain (stable)
  • Tauri platform deps: https://tauri.app/start/prerequisites/
  • Windows: run cargo from a Visual Studio Developer PowerShell so MSVC env vars are set for the native C deps (MuPDF).
npm install
npm run tauri dev

Lint:

npm run lint

Building

npm run tauri build

Bundles land in src-tauri/target/release/bundle/.

Android

CI builds an APK via .github/workflows/build-android.yml. Locally you need the Android NDK and the aarch64-linux-android Rust target.

Project layout

src/                React 19 + TypeScript frontend
├─ tools/           One page per feature (Merge, Split, OCR, …)
├─ viewer/          PDF viewer + annotation surface
├─ components/      Shared UI
├─ store/           Zustand stores
└─ hooks/           React hooks

src-tauri/
├─ src/commands/    Rust Tauri commands, one file per feature
├─ src/pdf/         MuPDF bindings and PDF helpers
└─ src/utils/       Shared Rust utilities

Tech stack

Layer Choice
Shell Tauri 2
Frontend React 19, TypeScript, Vite, Tailwind 4, Radix UI
State Zustand, TanStack Query
PDF engine MuPDF via Rust FFI
OCR Tesseract.js
Ink perfect-freehand

Contributing

Issues and PRs welcome. Conventions:

  • One logical change per commit
  • Many small commits per PR
  • Merge commit only (no squash, no rebase)
  • Reference an issue in the PR body when one exists

License

GPL-3.0. Use it, modify it, ship it, just keep it open.


Built by @zParik. Star the repo if Qyra saves you a subscription.

About

The free, open-source PDF Swiss Army Knife, merge, split, compress, edit and more. Offline-first, privacy-focused. Built with Tauri, React & Rust.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors