Every release, in reverse chronological order. Built in public.
The marketing site now gives prospects a direct path to contact you instead of nudging them into sign-in first.
/contact page with a structured email enquiry form for demos, onboarding, pricing, and sales conversations.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.
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 cannot receive free-text or template messages; the API returns a clear error.DELETE /api/contacts/{id} soft-deletes the contact and archives their conversations (audit-logged; data retained per statutory retention)./settings/templates/new with per-{{n}} variable samples, WhatsApp-style preview, and submit to Meta (fixes INVALID_FORMAT rejections).unread_count in the sidebar.last_customer_message_at immediately so free-text compose re-enables without a page refresh.Smaller UX fixes so the inbox behaves like WhatsApp: one message per send, and the header control does what coordinators expect.
content_text and display as a single message (no duplicate “Template · name” + body). What you see in MaidCopilot is what the contact receives.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.
{{n}} placeholders with a live preview, send to the open contact. Works outside the 24-hour customer service window.{{n}} variables into the body, save draft or submit to Meta, sync/import from WhatsApp Manager.message_template_status_update events update local approval status (and backfill meta_template_id) so rejected/approved templates reflect in Settings without clicking Sync.POST /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).{{1}} defaults to the contact's display name (or number).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.
GET /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.GET /api/inbox/conversations/{id} now returns the same conversation + nested contact object as the list endpoint instead of the raw Supabase contacts key.layout.tsx + ConversationSidebar so the thread list stays visible alongside the open conversation on desktop-sized viewports.POST /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”).utility / marketing / authentication so inserts satisfy the Postgres CHECK constraint; empty bodies fall back to a single space so body_text stays non-null.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.
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.unknown, so a typical visit no longer spams [Facebook SDK] Ready….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.
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.
.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.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./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./security, so signed-out visitors would have been bounced to /sign-in. Added.FB.login() with a plain sync callback that dispatches the API call inside an async IIFE.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.
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.
Full employer and maid biodata management, match pipeline, interview scheduling, and case tracking from offer acceptance through to deployment.
Multi-tenant workspace, authentication, team management, and the shared WhatsApp inbox. The core infrastructure everything else is built on.