Tell me what they meant. Tell them what you mean.
iOS 17+ communication coach app. Paste a text from your mom, boss, partner, mother-in-law — Decode reads between the lines and drafts three reply versions (warmer / neutral / boundary).
The decoding engine runs entirely on-device — no LLM call, no analytics, no servers — using a Swift-native algorithm with combinatorial template generation across 8 cultures and 14 relationship roles.
- SwiftUI 6, iOS 17+
- StoreKit 2 (subscription + lifetime tier)
- JSON-on-disk persistence (no SwiftData, no iCloud)
- Pure-Swift decode + reply engine (no LLM, no network)
| Stage | Files |
|---|---|
| Signal detection | Decode/Engine/SignalDetector.swift |
| Cultural cues | Decode/Engine/Phrasebook.swift (33 cues, 8 cultures) |
| Decode (3-layer) | Decode/Engine/DecodeEngine.swift |
| Reply (3 tones) | Decode/Engine/ReplyEngine.swift |
| Iteration mode | Decode/Engine/IterationEngine.swift |
| Deterministic RNG | Decode/Engine/SeededRNG.swift (SplitMix64 + FNV-1a) |
Distinct draft combinations: 378M base × regen-counter (effectively unbounded) × signal-biasing → into the billions. See ReplyEngine.distinctOutputEstimate.
brew install xcodegen
xcodegen generate
open Decode.xcodeproj
# ⌘R against any iPhone simulatorxcodebuild -project Decode.xcodeproj -scheme Decode \
-destination 'platform=iOS Simulator,name=iPhone 17' \
-configuration Debug test CODE_SIGNING_ALLOWED=NO24 unit tests covering: engine determinism, fuzz survival across weird/empty/emoji-only/multi-script input, persistence round-trip, RNG cross-launch stability, search-space sanity.
The app honors a --screenshot=<screen> launch argument that jumps to a single screen with seeded state. Used to verify each flow in CI without UI driving:
xcrun simctl launch booted com.atrium.decode --screenshot=decoded
xcrun simctl launch booted com.atrium.decode --screenshot=reply
xcrun simctl launch booted com.atrium.decode --screenshot=iterationOutcome
xcrun simctl launch booted com.atrium.decode --screenshot=libraryAdd
xcrun simctl launch booted com.atrium.decode --screenshot=libraryForget
xcrun simctl launch booted com.atrium.decode --screenshot=onboard1
xcrun simctl launch booted com.atrium.decode --screenshot=onboard2
xcrun simctl launch booted com.atrium.decode --screenshot=onboard3#if DEBUG-gated — stripped from release builds.
- No accounts. No email. No phone number.
- No LLM call.
- No analytics SDK.
- Messages live in memory only (or in a local JSON file if you save the relationship profile).
- "Forget" wipes any profile + its decoded history. There is no backup.
Full policy: docs/privacy.html
Source available, all rights reserved.
- Landing: leexuanxuan95-dev.github.io/decode
- Privacy: /privacy.html
- Support: /support.html
- Terms: /terms.html