Skip to content

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.

React NativeDjangoAWS BedrockElasticsearchCeleryRAG

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 ↓

1 / 12

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.

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.