a love letter to tangled (android, iOS, and a search API)
at main 149 lines 6.7 kB view raw view rendered
1--- 2title: Roadmap 3updated: 2026-03-26 4--- 5 6## API: Search Stabilization 7 8Highest priority. This work blocks further investment in search quality and broader discovery features. 9 10- [x] Stabilize local development around PostgreSQL, with SQLite kept only as a rollback path 11- [x] Document backup, restore, and disk-growth procedures for the experimental local DB 12- [x] Research production backend options: PostgreSQL, Turso remote/libSQL, and Turso embedded replicas 13- [x] Write a production storage decision record with workload and operational tradeoffs, using `docs/adr/pg.md` and `docs/adr/turso.md` 14- [x] Define the migration path from the experimental local setup to the chosen production backend 15- [x] Add a durable read-through indexing job queue for records fetched through the API 16- [x] Add API smoke tests for `healthz`, `readyz`, `search`, `documents`, indexing, and activity in `packages/scripts/api/` 17 - desertthunder.dev DID: `did:plc:xg2vq45muivyy3xwatcehspu` 18 - Twisted AT URI: `at://did:plc:xg2vq45muivyy3xwatcehspu/sh.tangled.repo/3mho6hukiei22` 19 - Profile AT URI: `at://did:plc:xg2vq45muivyy3xwatcehspu/sh.tangled.actor.profile/self` 20 - Follow AT URI (desertthunder.dev follows npmx): `at://did:plc:xg2vq45muivyy3xwatcehspu/sh.tangled.graph.follow/3mhofstanru22` 21 - Star AT URI (desertthunder.dev stars microcosm-rs): `at://did:plc:lulmyldiq4sb2ikags5sfb25/sh.tangled.repo/3lvsxzinfz222` 22- ~~Add `just` targets for smoke-test runs locally and against a remote base URL~~ directly invoking the scripts is fine. 23- [x] Reuse the existing normalization and upsert path for on-demand indexing jobs 24- [x] Trigger indexing jobs from repo, issue, PR, profile, and similar fetch handlers 25- [x] Add dedupe, retries, and observability for indexing jobs 26- [x] Add a JetStream cache consumer with a persisted timestamp cursor 27- [x] Seed the JetStream cursor to `now - 24h` on first boot and rewind slightly on reconnect 28- [x] Store and serve bounded recent activity from the local cache 29- [x] Keep Tap as the authoritative indexing and bulk backfill path 30- [x] Define a controlled backfill and repo-resync playbook for recovery (`docs/reference/resync.md`) 31 32## API: Constellation Integration 33 34Completed on [2026-03-25](../CHANGELOG.md#2026-03-25) 35 36## API: Keyword Search Quality 37 38Improve keyword search quality without external dependencies. 39 40**Depends on:** API: Search Stabilization 41 42- [ ] Synonym expansion at query time (e.g. "repo" matches "repository") 43- [ ] Stemming and parser tuning for PostgreSQL full-text search 44- [ ] Prefix search support for autocomplete 45- [ ] Field weight tuning based on real query patterns 46- [ ] Recency boost for recently updated content 47- [ ] Star count ranking signal (via Constellation) 48- [ ] State filtering defaults (exclude closed issues) 49- [ ] Better snippets with longer context 50- [ ] Relevance test fixtures 51 52## API: Observability 53 54**Depends on:** API: Search Stabilization 55 56- [ ] Structured metrics: ingestion rate, search latency, embedding throughput 57- [ ] Dashboard or log-based monitoring 58 59## API: Embedding Adapter 60 61**Depends on:** API: Search Stabilization 62 63- [ ] Add an embedding provider interface in the API 64- [ ] Add a `llama.cpp` HTTP adapter targeting `llama-embeddings` 65- [ ] Add PostgreSQL embedding schema and jobs using `pgvector` 66- [ ] Define source-code chunking and repo re-embed triggers 67- [ ] Add `embed` and `reembed` operational commands 68- [ ] Add queue-depth, latency, and throughput metrics for embeddings 69- [ ] Keep semantic or hybrid retrieval behind a non-default search mode 70 71## App: Search & Discovery 72 73Wire the Explore tab to the search API and add activity feed. 74 75**Depends on:** API: Constellation Integration 76 77- [x] Search service pointing at Twister API 78- [x] Constellation service for star/follower counts 79- [x] Debounced search on Explore tab with segmented results 80- [x] Recent search history (local) 81- [x] Graceful fallback when search API unavailable 82- [x] Activity feed data source investigation (Jetstream vs polling) 83- [x] Activity tab with filters, infinite scroll, pull-to-refresh 84- [x] Home tab: surface recently viewed repos/profiles 85 86## App: Authentication & Social 87 88Bluesky OAuth and authenticated actions. 89 90**Depends on:** App: Search & Discovery (for Constellation service), API: Constellation Integration 91 92- [x] OAuth setup with `@atcute/oauth-browser-client` 93- [x] Login page, OAuth flow, callback handling 94- [x] Capacitor deep link configuration 95- [x] Session management (restore, refresh, logout, account switcher) 96- [x] Auth-aware XRPC client using dpopFetch 97- [ ] Star repos (write to PDS, count from Constellation) 98- [ ] Follow users (write to PDS, count from Constellation) 99- [ ] React to content (write to PDS, count from Constellation) 100- [ ] Authenticated profile tab (pinned repos, stats, starred, following) 101- [ ] Personalized feed ("For You" / "Global" toggle) 102 103## App: Write Features 104 105**Depends on:** App: Authentication & Social 106 107- [ ] Create issue (title + markdown body) 108- [ ] Comment on issues and PRs (threaded) 109- [ ] Close/reopen issues 110- [ ] Edit profile (bio, links, avatar, pinned repos) 111- [ ] OAuth scope upgrade flow 112 113## App: Offline & Performance 114 115**Depends on:** App: Search & Discovery (for cache persistence of search/feed data) 116 117- [x] IndexedDB-backed local cache and bookmark storage for first release 118- [ ] Migrate offline cache and saved-content storage from IndexedDB to SQLite 119- [ ] TanStack Query persister backed by SQLite or equivalent app-managed store 120- [ ] Pinned content store (save/unsave files for offline reading) 121- [ ] Pinned files UI (list, pin/unpin actions on file viewer, last-fetched timestamp) 122- [ ] Offline detection and banner 123- [ ] Migrate auth/session data to Ionic secure storage 124- [ ] Cache eviction (per-type limits and TTL, pinned content exempt) 125- [ ] List virtualization for large datasets 126- [ ] Lazy-load avatars, prefetch on hover 127- [ ] Code splitting and bundle optimization (target <500KB JS) 128 129## App: Real-Time & Advanced 130 131**Depends on:** App: Authentication & Social, App: Offline & Performance 132 133- [ ] Jetstream integration for live `sh.tangled.*` events 134- [ ] Live UI indicators (new commits, new feed items, PR status) 135- [ ] Custom feed presets ("My repos", "Watching", "Team") 136- [ ] Repo forking 137- [ ] Labels (display, filter, manage) 138- [ ] Expanded reactions with emoji picker 139- [ ] PR interdiff (compare rounds) 140- [ ] Knot info display 141 142## App: Push Notifications 143 144**Depends on:** App: Authentication & Social 145 146- [ ] Register device token on login 147- [ ] Subscribe to relevant events 148- [ ] Deliver via APNs/FCM 149- [ ] Handle notification taps (deep link to relevant screen)