Easy Access QR is an organization-first QR code platform for creating branded QR codes, routing traffic with weighted destinations, and tracking view analytics.
- Organization-scoped QR code management
- Dynamic short links (
/r/:organizationSlug/:qrSlug) with scan/view tracking - Weighted destination routing (A/B and multi-destination splits)
- QR design studio (styles, colors, logo support, export to PNG/SVG/JPEG)
- iPhone-safe QR constraints enforced in the builder
- Public QR pages for shareable, non-auth QR previews
- Analytics dashboards:
- Total views, views today, active codes
- Daily trend charts
- Top codes and destination hit breakdowns
- Onboarding flow for new organizations
- People management and billing settings
API keysis intentionally disabled in the app UI for now./app/settings/api-keysredirects to/app/settings- API key screens can be re-enabled later
- TanStack Start + TanStack Router
- tRPC
- Drizzle ORM + PostgreSQL
- Better Auth
- Tailwind CSS + Radix UI primitives
- Bun runtime + toolchain
qr_codeorganizationId,createdByUserIdname,slug,destinationUrldestinations(weighted routing rules)isActive,isPublicscanCount,lastScannedAt, timestamps
qr_scan_eventqrCodeId,organizationId,scannedAt- destination attribution (
selectedDestinationId,selectedDestinationUrl) - request metadata (
referrer,userAgent,ipHash,country,city,deviceType)
- Install dependencies
bun install- Create env file
cp .env.example .env.local- Set required environment values in
.env.local
DATABASE_URL(for this app, typically.../easyaccessqr)BETTER_AUTH_URLBETTER_AUTH_SECRET(32+ chars recommended)
- Prepare the database
bun run db:push- Seed development data (resets all public tables first)
bun run db:seedDefault seed users:
owner@easyaccessqr.comanalyst@easyaccessqr.com- Password:
EasyAccessQR!123(override withSEED_PASSWORD)
- Start the app
bun run devbun run dev- start local dev serverbun run build- production buildbun run start- run built server outputbun run lint- Biome lint checksbun run typecheck- TypeScript type checkbun run test/bun run test:unit- Vitest suitebun run test:e2e- Playwright suitebun run db:generate- generate Drizzle migrationsbun run db:migrate- apply migrationsbun run db:push- push schema to databasebun run db:seed- reset and seed development data
- Hitting a short link (
/r/:org/:slug) records a view and redirects to the selected destination. - If a code is paused, a styled status page is shown.
- If a code is public,
?view=1renders a public QR preview page without auth.
The QR toolkit is available from workspace navigation at /app/toolkit.
- Wi-Fi QR codes — personal network credentials, hidden networks, and open networks.
- Contact QR codes — vCard 4.0 with name, company, phone, email, and website.
- Email QR codes — recipient, subject, and prefilled message.
- SMS QR codes — international number and prefilled message.
- Phone QR codes — dialer links using international numbers.
- Map QR codes — validated latitude and longitude, including zero coordinates.
- Text QR codes — multiline and Unicode content.
- WhatsApp QR codes — click-to-chat links with prefilled messages.
- Campaign URL builder — source, medium, campaign, term, and content parameters.
- Tracking cleanup — remove UTM and common advertising identifiers while retaining other query parameters and anchors.
- Printable QR cards — custom heading and caption, with PNG/SVG downloads and a print layout.
- Bulk pause — stop redirects for selected codes in one operation.
- Bulk resume — reactivate codes with atomic plan-limit checks.
- Bulk visibility — enable or disable public preview pages.
- Bulk tagging — add or remove a tag, respecting the 12-tag limit.
- Bulk link copying — copy selected tracked URLs, one per line.
- Visibility filtering — find codes with public pages enabled or disabled.
- Routing filtering — distinguish single destinations from weighted routing.
- Scan-activity filtering — find codes that have never been scanned or already have scans.
- Library pagination — 10, 25, or 50 codes per page with selection across pages.
Toolkit codes embed their content directly: they are not stored as managed codes, are not editable after printing, and do not produce scan analytics. Network passwords are included in Wi-Fi codes; share the resulting card appropriately. Scanner support for contact and action formats depends on the scanning device. Payload conventions follow ZXing's barcode content documentation and vCard 4.0 (RFC 6350).
Batch writes affect at most 100 selected codes in the current organization. A missing or unauthorized code, tag overflow, or activation-limit failure rolls back the whole batch. Changing filters clears selection. Individual and batch activation writes share an organization lock to protect plan limits under concurrent requests. This release requires no database schema migration.
