One thing, sized to the gap, then done.
Postea is a small iOS app for the gaps in your day — between meetings, waiting for coffee, the minute before bed. It notices the moment, then offers one small thing: a breath, a passage, a puzzle, a person to text. You do it. Then you’re done. No feed. No streak. No nudges to come back.
This repository is the source code, the privacy policy, the support page, and the accessibility statement. Everything Postea does, you can read here.
Seven kinds of moments. Each is small, takes about a minute, and never repeats too quickly.
| Sit | Brief guided pauses — breathing, body awareness. Logs to Apple Health as Mindful Minutes. | 1–4 min |
| Read | Short passages from public-domain writers — Aurelius, Rilke, Lao Tzu, Tagore, Thoreau, Whitman. | <1 min |
| Reach | A nudge to message someone you haven’t spoken to recently. Compose in the app or jump to Messages. | <2 min |
| Learn | An untranslatable word from somewhere in the world — saudade, komorebi, hiraeth, wabi-sabi. | <1 min |
| Solve | A small logic puzzle. Reveal the solution when you’re ready. | 1–8 min |
| Make | A one-minute creative prompt. A haiku. A six-word story. A sketch with your wrong hand. | 1–4 min |
| Notice | A brief attention exercise. Look up. Listen. Find what’s already there. | <1 min |
Postea ships with 2,500+ offerings — curated where curation matters (every Read passage is real public-domain literature, every Solve puzzle has a verified solution) and procedurally generated where variety matters more than authorship.
Postea has no servers, no analytics, no accounts. Calendar, motion, contacts, and location data are read on-device and never leave it. The only data that syncs across your devices is your settings — via your private iCloud, never to me.
Full details in PRIVACY.md.
VoiceOver, Dynamic Type, Reduce Motion, Reduce Transparency, Bold Text, Increase Contrast, and 44pt minimum tap targets are first-class — not bolted on. Accessibility bugs are the highest-priority bugs in this app; please report them.
Full details in ACCESSIBILITY.md.
If you want to build the app yourself or contribute a fix, here’s how.
brew install xcodegenThe Xcode project is generated from project.yml and is not checked into git.
make project # regenerate Postea.xcodeproj
make build # build the app
make test-all # unit + UI tests
To build for a real device, set your Apple Developer team ID:
DEVELOPMENT_TEAM=<your-team-id> xcodegen generate
| Target | What it is |
|---|---|
Postea |
The main iOS app |
PosteaWidgetExtension |
Live Activity (Sit timer on Lock Screen / Dynamic Island) + home-screen widget |
PosteaTests |
Swift Testing unit tests (38 tests in 7 suites) |
PosteaUITests |
XCUITest UI tests (8 tests covering onboarding, idle screen, sheets) |
Every push and pull request runs unit tests, UI tests, and the widget build via GitHub Actions. The workflow:
xcodegen and xcbeautifysimctl --json)PosteaTests, then PosteaUITests, then builds PosteaWidgetExtensionPostea/
Core/ — moment detection (calendar, motion, location, unlock signals)
DesignSystem/ — DS namespace: typography, spacing, motion, components
Models/ — SwiftData models + value types
Resources/ — assets, seed content, Info.plist, privacy manifest
Services/ — content engine, contact recency, notifier, etc.
Views/ — SwiftUI views (offerings, onboarding, settings, idle)
PosteaWidget/ — Live Activity + home-screen widget
PosteaTests/ — Swift Testing unit tests
PosteaUITests/ — XCUITest UI tests
scripts/ — content generator
Bundled content lives in Postea/Resources/ContentPacks/seed-v1.json. To regenerate the templated portions (Sit / Solve / Make / Notice / Reach / Learn template variations), run:
python3 scripts/generate_postea_content.py
The generator preserves curated baseline content and only adds template-driven items. Read content stays curated and is never machine-generated. Bump packVersion so existing installs re-import on next launch.
Some runtime identifiers in this codebase retain a legacy liminal prefix — bundle IDs (dev.liminal.app*), the App Group (group.dev.liminal.app), the BG task (dev.liminal.bg.detect), the URL scheme (liminal://), the SwiftData store filename (Liminal.store), and UserDefaults keys. They are deliberately preserved so installed copies don’t lose user state when the project rebrands. Anything user-visible is “Postea.”
Postea is a personal project, but if you find a bug or want to suggest a small improvement, open an issue or a PR. I read every one. The app’s design philosophy is one thing, sized to the gap, then done — that means I will probably not merge changes that add streaks, social features, in-app purchases, badges, or anything that nudges people back. But content, accessibility, privacy hardening, and bug fixes are always welcome.
Code is released under the MIT License — see the LICENSE file in this repository.
The bundled Read content is sourced from public-domain works (translations or original works dated before 1928, plus selected Sefaria public-domain Mishnah). Each item is attributed to its source in the app and in the seed file. If you believe an item is incorrectly attributed or not actually public domain in your jurisdiction, please email me and I will remove it immediately.
Built and maintained by Honorius M. Neogy.
If Postea has helped you, the most useful thing you can do is leave a short review on the App Store.