Case Study · Side Project · LLM
GraceMind — AI Journaling App
LLM-powered journaling and mindfulness app with guided prompts and a reflective AI assistant.
The Problem
Most journaling apps treat the page as a passive surface — you write, it stores, and the only intelligence is in the search box. I wanted to see how an LLM could turn the prompt-and-reflection pattern into something closer to a conversation, without slipping into therapist territory or pretending to be one.
The harder part is what an LLM should not do here. It can't diagnose, it shouldn't escalate emotional states, and it shouldn't give advice. It should ask another question.
The Solution
A Flutter cross-platform app with Firebase for authentication and storage, and a REST API gateway in front of the LLM. The app talks to the gateway, never directly to the model — the gateway is where prompt construction, safety filtering, and rate limits live.
- Guided prompts. A small library of opening prompts categorised by the kind of reflection they invite (gratitude, decision, recap, friction).
- Reflection-not-advice prompting. System prompts that bias the model toward asking a follow-up question rather than producing answers.
- API gateway. Single REST surface the app talks to; handles prompt assembly, response filtering, and per-user rate-limits.
- Local-first journal. Entries store on-device and sync to Firebase; the LLM only sees the entries the user explicitly chooses to send.
Tech Stack
- Flutter
- Dart
- Firebase · Auth
- Firebase · Firestore
- REST APIs
- LLM integration
My Specific Contribution
- Solo end-to-end. Auth, storage, prompts, the gateway, and inference path — all owned and shipped solo.
- Cross-platform UI. One Flutter codebase for iOS and Android with shared theme tokens.
- Prompt design. Iterated the system prompts for tone — reflective, never prescriptive.
- Safety scaffolding. Response filters, escalation copy for sensitive content, and explicit user consent for sending entries.
Impact
LLM
Production integration in a shipping mobile app — gateway, prompts, filters.
2 → 1
iOS + Android from one Flutter codebase, shared theme tokens.
Solo
Auth, storage, prompts, and inference owned end-to-end.
Visuals
Lessons
The interesting engineering wasn't in calling the model — it was in the layer between the app and the model. Prompt construction, response filtering, and rate-limiting belong on a server you own, not in the client. That gateway pattern is portable to any LLM-backed product, and it's the bit I'd reuse first if I built another one.