postea

Postea

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.



What Postea offers

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.

How it works

Privacy

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.

Accessibility

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.


Building from source

If you want to build the app yourself or contribute a fix, here’s how.

Prerequisites

The Xcode project is generated from project.yml and is not checked into git.

Build & test

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

Targets

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)

Continuous integration

Every push and pull request runs unit tests, UI tests, and the widget build via GitHub Actions. The workflow:

Project layout

Postea/
  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

Content generation

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.

A note on identifiers

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.”


Contributing

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.

License

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.

Credits

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.