Native iOS + web mobile reader for aklman.com, backed by a small Express API that pulls and caches RSS content.
pnpm install
pnpm --filter @aklman/api run dev # API on http://localhost:5001
pnpm --filter @aklman/mobile run ios # build + launch in iOS simulatorFor dev on a physical device:
EXPO_PUBLIC_DOMAIN=<your-mac-lan-ip>:5001 pnpm --filter @aklman/mobile run devapps/
api/ Express 5 + Drizzle ORM (@aklman/api)
mobile/ Expo SDK 54 / React Native 0.81 (@aklman/mobile)
packages/
api-client/ Generated react-query hooks (@aklman/api-client)
api-schema/ Generated Zod schemas (@aklman/api-schema)
api-types/ OpenAPI spec + orval config (@aklman/api-types)
db/ Drizzle schema & client (@aklman/db)
scripts/ Misc dev scripts
docs/tasks/ Historical task archive (delivered features)
pnpm run typecheck— full repo typecheckpnpm --filter @aklman/api run dev— API server (port 5001 by default; override withPORT)pnpm --filter @aklman/mobile run ios— build native dev client + launch simpnpm --filter @aklman/mobile run dev— Metro only (requires existing dev client install)pnpm --filter @aklman/api-types run codegen— regeneratepackages/api-clientandpackages/api-schemafrompackages/api-types/openapi.yamlpnpm --filter @aklman/db run push— push Drizzle schema to local DB
API:
PORT(default5001)DATABASE_URL— Postgres connection string
Mobile (Expo public, baked into bundle):
EXPO_PUBLIC_DOMAIN—host:portfor the API (defaultlocalhost:5001)EXPO_PUBLIC_SCHEME—httporhttps; auto-resolves based on whether domain is RFC1918/loopback
- pnpm workspaces, Node 24, TypeScript 5.9
- API: Express 5, esbuild bundling, pino logging
- DB: PostgreSQL + Drizzle ORM, validation via Zod (
zod/v4) anddrizzle-zod - Mobile: Expo Router (Liquid Glass NativeTabs on iOS 26+), React Query, react-native-webview for article HTML
- Codegen: Orval reads
openapi.yaml→ react-query hooks + Zod schemas
- The bottom Liquid Glass tab bar reads from
UITraitCollection, not RNAppearance. Theme picker callsAppearance.setColorSchemeto sync them — seeapps/mobile/context/ThemeContext.tsx. apps/data/cache/is local RSS cache, gitignored.- Three pages (
about,showcases, post detail) render content from aklman.com via WebView rather than native RN.