Changelog

What's shipped

Every release, in reverse chronological order. Built in public.

May 2026
v0.12

Marketing contact flow & WhatsApp CTA

The marketing site now gives prospects a direct path to contact you instead of nudging them into sign-in first.

Added
  • Public contact page — new /contact page with a structured email enquiry form for demos, onboarding, pricing, and sales conversations.
  • Floating WhatsApp bubble — marketing pages and the homepage now show a WhatsApp chat bubble that opens a conversation with a prefilled “Hi, I want to enquire about MaidCopilot.” message.
Improved
  • Primary marketing CTA — the black button now says Contact us and routes to the contact page instead of a generic auth CTA.
  • Contact page layout — the left side is now an email form while the right side keeps a simple WhatsApp quick-contact card, so visitors can choose either path without duplicated email actions.
  • Marketing footer — footer nav now includes a direct Contact link so visitors can get back to your contact details from any marketing page.
May 2026
v0.11

Meta compliance: 24-hour window, opt-out & template hygiene

Aligns the inbox and API with WhatsApp's customer service window and opt-out expectations ahead of Tech Provider / App Review — plus template tooling and sync fixes coordinators asked for.

Added
  • 24-hour window enforcement — inbound messages set last_customer_message_at on the conversation. Free-text compose is disabled when the window is closed or the contact has never replied; an amber banner directs coordinators to send an approved template instead.
  • Opt-out guard — contacts tagged opt-out cannot receive free-text or template messages; the API returns a clear error.
  • Contact erasure APIDELETE /api/contacts/{id} soft-deletes the contact and archives their conversations (audit-logged; data retained per statutory retention).
  • New template page/settings/templates/new with per-{{n}} variable samples, WhatsApp-style preview, and submit to Meta (fixes INVALID_FORMAT rejections).
Improved
  • Sync from Meta — templates deleted in WhatsApp Manager are soft-deleted locally; Settings reports how many were removed.
  • Dev connect UI — manual token card only appears when both dev feature flags are enabled (cleaner for App Review recordings).
  • Dashboard typography — unified sans inside the app shell; marketing site unchanged.
Fixed
  • Unread badge — opening a thread or sending a message clears unread_count in the sidebar.
  • Stale templates — rejected or deleted Meta templates no longer linger after sync.
  • Realtime 24-hour window reopen — when a contact replies, the open thread now updates last_customer_message_at immediately so free-text compose re-enables without a page refresh.
  • Duplicate send guard — rapid double-clicks on Send are ignored while the first request is in flight, preventing accidental duplicate WhatsApp messages.
May 2026
v0.10

Inbox polish: contact panel toggle & template messages

Smaller UX fixes so the inbox behaves like WhatsApp: one message per send, and the header control does what coordinators expect.

Improved
  • ⋮ toggles contact panel — the three-dot button in the thread header shows or hides the right-hand contact column (no longer opens a WhatsApp dropdown). View on WhatsApp and conversation status (Open / Waiting / Resolved) live in the panel.
  • Template composer layout — fill variables and preview sit side by side on desktop so you can see the final message while typing.
  • Template bubbles match WhatsApp — sent templates store the rendered body in content_text and display as a single message (no duplicate “Template · name” + body). What you see in MaidCopilot is what the contact receives.
Fixed
  • Double template bubbles — removed the extra optimistic preview that appeared alongside the database row when sending a template.
May 2026
v0.9

Inbox workspace & templates from the thread

Coordinators get a proper chat workspace: list and thread side by side on desktop, search the inbox, edit contact details without leaving the conversation, and send approved WhatsApp templates (with variables) when the 24-hour window is closed. Template approval status can update automatically from Meta.

Added
  • Two-column inbox — shared layout keeps the conversation list visible next to the open thread on desktop; on mobile the list hides while you read a thread (back arrow returns to the list).
  • Send template from inbox — compose-bar control opens a modal: pick an approved template, fill {{n}} placeholders with a live preview, send to the open contact. Works outside the 24-hour customer service window.
  • Contact panel — always-visible right column: edit display name and contact type, collapsible tags and notes sections, header menu for status (open / waiting / resolved).
  • Inbox search — filter conversations by contact name or WhatsApp number in the sidebar.
  • Settings → Templates redesign — create drafts with Meta-safe names, insert {{n}} variables into the body, save draft or submit to Meta, sync/import from WhatsApp Manager.
  • Template status webhooks — Meta message_template_status_update events update local approval status (and backfill meta_template_id) so rejected/approved templates reflect in Settings without clicking Sync.
