Repository navigation
Releases: mrkaqz/queue
Release list
v2.5.4 — Smooth large ticket numbers (TrueType raster)
What's new
🖨 Smooth large ticket numbers
The previous large mode used ESC/POS GS ! to scale up the built-in bitmap font — which simply multiplied each dot, producing blocky/pixelated output.
v2.5.4 switches to raster image printing (GS v 0):
- Queue number is rendered with DejaVu Sans Bold TrueType font via Pillow
- Rendered at the printer's native 203 DPI — smooth, clean edges
- Auto-sizes the font to fill ~88% of the paper width
- Falls back to bitmap scaling if Pillow or the font is unavailable
Dependencies
- Added
Pillow(Python image library) - Added
fonts-dejavu-coreto the Docker image
Upgrade
docker pull ghcr.io/mrkaqz/queue:2.5.4or in docker-compose.yml:
image: ghcr.io/mrkaqz/queue:2.5.4v2.5.3 — Large ticket size option
What's new
🖨 Large ticket size
New Ticket Size setting in Settings → Ticket Printer:
| Size | Queue number | ESC/POS command |
|---|---|---|
| Normal (default) | Double-width + double-height | ESC ! 0x30 |
| Large | 6× width × 6× height | GS ! 0x55 |
Large mode makes the queue number dramatically bigger — easy to read across a waiting room. Everything else (shop name, "Queue No.", date) stays the same compact size.
Upgrade
docker pull ghcr.io/mrkaqz/queue:2.5.3or in docker-compose.yml:
image: ghcr.io/mrkaqz/queue:2.5.3v2.5.2 — Printer spacing & timezone fixes
What changed
🖨 Ticket spacing
Added 3 extra line feeds before the partial-cut command (GS V 01) so the cutter clears the last printed line. Tickets are now cleanly separated instead of cutting mid-content.
🕐 Correct local time on ticket
The date/time printed on each ticket now uses the UTC offset configured in Settings → Timezone (same offset as the admin page timestamps). Previously the Docker container's UTC clock was used directly, showing the wrong time.
Upgrade
docker pull ghcr.io/mrkaqz/queue:2.5.2or in docker-compose.yml:
image: ghcr.io/mrkaqz/queue:2.5.2v2.5.1 — Fix Xprinter Thai character garbling
Bug fix
ESC/POS ASCII-only ticket header
The Thai shop name was printing as garbled characters because ESC/POS thermal printers only support ASCII/Latin character sets — they cannot render multi-byte UTF-8 Thai text.
Changes:
- Ticket header now encodes as ASCII (
errors='replace'), so any non-ASCII character safely prints as?instead of garbage bytes - New Ticket Header (English/ASCII only) field in Settings → Ticket Printer — enter your clinic/shop name in English (e.g.
Saimoon Pet Clinic). If left empty, falls back to the main Shop Name with non-ASCII characters replaced - The fix applies to both auto-print on Add Queue and the manual 🖨 Print Ticket button
Action required: Go to Settings → Ticket Printer and fill in the Ticket Header field with your shop name in English, then click Save Settings.
Docker
docker pull ghcr.io/mrkaqz/queue:2.5.1v2.5.0 — Xprinter Ticket Printing
What's new
Xprinter Ticket Printing
Print queue tickets directly from the queue server to your Xprinter over ESC/POS TCP — the same protocol as the physical ESP32 button device.
Admin page
- New 🖨 Print Ticket button next to + Add Queue — always visible; prints the last queue number on demand
Settings page — Ticket Printer (Xprinter) card
- Printer IP Address — enter the LAN IP of your Xprinter (port 9100)
- Auto-print on Add Queue — when enabled, a ticket is printed automatically every time a queue number is added from the admin page
- 🖨 Test Print button — verify printer connection without adding a real queue entry
Notes
- Paper auto-cuts after every ticket (
GS V 01partial cut) - Cash drawer is NOT triggered — no
ESC pcommand is sent; the drawer only opens from Loyverse POS as before - Printer unreachable → connection times out silently in background (5 s), queue operation unaffected
- Compatible with all Xprinter models that support ESC/POS over TCP (port 9100)
Docker
docker pull ghcr.io/mrkaqz/queue:2.5.0image: ghcr.io/mrkaqz/queue:2.5.0v2.4.2 — Wait Time Column · Facebook Advance Notification
What's new
⏱ Wait Time column in Admin
The queue list now shows how long each patient waited between receiving their ticket and being called, displayed as Xm Ys. Entries not yet called show —.
🔔 Facebook Messenger advance notification
When a queue number is called, the subscriber of the next queue number now receives an early heads-up:
⏰ อีก 1 คิว! / 1 queue away — please make your way to the clinic now.
Their subscription is kept so they still receive the normal "your number is being served" notification when their own turn comes.
Docker
docker pull ghcr.io/mrkaqz/queue:2.4.2v2.4.1 — Resume Held Queue · Auto-Advance Pause · DB Backup/Restore
What's new
▶ Resume Held Patients
Each held entry in the Admin queue list now shows a ▶ Resume button. Staff can bring any held patient back to serving in any order — no need to call next and skip them.
- Multiple patients can be on hold simultaneously; each gets its own Resume button
- Resuming re-announces the number via voice and updates the TV display
- Fix: Reset now correctly clears held entries (previously they were orphaned across sessions)
⏸ Pause / Resume Auto-Advance (Admin page)
A new ⏸ Pause Auto-Advance button in the Admin action bar lets staff temporarily stop Loyverse auto-advance without navigating to Settings.
- Turns yellow with ▶ Resume Auto-Advance text when paused
- State syncs live across all open Admin tabs via WebSocket
- Useful when a patient steps out (on hold) and you don't want sales to keep advancing the queue
⬇/⬆ Database Backup & Restore (Settings page)
A new Database card in Settings makes machine migration easy.
- Download Backup — exports a consistent snapshot of
queue.db(safe while the app is running); filename includes today's date (e.g.queue_backup_2026-03-21.db) - Restore from Backup — upload a previously exported
.dbfile; validates it's a real SQLite database, atomically replaces the current DB, then reloads the page - Preserves all settings, queue history, push subscriptions, and Messenger subscriptions
Docker
docker pull ghcr.io/mrkaqz/queue:2.4.1image: ghcr.io/mrkaqz/queue:2.4.1v2.4.0 — Loyverse POS Integration
What's new
Loyverse POS Integration
Completing a sale in Loyverse POS now automatically advances the queue — no manual Call Next needed.
Smart mode (default):
- Queue has waiting patients → calls the next one
- Queue is empty → auto-issues a new number and calls it immediately (walk-in support)
Call-next-only mode: advances only when patients are already waiting; does nothing if the queue is empty.
The endpoint is secured with HMAC-SHA256 signature verification (X-Loyverse-Webhook-Signature).
Settings page
A new Loyverse POS Integration card in Settings lets you:
- Paste your webhook secret
- Enable/disable the integration
- Choose Smart or Call-next-only behaviour
- Copy the webhook URL to paste into the Loyverse dashboard
Setup (Loyverse dashboard)
- Settings → Loyverse POS Integration → copy the Webhook URL
- Loyverse dashboard → Webhooks → Add webhook → paste URL, select Receipt created
- Copy the generated secret → paste into Settings → Webhook Secret
- Set toggle to Enabled → Save Settings
Docker
docker pull ghcr.io/mrkaqz/queue:2.4.0image: ghcr.io/mrkaqz/queue:2.4.0v2.3.2
Bug fixes
TV sound badge hidden on Admin-only audio
When Announcement Sound Output is set to "Admin only", the TV page no longer shows the "Tap to enable sound" badge — since audio never plays on the TV in that mode, the badge was misleading and cluttered the display.
Also fixed: the badge now reacts instantly when the setting is changed from the Settings page — no TV page reload required. Switching back to "TV only" or "Admin + TV" will correctly re-show the badge if browser autoplay is still blocked.
Docker
docker pull ghcr.io/mrkaqz/queue:2.3.2Or pin in docker-compose.yml:
image: ghcr.io/mrkaqz/queue:2.3.2v2.3.1
Bug fixes & polish
TV sound badge auto-hide
The "Tap to enable sound" banner on the TV page now automatically disappears after 15 minutes if nobody taps it.
Previously the badge would stay on screen indefinitely when autoplay was blocked by the browser — cluttering the display overnight or whenever the TV was left running unattended after setup. Now it quietly fades away on its own.
Tapping the badge still works exactly as before and cancels the timer immediately.
Admin footer version
Fixed the admin page footer still showing v2.3.0.
Docker
docker pull ghcr.io/mrkaqz/queue:2.3.1Or pin in docker-compose.yml:
image: ghcr.io/mrkaqz/queue:2.3.1