Built for Stori · Live · Mobile · AI
Stori
An AI‑powered journaling and mental wellbeing app. Rich journaling, mood tracking, personalised insights, and a RAG‑powered companion that remembers what you've written.
The problem
People want to journal but don't stick with it. The blank page is intimidating, there's no feedback loop, and weeks of writing disappear into a void with no way to see patterns or growth. Existing apps are either too simple (glorified note apps) or too clinical (CBT worksheets disguised as journals).
Try the flow ↓
Tap the highlighted areas to navigate
Stori needed to make journaling feel rewarding from day one. That meant AI that actually reads what you write and gives you something back: personalised prompts, emotional insights across time, and a companion that remembers your story and can talk about it with you.
From design to delivery
I worked closely with the design team to shape Stori from concept to shipped product. My role covered the full technical build: the React Native (Expo) mobile app, the native Android app (Kotlin / Jetpack Compose), and the Django REST API with its AI pipeline. I collaborated on product decisions throughout, translating design intent into working features and pushing back where technical constraints or user experience trade-offs demanded it.
Try the flow ↓
Tap the highlighted areas to navigate
Rich journaling
Block-based editor supporting free-form text, AI-generated prompts, photos, and voice notes with automatic transcription. Entries can be saved as drafts and resumed later.
Mood tracking
Daily check-in on a 1 to 5 scale with bird mood illustrations. Monthly averages, weekly/monthly trends, and AI-generated mood summaries that spot patterns across your entries.
AI insights
Every journal entry is categorised automatically. Tap a life category (Health, Career, Relationships) to see AI-generated summaries, detected emotions, and personalised follow-up prompts.
RAG-powered chat
A conversational companion that retrieves your past journal entries via hybrid BM25 + vector search and naturally references them in supportive, contextual responses.
Semantic search
Full-text and meaning-based search across all entries. OpenAI embeddings power k-NN similarity alongside keyword matching, with people extraction and highlighted results.
Streaks and prompts
Consecutive-day journaling streak with weekly dot calendar. Personalised prompts generated from your interests and past category summaries keep the habit going.
The AI layer
AI isn't a bolt-on feature in Stori. It's deeply integrated across almost every part of the experience: categorising entries, generating titles, building time-scoped summaries, extracting emotions, creating personalised prompts, powering the chat companion, and transcribing voice notes.
01
User writes a journal entry (text, voice, or photos)
02
Celery tasks categorise, generate a title, and extract mentioned names
03
OpenAI creates a vector embedding; entry is indexed in Elasticsearch
04
Bedrock generates category summaries with emotions, insights, and custom prompts
05
Chat uses hybrid search to retrieve relevant past entries as context for responses
The chat companion uses retrieval-augmented generation: each user message is embedded, then a hybrid search (BM25 + k-NN) retrieves the top 5 most relevant past journal entries. These are injected into the system prompt so the model can naturally reference what the user has written before. All AI processing runs asynchronously through Celery so the app stays responsive.
Every LLM call is logged with model name, token counts, call type, and timestamp. An admin dashboard tracks per-user usage with estimated costs from Bedrock pricing. All AI features are gated behind explicit GDPR special-category consent, and voice recordings are deleted from S3 immediately after transcription.
Decisions & trade-offs
React Native (Expo) plus native Android
The cross-platform app covers iOS and Android via Expo, while a separate native Kotlin/Compose app was built for Android-specific polish. This let us ship to both platforms fast while iterating on native feel where it mattered.
AWS Bedrock over OpenAI for generation
Bedrock offered model flexibility (Nova Lite for fast tasks, Nova Pro and Claude for complex analysis) without vendor lock-in on a single provider. OpenAI is still used for embeddings where text-embedding-3-small remains best-in-class.
Hybrid search over pure vector similarity
Combining BM25 keyword matching with k-NN vector search in Elasticsearch catches both exact references and semantic matches. Pure vector search missed too many name-based and date-based queries.
Async AI pipeline via Celery
Journal categorisation, title generation, summary building, and embedding indexing all run as background Celery tasks. The app returns instantly after saving an entry, and pushes a notification when AI processing completes.
My role
Sole developer across mobile and backend AI. I built the React Native app (Expo), the native Android app (Kotlin / Jetpack Compose), and the entire AI pipeline: journal categorisation, title generation, category summaries with emotion detection, mood summaries, the RAG-powered chat system, semantic search indexing, voice transcription, and personalised prompt generation.
The scope covered the full product surface: onboarding with age verification and GDPR consent, the block-based journal editor, mood tracking, streak mechanics, push notifications, search, profile management, passcode lock, and LLM usage tracking with cost dashboards.
Outcomes
The app is live on both iOS and Android. The AI pipeline processes every journal entry within seconds of saving, delivering categorisation, titles, and updated insights automatically. The RAG-powered chat companion references users' own journal entries in conversation, and the semantic search finds entries by meaning rather than just keywords.