Improved
  • Template sync matchingPOST /api/whatsapp/templates/sync-status updates by meta_template_id first, then by template name on the same WABA (covers rows submitted before the Meta ID was stored).
  • Variable prefill — when you pick a template in the inbox, {{1}} defaults to the contact's display name (or number).
  • 24-hour window errors — free-text send failures surface a clear banner suggesting an approved template instead of failing silently.
May 2026
v0.8

Inbox reliability & template sync from Meta

Smaller hardening pass: the inbox API now returns nested contact data in a shape the UI can parse, and template sync pulls the full template list from Meta so Manager-created templates show up in MaidCopilot without retyping them.

Fixed
  • Inbox list 500GET /api/inbox/conversations embedded only a subset of contacts columns; building a full ContactResponse failed validation. The query now selects agency_id, created_at, and last_message_at on the join, and tolerates PostgREST returning contacts as a single-element array.
  • Conversation detail payloadGET /api/inbox/conversations/{id} now returns the same conversation + nested contact object as the list endpoint instead of the raw Supabase contacts key.
Improved
  • Inbox layout — shared layout.tsx + ConversationSidebar so the thread list stays visible alongside the open conversation on desktop-sized viewports.
  • Template syncPOST /api/whatsapp/templates/sync-status walks every connected WABA (Graph message_templates, limit=250), updates local approval status, and imports templates that only exist in Meta. Paused templates map to disabled. Settings → Sync shows how many were imported vs updated (or “No changes”).
  • Imported template rows — Meta categories are normalised to lowercase utility / marketing / authentication so inserts satisfy the Postgres CHECK constraint; empty bodies fall back to a single space so body_text stays non-null.
May 2026
v0.7

WhatsApp Cloud API: finalize registration in-app

Embedded Signup links your number to MaidCopilot but Meta still expects an explicit Cloud API phone registration step. Owners can now finish that without leaving the product or pasting curl commands.

Added
  • Finalize setup (Settings → WhatsApp) — opens a modal to enter and re-enter the six-digit two-step verification PIN from the WhatsApp Business app. Both fields must be numeric; if they don't match, you get a clear “PIN does not match” message before anything is sent to Meta.
  • POST /api/whatsapp/accounts/{id}/register — owner-only; proxies to Meta POST /{phone-number-id}/register using the stored access token.
  • whatsapp_accounts.cloud_api_registered_at — new column (migration 0007_whatsapp_cloud_api_registered_at.sql) set on success; existing successful registrations are backfilled from the audit log where possible. The finalize row and button disappear after registration; repeat calls return a friendly error.
Improved
  • Facebook SDK diagnostics on the Settings page only log to the browser console when login status is something other than unknown, so a typical visit no longer spams [Facebook SDK] Ready….
May 2026
v0.6

Job order matching, extended maid profiles & PDF biodata import

Coordinators can now record an employer's full job order — preferences, budget, care needs, target start date — and pull up a ranked shortlist of available maids who fit, on a single click. Maid profiles got a major expansion with employment history, experience flags, food handling and physical attributes; and you can now import most of that directly from a biodata PDF instead of typing it in.

Added
  • Job order on employer profiles — nationality preference, model preference (new / ex-Singapore / ex-overseas / any), salary budget, off-days per month, care requirements (childcare, elderly, cooking), preferred age range, target start date, and a free-text section for the family setup.
  • Find Matches — one click on an employer record returns the available maids that fit the job order, sorted by salary then name. No more spreadsheet-style cross-referencing.
  • Extended maid profile — expected salary, model type, English level, experience flags (childcare, elderly, cooking), religion, food handling, height & weight, marital status, number of children, siblings rank, and birthplace. Optional throughout — fill in what you know.
  • Employment history — a row per past employer (employer type, country, period, housing, household size, duties, cook notes, wake/sleep times, reason for leaving). Add, edit, reorder, delete.
  • Import biodata PDF — drop a PDF onto a maid profile and we extract the name, date of birth, nationality, religion, height/weight, languages, model type, expected salary, experience flags, and food handling into the form. Scanned image PDFs trigger a clear notice asking you to enter the details manually.
  • WhatsApp account selector on templates — when drafting a new template, you now pick which connected WhatsApp Business account it belongs to. The form also warns you to connect an account first if none are linked.
