a love letter to tangled (android, iOS, and a search API)
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)