Inspiration
Dream journals often force a false choice: a blank text box that offers no help, or an “AI dream interpreter” that presents speculation as authority. I wanted a quieter third option—an iPhone journal that preserves the dreamer’s own words, finds useful patterns locally, and makes any generated reflection optional, consent-based, and explicitly non-diagnostic.
What it does
Upon Waking is a private, local-first dream journal for iPhone. A dream can be captured by typing or recording, then enriched with emotions, people, places, symbols, colours, tags, vividness, lucidity, and private notes. Voice drafts recover across interruptions, transcription stays on-device, and the original transcript is preserved.
Atlas turns structured details into deterministic on-device patterns: recurring symbols, people, places, emotions, dream types, recent shifts, co-occurrences, monthly summaries, and a readable calendar. Every pattern links back to the source dreams, and sparse data is reported honestly.
For deeper exploration, the app offers a structured eight-part reflection flow. The local mock works offline. An optional private backend uses the OpenAI Responses API with GPT-5.6, strict structured output, minimized context, store: false, double validation, and no content logging. The dreamer reviews exactly what will be sent and confirms each request. Generated material is framed as reflection—not diagnosis, prediction, or fact.
How I built it
The native app uses SwiftUI, SwiftData, AVFoundation, Speech, and a typed service boundary. The optional backend uses TypeScript and the OpenAI Responses API. The repository includes 52 iOS unit tests, eight essential UI flows, and 14 backend tests.
I directed the product stance, privacy boundaries, interaction model, and editorial tone. Codex with GPT-5.6 translated those decisions into the data model, recoverable capture architecture, deterministic Atlas, interpretation contracts, validation, backend, and test suite. We worked in small milestones: inspect, implement, build the full target, run focused tests, diagnose failures, and refine. Codex was especially valuable when persistence, recovery, validation, and provider-boundary behavior crossed several layers at once.
Challenges
The hardest problem was not generating an interpretation; it was constraining one. The app needed to preserve consent, minimize context, reject malformed or unsafe output, distinguish an old reflection from an edited source dream, and remain complete when remote AI is never enabled. Voice recovery and on-device transcription introduced a second state-machine problem involving interruptions, permissions, audio retention, and relaunch.
Accomplishments
I am proud that the app feels like a finished journal rather than an AI wrapper. It has a complete offline experience, recoverable capture, transparent pattern evidence, accessible list alternatives, strict remote boundaries, and a substantial automated test suite. GPT-5.6 adds a carefully bounded capability without becoming the product’s authority.
What I learned
The best use of Codex was sustained engineering collaboration. Clear product boundaries made the implementation faster, not slower: once privacy, safety, and source-of-truth rules were explicit, Codex could build and test confidently across the entire stack.
What’s next
Next I would complete a physical-device audio pass, deploy the backend with production authentication and attestation, and add app lock, protected app-switcher state, export, and delete-all-data controls.
Built With
- avfoundation
- codex
- gpt-5.6
- openai-responses-api
- speech
- swift
- swiftdata
- swiftui
- typescript


Log in or sign up for Devpost to join the conversation.