Skip to content
Back to projects
Project

Aurelian

MVP

Daily stoic reflection in under two minutes - grounded in your actual day.

Preview of Aurelian

Aurelian helps you align your day, stoically, in under two minutes. The app combines a personal 12-week focus goal, the day's most important tasks, your current energy level and vetted stoic quotes into a short, concrete daily reflection. Deliberately not another quote-of-the-day app, but a stoic perspective on the user's actual day - calm and grown-up in tone, without motivational platitudes.

Problem

Stoicism apps serve generic quotes with no bearing on everyday life, journaling apps demand too much input and feel like work, and AI reflection tools invent quotes - with philosophical sources that destroys credibility instantly. Ambitious users want a short, practical moment of clarity before the day: no to-do list, no coach tone, no made-up wisdom.

Role

Everything end-to-end - product definition and PRD, a modular local-first architecture, the SwiftUI frontend, domain and application logic as a Swift package, curating the vetted quote database, the hardened Node backend endpoint for the AI generation, plus deployment, App Store preparation and test strategy.

The solution

The core is a very short daily loop. In the morning the user enters one to three important things, optionally adds what is on their mind, and picks their energy level; from that Aurelian generates a stoic perspective and a concrete rule for the day. In the evening, two or three short questions follow. The output is strictly structured, and the AI only ever selects from vetted, locally supplied quote candidates.

  • Fixed output structure: quote, source, today's perspective, a control question, a rule for the day, an evening question - short and concrete instead of a motivational speech.
  • The AI references exactly one quote ID from the supplied candidates and may never invent quotes, sources or authors.
  • Morning check-in in under two minutes: priorities, optional free text, energy level (Low / Normal / High).
  • Evening reflection deliberately short: three questions, three minutes at most, no pressure to analyze - stored locally.
  • Offline fallback: if no AI endpoint is configured or reachable, the app keeps generating locally.
Features
  • Minimal onboarding (max. 4 screens)done
  • Morning check-in (priorities, free text, energy)done
  • Structured stoic outputdone
  • Vetted quote database with provenancedone
  • Evening reflection (three short questions)done
  • Journal / history with detail viewdone
  • Local reminder notificationsdone
  • Offline fallback without an AI endpointdone
  • Remote generation via a Groq endpointdone
  • Favorites and an editable focus goalV0.2planned
  • Weekly reviewV0.3planned
  • Paywall, export (PDF/Markdown), Life WheelV1.0planned
Architecture

Local-first and modular, with clear boundaries between product rules and technical details (UI, persistence, notifications, AI provider). A platform-independent Swift package is cut into five library targets (Domain, Application, Content, Infrastructure, Design); the SwiftUI app composes them. Clear boundaries are preferred over heavy abstractions.

  • Dependency direction: apps/ios -> Application -> Domain; the domain layer depends on nothing - no UI, no persistence, no network, no AI SDK.
  • The AI is an adapter behind the Application contract DailyReflectionGeneratorPort: it receives user context plus quote candidates and returns structured output that references exactly one quote ID.
  • Core ports decouple the outside world: DailyEntryRepository, FocusGoalRepository, UserPreferencesRepository, QuoteRepository, Clock, IDGenerator.
  • Content -> Domain and Infrastructure -> Content: the vetted quote dataset lives behind a QuoteRepository, not scattered through the UI code.
  • Generation runs over a stateless Node endpoint with a server-side key; if it fails, the local fallback takes over without breaking the user's flow.
Challenges

Preventing quote hallucinations

Problem

The central trust question: if the AI invents quotes, authors or sources, that instantly destroys credibility for philosophical texts.

Solution

A vetted local database plus a deterministic QuoteSelectionPolicy hands the AI only permitted candidates. The AI picks exactly one ID but never invents - provenance (author, work, reference) stays guaranteed real.

AI sounds generic

Problem

Standard prompts produce interchangeable motivational lines with no bearing on the user's actual day.

Solution

A very strict prompt with real daily data in context and short, concrete outputs instead of motivational speeches - a stoic perspective on this exact day.

API-key protection and cost

Problem

Direct in-app calls to the LLM provider expose the key and make costs uncontrollable.

Solution

Moving generation to a stateless server endpoint with a server-side key, fixed-window rate limiting, limited retries and exactly one output per user per day.

Testability despite iOS dependencies

Problem

SwiftUI and SwiftData are hard to test in isolation - product rules risk being chained to the UI framework.

Solution

The modular, port-based architecture keeps domain and application logic independent of SwiftUI/SwiftData and thus testable across more than 26 test files in five test targets.

Timeline
  1. 29 April 2026

    Foundation in a day

    Domain package, content validation, daily-entry rules, design tokens, first application use cases (onboarding, morning check-in), SwiftData repositories and a SwiftUI app shell with onboarding, check-in, journal and focus wired up.

  2. 30 April - 1 May

    Persistence & quote policy

    Deeper persistence, extended onboarding and journal detail; then the deterministic quote-selection policy, the catalog expansion, the decision for Groq, a remote reflection adapter, the local notification scheduler and first tests.

  3. 2 May

    Endpoint live & E2E

    Stateless Groq endpoint implemented, hardened, deployed to production and validated by iOS E2E; plus App Store signing, shell assets and the public marketing, privacy and support pages.

  4. 3 May

    Compliance & polish

    App Store compliance answers, a store-metadata draft, polishing the accessibility copy and buffering the text inputs. Status since: Client MVP Ready / App Store Release Prep.

What I learned
  • A port-based, modular architecture keeps product rules testable independently of SwiftUI and SwiftData - the domain layer depends on nothing and can be checked without an iOS simulator.
  • Quote hallucinations are not a prompt problem but an architecture problem: solved with a deterministic selection policy that hands the AI only permitted candidates - the AI picks, it never invents.
  • Moving generation from the client to a stateless server endpoint protects the API key, caps the cost (one output per user per day) and still allows a local offline fallback.
  • Text-input latency on iOS is real: a dedicated investigation and buffering of the input kept the Today screen smooth.