Current Features
Qprint is a full-stack print-on-demand platform. This document lists all features implemented and available today.
Customer Features
| Feature | Description |
|---|---|
| User registration & authentication | JWT-based login: password (username/email/mobile) or email OTP; sign-up requires email OTP verification (6-digit code via Resend). All OTP flows are email only (no SMS). |
| File upload | PDF, images (PNG/JPG/JPEG), Word (DOC/DOCX), PowerPoint (PPT/PPTX). Billing uses real page/slide count where available; see Supported File Types below. |
| Print options | Copies, single/double sided, color/B&W, paper size (A4, Letter, etc.) |
| Private prints | Unique 6-character code for pickup |
| Queue prints | Send to a specific shopkeeper for printing |
| Payment integration | Razorpay (card, UPI, netbanking) |
| Wallet payments | Pre-load balance, instant payments, hybrid (wallet + Razorpay) |
| Cost calculation | Pre-payment cost estimate |
| File history & tracking | View uploads, status (including "Printing at shop...", "Cancelled by shop"), queue position; cancel reason shown when shop cancels an order |
| Expense tracking | Track print spending (cancelled orders excluded from pending costs) |
| Shop favorites | Save preferred shopkeepers |
| Nearest shop finder | Location-based shop discovery (requires login; GET /shops is protected) |
| Withdraw prints | Cancel and get automatic refund; withdraw is disabled while the shop has started printing (status printing); re-enabled if print fails or times out; withdraw hidden for orders cancelled by shop (status cancelled; customer is refunded automatically) |
| Login with email OTP | Optional: request OTP to email → verify 6-digit code → receive JWT (web, customer app, shopkeeper app). Email only. |
| Password/username recovery | Email-based reset via Resend API |
| Profile management | Update account details |
| Delete account | Self-service account deletion with password confirmation |
| Map view | See shop locations on a map |
| Real-time queue position | Live updates on queue status |
| Download Apps page | Public page with Windows/Android/iOS app links (admin-configurable) |
| Delete data (GDPR) | Public /delete-data page for Play Store "Delete data" link requirement |
Shopkeeper Features
| Feature | Description |
|---|---|
| Shop registration | Create shop with name, address, location (lat/long) |
| Queue management | View and process print queue; cancel order (with required reason) before printing — customer is notified, refunded, and sees the reason; cancel not allowed once printing has started |
| Private print code entry | Enter customer code to fetch and print |
| Print job processing | Process single or batch prints; print-started and print-failed API calls so customer withdraw is disabled while printing and re-enabled on failure |
| Windows silent printing | SumatraPDF CLI — no dialogs |
| Print verification | WMI-based completion check; page-based timeout (60 + 15 × pages seconds, no cap) before confirming |
| Multi-file batch printing | Queue multiple prints to different printers |
| Shop status toggle | Mark shop open/closed; optional auto-close when app heartbeat and web activity are stale |
| Shop heartbeat | App sends heartbeat to keep shop "open"; sweeper auto-closes when both app and web are inactive |
| Earnings statistics | View revenue and commissions |
| Print history | Past jobs and status |
| Payout tracking | Track pending and completed payouts |
| Printer selection | Choose printer per job |
| File conversion | Word/PPT → PDF via LibreOffice (Windows). Pre-convert runs in background when queue loads; at print time cache is used or on-demand convert. |
| Delete account | Self-service account deletion with password confirmation |
| Windows installer | MSIX package (Publisher: Qprint, white logo, desktop shortcut); optional classic .exe (Inno Setup) with install-directory choice and desktop-shortcut checkbox. See Windows Installer. |
Supported File Types (Platform-Wide)
| Type | Extensions | Page/slide count | Notes |
|---|---|---|---|
.pdf | From file | Passthrough; no conversion | |
| Images | .png, .jpg, .jpeg | 1 per file | Converted to single-page PDF (fit to paper) |
| Word | .doc, .docx | DOC: OLE SummaryInformation; DOCX: app.xml or document.xml | Converted via LibreOffice (shopkeeper Windows) |
| PowerPoint | .ppt, .pptx | Slide count (PPTX: slide XMLs; PPT: binary) | Converted via LibreOffice (shopkeeper Windows) |
- Billing: Cost = pages × copies × rate. When the backend cannot determine page/slide count (e.g. .doc without summary, corrupted or non-standard file), the API returns 400 with: "Page count not available for this file. Please convert to PDF and upload."
- Max 20MB per file, 100MB total per upload batch.
Admin Features
| Feature | Description |
|---|---|
| User management | View users, user details, delete user accounts |
| Order management | View all payment orders |
| Payout management | Update payout status (single or bulk), export payouts |
| Manage payments | Per-shop payout history and mark-as-paid |
| App download links | Set Windows/Android/iOS download URLs and "coming soon" flags (shown on public Download Apps page) |
| Dashboard statistics | Platform analytics overview |
Platform Features
| Feature | Description |
|---|---|
| Multi-role system | Customer, Shopkeeper, Admin |
| Payment gateway | Razorpay integration |
| Email service | Resend API (recommended) or SMTP |
| File storage | Local (default) or AWS S3 |
| Database migrations | PostgreSQL with schema management |
| JWT authentication | Secure API access |
| CORS configuration | Configurable allowed origins |
| Webhook handling | Razorpay payment confirmations |
| Commission system | Configurable platform commission |
| Wallet service | Top-up, pay, refund, transaction history |
Security Features (Implemented)
| Component | Features |
|---|---|
| Backend | JWT validation (32+ chars), CORS, rate limiting, file upload validation (MIME + magic bytes), security headers, password reset token hashing, webhook signature verification, secure account deletion; optional SKIP_AUTH_COOKIE so only Bearer auth is accepted (no cookie when opening API URL in browser) |
| Frontend Web | httpOnly cookie auth, CSRF protection, security headers, generic error messages, delete account with password confirmation |
| Customer App | Secure token storage, certificate pinning, root/jailbreak detection, session timeout (15 days idle), registration duplicate-field messages (username/email/mobile), delete account |
| Shopkeeper App | Secure token storage, certificate pinning, HTTP timeout, API URL config, PowerShell injection fix, path traversal sanitization, verbose logging, session timeout (30 min), token fallback restriction, file integrity verification, delete account |
See Security Audit for full details.
Deployment & Integrations
- Backend: Render-ready (Go)
- Frontend: Vercel-ready (Next.js)
- Mobile: Flutter (Android, iOS, Windows for shopkeeper)
- Printing: SumatraPDF (required), LibreOffice (optional, for Word/PPT)
Last Updated: February 2026 (page count by file type; convert-to-PDF message when count unavailable; pre-convert cache; email-only OTP; shopkeeper cancel with reason; SKIP_AUTH_COOKIE)