Back to work
AI · Mobile

Neshama

A spiritual wellness app that matches how you're feeling to a Hasidic story, writes you a reflection from it, and reads it aloud.

Visit site
Role
Sole developer: mobile app, backend, retrieval pipeline
Stack
React Native · Expo · Supabase · Postgres · pgvector · Claude Sonnet 4.5 · OpenAI embeddings · ElevenLabs · RevenueCat
Status
Live

Live on the App Store since March 2026 and still being updated. Published under a different name and publisher after I left the company. Same app, same bundle identifier.

Context

Neshama is built on a specific idea: that the right old story, at the right moment, does more than generic advice. Someone says what they are carrying today, and gets back wisdom from Jewish tradition shaped to it.

The hard part is not putting text on a screen. It is that the match has to be right. A person shares something difficult and gets back a story that misses. That is worse than showing them nothing, because it tells them the app was not listening.

What I built

A cross-platform mobile app with the retrieval pipeline and serverless backend behind it. The flow is: a person shares by voice or text, that sharing is embedded, matched against the story corpus, a reflection is generated from the match, and it is read aloud.

  • Daily sharings by voice or text: what you say is what the match runs on.
  • Semantic matching against a corpus of over 1,200 enriched Hasidic stories, by meaning rather than keyword.
  • A personalized reflection per sharing, bridging the matched story to that person's actual situation.
  • Narration of both story and reflection, so it can be listened to rather than read.
  • Emotion check-ins that build into a mood graph over time.
  • A multi-day journey of concrete daily practices, not just words.
  • A personal journal, encrypted and local to the device.
  • Streak tracking, and subscriptions.

Architecture

App
React Native and Expo, one codebase for both platforms. Twelve Supabase Edge Functions and twenty-six migrations behind it.
Retrieval
OpenAI text-embedding-3-large at 3072 dimensions, stored in Postgres with pgvector and matched by cosine distance through a database function. A fixed corpus shared by every user is exactly the case a vector index is built for.
Generation
Claude Sonnet 4.5, called directly over HTTP from the Edge Functions.
Batching
The bulk path uses Anthropic's Message Batches API with a table tracking batch jobs, so generation happens ahead of time rather than while someone waits.
Audio
ElevenLabs text-to-speech, server-side only.
Commerce
RevenueCat, wired on both the client and a webhook, with a server-side fallback that queries their API directly.

One boundary I would defend: the mobile app never calls a model provider directly and holds no provider keys. Every generation, embedding and narration call goes through an Edge Function, so the credentials live server-side and the client only ever invokes a function by name.

How AI was used to build it

Neshama is where the AI-assisted workflow started for me. Building a retrieval pipeline end to end (enriching a corpus, embedding it, matching, generating, and the batch infrastructure around all of it) taught me the failure modes I now design for by default: retrieval that returns confidently irrelevant results, and generation that is fluent and wrong.

It also taught me to date my decisions. The architecture moved providers partway through the build, and that change is recorded in a single commit that names what came out and what went in. Months later the repository README still described the old stack, which is exactly how a codebase starts lying about itself, and why I now treat the call site as the source of truth over any document.

The lesson about confident wrong matches is the direct ancestor of Command Hub's hardest problem: here it breaks trust with someone who has just shared something personal, there it stops a model from looking any further.

Outcome and current status

Shipped. The app has been live on the App Store since March 2026 and was still receiving updates as of September 2026, six months of continued releases after launch.

It ships under a different name and publisher than the one I built it under. I left the company shortly before the store rollout; the bundle identifier is unchanged, which is what makes it the same app.

It is iOS only. The Android build was prepared but never published.

Screenshots

Screens from the app's current App Store listing, where it is published as Shalem. The headline above each screen is the listing's own marketing copy. The app has kept receiving updates since I left, so some details may differ from the version I built.