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) skippedscripts/prerender.mjs, so production served the empty shell at/and 404s for every public route,sitemap.xmland template previews, whilenpm run devlooked fine (DEV-only client renderer). A repo-sidenetlify.tomlnow pinscommand = "npm run build"andpublish = "dist", overriding the dashboard settings, so every deploy includes the prerendered pages, branded404.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-themekey (legacytps-themeis 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.sqlwidens 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 atax_idalias 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 anyhttps://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 ontogst-bill-80/gst-bill-58with 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 indocs/POS_INTEGRATION.md; manual acceptance checks indocs/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/_headersships a CSP (Report-Only for the rollout week, pinned by a hash test) plus security headers and immutable asset caching;public/_redirectsmaps/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
.xlsxalongside CSV through a minimal read-only reader (ZIP +DecompressionStreaminflate + 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_ENABLEDkill 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 thevb_waitlisttable (RLS on, no policies),vb_waitlist_by_countryview and an idempotent, rate-limitedwaitlist-joinEdge 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_sendscrub 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 verifygate,AGENTS.md/CLAUDE.md,.env.example,docs/DEPLOY.md, repo copy ofBRANDING.md.