← Wesley Dickens
Consulting engagement · Architecture & implementation

Encounter AI

A contemplative Scripture meditation app I architected and built for Encountering Peace — live at app.encounteringpeace.ai.

The brief was a conversational meditation experience: a streaming chat that could also pull from a curated library, generate audio on demand, and gate features by subscription. The build is deliberately quiet — vanilla ES modules in the browser, a small set of serverless functions custodying every external API, no framework runtime in the critical path.


What was delivered

01
Streaming chat with Claude A responsive conversational surface that renders model responses as they arrive, sized for an audience that expects the experience to feel calm rather than mechanical.
02
Generated audio meditations TTS through ElevenLabs against a curated voice set, orchestrated so meditations are produced and queued without breaking the conversational pace of the chat.
03
Subscription tier gating OAuth sign-in through Memberful with server-verified entitlements on every session. Tier resolution decides which capabilities the client exposes — no client-side trust on access control.
04
Curated content library An Airtable-backed catalog of pre-recorded meditations and persona configuration, retrievable from inside a conversation so the model can route between bespoke generation and the existing library.
05
Server-side key custody Every external API — model, audio, content, auth — sits behind a Netlify Functions proxy. No third-party credentials ever touch the browser, and each proxy is the only place rate limits and provider quirks need handling.
06
No-framework architecture A deliberate choice to ship vanilla ES modules with explicit dependency injection instead of a framework runtime. Smaller surface area to maintain after handoff, no bundler in the critical path, and an architecture the client’s team can read end-to-end.

The interesting problem

The non-obvious design problem on this kind of build isn’t the model itself — it’s wiring the model’s output into the rest of the app. A conversational interface where the model can also start audio, retrieve content, and move the UI between states needs a clean answer to a deceptively simple question: how does prose become side effects?

The textbook answer is structured tool calls. The right answer for a single-team product moving quickly is often something tighter — close coupling between the system prompt and the client-side dispatcher, both sides versioned together, no formal protocol overhead. Picking that tradeoff deliberately, knowing when it stops being correct, and leaving the seam in a place the client’s team can move later is the consulting work.


Tech stack