back to work
Case Study · Conversational AI

Harper (HRPR)

A consent-driven, multi-tenant conversational AI assistant — answers in 1–3 sentences first, asks before it goes deeper, and embeds in any host site with one script tag.

Role
Primary builder · end-to-end
Type
Cross-platform mobile + embeddable web
Status
In production at Banyan Labs
Window
27+ merged PRs through 2026
Harper

LLM chatbots overwhelm — and act without permission.

Most embedded AI assistants do two things wrong: they dump walls of text on first contact, and they shift contexts (recommend a tool, switch domains, take an action) without asking. The result is a chatbot that feels noisy on a brand site and pushy in a serious workflow.

Banyan needed a conversational AI that could embed inside client products and feel domain-aware, multi-tenant, and consent-driven from the first message — without rebuilding the host's design system or backend.

Listen → Verify → Pivot → Immerse.

Harper answers in 1–3 sentences first — what the team calls a tiny response. Only after the user explicitly says yes does it activate a focused context (a tenant-specific tool, a domain guide, a recovery resource).

Architecturally it's a food-truck pattern. The Flutter app is the window. A Go backend-for-frontend is the counter. The intelligence — Bedrock + a Model Context Protocol catalog — lives in a separate service the BFF proxies to. The Flutter client never holds backend keys.

End-to-end ownership.

  • Flutter client targeting iOS, Android, web, and desktop — voice-first hold-to-speak with speech-to-text, multi-provider TTS, and a fully themable UI.
  • Embeddable web widget with PostMessage bridge — auto-detects host page colors, fonts, and dark/light mode, and renders a resizable sidebar that pushes host content aside.
  • Go BFF with middleware, health checks, server-side AUTH_API_KEY injection, multi-stage Docker builds, and GitHub Actions CI/CD covering Go quality gates and Flutter web builds.
  • MCP-driven tool catalog — tools, domain policies, tone/verbosity restrictions, and trigger keywords routed by tenant slug.
  • Multi-provider TTS (AWS Polly + ElevenLabs + browser voices) with voice selection UI, speed slider, and per-user voice preferences persisted server-side.

What it's built on.

Client
Flutter · Dart · Riverpod · MVP/MVS pattern
BFF
Go · nginx · WebSockets · Postgres
AI
AWS Bedrock (Claude 3) · MCP · Polly · ElevenLabs
Infra
Docker multi-stage · GitHub Actions · OWASP-aware defaults
Auth
JWT · multi-tenant (Company → Org → User)
Embed
PostMessage bridge · auto-theming · resizable sidebar

Production conversational AI inside a real product.

Harper ships as a native mobile app and as an embeddable web widget — installable on third-party sites with a single script tag. The consent-driven loop holds across both surfaces, and 34 cross-stack tests (24 Flutter, 10 Go) keep regressions out of the BFF.

Honest framing: this is Banyan-Labs internal/client work, NDA-sensitive, and depends on a separate backend service called Armada Core. The case study describes my contributions, not the full product surface.