Status
Last updated: 2026-08-03 — kept in sync with docs/STATUS.md.
Production-ready
Section titled “Production-ready”Active apps:
apps/svelte-web— SvelteKit web (all major web features implemented)apps/ios-user— Native iOS customer app (Swift/SwiftUI) — Phase 1 code-completeapps/android/app-user— Native Android customer app (Kotlin/Compose) — Phase 1 code-completeapps/ios-agent+apps/android/app-agent— Native agent apps (Swift/SwiftUI + Kotlin/Compose); Phase 1 increments (Dashboard, Leads) landingapps/worker— Bun + BullMQ background worker (production)apps/api— Standalone Hono server hosting tRPC + Better Auth (production)
The legacy Next.js web app was removed in March 2026. See Conventions → Mobile (Native) for the native-app rewrite.
Feature completion
Section titled “Feature completion”| Feature | Status |
|---|---|
| Authentication & Security | ✅ 100% — Better Auth + CSRF + RLS |
| Property Search & Map | ✅ 100% — Valkey GEOSEARCH + Google Maps |
| Property Detail | ✅ 100% — Gallery, SEO, tours, similar |
| Property Management | ✅ 100% — 10-step wizard + BullMQ sync |
| Lead Management | ✅ 100% — Audit trail + SLA + DLQ + draft deals |
| Chat (GetStream) | ✅ 100% — Direct + property channels |
| Notifications (Knock) | ✅ 100% — 21 workflows wired |
| User Profiles | ✅ 100% — Customer + agent + settings |
| User Engagement | ✅ 100% — Compare, share, alerts |
| Landing Page | ✅ 100% — Hero + streaming + caching |
| Location Search | ✅ 100% — Meilisearch + geocoding |
| Image System | ✅ 100% — Cloudflare R2 + imgproxy |
| Calendar & Tours | ✅ 100% — FullCalendar + tour API |
| Agent Directory | ✅ 100% — Meilisearch + curated lists |
| Agency Pages | ✅ 100% — Public team pages |
| Teams | ✅ 100% — Analytics, SLA, permissions, member detail |
| i18n | ✅ 100% — 600+ keys (es / en) |
| Infrastructure | ✅ 100% — Docker + GitHub Actions + IaC |
| Security | ✅ 100% — Rate limiting + CSP + RLS |
| Native User App (iOS/Android) | ✅ Phase 1 code-complete — search, detail, favorites, tours, profile/settings, deep links |
| AI Features | ✅ 100% — Description generation + virtual staging live, plan-quota gated (M1) |
| Subscriptions & Billing | ✅ 100% — M1 + M2 + TEAM checkout + CFDI facturación (FacturAPI) live |
| Analytics | ⏳ 40% — Team analytics live, agent analytics pending |
| Rental Companion | ⏳ Deferred — code removed, RentalTerms UI preserved |
Pending
Section titled “Pending”Analytics dashboard
Section titled “Analytics dashboard”/dashboard/analytics is a placeholder with mock data. Needs real data integration (property views, conversion rates, etc.) via packages/api/src/services/analytics.ts (currently a stub).
Rental Companion (deferred)
Section titled “Rental Companion (deferred)”Implemented through Phases 1–3, then removed in April 2026 to keep the codebase clean (8 models, 5 enums, 40+ files, 8800+ lines).
Preserved: RentalTerms model + listing wizard Step 8.
Removed: 9 Knock rental workflows, the tRPC rentals router, the Better Auth Anonymous plugin, the DocuSeal integration, the Typst contract generator.
Future: re-implement as a multi-phase workstream (renter application, guarantor invitations, contract upload + DocuSeal signing, Typst PDF generation, room-by-room inventory).
Legal pages
Section titled “Legal pages”/legal/cookies exists. Main legal page (terms, privacy) not yet implemented.
Recent milestones (last 8 weeks)
Section titled “Recent milestones (last 8 weeks)”| Month | Milestone |
|---|---|
| Aug 2026 | TEAM checkout — per-seat Premium ($549 MXN/seat/month, min 3 seats) / Enterprise ($449 MXN/seat/month, min 10 seats) team subscriptions from a LEAD-only plan card on the teams billing tab: teams.stripeCustomerId (migration 0017), subjectType: 'team' metadata contract, seats synced from the Stripe item quantity (portal seat changes follow), member entitlement lift/drop through the existing team blend, billing notifications to the team LEAD. |
| Aug 2026 | Subscriptions M2 — Stripe self-serve — hosted Checkout form actions on both billing pages (cards-only MXN, prices resolved by lookup_key with a blocking amount check), signature-verified webhook with convergent re-fetch sync (receipts idempotency, supersede-on-checkout, dunning PAST_DUE stays entitled), payment-failed / subscription-canceled Knock workflows off sync status transitions, billing-anchor usage windows (monthly anniversaries — yearly plans still reset monthly), a daily stripe-reconcile worker job, and native planGate upgrade sheets in both agent apps. Canonical doc: packages/api/src/services/subscriptions.FEATURE.md. |
| Aug 2026 | Subscriptions M1 — subscriptions + append-only audit tables, plan catalog + MXN pricing (@repo/validation plan-rules), best-of(own, team) entitlements behind a short Valkey cache, six server-enforced plan gates with a planGate error envelope for native clients, 14-day agent trial + worker trial-scan + Knock warning/expiry, admin grant/revoke UI, billing/plan pages with usage meters. Self-serve Stripe checkout is M2. Canonical doc: packages/api/src/services/subscriptions.FEATURE.md. |
| Jul 2026 | AI room staging v2 hardening — switched exclusively to Replicate’s official openai/gpt-image-2 wrapper with a durable PostgreSQL dispatch outbox, dedicated queue, persisted/capped provider attempts, retry/resume/cancel races, signed webhooks, validated downloads, private review/approval, durable deletion, canonical shared contracts, native/web parity, and staged-cover/public-visibility database guards. See Operations → AI room staging rollout. |
| Jun 2026 | Native model codegen (@repo/contract) — all four native apps (ios-user, android-user, ios-agent, android-agent) generate their response models from one Zod wire-schema source instead of hand-written DTOs; the CI tests job regenerates + git diffs for drift. See Conventions → Mobile (Native). |
| Jun 2026 | Native user-app rewrite (Phase 1 code-complete) — apps/ios-user + apps/android/app-user reach the core journey: browsable tabs + Home, list + map search, property detail + tour request, favorites, My Tours + reschedule, profile/settings + avatar + become-agent, live theme/language, and expo-user:// deep links. Builds + unit suites green both platforms. Next: device QA + TestFlight/Play internal. See Conventions → Mobile (Native). |
| Jun 2026 | Native user-app rewrite (Phase 0) — apps/ios-user (Swift/SwiftUI) + apps/android/app-user (Kotlin/Compose) scaffolded with a hand-written tRPC-over-HTTP client, cookie-based Better Auth (email OTP + native Google idToken), generated design tokens, and synced i18n. See Conventions → Mobile (Native). |
| May 2026 | Public staged-variants viewer redesign — properties/detail/staged-variants-dialog.svelte resized + reflowed (max-w-[1267px], inset card, ring-2 ring-primary active state). |
| May 2026 | Virtual staging UX rework — agent variants dialog matched to the bulk dialog sticky-chrome pattern; “No Furniture” mode removed from clients + server validation. |
| May 2026 | AI description hardening — anti-hallucination prompt (forbidden adjectives, 30-word cap, exhaustive feature list, self-check); typed WorkerError codes drive friendly toasts; client disclaimer added. |
| May 2026 | Silent-logout fix (IPv6 IP-hijack) — normalizeIp in hooks.server.ts now mirrors Better Auth’s /64 IPv6 subnet logic. Inlined to avoid @better-auth/core direct-dep build break. |
| May 2026 | Email-OTP signup fix + auth error i18n — firstName / lastName relaxed to required: false at the auth layer; authClient.updateUser writes them after signIn.emailOtp succeeds. New translateAuthError helper + 7 auth_error_* keys. |
| May 2026 | Mobile dark mode — light / dark palettes derived from web’s OKLCH; carried forward into the native apps’ generated token files with live appearance switching (System / Light / Dark). |
| May 2026 | Mobile profile parity — users.updateProfile accepts firstName / lastName / phone; Edit Profile sheet matches web /portal/profile/. |
| Apr 2026 | AI virtual staging (Replicate via apps/worker/src/ai-room-staging.ts) — 6 stylize variants via adirik/interior-design. BullMQ concurrency: 1 + limiter to stay under Replicate’s 6/min cap. |
| Apr 2026 | AI description generator (Gemini 2.5 Flash via @google/genai) — bilingual sectioned output, structured responseSchema, from-scratch + enhance modes. |
| Apr 2026 | Leads overhaul — event-driven audit trail (LeadEvent), per-team SLA engine (BullMQ repeatable), reliable BullMQ ingestion with DLQ + admin replay UI, terminal-state hygiene (dispositionReason + DraftDeal). |
| Apr 2026 | Rental Companion deferred — Phases 1–3.5 code removed; RentalTerms model + listing wizard UI preserved. |
| Apr 2026 | DB reset workflow — bun run db:reset script drops + recreated the schema with PostGIS, applied the pre-SQL ID-generator functions, pushed the schema, then the post-SQL triggers + stats aggregators. (This pre/post-SQL flow was later superseded by the Kysely migration chain.) |
| Apr 2026 | Team analytics & leaderboard — KPIs + per-member stats with time filter, customizable SLA (30 / 60 / 120 / 240 / 480 min) with 3-tier escalation. |
| Apr 2026 | Property comparison (side-by-side, 2–4 properties), share collections (link / WhatsApp / email), notification alerts (price-drop, listing-status-change, saved-search-match via BullMQ alerts queue + Knock workflows). |
| Apr 2026 | Neighborhood price insights — multi-level visual funnel (city → municipality → neighborhood) from Redis indexes; new IDX_MUNICIPALITY in @repo/redis-search. |
For the full historical milestone list, see docs/STATUS.md.