Engineering at Glanz CRM
How the platform is built, secured, tested and operated. Every claim on this page is backed by an automated check that runs on every release.
Technology stack
- Application
- Next.js 15 App Router, React 19, TypeScript
- Database
- Supabase PostgreSQL with 28 migrations and 82 RLS policies
- Authentication
- Supabase Auth with server-side sessions and HttpOnly cookies
- Tenancy
- Row-level security per organisation, enforced in the database
- Interface
- Tailwind CSS, custom engine with full Thai and English parity
- Documents
- PDF generation for invoices, quotations, appraisals and memos
- Resend transactional mail plus a per-user mailbox
- Hosting
- Hostinger Node.js web app behind the LiteSpeed edge
Quality gates
Every pull request passes all of these before it can ship.
- Unit tests59 automated tests run by the Node.js test runner
- HTTP smoke tests13 checks per release across every public page
- SEO audit300+ checks covering metadata, structured data and crawl files
- Accessibility auditStatic checks plus a headless-browser sweep with zero violations
- Performance audit42 checks covering response time, payloads and caching
- Translation auditEvery interface string and every release note must have a Thai counterpart
Security posture
Database-level isolation
Every tenant table is protected by row-level security, so data cannot leak between organisations.
Enforcing content policy
A strict content security policy, HSTS, frame denial and referrer policy are set on every response.
Role-based access
Admin, Manager, Sales and Viewer roles are checked server-side, with plan entitlements resolved centrally.
Abuse protection
Public forms are rate limited per address and per network, validated, and protected with hidden fields.
Accountability
Every user action is recorded with the user, the action, the IP address and the session.
Full details are published on the security page.
Delivery pipeline
- 01Install dependencies and cache them
- 02Lint the whole codebase, zero errors allowed
- 03Type-check every TypeScript file
- 04Run the unit test suite
- 05Verify Thai and English translation coverage
- 06Build the production application
- 07Start the production server and run the smoke suite
- 08Run SEO, accessibility and performance audits against it
Product lifecycle
Customers should never have to guess where they stand. Trial, paid and cancelled states are decided by the server, never by a value cached in the browser.
Trial you can trust
Trial start and expiry are decided by the server. The browser cache is only an offline fallback, so changing device or clock cannot extend a trial.
Nothing is lost on expiry
When a trial ends the account becomes read-only rather than deleted. Data is kept so an upgrade restores everything exactly as it was.
Automated trial lifecycle
Scheduled jobs process expiries and send trial-ending, expiry and win-back email, de-duplicated so a customer is never emailed twice for the same event.
Cancellation you control
Cancel from settings, keep access until the period ends, and receive a confirmation describing exactly what happens and when.
A published deprecation policy
Anything removed or changed incompatibly is announced at least 30 days ahead in the product changelog before it happens.
Release discipline
Every version we ship is dated, documented and reversible. If a release causes harm, it can be switched off without waiting for the next deploy.
Semantic versions
Major for breaking changes, minor for features, patch for fixes. Versions are never reused or renumbered.
A public changelog
Every release is dated and described on a public changelog, with an RSS feed for customers who want to follow along.
Bilingual release notes
Notes ship in Thai and English together, and a missing Thai string fails the build rather than shipping half a translation.
Kill switches, not hotfix panic
Every optional surface sits behind a feature flag with a documented owner and default, so a bad release is switched off by configuration rather than by an emergency patch.
Automatic quality gates
A release that fails lint, types, tests, translation coverage or any audit cannot be promoted, because the pipeline fails first.
Read every release note at /changelog
Operations and reliability
Health endpoint
A public endpoint reports application and database status in real time.
Uptime monitoring
The health endpoint is polled every minute with alerting on sustained failure.
Backups
Daily point-in-time database backups with documented retention.
Rollback
Every release keeps the previous build ready for one-step restoration.
Incident runbook
A documented first-response path from health check to mitigation.
Error reporting
Client errors are reported to a rate-limited ingest endpoint, stripped of user data, and written to the application log so a failure leaves evidence behind.
Accessibility
- Conforms to WCAG 2.1 Level AA across the whole public site
- Keyboard bypass link as the first focusable element on every page
- Visible focus indicators and full reduced-motion support
- Every form control programmatically labelled
- Verified with an automated audit on every release
Questions about our engineering?
We are happy to walk through the architecture, the security model or a technical evaluation for your team.
Talk to us