Improved
  • List pages for cases and matches now show the employer and maid names inline, so you don't have to click into every row to see who is on it.
  • Detail pages no longer bounce you back to the list when a record fails to load — you stay on the page and get a “try again” button. Applied to employers, maids and cases.
  • Browser-tab favicon and link previews (when you share a MaidCopilot URL in WhatsApp, Slack or LinkedIn) now use the new circular brand mark.
Fixed
  • The inbox “Send” button silently failed when WhatsApp rejected the message — most often because the 24-hour customer service window had closed. It now surfaces the actual reason, and for the 24-hour case specifically suggests sending an approved template instead.
  • Drafting a new WhatsApp template silently rejected every submit because the form didn't let you pick which connected WhatsApp Business account it belonged to. Fixed by adding the selector and surfacing any further rejection from WhatsApp inline.
  • Several list pages used to show a blank screen when loading failed instead of an error message. They now display the error with a retry link.
May 2026
v0.5

Trust & Legal expansion: DPA, Subprocessors, Security

Three new public pages aimed at agency owners doing procurement due diligence and Data Protection Officers reviewing our handling practices. Plus a few homepage copy edits to soften compliance language we haven't formally been audited for.

Added
  • Data Processing Agreement (/legal/dpa) — 13-section DPA covering controller/processor roles, security measures, sub-processor management, international transfers, incident notification, and retention. Request a countersigned copy by email.
  • Subprocessors (/legal/subprocessors) — full list of third parties we engage (database, hosting, CDN, WhatsApp) with purpose, entity country, data location, and a 14-day prior-notice objection window for DPA customers.
  • Security (/security) — public overview of how we protect agency data: TLS in transit, AES-256 at rest, Row-Level Security at the database layer, HMAC webhook verification, immutable audit log, incident response timeline, vulnerability disclosure address.
  • All marketing and legal page footers now surface the three new pages under a single Trust & Legal column.
