Chiang Mai flagship instance of the white-label "marketplace in a box" kit. Workers list services; employers post needs; both negotiate in-app and generate a bilingual TH/EN written agreement. See the product spec for the full picture.
npm install
npm run dev # http://localhost:3000
npm run build # production build (Netlify adapter)
npx tsc --noEmit # type-check- Stack: TanStack Start + Tailwind v4 + Sigil design system (Base-UI
primitives, CVA variants — components in
src/components/ui/, cloned from the proven spec-hud set; extend sizes there for touch targets). - White-label seam: tenant.config.ts re-exports the
active tenant from
src/tenant/tenants/— one tenant per deploy, zero code edits to redeploy. Schema in src/tenant/types.ts; Chiang Mai pack (districts, services, languages, plans, legal notice pack) in src/tenant/tenants/chiang-mai.ts. - Theme: Sigil token registration in src/styles.css
(teak & marigold on warm near-black, dark-first). Tenant
colorTokenscan override any CSS custom property at runtime. Print pages flip to ink-on-paper via@media print— the agreement "PDF" is browser print-to-PDF (perfect Thai shaping, zero JS weight). - i18n: fully externalized string packs — src/i18n/en.ts
is the key schema, src/i18n/th.ts must satisfy every key
(compile-enforced). Provider in src/i18n/index.tsx:
t()messages,tl()tenant labels, Thai-numeral toggle, worker-default locale = tenantlocalePair[0]. Both packs are complete for all V1 screens. - Font: Noto Sans Thai Looped (variable) — looped Thai for readability.
docs/LEGAL_RESEARCH.md — web-verified 2026-07-13.
Headlines: Ministerial Regulation No. 15 (B.E. 2567) replaced MR14 in
April 2024 — minimum wage NOW applies to domestic workers (Chiang Mai:
380 ฿/day Mueang district, 357 ฿/day elsewhere; rates of 1 Jul 2025), 8 h/day
cap, 98-day maternity leave (45 paid), 3 days business leave. Severance and
statutory OT rates still do NOT apply. Agency-licensing read: pure listings
board with employer software subscription is defensibly outside the
Employment Arrangement Act, but get a DOE opinion before commercial
launch; no matching/placement features, ever charge workers nothing.
Tenant legal notices in chiang-mai.ts already reflect MR15.
Milestone 1 (scaffold, tenant config, theme, i18n, shell + landing) is done,
type-clean, and verified in the browser in both languages. Routes /workers
and /posts are titled empty states awaiting the data layer.
Next milestones (per spec, in order):
2. Data layer — domain types per spec data model, DataStore interface,
LocalStore (localStorage + seeded CM demo data), SupabaseStore gated on
VITE_SUPABASE_URL/VITE_SUPABASE_ANON_KEY; auth (demo local; magic
link + LINE via Supabase). Supabase migration SQL + RLS in supabase/.
3. Worker onboarding wizard (<3 min on a phone) + worker profiles.
4. Employer posts + browse/filter both directions (no algorithmic matching).
5. Messaging + bilingual canned templates (both languages rendered at once);
first-thread-free grace, subscription gate (manual PromptPay activation).
6. Agreement wizard → side-by-side TH|EN print view, CE+BE dates — clause
minimums from docs/LEGAL_RESEARCH.md §6.
7. Reviews (gated: agreement or ≥10 messages) + admin seeding tools
(bulk-add with claim-via-LINE, QR flyer print page).
8. Kit packaging: docs, translation-sheet template, deploy:tenant script.
Records, prose and pages: CC BY 4.0. Code: MIT. Attribution is the only condition — name the work and link back. Anything carried in from elsewhere keeps its own terms — see LICENSE and NOTICE.txt.
Using it. Attribution is the whole of the condition — copy it, adapt it, sell it, index it, train on it, and say where it came from. Open an issue if something is missing.
Contact: Nan · nan@motdang.net · Sponsor: Ko-fi · Patreon