···991010### 2026-01-03
11111212-- Implemented `malfestio-readability` crate: A custom, rule-based content extraction engine replacing `dom_smoothie`, featuring XPath support (ftr-site-config compatible) and a Mozilla Readability-based generic fallback.
1212+- OAuth login directly to user's PDS with DPoP token binding
1313+ - Handle resolution via DNS TXT or `/.well-known/atproto-did`
1414+- Bi-directional sync infrastructure with conflict resolution
1515+- Implemented `malfestio-readability` crate
1616+ - Custom, rule-based content extraction engine replacing `dom_smoothie`, featuring XPath support (ftr-site-config compatible) and a Mozilla Readability-based generic fallback.
13171418### 2026-01-02
1519
+16-51
docs/todo.md
···11# Product + Technical Roadmap
2233-## Auth direction
44-55-- ATProto is moving toward OAuth for client↔PDS authorization.
66-- Plan for OAuth support even if MVP starts centralized.
77-83## Roadmap Milestones
941010-> [!NOTE]
1111-> Completed milestones (A-K) have been moved to [CHANGELOG.md](/CHANGELOG.md).
1212-1313-### Milestone L - ATProto Integration Pass
1414-1515-#### Deliverables
1616-1717-**Identity & Auth:**
1818-1919-- [x] OAuth login directly to user's PDS
2020-- [x] Handle resolution via DNS TXT or `/.well-known/atproto-did`
2121-- [x] DPoP token binding for secure API calls
2222-2323-**Local Development:**
2424-2525-- [x] Document local testing with real Bluesky accounts
2626-- [x] Add justfile commands for common dev tasks
2727-- [x] Environment variable configuration guide
2828-- [x] Update health check endpoint for service monitoring
2929-- [x] Add logging for OAuth flow steps
3030-3131-**Sync & Conflict Resolution:**
3232-3333-- [x] Bi-directional sync infrastructure
3434-- [x] Conflict resolution strategy
3535-- [x] API endpoints for sync operations
3636-- [x] Offline queue for pending publishes
3737-- [x] Frontend sync store with IndexedDB persistence (Dexie.js)
3838-- [x] Sync status UI indicators
3939-4040-**Deep Linking:**
4141-4242-- [ ] AT-URI deep linking from external clients
4343-- [ ] Handle `at://` URL scheme in app
4444-- [ ] Link preview generation for shared content
4545-4646-#### Acceptance
4747-4848-- User can log in with existing Bluesky/PDS identity
4949-- OAuth flow works with production bsky.social accounts
5050-- Developers can test locally using real accounts (see [Local Development Guide](./local-dev.md))
5151-- Local drafts sync correctly after reconnecting
5252-535### Milestone M - Reliability, Observability, Launch (v0.1.0)
546557#### Deliverables
···8436- System handles 10x expected load without degradation.
8537- Mean time to recovery < 5 minutes for common failures.
86388787-### Milestone N - Custom Feed Generator (v0.2.0)
3939+### Milestone N - Deep Linking (v0.2.0)
4040+4141+#### Deliverables
4242+4343+- [ ] AT-URI deep linking from external clients
4444+- [ ] Handle `at://` URL scheme in app
4545+- [ ] Link preview generation for shared content (backend OG middleware)
4646+4747+#### Acceptance
4848+4949+- Users can share AT-URIs that open directly to content
5050+- Shared links show rich previews on Slack, Twitter, Discord, etc.
5151+5252+### Milestone O - Custom Feed Generator (v0.3.0)
88538954#### Deliverables
9055···154119- Most feeds can garbage collect data older than 48 hours
155120- Reference: [Feed Generator Starter Kit](https://github.com/bluesky-social/feed-generator)
156121157157-### Milestone O - Moderation + Abuse Resistance (v0.3.0)
122122+### Milestone P - Moderation + Abuse Resistance (v0.4.0)
158123159124#### Deliverables
160125···185150186151**Reference:** [Ozone Moderation Service](https://github.com/bluesky-social/ozone)
187152188188-### Milestone P - Readability Updates
153153+### Milestone Q - Readability Updates (v0.5.0)
189154190155#### Deliverables
191156