Browser-based thermal ticket printing for Cursor events.
Event tickets, photo wall, Luma badges, Cursor Credits, and live preview. No desktop app required.
Live app · Documentation · GitHub
Cursor POS is a web app to print 58 mm thermal tickets directly from Chrome or Edge using Web Serial. Built for meetups, check-in desks, credit handouts, and event photo walls.
Printing runs in the browser on each machine. The Vercel deployment serves the UI; your printer connects locally via Bluetooth Serial.
| Mode | Use case |
|---|---|
| Event ticket | Custom receipts with QR, WiFi, name, and toggleable sections |
| Photo ticket | Camera capture or upload for a post-event photo wall |
| Luma check-in | Scan guest QRs, confirm, and print badges |
| Cursor Credits | Print claim-link tickets from a CSV queue |
- Cursor logo, custom QR, business name, event type, action label
- Attendee name and optional extra line
- WiFi network and password block
- Section toggles — show/hide logo, QR, event type, action, name, extra, WiFi, timestamp
- Live preview updates as you edit
- Save default field values in the browser
- Capture from camera or upload an image
- 3, 2, 1 countdown before capture
- Review, retake, drag-to-frame, and confirm before printing
- Switch between front/back cameras when available
- Name, extra line, timestamp, and Cursor logo on the ticket
- Scan guest QR codes from the device camera
- Confirm before print — beep on scan, review guest, then print or discard
- Load guest details from Luma via API (server proxy or browser key)
- Configurable badge QR — use Event ticket QR content or the guest's Luma check-in URL
- Toggle logo, QR, action, ticket type, and timestamp on the badge
- Live session log with reprint
- Does not mark check-in in Luma — the public API no longer supports it; use Luma's official scanner for attendance
- Upload a CSV with claim links (
name,urlcolumns suggested) - Each row = one ticket; the QR is the claim URL
- Print next advances the queue automatically
- Reset or clear the queue; progress persists in localStorage
- Sample file:
examples/cursor-credits-test.csv
- Four ticket modes with large live preview (58 mm and 80 mm paper)
- Direct print over Web Serial (ESC/POS)
- Download raw ESC/POS file as backup
- English and Spanish UI, light/dark theme
- Full setup guide at /docs
Tested with GOOJPRT PT-210 (portable, Bluetooth, 58 mm thermal paper).
| Spec | Detail |
|---|---|
| Model | GOOJPRT PT-210 |
| Paper | 58 mm thermal |
| Connection | Bluetooth (virtual COM / Serial) |
| Protocol | ESC/POS |
| Recommended baud | 9600 |
It should also work with other 58 mm Bluetooth thermal printers that expose a Serial (COM) port and support ESC/POS.
- Pair the printer via Bluetooth in your OS settings.
- Open cursor-pos.vercel.app in Chrome or Edge (HTTPS required).
- Click Connect Serial and select the paired printer port.
- Set baud rate to 9600.
- Pick a ticket mode, fill in fields, and print.
See the full guide: cursor-pos.vercel.app/docs
name,url
Ana Garcia,https://cursor.com/redeem/example-001
Carlos Mora,https://cursor.com/redeem/example-002The parser also accepts columns named link, claim, label, email, or guest, and ; as separator.
- Browser: Chrome or Edge (Web Serial)
- HTTPS or
localhost(required for camera and printer APIs) - Printer: 58 mm thermal (80 mm optional in settings)
- Windows: use Serial over Bluetooth; WebUSB is blocked by drivers on most setups
git clone https://github.com/cursorcommunityled/cursor-pos.git
cd cursor-pos
npm install
npm run devOpen http://localhost:3001.
There are two ways to use Luma check-in:
- Open the Luma check-in tab
- Paste your calendar API key from luma.com/calendar/manage/api-keys
- The key is stored in sessionStorage only (this tab). It is not saved on the Vercel server
- Each API call sends the key in a request header; the server forwards it to Luma and does not persist it
Security note: on a shared deployment, your key still transits through that server on each request. For maximum security, use Option B.
- Fork github.com/cursorcommunityled/cursor-pos
- Deploy to your Vercel account
- Set
LUMA_API_KEYin Project Settings → Environment Variables - Use your own URL. The key stays on your server only; staff never paste keys in the browser
Requires Luma Plus. Event ticket, photo, and Cursor Credits work without any Luma configuration.
Note: Port
3000is often used by other local apps. This project uses 3001 by default.
| Command | Description |
|---|---|
npm run dev |
Start dev server |
npm run build |
Production build |
npm run start |
Run production server |
npm run lint |
ESLint |
- Next.js 16 (App Router)
- React 19
- @point-of-sale/receipt-printer-encoder for ESC/POS
- Web Serial for browser printing
- Tailwind CSS 4
- Deployed on Vercel
src/
app/ Next.js routes (/, /docs, API)
components/ UI (PosApp, LumaCheckin, CursorCredits, previews)
hooks/ Browser printer hook
lib/ Receipt builders, Luma client, credits CSV, i18n
examples/
cursor-credits-test.csv Sample CSV for Cursor Credits mode
public/
CUBE_2D_LIGHT.svg Official Cursor logo asset
Or connect your fork to Vercel. No server-side printer access is needed for the main workflow.
Found a bug or have an idea? Open an issue or try the app at your next event and share feedback.
Built by cbiux for Cursor community events.
Pura Vida