Quill — a native Bluesky client for iPhone and iPad, built with SwiftUI and AT Protocol.

README.md

Quill #

A native Bluesky client for iPhone, iPhone Duo and iPad (Android to follow).

See AGENTS.md for layout, commands and conventions.

Quick Start #

brew install xcodegen
make test
make ios-generate
open apps/ios/Quill.xcodeproj

Local API Keys #

To enable GIF search, create apps/ios/Config/Local.xcconfig with KLIPY_API_KEY = your_key. This optional file is ignored by Git and loaded by both Debug and Release builds. Never put provider credentials in project.yml.

OAuth Deployment #

The production OAuth metadata service is hosted on Railway at https://quillapp.at. Its client ID is https://quillapp.at/client-metadata.json, and the native callback is at.quillapp:/oauth/callback. See the worker guide for runtime configuration.

Deploy the worker independently of the iOS app:

railway up services/oauth-worker --path-as-root \
  --project 90c005fd-c175-4739-8c48-e8bfe061704e \
  --environment da2abdc2-64d4-4b99-b663-19783844bd3e \
  --service 64137a97-126f-46d1-9f6b-9427b2122c81 \
  --ci -m "Describe the worker change"
python3 scripts/verify-oauth-worker.py

DNS is managed through the Marque TUI. The apex CNAME targets hi2dj4fb.up.railway.app (flattened by Marque), with TTL 300. _railway-verify holds Railway's ownership-verification TXT record. The service uses port 8080, /healthz, PUBLIC_URL=https://quillapp.at, APPLE_TEAM_ID=G39TU2R26A, and APPLE_BUNDLE_ID=tech.stygian.quill. It is a public native OAuth client; do not configure a shared client signing key.

The deployment smoke check verifies the public worker contract. Complete OAuth acceptance also requires signing in through the app, returning from the browser, and force-quitting/relaunching to verify the securely stored session.