Skip to content

MyManny — Roadmap

Explanation — forward-looking phases and milestones


MVP 0 — local-hardening sprint. Core marketplace (booking + SOS) feature-complete. SOS RC1 shipped (sos-mvp-rc1, 2026-04-23). Active sprint: 7-phase local-hardening plan (SOS E2E + demo-04 JIT + bug-sweep tail + dead-code sweep + rate-limit tiers + SOTA audit + E2E coverage grid to 100%). Native iOS + Android + cloud CI/CD deferred until all 7 green locally. See status.md + plans/2026-04-23-local-hardening-sprint.md.


Active Initiative — UX/UI Realignment (2026-04-21+)

Section titled “Active Initiative — UX/UI Realignment (2026-04-21+)”
Sub-phaseStatusScope
M0 — Design tokens + fontsDoneItalian Sole palette, Gambarino + Switzer, Gluestack tokens
Phase A — Auth screensSpec lockedWelcome tour, Sign-in, Sign-up, OTP polish
Phase C — Consumer flowIn progressSole token sweep done (A4–A7); Home hero map + real-time presence done (B18+B26); chat attach (B22); GPS+Mapbox autocomplete (B30); image upload web fix (B29); HARDEN revert done; Map-first Results + Mappa/Lista toggle + direct prompt routing (Claude Design handoff, ADR 0028, 2026-04-22). Remaining: Pro Profile polish, pin clustering, custom Mapbox Sole style
Phase B — Pro flowQueuedPro Dashboard, Availability, Earnings, SOS Accept
Phase D — Navigation chromeDone (PR #17)Tab bars, headers, bottom sheets

Locked decisions (2026-04-21)

  • Typography: Gambarino (display/serif) + Switzer (body/sans) — replaces Plus Jakarta Sans
  • Color palette: Italian Sole · Warm Denim — Warm Denim Blue #3B5A78 primary, Emerald #10B981 trust/Verificato, Dusty Sky #6E8CA8 accent, Warm near-white #FAFAF9 bg, Warm brown-black #2E281A text. SOS red #E5484D reserved for active dispatch only. ADR 0032 (supersedes ADR 0010, 2026-04-27)
  • Map provider: @rnmapbox/maps + Mapbox APIs (Day 1, 2026-04-19) — replaces react-native-maps + Google Maps
  • Auth flow: Clerk identifier-first unified sign-in/sign-up
  • Live tracking: Tier 2 (post-MVP 0) — Socket.IO foundation built, full polish deferred
  • Pro nav: OS deep-link via Expo Router, no custom bottom-sheet nav

MilestoneStatusNotes
FoundationDoneMonorepo (Turborepo + pnpm), DB schema, Clerk auth, core NestJS modules
API CoreDoneBooking, SOS, Chat, Reviews, Payments, Notifications, AI, Credentials
SOS Flow Uplift (Tasks 1–16)Done (sos-mvp-rc1, 2026-04-23)Shipped: multimodal AI triage + sequential 30s dispatch + dual-PI lock fee + escrow + 7s live tracking + lifecycle + 30-min no-show auto-refund. Task 17 E2E + Task 18 docs shipped. Spec docs/specs/2026-04-22-sos-flow-design.md. Archived plan docs/archive/completed/plans/2026-04-22-sos-flow-impl.md.
InfrastructureDoneDocker, Hetzner CAX11, GitLab CE Lane 1/2/3 CI/CD (SSH→docker compose up -d), Sentry, Cloudflare R2 (GH Actions origin replaced 2026-05-04; Dokploy deploy API migrated to Lane 3 SSH+compose 2026-05-04, Dokploy remains as PaaS)
Test SuiteDone195 unit + 45 E2E + 122 Playwright — green on CI; demo seed (pnpm seed:demo) added for cofounder walkthrough
External IntegrationsPartialClerk + Stripe verified; Novu multi-channel pending full smoke test
Mobile AppDoneExpo SDK 55 + React Native — all core screens built
Production PolishDonei18n (IT+EN), BullMQ notifications, security headers, design system M0

  • Turborepo monorepo, pnpm workspaces, Biome lint, Husky pre-commit
  • NestJS 11 + Fastify + SWC + Prisma 7 + PostgreSQL 18 + PostGIS
  • Clerk JWT verification, svix webhook, RBAC (CONSUMER / PROFESSIONAL / ADMIN)
  • packages/types, packages/validators (Zod), packages/api-client shared packages
  • Docker Compose local stack (Postgres, Redis, MinIO, Mailpit)
  • BookingModule: create, confirm, cancel, lifecycle state machine
  • SOSModule: request, candidate matching (PostGIS radius), accept/decline
  • ChatModule: Socket.IO real-time messaging, message history
  • ReviewsModule: create, display, rating aggregate
  • ProfessionalModule: profile, availability slots, search (text + category)
  • AvailabilityModule: weekly schedule, slot generation, conflict checks
  • Stripe Connect Express: onboarding, PaymentIntent, escrow, payout, refund
  • Stripe webhooks: signature verification via raw body
  • Novu Cloud EU: 6 workflow templates (booking confirmed/cancelled/reminder, review request, SOS matched, chat message)
  • Novu → Resend (email) + Twilio (SMS) + Expo Push channels
  • BullMQ queues: notification-worker, reminder-worker, webhook-worker

2026-08-06 — replatformed. Hetzner + Dokploy + GitLab CE (what the two bullets below originally described) are destroyed; prod moved to DigitalOcean App Platform, CI to GitHub Actions. Details: docs/infrastructure.md.

  • DigitalOcean App Platform, region fra, doctl apps create-deployment (never automatic — gated behind the CI quality jobs)
  • GitHub Actions (.github/workflows/ci.yml): lint+typecheck+unit-api+unit-mobile+verify-zero-error+smoke-web → build-web-export+deploy-api (parallel) → deploy-web → smoke-prod → tag-release. lint+typecheck run on a shared self-hosted runner (infra/runner/, free, no minutes consumed); the rest on GitHub-hosted ubuntu-latest.
  • Sentry: @sentry/nestjs (BE) + @sentry/react-native (FE) — Session Replay enabled (P7 Task 5, mobileReplayIntegration, Open Beta); ADR 0031
  • Dark-theme tokens + Mapbox dark style: Warm Denim v2 night variant, sole-denim-dark.json, darkMode: "class" + useThemedColors() pattern; ADR 0033 (2026-04-28)
  • Drift-prevention policy (P0+P1 shipped): Renovate LTS-only, Schemathesis contract tests, openapi-msw, Zod response validation in SDK, Biome apiClient ban; ADR 0034 (2026-04-28)
  • Cloudflare R2 storage (S3-compatible), MinIO for local dev
  • Cloudflare Quick Tunnels (canonical until paid domain registered) — moot, domain bought 2026-08-03, no tunnel in the current DO/Pages architecture; is-a.dev path abandoned 2026-04-29 (TOS §8 prohibits commercial use)
  • Expo Router 5 file-based routing, tab groups (consumer)/ + (professional)/
  • All core screens: Home, Search, Results, Pro Profile, Book, Booking Detail, Chat, Review, SOS, Pro Dashboard, Availability, Earnings, Settings
  • @clerk/clerk-expo auth — welcome tour + social login (Google/Apple/Facebook) + email OTP
  • @stripe/stripe-react-native payment sheet
  • react-native-reanimated 60fps animations + Lottie illustrations
  • TanStack Query (server state) + Zustand (client state) + Context (auth)
  • Gluestack UI v3 (NativeWind, copy-paste) + Phosphor Icons (duotone)
  • Italian Sole design tokens: palette, typography scale, spacing, border-radius
  • Gambarino + Switzer font loading via lib/fonts.ts
  • packages/design-tokens shared token package
  • 195 unit tests: services, repositories, controllers, guards
  • 45 E2E tests: booking lifecycle, SOS flow, auth, payments
  • 122 Playwright tests: mobile web smoke tests
  • Turborepo remote cache (Vercel) for CI speed
  • E2E JWT via Clerk BAPI session creation (no FAPI rate limits)
  • @fastify/helmet security headers
  • Zod global validation pipe (createZodValidationPipe)
  • Input sanitization, SQL injection prevention
  • Rate limiting: Redis-backed per-user limits (credential upload 10/day)
  • LangGraph.js agentic workflow: job estimation, smart scheduling
  • GPT-5.4 Mini primary + Gemini 2.5 Flash fallback
  • LangSmith EU tracing + experiment tracking
  • apps/api/src/modules/ai/ — LangGraph state machine, tool nodes
  • CredentialsModule: upload flow (presigned R2 URL, 600s), admin review queue
  • Credential types: P_IVA, INSURANCE, ALBO, F_GAS, ID_DOCUMENT, TRAINING_DIPLOMA, MANUFACTURER_CERT, OTHER
  • Trust engine: weighted score → BASIC / VERIFIED / ELITE tier
  • trustScore + trustTier on ProfessionalProfile
  • nestjs-i18n (BE) + i18next + react-i18next + expo-localization (FE)
  • IT (default) + EN — all user-facing strings via t() calls
  • BE: Accept-Language / x-lang header; FE: auto-detect locale
  • @nestjs/swagger auto-generates OpenAPI spec
  • @hey-api/openapi-ts generates typed SDK from spec
  • packages/api-client/: types.gen.ts, sdk.gen.ts, schemas.gen.ts
  • pnpm -w run generate:sdk pipeline
  • Auto-scaling, backups, disaster recovery, monitoring dashboards
  • Named tunnel migration: Quick Tunnel → cloudflared named tunnel — moot, DO App Platform doesn’t use tunnels; DNS is a plain Cloudflare Pages/App Platform CNAME
  • Secret rotation (post-v0 stable): Clerk, Stripe, Novu, R2, DigitalOcean + Cloudflare GitHub Actions secrets — procedure needs re-verifying against the current platform (docs/runbooks/post-v0-secret-rotation.md has a 2026-08-06 translation note, not a full rewrite)
  • Pulumi IaC TypeScript for Hetzner provisioning — Pulumi and the Hetzner host it provisioned are both gone; DO App Platform config isn’t tracked IaC today
  • 100% SLA target for production

Phase 8.5 — Post-MVP 0 Codebase SOTA Audit

Section titled “Phase 8.5 — Post-MVP 0 Codebase SOTA Audit”

First work stream once MVP 0 is out the door, before any new feature sprint. Big brainstorm pass over the entire codebase against industry SOTA per stack layer — Nest 11 patterns, Expo SDK 55 / React Native best practices, native iOS+Android binary tuning, the Expo web bundle, Prisma 7 + PostGIS query scan, Redis cache taxonomy, BullMQ retry/DLQ shape, LangGraph AI pipeline hygiene, Clerk auth surface, Novu/Resend/Twilio notification coverage, Stripe Connect escrow, R2 storage policy, Sentry observability, testing pyramid, OWASP ASVS security sweep, DO App Platform config drift, Turbo CI cache effectiveness. For each layer: run the matching specialized agent / skill / MCP, fetch latest docs via Context7 + cross-check Exa, use ast-grep for idiomatic-pattern audit. Bump all deps to latest stable/LTS (no canary). KISS/DRY refactor pass + dead-code removal. Produces a single codebase-wide audit spec in docs/specs/ before code changes; layer-specific subagents dispatched in parallel once the spec is locked.

  • Consumer: saved pros, repeat booking, favourite lists
  • Professional: advanced analytics, team accounts, multi-location
  • Payments: subscription plans, promotional credits, invoice generation
  • AI: predictive pricing, demand forecasting, smart availability suggestions
  • Live tracking Tier 2: full real-time GPS + ETA + route display
  • Multi-city expansion beyond initial Italian market

See product.md for per-feature catalog cards (descriptions, screenshots, spec links). This matrix is the data source.

FeatureCategoryStatusPlatformsNotes
Sign InAuthstableiOS, Android, WebClerk identifier-first unified flow
Sign UpAuthstableiOS, Android, WebSocial (Google/Apple/Facebook) + email OTP
2FA / MFAAuthalphaiOS, Android, WebClerk TOTP — task #140
RBACAuthstableAPICONSUMER / PROFESSIONAL / ADMIN roles
JWT VerifyAuthstableAPI@clerk/backend verifyToken + @CurrentUser()
Clerk WebhooksAuthstableAPIsvix signature, raw body
Category SearchDiscoverystableiOS, Android, WebTrade categories + PostGIS proximity
Text SearchDiscoverystableiOS, Android, WebFull-text search, Redis cache 30s
Results ScreenDiscoverystableiOS, Android, WebFilter + sort, map overlay
Pro ProfileDiscoverystableiOS, Android, WebTrust tier badge, credentials display
Mapbox MapsDiscoverybetaiOS, Android, Web@rnmapbox/maps, custom Sole style
Create BookingBookingstableiOS, Android, WebZod validation, slot conflict check
Booking LifecycleBookingstableiOS, Android, APIPENDING→CONFIRMED→IN_PROGRESS→COMPLETED
Change OrdersBookingstableiOS, Android, APIExtra work approval flow
Booking HistoryBookingstableiOS, AndroidConsumer + professional views
Cancel BookingBookingstableiOS, AndroidCTA + useCancelBooking hook
SOS RequestSOSstableiOS, AndroidEmergency dispatch trigger
Candidate MatchingSOSstableAPIPostGIS radius, availability check
SOS PricingSOSstableiOS, Android, APISurge multiplier, transparent estimate
Accept / DeclineSOSstableiOS, AndroidPro accept/decline flow
SOS Pick-List ModeSOSshipped (2026-04-23)iOS, Android, WebDual-mode sheet (AUTO vs PICK_LIST) on home FAB, QuoteCard (name/tier/price/ETA/note, pick button PENDING-only), pro sos-quote-request FORM→WAITING→PICKED/NOT_PICKED state machine, optimistic-lock pickQuote transaction, BullMQ quote-window-close (180 s) + dispatch-reaper-24h (hourly) hygiene jobs, E2E S9/S10/S11 multi-role Playwright scenarios (env-gated). See ADR 0030.
Live TrackingSOSbetaiOS, AndroidConsumer LiveTrackingMap (T14) + pro useProLocationStream/sos-active (T12–13); SosBanner StatusPill + tel: call. Full GPS Tier 2 (Directions API ETA) pending.
Real-time ChatChatbetaiOS, AndroidSocket.IO, message history
Create ReviewReviewsstableiOS, AndroidPost-booking unlock, duplicate guard
Display ReviewsReviewsstableiOS, Android, WebRating aggregate, sorted list
Stripe ConnectPaymentsbetaiOS, Android, APIConnect Express onboarding
EscrowPaymentsstableAPIHold on booking create, release on complete
RefundsPaymentsstableAPIStripe refund + webhook reconcile
Stripe WebhooksPaymentsstableAPIRaw body signature verify, async BullMQ processing, StripeEventLog idempotency guard, admin stuck-events endpoint (GET /admin/stripe-events?status=stuck)
Multi-channel NotificationsNotificationsstableAPINovu → email + SMS + push
Push NotificationsNotificationsbetaiOS, AndroidExpo Push Token, Novu channel
Consumer → Pro FunnelPro Toolsshipped (2026-04-23)iOS, Android, Web”Become a professional” CTA on consumer profile routes into 8-step onboarding wizard. OnboardingController per-method @Roles("CONSUMER","PROFESSIONAL") lets consumers start + progress. startOnboarding create-or-get drafts a ProfessionalProfile w/ safe placeholders on first entry. completeOnboarding $transaction atomically flips User.role → PROFESSIONAL + busts auth:user:${clerkId} Redis cache. Mobile complete.tsx invalidates ["users","me"] and redirects to /.
Pro DashboardPro ToolsstableiOS, AndroidEarnings summary, upcoming bookings
AvailabilityPro ToolsstableiOS, Android, Web, APIItalian split-day prefill, 1-3 ranges/day, copy-to-day chips, date exceptions, dual live toggles, SOS auto-suspend (spec 2026-04-27)
EarningsPro ToolsstableiOS, AndroidPayout history, pending balance
CalendarPro ToolsstubiOS, AndroidBlocked slots UI — planned Phase 1
Credential UploadCredentialsstableiOS, Android, APIPresigned R2 URL, Redis rate limit
Credential ReviewCredentialsstableAPIAdmin approve/reject queue
Trust ScoreCredentialsstableAPIWeighted engine → BASIC/VERIFIED/ELITE
KYC — Stripe Connect ExpressCredentialsshipped (2026-04-30)iOS, Android, APIStripe Connect Express is canonical KYC — collects identity (name, DOB, codice fiscale, document, selfie) + charges_enabled as KYC signal. Stripe Identity module dropped (duplicate uploads, doubled failure modes). Onboarding shrinks 7 → 6 steps. Migration 20260430103304_drop_identity_collect_prefill adds prefill fields to ProfessionalProfile; StripeService.createConnectAccount accepts ConnectAccountPrefill. [ADR linked to 2026-04-30 drop decision.]
Service-area Polygon (Phase B v0)Pro Toolsshipped (2026-04-30)API, iOS, AndroidProfessionalProfile.serviceArea (geometry(MultiPolygon, 4326)) + serviceBbox + 2 GIST indexes via migration 20260430091154_add_service_area. ServiceAreaService.setCircle + backfill of all 28 seeded pros. ServiceAreaEditor native (@rnmapbox/maps) + web (react-map-gl/mapbox) — draggable circle + ±5 km stepper (5–50 km). @turf/circle polygon materialisation matches BE. Search + SOS still haversine; two-stage ST_Contains swap queued as Phase B v1 (B3).
AI Job EstimationAIalphaAPILangGraph.js + GPT-5.4 Mini
AI Smart SchedulingAIalphaAPILangGraph state machine, tool nodes
Health EndpointInfrastableAPI/health liveness + readiness
i18n IT+ENInfrastableiOS, Android, APInestjs-i18n + expo-localization
Security HeadersInfrastableAPI@fastify/helmet

Phase 0 — Demo ready (shipped 2026-04-21)

Section titled “Phase 0 — Demo ready (shipped 2026-04-21)”
  • #140 — Clerk 2FA sweep (all users audited, per-user MFA wiped, app-level dashboard-only) 80edaa1
  • #150 — CC1: Theme store + dark palette foundation 2f9c140
  • #151 — CC4: Offline banner 6bbcccd
  • #171 — R5: Icon voice cleanup (chrome Phosphor, inline lucide) 8aa44fb
  • #175 — R9: E2E selector refresh after Home route promotion 1e24f43
  • #176 — R10: PromptCard chat-UX parity (focus-expand, suggestions, history, placeholder cycle, typing indicator) 2f9c140
  • #174 — R8: ui-visual-validator run + screenshot diff vs design spec (in-flight)
  • #180 — CC2.x: Dark mode codemod — chrome + ui primitives via useThemedColors() c62c5be

Phase 1 — Post-demo (deferred to post-cofounder review)

Section titled “Phase 1 — Post-demo (deferred to post-cofounder review)”
  • E2E M1 — track C demo walkthroughs (3 Playwright specs, cofounder/investor paths) — e2e/web/demo/*.spec.ts. Spec: specs/2026-04-21-e2e-strategy.md.
  • E2E M2 — track A deploy smoke — 3 unauthenticated Playwright flows wired into scripts/deploy.sh post-CD via e2e/playwright.prod-smoke.config.ts. Authed expansion (5 flows) deferred to M3+ pending prod test-user seeding.
  • E2E M3 — gap closure (audit): webhook + i18n API-integ already covered. Carve-outs: M3b, M3c.
  • E2E M3b — Browser i18n smoke — e2e/web/i18n/language-switch.spec.ts + testID instrumentation on LanguagePicker + profile menu row.
  • E2E M3c — Rate-limit E2E (blocked on @nestjs/throttler impl, deferred post-MVP0).
  • [~] E2E M4 — track B multi-role harness (carries Phase E M-E1–M-E7: TestModule + test_tenant + 6 canonical scenarios on Playwright web). Harness landed — e2e/multi-role/ orchestrator + tenant/state/clock/seed helpers + S1 scenario + playwright.multi-role.config.ts + test:multi-role / test:s1 scripts. BE TestModule + remaining 5 scenarios (S2–S6) still pending.
  • E2E M5 — Maestro mobile flows — DEFERRED post-MVP0 (per user 2026-04-21: web-only MVP 0 scope).
  • E2E M6 — Nightly scheduled workflow (GitHub Actions schedule: on the self-hosted runner, see docs/infrastructure.md) + Slack report emitter (web suite only in MVP0).
  • E2E M7 — free-tier device cloud — DEFERRED post-MVP0 (alongside M5, mobile-specific).
  • Rate-limit impl — @nestjs/throttler 4-tier integration (plan: archive/completed/plans/2026-04-21-rate-limit-throttler-audit.md).
  • Named tunnel migration (blocked — pending is-a.dev PR merge) — moot, DO App Platform + Cloudflare Pages don’t use tunnels
  • #176 — R10: Secret rotation (Clerk, Stripe, Novu, GitHub Actions secrets, R2) — post-v0 stable

  • New milestone completed → update the Milestone Overview table row status
  • New locked decision → add row to Active Initiative decisions table with date
  • Phase promoted / feature shipped → update Feature Matrix status column
  • New planned work → add to Phased Execution Plan under correct phase
  • Do NOT add in-flight task details here — those belong in status.md
  • Re-read both ROADMAP.md and FEATURES.md before editing to stay in sync