Skip to main content

Changelog

All notable changes to Thermal Print Studio. Releases are tagged CalVer vYYYY.MM.N.

[Unreleased]

Fixed

  • Deployed public site no longer ships un-prerendered: the Netlify site's stored build command (bolt template default vite build) skipped scripts/prerender.mjs, so production served the empty shell at / and 404s for every public route, sitemap.xml and template previews, while npm run dev looked fine (DEV-only client renderer). A repo-side netlify.toml now pins command = "npm run build" and publish = "dist", overriding the dashboard settings, so every deploy includes the prerendered pages, branded 404.html, sitemap and preview SVGs.
  • Bluetooth printer discovery now includes the VyaparaBandhu ISSC service UUID (49535343-fe7d-…), so printers that pair in the POS are discoverable in the studio. HM-10 (FFE0) kept as an extra.
  • Auth page hero image is self-hosted (no more third-party request on first paint).

Changed

  • Fonts are self-hosted woff2 (public/fonts/); the Google Fonts CDN is gone.
  • Theme preference now uses the shared vite-ui-theme key (legacy tps-theme is migrated once on load).
  • Package renamed to thermal-print-studio; default bolt OG/Twitter images replaced with a studio OG image.
  • Signup copy: "Create a free account to sync your designs".

Added

  • Direct raster encoders for TSPL/TSPL2, ZPL, CPCL, documented StarPRNT devices and legacy ESC/POS bit-image; printer profiles now carry continuous/gap/black-mark media settings through the local and account backends. Additive migration 20261019000000_c3_label_languages.sql widens the profile language constraint and adds validated media JSON. Dialects are software-tested, not hardware-verified. Older Star Line/TSP143 is not covered by the StarPRNT encoder; unsupported speed/ribbon settings are explicitly reported. Existing ESC/POS raster/text output and DPI conversion stay unchanged.
  • Driverless compatibility foundations: evidence-tagged printer catalog and conservative IEEE-1284 identity parsing, Bluetooth Classic SPP transport support through Web Serial on supported browsers, bounded optional status reads, and lab checklists for identity, label media, transport resilience and network go/no-go testing. These are software capabilities, not hardware-verification claims; POS BLE defaults remain unchanged.
  • Barcode quality advisories for whole-dot EAN/UPC magnification, bar height and neighbouring content in quiet zones. Existing barcode output is unchanged. GS1 AI validation, Digital Link construction and ITF-14 data/encoding helpers are available as software foundations; unsupported 2D formats and hardware scan certification are not claimed.
  • Code 128 now selects A/B/C code sets for mixed ASCII data, with existing plain-text/even-digit regression fixtures preserved. A software-tested GS1-128 encoder validates AI data, places FNC1 separators and enforces symbol length; editor selection and hardware scan verification remain separate work.
  • Global readiness (Phase 5): settings for locale/currency/tax label/display unit (existing accounts stay IN/en-IN/INR/GST/mm; new guests default from the onboarding country or timezone); Intl-based money and date formatting for every other locale while Indian output stays byte-identical; template variables for the currency symbol, tax and tax label (currency_symbol, tax, tax_label, plus a tax_id alias for the shop's GSTIN/VAT number); inch roll presets (2¼″, 3⅛″) and die-cut label presets (4×6″…2×1″) with a mm/in toggle for rulers and the Paper panel; a template region facet that orders the gallery by your region without hiding the other, a renamed "Works with VyaparaBandhu" category and 7 new global templates (retail receipt, VAT receipt, price tag, 2.25×1.25″ product label, event badge with QR, food prep & allergen label, return/RMA label) with neutral sample data; a generic payment-link QR element for any https:// URL (UPI unchanged); honest copy that dedicated label printers (Zebra/ZPL, TSC/TSPL, Rollo, Munbyn) print via their system driver in this version; and an untested-script warning when text contains RTL, CJK or Thai.
  • VyaparaBandhu handoff (Phase 3): #/handoff?v=1&kind=receipt|labels&data=<base64url(JSON)> — POS bills and product lists land in the studio with the payload scrubbed from the URL immediately, validated (32 KB cap, field allowlists, control-char stripping, money normalisation), previewed canvas-only and printed on explicit action only (never auto-print, no autosave). Receipts map onto gst-bill-80/gst-bill-58 with the pinned two-line item layout and UPI QR only for a valid VPA; labels feed the bulk print flow with the VyaparaBandhu preset pre-applied. A valid handoff (or a successful paste-a-receipt) marks the device as a VB user locally. Contract documented in docs/POS_INTEGRATION.md; manual acceptance checks in docs/MANUAL_TESTING.md §8.
  • Public front door + SEO (Phase 4): / is a prerendered static site (landing, /templates + 22 template pages with build-time SVG previews, /guides + 7 how-tos, /for-shops, /about, /privacy, /terms, /accessibility, /changelog, a real 404) with canonical/OG/Twitter tags, JSON-LD (WebApplication, WebSite, BreadcrumbList, HowTo), robots.txt + sitemap.xml; the studio remains the hash-routed SPA at /app/ (old /#/… links forwarded; /app/ is noindex). public/_headers ships a CSP (Report-Only for the rollout week, pinned by a hash test) plus security headers and immutable asset caching; public/_redirects maps /app/* to the SPA and everything else to the 404. Public pages ship ~2 KB gz of JS.
  • XLSX spreadsheet import: the bulk data dialog accepts .xlsx alongside CSV through a minimal read-only reader (ZIP + DecompressionStream inflate + a DOCTYPE-rejecting XML tokenizer) with the same 2 MB / 2,000-row / 100-column limits and error surfaces; values stay text so leading zeros in SKUs and barcodes survive. No new dependencies.
  • VyaparaBandhu discovery funnel (Phase 6): opt-in promo surfaces (footer/settings/templates, post-print after the first completed receipt print, bulk import for Indian shops) with frequency caps (1/session, 60-day dismiss, VITE_PROMOS_ENABLED kill switch) and a region gate (settings country, else timezone/language guess); waitlist form for the VB beta (Turnstile for guests, JWT for accounts) backed by the vb_waitlist table (RLS on, no policies), vb_waitlist_by_country view and an idempotent, rate-limited waitlist-join Edge Function; opt-in "Made with print.salesforceapp.tech" credit on receipt outputs (never on labels; PDF Creator/Producer metadata always on); existing VB users get connect tips instead of acquisition copy.
  • Guest mode (Phase 2): the studio opens without an account — designs, settings, printer profiles, presets and history live in the browser (IndexedDB). "Sync across devices" opens the optional sign-in; signing up offers to bring guest designs along. First-run onboarding (what you print + country), JSON export/import, iOS storage-eviction warning with persist/estimate, forgot-password (PKCE), account deletion and data export, Terms acceptance at signup.
  • Observability (Phase 1): PostHog facade with cookieless guest mode and identified account mode, an explicit event allowlist, and a before_send scrub that strips query/fragment from URLs (handoff payloads never leave the device). Better Stack browser-direct error logging with redaction (ids, counts, enums and statuses only), batching and rate limits. React error boundary. Settings → Privacy opt-out (device-local; the SDK never loads when off). Both no-op without env keys.
  • UmbrellaFooter with sibling products, floating theme toggle, and a skip-to-content link (BRANDING §4.1–4.3).
  • PWA manifest and icons (service worker deferred).
  • npm run verify gate, AGENTS.md/CLAUDE.md, .env.example, docs/DEPLOY.md, repo copy of BRANDING.md.