--- name: project-feedreader description: "FeeDreader (formerly \"Feeds\") Android RSS reader app (org.terst.feedreader) built for Peter — standalone greenfield project, separate from doot" metadata: node_type: memory type: project originSessionId: 375c858e-e817-41e8-a076-7920d22eab2b modified: 2026-09-07T07:08:26.805Z --- Building "FeeDreader" (renamed 2026-07-23 from "Feeds" — pun on "fee dreader", avoiding paywalls), a standalone Android RSS/Atom reader app for Peter, package `org.terst.feedreader`, repo at `/workspace/feedreader` (separate git repo from doot, same local git identity). Greenfield build authorized with "just go for it - greenfield, simple design, just build." Core feature set: RSS/Atom subscriptions (now with OPML-category folder grouping + case-insensitive sort, and a virtual "Last fetch failed" section), full article + WebView/Readability.js reader-mode view, OPML import/export, keyword mute/highlight filters, save-to-Stash integration (explicit action, not automatic), Android share-sheet target. Explicitly excluded: local full-text search, home-screen widget, notifications, social features. Has an owl-themed adaptive launcher icon (hand-authored vector, no external design tool available) and a short paywall-avoidance philosophy note in Settings. **Why:** Inoreader (his prior RSS reader) removed OPML export, forcing a migration off it — his ~107 feeds were pulled via Inoreader's Reader API (ClientLogin) and re-packaged as OPML for import into this app. **Build trap (verified 2026-09-03): `/workspace/feedreader` has uncommitted dependency-upgrade work sitting in the working tree** — AGP 8.3.2→8.13.2, Kotlin 2.0.21→2.2.21, Gradle 8.6→9.5, compileSdk/minSdk/targetSdk 34→36, plus the whole androidx family bumped (the BACKLOG's "AGP / compileSdk upgrade" item, started but never finished or committed). Building without noticing produces a **66MB APK instead of ~18MB** — minSdk 36 flips AGP to storing `classes.dex` uncompressed — which exceeds the 30MB file-send limit. Before building a debug APK to send, check `git status`; if those five files are dirty, stash them (`git stash push -- app/build.gradle.kts build.gradle.kts gradle/wrapper/... gradlew`), build, then `git stash pop` to leave the tree as found. Don't commit or discard that work — it isn't finished and isn't mine. **How to apply:** Peter's workflow for this app is hands-on testing rounds — he sideloads a build to his phone, uses it for a while, then sends a batch of bug reports/feature requests in one message. Expect iterative APK rebuild-and-resend cycles, not a single big spec upfront. Room DB schema is at **v11** as of 2026-09-18 (was v6 on 2026-07-23 when `FeedEntity.folder` was added); see `AppDatabase.kt`'s migration comments — several past migrations needed a full table rebuild (Room validates exact column match, not just superset) rather than a plain ADD COLUMN. See [[feedback_feedreader_apk_naming]], [[project_feedreader_emulator]] and [[project_feedreader_apk_publishing]].