A native reader and writer for the Standard.site publishing ecosystem on AT Protocol.
Inkwell is a native app available on iOS and Android. This monorepo also contains the marketing/legal site that hosts the app's install sources and OAuth metadata.
| Directory | Purpose |
|---|---|
iOS/ |
iOS app (SwiftUI) |
Android/ |
Android app (Kotlin/Compose) |
website/ |
Marketing/legal site and OAuth metadata (inkwell.ewancroft.uk) |
- Reads
site.standard.publicationandsite.standard.documentrecords from the author's PDS. - Renders Markpub Markdown plus Leaflet, pckt, and Offprint content. Uses
textContentas a fallback. Native block rendering for Leaflet (including blob-stored pages), Markdown for everything else. - Real device screenshots are checked in under
iOS/screenshots/,Android/fastlane/metadata/.../images/phoneScreenshots/, andwebsite/static/screenshots/, captured via each app's-screenshot(iOS) / intent-extra (Android) mock-data mode. - Theme resolution: Leaflet's light/dark palette →
basicTheme→ system defaults. Publication-level by default, overridable per document. - Publishes Standard.site documents with portable metadata and selectable content formats.
- Creates and removes
site.standard.graph.subscriptionrecords and recommends. - Searches the cross-platform Standard.site public index, fetches records directly from the author.
- Publication
.well-knownand document<link>verification. - Polls subscribed publications for notifications (in-app + local), including background app refresh.
- OAuth sign-in with your AT Protocol handle (no app password). Session resumes silently on relaunch.
git clone https://github.com/ewanc26/inkwell.git
cd inkwellOpen iOS/Inkwell.xcodeproj in Xcode, build and run. Sign in with your AT Protocol handle via OAuth.
git clone https://github.com/ewanc26/inkwell.git
cd inkwell/AndroidBuild with Gradle:
./gradlew assembleDebugRun on API 26+ device or emulator. Sign in with your AT Protocol handle via OAuth.
Standard.site standardises publishing metadata rather than one body format. Inkwell always publishes textContent and defaults to at.markpub.markdown, while retaining readers for pub.leaflet.content, blog.pckt.content, and app.offprint.content.
Inkwell-owned lexicons use the uk.ewancroft.inkwell.* namespace. Shared records use their canonical site.standard.* NSIDs.
The app icon and in-app wordmark share one set of vector coordinates, so they always match. Both are duotone: the letterform follows the system foreground colour (light/dark and tinted icon modes), while the ink drop uses one fixed brand colour in Display P3.
iOS/InkwellTests/StandardSiteTests.swift covers AT-URI parsing, record encoding/decoding, publication/document association rules, theme and verification-endpoint resolution, and tolerant decoding of malformed records.
Run ./gradlew test from the Android/ directory.
- iOS: ATProtoKit — via Swift Package Manager (
https://github.com/MasterJ93/ATProtoKit.git) - Android: atproto-kotlin — via Gradle version catalog
If you find this project useful, consider supporting its development:
AI tools may be used when contributing, but do not add Co-authored-by: trailers crediting AI agents. Attribution is reserved for human contributors only.
AGPL 3.0 — see LICENSE