Improved
  • Homepage trust line: “PDPA compliant” → “PDPA-ready workflows”. Same spirit, accurate framing.
  • Biodata feature headline: “MOM-compliant in 5 minutes” → “Generate agency-ready biodata PDFs in 5 minutes”. Leads with the deliverable instead of a claim.
  • How-it-works step 02 description updated to match the headline (“versioned, agency-ready PDF”).
  • Dropped the ⌘K nav badge — no command palette ships yet, so the affordance was misleading.
  • In-app shell visual refresh. Dashboard, app header, and global utility classes (.btn-primary, .card, .input) now use the same Light Ink palette as the marketing site (paper, ink, accent, muted, line, panel, tint) instead of the old gray-* / blue-600 defaults. Tailwind config extended with the tokens and aliases for backwards compat. Header is now sticky with a tighter 14h height and a mono wordmark. Dashboard cards use uppercase mono captions and hover into the accent tint. Inter Tight + JetBrains Mono loaded globally.
  • WhatsApp dev-connect fallback for App Review testing. Settings → WhatsApp now exposes an opt-in “Connect with manual access token” form (collapsible, owner-only, dashed amber styling so it's impossible to confuse with the production path). It POSTs to a new backend endpoint POST /api/whatsapp/dev-connect which auto-resolves WABA ID + phone number from the token, then upserts a whatsapp_accounts row with connection_method: "dev_manual_token". Lets us verify whatsapp_business_management + whatsapp_business_messaging + business_management end-to-end against Meta's free Test Phone Number from API Setup, while App Review for Advanced Access is pending. Gated on both NEXT_PUBLIC_ENABLE_DEV_WHATSAPP_CONNECT (frontend) and ENABLE_DEV_WHATSAPP_CONNECT (backend) — both default to false and must be explicitly enabled. The Embedded Signup callback was refactored to share the same WABA-resolve + upsert helpers, so the dev path can't drift from production behaviour.
Fixed
  • Security page metadata description had an unescaped apostrophe (“agency's”) inside a single-quoted string — would have failed the Vercel build the same way the privacy page metadata did last week. Switched to double quotes.
  • The three new pages referenced /coreframes-logo.svg in their nav and footer, but that asset was removed two commits ago in favour of the designer's PNG. All six references swapped to /coreframes-logo.png.
  • Public-route allowlist didn't include /security, so signed-out visitors would have been bounced to /sign-in. Added.
  • Settings → WhatsApp → Connect threw “Expression is of type asyncfunction, not function” because Meta's Facebook JS SDK refuses async callbacks. Rewrote FB.login() with a plain sync callback that dispatches the API call inside an async IIFE.
May 2026
v0.4

Coreframes Lab brand, legal pages & marketing site polish

The product is still MaidCopilot — same workspace, same WhatsApp inbox, same audit trail. We are now operating under the Coreframes Lab brand (matching our domain, coreframeslab.com), and that brand is what now appears on the marketing site, the dashboard, and our emails. Your accounts and data carry over without a single click.

Added
  • Privacy Policy, Terms of Service, and PDPA Policy — all linked from the footer's new Legal column
  • Public marketing pages now load without sign-in (product, compliance, changelog, docs, legal)
  • Landing page redesign — new light Ink palette, with a tilted dashboard preview, metric strip, four-tile feature grid, and a how-it-works pipeline
  • Compliance page — full PDPA & MOM disclosure, data residency table, security architecture, retention windows, your rights, DPA on request
  • Open Graph card for richer social previews
Improved
  • Coreframes Lab brand applied everywhere we used to show a generic mark — favicon, nav, footer, email signatures, OG card. Product name remains MaidCopilot in copy.
  • Documentation page trimmed to the parts agency teams actually need (Owners, Coordinators)
  • Product footer split into Product and Legal columns for easier policy access
Fixed
  • Marketing site pages no longer redirect signed-out visitors to the sign-in screen
  • Landing page no longer fails to render after a stray editor save truncated the inline stylesheet
May 2026
v0.3

WhatsApp Embedded Signup & Automation

Agencies can now connect their own WhatsApp Business Account directly from Settings — no manual token setup. Coexistence mode means the Business App on your phone keeps working.

Added
  • Embedded Signup flow — connect your WABA with one click
  • Coexistence mode always on — your WhatsApp Business App continues to work
  • WhatsApp template management — create, submit for Meta approval, and send templates
  • Automation rules — trigger template sends on case status changes
  • Intake flow builder — configure multi-step WhatsApp questionnaires for new leads
  • Disconnect WhatsApp — soft-delete a WABA connection from Settings
Improved
  • Webhook verification error messages now include the token mismatch detail
  • Audit log now covers WhatsApp account connection events
Apr 2026
v0.2

CRM, Matching & Case Management

Full employer and maid biodata management, match pipeline, interview scheduling, and case tracking from offer acceptance through to deployment.

Added
  • Employer records — contact details, address, household profile
  • Maid biodata — nationality, skills, work history, documents
  • Supplier management — source agencies and overseas partners
  • Match pipeline — link employer to maid, add fit notes
  • Interview scheduling — date, type, and outcome tracking
  • Case lifecycle — offer accepted → processing → deployed → terminated/transferred
  • Case notes — timestamped coordinator notes with author attribution
  • Document storage — upload and attach PDFs to maids, employers, or cases
Improved
  • Contact auto-create when a new WhatsApp message arrives from an unknown number
  • Conversation now links to the contact record in the sidebar
Mar 2026
v0.1

Foundation & Shared Inbox

Multi-tenant workspace, authentication, team management, and the shared WhatsApp inbox. The core infrastructure everything else is built on.

Added
  • Agency workspace creation — isolated per agency with Row-Level Security
  • Magic link authentication (no passwords)
  • Team management — invite coordinators, assign roles, deactivate members
  • Shared WhatsApp inbox — all inbound messages in one view
  • Conversation assignment — assign threads to coordinators
  • Conversation status — open, pending, resolved
  • Inbound webhook — HMAC-verified, idempotent message ingestion
  • Audit log — every data change recorded with user + timestamp
  • Role-based access control — Owner and Coordinator roles
Chat on WhatsApp