learn and share notes on atproto (wip) 馃 malfestio.stormlightlabs.org/
readability solid axum atproto srs
1# Product + Technical Roadmap 2 3## Roadmap Milestones 4 5### Milestone M - Reliability, Observability, Launch (v0.1.0) 6 7#### Deliverables 8 9**Observability:** 10 11- [ ] Structured logging with correlation IDs 12- [ ] Metrics collection (Tracing spans) 13- [ ] Error tracking 14 15**Reliability:** 16 17- [ ] Database backups + restore drills 18- [ ] Health check endpoints (`/health`, `/ready`) 19- [ ] Graceful shutdown handling 20- [ ] Circuit breakers for external dependencies 21 22**Load Testing:** 23 24- [ ] Study session throughput targets 25- [ ] Feed generation latency benchmarks 26- [ ] Search query performance under load 27 28**Launch Prep:** 29 30- [ ] Beta program signup flow 31- [ ] Feedback collection mechanism 32- [ ] Feature flags for gradual rollout 33 34#### Acceptance 35 36- System handles 10x expected load without degradation. 37- Mean time to recovery < 5 minutes for common failures. 38 39### Milestone N - Deep Linking (v0.2.0) 40 41#### Deliverables 42 43- [ ] AT-URI deep linking from external clients 44- [ ] Handle `at://` URL scheme in app 45- [ ] Link preview generation for shared content (backend OG middleware) 46 47#### Acceptance 48 49- Users can share AT-URIs that open directly to content 50- Shared links show rich previews on Slack, Twitter, Discord, etc. 51 52### Milestone O - Custom Feed Generator (v0.3.0) 53 54#### Deliverables 55 56**Infrastructure:** 57 58- [ ] Feed Generator service with `did:web` identity 59- [ ] Publish `app.bsky.feed.generator` declaration record to creator's repo 60- [ ] DID document with service endpoint for feed requests 61 62**Endpoints:** 63 64- [ ] `app.bsky.feed.getFeedSkeleton` - Return post URIs + cursor for pagination 65- [ ] `app.bsky.feed.describeFeedGenerator` - Feed metadata (DID, name, description) 66- [ ] JWT authentication for user-personalized feeds 67 68**Algorithms:** 69 70- [ ] "Trending Decks" - Top decks by fork/like count in last 7 days 71- [ ] "New from Following" - Latest decks from followed creators 72- [ ] "Study Streak Leaders" - Decks with highest completion rates (anonymized) 73 74**Indexing:** 75 76- [ ] Subscribe to `com.atproto.sync.subscribeRepos` (or Jetstream) for `org.stormlightlabs.malfestio.*` records 77- [ ] Index posts with compound cursor (timestamp::CID) for deterministic pagination 78- [ ] Garbage collect indexed data older than 48 hours (except pinned content) 79 80#### Acceptance 81 82- Custom feed appears in Bluesky and other AT Protocol clients. 83- Feed surfaces relevant learning content based on engagement signals. 84- Pagination works correctly across feed refreshes. 85 86#### Implementation Details 87 88**Core Flow:** see [AT Notes](./at-notes.md#feeds) 89 90**Skeleton Response Format:** 91 92```json 93{ 94 "feed": [ 95 {"post": "at://did:example/app.bsky.feed.post/1"}, 96 {"post": "at://did:example/app.bsky.feed.post/2"} 97 ], 98 "cursor": "1683654690921::bafyrei..." 99} 100``` 101 102**Skeleton Metadata Types:** 103 104```typescript 105type SkeletonItem = { 106 post: string // post URI 107 reason?: Reason // optional context (e.g., repost) 108} 109type ReasonRepost = { 110 $type: 'app.bsky.feed.defs#skeletonReasonRepost' 111 repost: string // repost URI 112} 113``` 114 115**Considerations:** 116 117- Validate user JWTs if feed depends on user state (follows, likes) 118- Use compound cursor (timestamp::CID) for deterministic pagination 119- Most feeds can garbage collect data older than 48 hours 120- Reference: [Feed Generator Starter Kit](https://github.com/bluesky-social/feed-generator) 121 122### Milestone P - Moderation + Abuse Resistance (v0.4.0) 123 124#### Deliverables 125 126**Labeler Infrastructure:** 127 128- [ ] Dedicated Bluesky account for labeler service 129- [ ] Publish `app.bsky.labeler.service` record to make discoverable 130- [ ] Self-host Ozone backend + UI (Docker setup in `HOSTING.md`) 131- [ ] Configure report types via `goat` CLI 132 133**Endpoints:** 134 135- [ ] `com.atproto.label.subscribeLabels` - real-time label stream 136- [ ] `com.atproto.label.queryLabels` - query published labels 137- [ ] `com.atproto.report.createReport` - accept user reports 138 139**Moderation Features:** 140 141- [ ] Reporting pipeline + review queue UI 142- [ ] Rate limits + spam heuristics 143- [ ] Takedown/visibility states (shadowed, removed, quarantined) 144- [ ] Audit logging for moderation actions 145 146#### Acceptance 147 148- You can safely operate an open publishing surface. 149- Users can subscribe to your labeler and see moderation applied. 150 151**Reference:** [Ozone Moderation Service](https://github.com/bluesky-social/ozone) 152 153### Milestone Q - Readability Updates (v0.5.0) 154 155#### Deliverables 156 157**Multi-page Support:** 158 159- [ ] `single_page_link` directive - find "view full article" link 160- [ ] `next_page_link` directive - paginate through article pages 161- [ ] Concatenate content from multiple pages 162- [ ] Avoid circular pagination 163 164**Advanced Directives:** 165 166- [ ] `http_header(name)` directive - custom headers for fetching 167- [ ] `replace_string(find): replace` directive - text replacement 168- [ ] `find_string` directive - text pattern matching 169 170**Quality:** 171 172- [ ] Better table handling in markdown 173- [ ] Image caption extraction 174- [ ] JSON-LD support 175 176**Performance:** 177 178- [ ] LRU cache for parsed configs 179- [ ] Parallel candidate scoring 180- [ ] Lazy XPath evaluation 181 182**Markdown Conversion:** 183 184- [ ] Custom markdown converter (more control than html2md) 185- [ ] Code block language detection 186 187#### Acceptance 188 189- [ ] Can correctly extract multi-page articles (e.g., long news reports). 190- [ ] Advanced string manipulation allows for cleaner output on tricky sites. 191- [ ] Performance remains stable under high load. 192 193## Open Question/Parked Decisions 194 195- Full offline authoring + later publish 196- Federation depth: publish-to-PDS in the first public beta 197- Content extraction: store extracted article snapshots locally (browser) 198 - Persist only metadata + highlights