Changelog
Notable changes on the Aroovo platform. Grouped by sprint where the sprint plan applies; entries link the short merge SHA so a reader can chase the exact commit in the public repo.
For the full per-commit log: GitHub commits on main. For the sprint roadmap: docs/sprint-plan-2026-05-25.md.
Marketing surface + agent templates
- Marketing site at aroovo.techb1dc7a9
Homepage / features / for-resellers / contact pages ported into the console at /about /features /for-resellers /contact. Sign-in CTA + demo-request flow live.
- Pre-built agent template browser9f97e54
Reseller-facing template marketplace at /marketplace so a Brand-Owner can preview an agent persona before provisioning it. Lift for the design partner motion.
- Agent instructions content (first pass)6804f1a
Matt-authored agent persona instructions checked in under docs/. Drives the system-prompt defaults the agent loader reads on Tenant onboarding.
Tech-debt cleanup + DB durability
- Drop legacy Entra-only columns19eddbd
After ADR-004 alt-auth Phase 5 backfilled all Brands onto the multi-provider columns, the legacy entraOid / entraTenantId / entraClientId User columns were dropped.
- DB backups + tested restore drillb8223a9
Nightly Postgres dump + a quarterly restore drill that exercises the actual restore path against a staging Postgres. Ungated by the Azure-hosting decision.
- Sentry semver-major bumpcfd3fc4
@sentry/nextjs 8.x → 10.x. Validated against the deploy pipeline before any tenant-touching work landed on top.
Sprint planning + ADR landing
- ADR-007 External OpenClaw agents150575b
Proposes a runtime indirection that lets a Brand register an Agent row that runs on OpenClaw, not Aroovo. Sprint 5 motion; expands the moat beyond per-Brand white-label.
- ADR-006 Team presetsc328ba7
Proposes five role-based agent team presets (marketing-agency, sales-b2b, tech-services, ops-coo, support-only) plus full-stack. Replaces 28 onboarding checkboxes with one preset picker.
- Brand + domain decisions locked
Keep platform name "Aroovo", canonical domain aroovo.tech, console subdomain agents.aroovo.tech. Zero rename work — frees Sprint 2.
- Sprint plan + competitor analysis8c1a128
Locked the order of the 22 pending roadmap items; competitor + gap analysis identifies multi-tenant + Brand layer + BYO identity / LLM / ingress / MCP-native as the defensible wedge.
- Azure hosting migration dropped9febcdc
Cash-conservation call: stay on Hostinger + Caddy + GitHub Actions. ADR-002 marked superseded. Frees Sprint 1 of migration-blocked items.
Slack ingress
- Slack ingress shipped end-to-endc932dd8
Five phases (interface + Teams relocation, inbound + signing verify, outbound + dispatcher, admin UI, channel-to-tenant mapping). Per-Brand BYO Slack App mandatory; DM + thread + @mention supported.
- ADR-005 Slack ingress38c54e6
Ingress abstraction so Teams + Slack + future Discord share a common dispatch path.
Alternative auth providers (Google / Okta / Auth0)
- Alt-auth shipped end-to-end662fc53
Five phases (schema + interface, Google/Okta/Auth0 OIDC validators, console sign-in dispatch, admin UI, backfill + read-switch). One AuthProvider interface, four implementations; each Brand picks one.
- ADR-004 Alternative auth providers608743c
Extends ADR-003 §3.6 to Google Workspace, Okta, and Auth0 as first-class providers. Facebook and GitHub deferred; SAML federated through Okta/Auth0.
Brand layer (white-label / reseller architecture)
- Brand layer Phase 1 + 218935df
Schema (Brand model + brandId FK), Phase 1 read APIs, Phase 2 CRUD + admin UI at /admin/brands. aroovo Brand seeded by boot hook.
- Brand layer Phase 3 (theming + hostname)2a7db8a
Per-Brand themeJson + primaryDomain + DNS-TXT verification; edge middleware attaches x-brand-id; per-Brand CSS injection at SSR.
- Brand layer Phase 4 (BrandOwner + BYO Entra)402362a
BrandOwner role; per-Brand entraTenantId + entraClientId; per-Brand Bot Framework app registrations.
- Brand layer Phase 5 (offboarding)077beff
30-day soft-delete window with bundle export of every audit row, tenant config, KB file, and secret reference.
- Brand layer Phase 6 (per-Brand model routing)69710e7
providerConfigJson with encrypted secret references for Anthropic / OpenAI / OpenRouter / OpenClaw keys.
- Brand layer Phase 7 (analytics)3e65776
Brand-Owner analytics — request count + latency rollups per Brand.
- Security hardening C1-C7 + H1-H7 + M1-M6
Multi-issuer JWT validator, AUDIT_HMAC_SECRET required in prod, encrypted secrets vault, MCP arg validation, per-tenant rate-limit + spend cap, SSRF protection on MCP bootstrap, BrandOwner tenant carve-out.
- ADR-003 Brand layer
Adds a Brand layer above Tenant. Each Brand has its own hostname, theme, IdP, LLM provider config, and Bot Framework / Slack app registrations.
Self-hosted runtime + MCP
- ADR-001 shipped (phases 1-6)
In-process agent loop replacing Managed Agents; MCP as integration layer; provider-pluggable across Anthropic / OpenAI / OpenRouter / OpenClaw; multi-tenant scaffolding; legacy Managed Agents path removed.
- Multi-tenant scaffolding
Tenant model + tenantId on 13+ tables; per-tenant audit chain, rate-limit, spend cap, vault, standups, broadcast; /admin/tenants/new wizard.
See also: Architecture decisions (ADRs) — the canonical engineering record per load-bearing decision.