The Simplest & Most Reliable LAN / Cross-VLAN Virtual Printer Sharing Solution for Windows
sha-print
The Simplest & Most Reliable LAN / Cross-VLAN Virtual Printer Sharing Solution for Windows
README
ShaPrint
Modern, Standards-Based LAN & Cross-VLAN Printer Sharing for Windows, Linux, and Android
Desktop (Tauri 2, React, Rust) & Mobile (Android, Kotlin)
ShaPrint is a modern printer-sharing solution for local area networks (LAN) and cross-VLAN environments. It allows computers and mobile devices to share and access physical printers securely and transparently without relying on problematic Windows SMB printer sharing, third-party cloud services, or shared domain accounts.
Communication runs entirely over standard IPPS (Internet Printing Protocol over TLS) on dedicated high port TCP 48631, local client queue routing via proxy on TCP 48632 (127.0.0.1:48632), and zero-configuration multicast DNS discovery on UDP 48633 (ADR 0001–0018).
📥 Downloads & Supported Platforms
| Platform | Channel / Role | Package / Format | Download / Instructions |
|---|---|---|---|
| 🪟 Windows (10 / 11) | Stable (Server & Client GUI) | .msi, .exe Installer |
⬇️ Download Windows Installer (Includes x64 Setup .exe & MSI Installer) |
| 🐧 Linux (Universal) | Stable (Portable Desktop GUI) | .AppImage (x86_64) |
⬇️ Download Linux AppImage (Runs out-of-the-box on Ubuntu, Fedora, Debian, Mint, Arch, etc.) |
| 🐧 Ubuntu / Debian | Stable / Nightly (Desktop GUI & System Daemon) | .deb (Ubuntu 22.04+ / Debian 11+) |
⬇️ Download DEB Package (Installs desktop application menu launcher, icons & background daemon) 📦 Signed Repositories Guide |
| 🐧 AlmaLinux / Fedora / RHEL | Stable / Nightly (Desktop GUI & System Daemon) | .rpm (AlmaLinux 9 / 10, Fedora, RHEL) |
⬇️ Download RPM Package (Installs desktop application menu launcher, icons & background daemon) 📦 Signed Repositories Guide |
| 📱 Android (8.0+) | Client (Direct & PrintService) | .apk (Direct Install) |
⬇️ Download Latest APK (View all Android releases) |
| 🌙 Desktop Nightly | Nightly (Bleeding-Edge Test) | .exe, .deb, .AppImage |
⬇️ Browse Nightly Builds (q=nightly)(Automated test builds & prerelease verification) |
👉 Browse all releases, nightlies, and changelogs on GitHub Releases
🌐 Dedicated Network Ports
ShaPrint binds fixed, dedicated high ports to eliminate collisions with Windows system responders or common local developer servers (ADR 0014):
| Service | Protocol / Transport | Port | Purpose | Reference |
|---|---|---|---|---|
| Server Sharing Endpoint | IPPS (TLS) | TCP 48631 |
Encrypted IPP server (/ipp/print/...) answering printer queries and processing raster print jobs |
ADR 0003, ADR 0014 |
| Client Loopback Proxy | IPP (HTTP loopback) | TCP 48632 |
Local Windows spooler routing (127.0.0.1:48632) attaching Network Channel credentials |
ADR 0005, ADR 0014 |
| Discovery Responder / Querier | mDNS (UDP multicast) | UDP 48633 |
Advertising and discovering nearby servers (_shaprint-ipps._tcp.local., TTL = 32) |
ADR 0004, ADR 0014 |
If a port is held by a stale shaprint process on startup, ShaPrint automatically reclaims it; third-party conflicts are reported cleanly without killing foreign processes.
✨ Key Capabilities
- 🖨️ Standards-Based IPPS: Server shares queues using standard RFC 8010/8011 IPP over TLS with pinned SHA-256 certificate fingerprints (Trust-On-First-Use) and a dedicated TCP
48631listener (ADR 0001, ADR 0003, ADR 0014). - 🎨 Driver Fidelity & Fixed Media Catalog: Renders client PWG Raster pages directly through the server's installed manufacturer driver (e.g., Epson, Canon, HP), preserving media size, color, duplex, and copies (ADR 0010). Publishes a fixed media catalog with 0.5 mm geometry matching to prevent driver capability mismatches (ADR 0017).
- 🔍 Zero-Config Discovery & Cross-VLAN Reachability: Nearby servers advertise shared queues over multicast DNS (
_shaprint-ipps._tcp.local., UDP48633) across all active non-loopback IPv4 interfaces with TTL = 32 for mDNS reflection (ADR 0004, ADR 0014). Manual host:port entry, persistent trusted server storage, and live unicast polling enable seamless cross-VLAN printing. - 📱 Native Android Mobile Client: Lightweight client application in
apps/android(io.shaprint.client) connecting directly over IPPS (TCP48631) with client-side 300 dpi PWG raster rendering viaPdfRenderer, battery-friendly on-demand discovery (UDP48633), hardware-backed Android Keystore credential encryption, systemPrintServiceintegration, and Share Sheet target (ADR 0016). - 🔒 Defense-in-Depth Security: Network Channel passwords are never sent in plaintext or stored raw; servers authenticate clients with salted SHA-256 verifiers, and credentials are encrypted using Windows DPAPI or Android Keystore (ADR 0003, ADR 0007, ADR 0016).
- 🪟 Native Windows Queues & One-Click Repair: Installs native Windows print queues via
Add-Printer -IppURLrouting through a transparent local loopback proxy (ADR 0005). Features a dedicated "Repair paper sizes" action to refresh cached driver capabilities cleanly without manual deletion (ADR 0017). - 🛡️ Automated Inbound Firewall Provisioning: Verifies effective Windows Firewall inbound policy on Server Sharing start (TCP
48631, UDP48633) and prompts for UAC elevation only when rules are missing or restricted (ADR 0013). - ⚡ Intent-Driven UI & Unified Add Printer Wizard: Background services automatically start and stop based on user intent. Includes a streamlined 4-step
AddPrinterDialogwizard with visual SHA-256 fingerprint chunking (XXXX • YYYY • ZZZZ • AAAA), system status pills, and contextual diagnostics (ADR 0009). - 🔄 Persistent Server Sharing Across Reboots: Server shared printer selections and sharing state persist across system reboots (
sharing_state.json), ensuring workstations acting as print servers resume sharing after Windows updates or power cycles (ADR 0012, superseding ADR 0006). - 📦 Desktop Auto-Updater & Drain Guard: Unprivileged per-user background updates via
tauri-plugin-updaterwith active-job drain protection (8s cooldown), idle tray auto-restart (15-min idle), and mDNS version advertisement (v=TXT record) (ADR 0012). - 🚀 Manual Nightly Releases: Maintainer-dispatched nightly builds published as public GitHub prereleases with dedicated update feeds and SemVer prerelease versioning (ADR 0015).
- ⚠️ Classified Print Failure Reporting: Surfaces actionable error cards with stable error codes and single-click recovery steps, while strictly omitting secrets and document content from logs and UI (ADR 0008).
- 👻 Tray & Lifecycle: Starts silently on Windows login (per-user
Runkey, no elevation required) and minimizes cleanly to the system notification area (ADR 0006). - 🔄 Legacy Transition: Seamlessly imports configured Network Channels from previous .NET ShaPrint installations read-only without disturbing existing setups (ADR 0007), while legacy .NET WPF is retired to
legacy/wpf-lts(ADR 0011).
📁 Repository Structure
sha-print/
├── apps/
│ ├── desktop/ # Tauri 2 desktop application (React, TypeScript, Rust)
│ │ ├── src/ # Frontend UI (Tailwind CSS, shadcn-ui)
│ │ └── src-tauri/ # Rust backend: IPPS server, proxy, mDNS discovery, Windows adapters
│ └── android/ # Native Android mobile client (Kotlin, Jetpack Compose)
│ └── app/ # Android app module (io.shaprint.client, minSdk 26, targetSdk 35)
├── docs/
│ ├── adr/ # Architecture Decision Records (ADRs 0001–0017)
│ └── agents/ # Agent guidelines and triage conventions
├── scripts/
│ └── nightly/ # Automated nightly release tooling
└── package.json # Monorepo root Bun workspace
🏗 Architecture & Documentation
All architectural decisions are documented under docs/adr/:
- ADR 0001: Windows-first IPP print sharing
- ADR 0002: Tauri app structure and Rust boundaries
- ADR 0003: IPPS sharing endpoint and identity
- ADR 0004: Server discovery over multicast DNS
- ADR 0005: Native client queue installation
- ADR 0006: Desktop lifecycle and login startup
- ADR 0007: Migrating settings from legacy .NET app
- ADR 0008: Print failure reporting
- ADR 0009: Desktop UI/UX flow redesign
- ADR 0010: Render client raster through server driver
- ADR 0011: Retire .NET WPF application & defer scanner sharing
- ADR 0012: Desktop auto-updater, job-aware restart, and persistent server sharing
- ADR 0013: Ensure inbound Client access when Server Sharing starts
- ADR 0014: Dedicated ports, stale-process port reclamation, and cross-VLAN server reachability
- ADR 0015: Manual nightly desktop releases
- ADR 0016: Android mobile client architecture
- ADR 0017: IPP media catalog and client queue repair
- ADR 0018: Linux CUPS system daemon, socket control plane, and desktop GUI integration
- ADR 0019: Safe Linux diagnostics and journal events
💻 Development Setup
Desktop Application (apps/desktop)
Prerequisites:
- Bun (v1.0+)
- Rust (stable)
- Windows: Windows 10/11 with Visual Studio C++ Build Tools
- Linux: WebKitGTK 4.1 development libraries, GTK 3, and build essentials:
- Ubuntu / Debian:
sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential curl wget libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev - Fedora / AlmaLinux:
sudo dnf install -y webkit2gtk4.1-devel gtk3-devel openssl-devel libappindicator-gtk3-devel
- Ubuntu / Debian:
# Install frontend dependencies
bun install
# Run frontend development with hot-reload
bun run dev
# Run full desktop app in development
bun run tauri dev
# Typecheck and run frontend tests
bun run typecheck
bun run test
# Rust backend checks and unit tests (from apps/desktop/src-tauri)
cd apps/desktop/src-tauri
cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
cargo test
Android Mobile Client (apps/android)
Prerequisites:
- JDK 17+
- Android SDK (API 35,
minSdk = 26)
cd apps/android
# Run unit tests
./gradlew test
# Build debug APK
./gradlew assembleDebug
Landing page (apps/landing)
The English landing page and setup guide target Cloudflare Pages at
sha-print.pages.dev. To preview them with the local download counter:
make landing-dev # http://localhost:8788
make landing-build # Build only
make landing-deploy # Refresh releases, validate, and publish with local Wrangler login
See the landing page README for release-link refresh, Cloudflare deployment, and analytics setup. Root frontend checks include the landing package.
Product Hunt launch copy is available as a draft for the maker to review before submission.
📦 Building Releases
Desktop Application (Windows & Linux)
# Tauri desktop bundles:
# - Windows: NSIS Setup .exe and .msi installer
# - Linux: Portable .AppImage and .deb bundle
bun run tauri build
# Linux System packages (ships shaprintd daemon, shaprintctl CLI, shaprint-desktop GUI, .desktop launcher & icons):
# Debian / Ubuntu (.deb):
bash packaging/linux/deb/build-deb.sh
# AlmaLinux / Fedora / RHEL (.rpm):
bash packaging/linux/rpm/build-rpm.sh
Built desktop artifacts are output to apps/desktop/src-tauri/target/release/bundle/, apps/desktop/src-tauri/target/deb/, and apps/desktop/src-tauri/target/rpm/.
Android Mobile Client
cd apps/android
./gradlew assembleRelease
🚀 Release Channels
- Stable Channel: Released as official GitHub Releases (
vX.Y.Z) from themainbranch. - Nightly Channel: Dispatched manually via
make release-nightlyor GitHub Actions workflow dispatch. Publishes public GitHub prereleases with unique SemVer prerelease tags (e.g.v3.4.0-nightly.8) and an isolated update feed (ADR 0015).
📜 Legacy Version
The legacy .NET 8 WPF application has been frozen at v2.0.0-community and archived to the permanent legacy/wpf-lts branch (ADR 0011).