{"id":48049954,"url":"https://github.com/lweiss01/news-thread","last_synced_at":"2026-04-04T14:20:43.355Z","repository":{"id":336966153,"uuid":"1144477293","full_name":"lweiss01/news-thread","owner":"lweiss01","description":"Follow the thread of every story. A privacy-first, native Android news engine using on-device NLP to find related perspectives. Your news, your device, your data.","archived":false,"fork":false,"pushed_at":"2026-03-19T22:56:36.000Z","size":26426,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-20T13:42:44.958Z","etag":null,"topics":["android","android-app-development","jetpack-compose","kotlin","media-bias","news-aggregator","news-app","nlp","on-device-ml","privacy-first","semantic-search","tensorflow-lite"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lweiss01.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-28T18:12:01.000Z","updated_at":"2026-03-19T22:56:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lweiss01/news-thread","commit_stats":null,"previous_names":["lweiss01/news-thread"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/lweiss01/news-thread","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lweiss01%2Fnews-thread","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lweiss01%2Fnews-thread/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lweiss01%2Fnews-thread/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lweiss01%2Fnews-thread/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lweiss01","download_url":"https://codeload.github.com/lweiss01/news-thread/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lweiss01%2Fnews-thread/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31402328,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-app-development","jetpack-compose","kotlin","media-bias","news-aggregator","news-app","nlp","on-device-ml","privacy-first","semantic-search","tensorflow-lite"],"created_at":"2026-04-04T14:20:43.234Z","updated_at":"2026-04-04T14:20:43.321Z","avatar_url":"https://github.com/lweiss01.png","language":"Kotlin","readme":"# NewsThread 🧵\n\n**Follow the thread of every story**\n\n\u003e [!IMPORTANT]\n\u003e **Sign up at [NewsThread.io](https://newsthread.io)** to be notified when the app officially launches!\n\nA native Android news reader that shows how different media sources cover the same story, plotted along a political bias spectrum. Built with an offline-first, privacy-first design: feed aggregation runs through a Cloudflare Worker, while semantic matching and clustering run on-device.\n\n---\n\n## What Makes NewsThread Different ✨\n\n### Bias-Aware News Reading ⚖️\n- **Integrated bias ratings** on every article from three respected organizations\n- **Bias heatmap bar** with colored dots showing where each source falls on the spectrum\n- Reliability ratings (1–5 stars) from trusted fact-checking organizations\n- **150+ major news sources** rated and categorized\n\n### Perspective Comparison 🔍\nCompare how sources across the political spectrum cover the same story. Inspired by Google News \"Full Coverage\" but with a bias transparency layer: articles are plotted along a continuous left-to-right spectrum so you can see where each source falls.\n\n### On-Device NLP Matching 🧠\nThe matching engine uses TensorFlow Lite sentence embeddings running entirely on your device. Feed retrieval and URL resolution are handled by a Cloudflare Worker, while embedding generation and similarity matching run locally. The app extracts article text, generates semantic embeddings (384-dimensional vectors), and finds genuinely related stories — replacing keyword-based matching with real semantic understanding.\n\n### Privacy-First Design 🛡️\n- Personalization, embedding generation, and similarity matching run on-device\n- No tracking, no ads, no data selling\n- Works offline with cached articles\n- Future: data backed up to your own Google Drive\n\n---\n\n## Screenshots 📸\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cimg src=\"store_assets/screenshot_01_feed_badges.png\" width=\"100%\" alt=\"News feed with source bias badges and reliability ratings\"\u003e\n      \u003cbr\u003e\u003cb\u003eNews Feed\u003c/b\u003e\u003cbr\u003e\n      Live headlines with bias ratings, reliability stars, and OG images.\n    \u003c/td\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cimg src=\"store_assets/screenshot_02_bias_spectrum.png\" width=\"100%\" alt=\"Bias spectrum showing article positions from left to right\"\u003e\n      \u003cbr\u003e\u003cb\u003eBias Spectrum\u003c/b\u003e\u003cbr\u003e\n      See how sources cover the same story across the political spectrum.\n    \u003c/td\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cimg src=\"store_assets/screenshot_03_tracking.png\" width=\"100%\" alt=\"Story tracking screen with tracked stories and bias distributions\"\u003e\n      \u003cbr\u003e\u003cb\u003eStory Tracking\u003c/b\u003e\u003cbr\u003e\n      Follow developing stories with auto-clustered updates and bias heatmaps.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cimg src=\"store_assets/screenshot_04_story_analysis.png\" width=\"100%\" alt=\"Story analysis showing perspectives grouped by political lean\"\u003e\n      \u003cbr\u003e\u003cb\u003eStory Analysis\u003c/b\u003e\u003cbr\u003e\n      Full coverage breakdown: Left, Center, and Right perspectives side by side.\n    \u003c/td\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cimg src=\"store_assets/screenshot_05_feed_clean.png\" width=\"100%\" alt=\"Clean feed view with article cards\"\u003e\n      \u003cbr\u003e\u003cb\u003eClean Feed\u003c/b\u003e\u003cbr\u003e\n      Modern dark interface designed for reading. Pull to refresh for the latest.\n    \u003c/td\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cimg src=\"store_assets/screenshot_06_article_updates.png\" width=\"100%\" alt=\"Article updates showing new coverage on tracked stories\"\u003e\n      \u003cbr\u003e\u003cb\u003eLive Updates\u003c/b\u003e\u003cbr\u003e\n      Get notified when tracked stories receive new coverage.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Current Status 🚀\n\n**Version**: 1.2.0  \n**Milestone**: v1.2 Google Play Release  \n**Progress**: 23 of 24 slices complete — finalizing quality and onboarding\n\n### What's Built\n\n| | Feature | Status |\n|---|---------|--------|\n| 📰 | **News Feed** — Live headlines with bias ratings and reliability stars | ✅ |\n| 🧠 | **On-Device NLP** — TF Lite sentence embeddings for semantic article matching | ✅ |\n| ⚖️ | **Bias Spectrum** — Articles plotted on a continuous left-to-right political axis | ✅ |\n| 📌 | **Story Tracking** — Follow developing stories with auto-clustered threads | ✅ |\n| 🔔 | **Notifications** — Background alerts when tracked stories get new coverage | ✅ |\n| 🎨 | **Amber Design System** — Consistent design tokens and polished UI | ✅ |\n| 🔄 | **Discovery Engine** — Background loop builds a 70+ story feed across categories | ✅ |\n| 🛡️ | **Authenticated Quality** — Strict filtering ensures 100% rated sources | ✅ |\n| 📖 | **Text Extraction** — Full article body parsed via Readability4J + JSoup | ✅ |\n| 🌐 | **Cloudflare Edge Backend** — Stateless RSS proxy, no user data, no API keys | ✅ |\n| 🖼️ | **Store Assets** — App icon, feature graphic, 6 framed screenshots, listing copy | ✅ |\n| 🧹 | **Code Review Fixes** — FeedViewModel UseCase refactor, 10 UI bugs closed | ✅ |\n| 🔧 | **Release Infrastructure** — Signing, ProGuard, privacy policy, legal links | ✅ |\n| 🎓 | **Quality \u0026 Onboarding** — First-launch UX, final regression | 🔜 Next |\n\n### What's Next\n\n| Slice | Focus | Status |\n|-------|-------|--------|\n| S23 | **Release Infrastructure** — signing config, R8/ProGuard rules, privacy policy, legal links | ✅ Complete |\n| S24 | **Quality \u0026 Onboarding** — first-launch experience, regression testing, release verification | Planned |\n\n### Future Milestones (Post-Launch)\n\n- ⏳ Timeline visualization — see how a story evolves hour by hour\n- 🔑 Google Sign-In and Google Drive backup\n- 📊 Reading analytics — understand your own media diet\n- ⚠️ Filter bubble warnings when your reading habits skew one-sided\n- 🖱️ Interactive bias spectrum (tap to filter by political lean)\n\n---\n\n## The Cloudflare RSS Engine 🌐 ⚡\n\nNewsThread runs on a free, unlimited feed system powered by a Cloudflare Edge Worker — no user-provided API keys, no rate limits, no per-user quotas.\n\n**Layer 1 — Google News RSS (Discovery \u0026 Volume)**  \nGoogle News RSS feeds are polled for trending stories. A Continuous Discovery loop background-polls categories like World, Technology, Science, Health, and Business to build a 70+ story feed on every refresh.\n\n**Layer 2 — Direct Outlet Feeds (Depth)**  \nDozens of handpicked outlets are polled directly via RSS. NewsThread's ratings dataset covers 150+ sources mapped by bias and reliability.\n\n| Bias | Examples |\n|------|----------|\n| Left | MSNBC, The Guardian, The Atlantic, Vox, Slate, HuffPost |\n| Lean Left | CNN, NYT, NPR, Washington Post, NBC, ABC, CBS, Politico |\n| Center | AP, Reuters, BBC, The Hill, PBS NewsHour, AllSides |\n| Lean Right | WSJ, Fox News, Washington Examiner, National Review |\n| Right | Breitbart, The Daily Wire, The Federalist, Newsmax, OAN |\n\nThe Worker resolves Google News redirect links server-side, caches via Cloudflare KV, and standardizes feed parsing. It is fully stateless — no concept of users, no personal data, same cached response for everyone. Reading history, tracked stories, and preferences never leave the device.\n\n---\n\n## Key Technical Decisions ⚙️\n\n| Decision | Rationale |\n|----------|-----------|\n| 🔒 **On-device NLP only** | Privacy-first — all data stays on your device |\n| 🌐 **Layered RSS Engine** | Google News for discovery + direct feeds for depth — free and unlimited |\n| 🛡️ **Authenticated Quality** | Only rated sources reach the main feed |\n| 🤖 **TF Lite all-MiniLM-L6-v2** | Quantized 384-dim model, 16KB page alignment for Android 15 |\n| ⚡ **Pre-compute matches** | Results ready before user taps Compare |\n| 🎨 **Bias spectrum UI** | Continuous axis is more nuanced than Left/Center/Right buckets |\n| ✂️ **Readability4J + JSoup** | Parse article body from URLs with fallback |\n| 📐 **In-memory cosine similarity** | Fast and lightweight for mobile |\n| 🏗️ **Clean Architecture + UseCases** | Domain layer owns business logic; ViewModels depend only on UseCases |\n\n---\n\n## Architecture 🏗️\n\n### Clean Architecture Layers\n\n```\npresentation/         # UI layer (Jetpack Compose)\n├── feed/             # News feed with bias ratings\n├── detail/           # Article detail WebView\n├── comparison/       # Perspective comparison (bias spectrum)\n├── tracking/         # Story tracking \u0026 thread management\n├── story/            # Story detail view\n├── components/       # Shared UI components (BiasHeatmap, etc.)\n├── navigation/       # Bottom nav bar \u0026 route definitions\n├── settings/         # App settings\n└── theme/            # Material 3 theming (Amber design system)\n\ndomain/               # Business logic (pure Kotlin)\n├── model/            # Domain models (Article, SourceRating, etc.)\n├── usecase/          # GetFeedUseCase, ToggleFollowUseCase, etc.\n├── similarity/       # EntityExtractor, embedding comparison\n└── repository/       # Repository interfaces\n\ndata/                 # Data layer\n├── local/            # Room database, DAOs, entities\n├── remote/           # Worker/feed + HTML fetch clients\n└── repository/       # Repository implementations\n\ndi/                   # Hilt dependency injection modules\nutil/                 # Utilities (DatabaseSeeder, etc.)\n```\n\n### Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| **UI** | Jetpack Compose + Material Design 3 |\n| **Architecture** | MVVM + Clean Architecture |\n| **DI** | Hilt (Dagger) |\n| **Database** | Room (SQLite) with migrations |\n| **Networking** | OkHttp with caching |\n| **Image Loading** | Coil + OG image resolution |\n| **Async** | Kotlin Coroutines + Flow |\n| **Navigation** | Jetpack Navigation Compose |\n| **ML** | TensorFlow Lite — all-MiniLM-L6-v2 (384-dim sentence embeddings) |\n| **Text Extraction** | Readability4J + JSoup |\n| **Background** | WorkManager with Hilt integration |\n| **Edge Backend** | Cloudflare Workers + KV cache |\n\n### Matching Pipeline\n\n```mermaid\ngraph TD\n    A[Article Feed] --\u003e B[Text Extraction]\n    B --\u003e|Readability4J| C[Embedding Generation]\n    C --\u003e|TF Lite| D[Hybrid Matching]\n    D --\u003e|Cosine Sim + Entity Overlap| E[Bias Clustering]\n    E --\u003e F[Amber Design System Visualization]\n```\n\n### Tooling \u0026 AI-Augmentation 🤖\n\nNewsThread was built using a hybrid AI-augmented workflow:\n\n* **[Android Studio](https://developer.android.com/studio)** — Primary IDE\n* **[Antigravity](https://antigravity.google/)** — Agentic partner for on-device NLP, orchestration, and system fixes\n* **[Claude Code](https://claude.ai/code)** — Foundational prototyping, UI/repository boilerplate, and later-stage refactoring\n* **[GSD](https://github.com/gsd-build/get-shit-done)** — Structured research, planning, and execution workflow\n* **[Beads](https://github.com/steveyegge/beads)** — Local issue tracking and bug management\n\n---\n\n## Source Bias Rating System 📊\n\n\u003e **Disclaimer**\n\u003e\n\u003e Bias ratings are provided for **informational and educational purposes only**. These ratings aggregate data from third-party organizations and represent general consensus, not absolute truth. Individual articles may vary from a source's overall rating. We encourage reading from multiple sources and thinking critically.\n\nNewsThread uses a **consensus approach** combining three respected media bias organizations:\n\n### Rating Sources\n1. **AllSides** — Community-driven bias ratings\n2. **Ad Fontes Media** — Interactive Media Bias Chart\n3. **Media Bias/Fact Check** — Detailed factual reporting analysis\n\n### Bias Scale\n| Score | Label | Examples |\n|-------|-------|----------|\n| -2 | Left | CNN, MSNBC, HuffPost |\n| -1 | Center-Left | NPR, Washington Post, Politico |\n| 0 | Center | Reuters, AP, BBC, The Hill |\n| +1 | Center-Right | WSJ (news), The Economist |\n| +2 | Right | Fox News, Breitbart, Newsmax |\n| ? | Unrated | Sources not yet rated — shown without a bias position |\n\n### Reliability Scale (1–5 stars)\n| Rating | Level | Examples |\n|--------|-------|----------|\n| ★★★★★ | Very High | Reuters, AP, BBC |\n| ★★★★☆ | High | NPR, WSJ, Washington Post |\n| ★★★☆☆ | Mostly Factual | CNN, Fox News |\n| ★★☆☆☆ | Mixed | Opinion sites, partisan sources |\n| ★☆☆☆☆ | Low | Conspiracy sites, misinformation |\n\n150+ sources rated including CNN, Fox News, MSNBC, Reuters, AP, BBC, NPR, New York Times, Washington Post, Wall Street Journal, The Guardian, Politico, The Hill, Bloomberg, and more.\n\n---\n\n## Getting Started 🛠️\n\n### Prerequisites\n- Android Studio Hedgehog or newer\n- Android SDK 34\n- Kotlin 1.9+\n\n### Setup\n\n1. **Clone the repository**\n   ```bash\n   git clone https://github.com/lweiss01/news-thread.git\n   cd news-thread\n   ```\n\n2. **Build and run**\n   ```bash\n   ./gradlew assembleDebug\n   ```\n   Or open in Android Studio, sync Gradle, and run on emulator or device.\n\n   No API keys or `secrets.properties` file required — the Cloudflare Worker handles feed fetching with internal authentication.\n\n3. **Firebase** (optional)  \n   Firebase requires a valid `google-services.json` in `app/` (not committed to git).\n\n---\n\n## Configuration\n\n| Setting | Value |\n|---------|-------|\n| Min SDK | 26 (Android 8.0) |\n| Target SDK | 34 (Android 14) |\n| Java | 17 |\n| Kotlin | 1.9.22 |\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e📋 Development History (23 slices completed)\u003c/b\u003e\u003c/summary\u003e\n\n| Slice | Name | Highlights |\n|-------|------|------------|\n| S01 | Foundation | Room caching, rate limiting, offline-first architecture |\n| S02 | Text Extraction | Readability4J article parsing, paywall detection, WiFi-only fetching |\n| S03 | Embedding Engine | TF Lite 2.17.0, all-MiniLM-L6-v2 quantized model, 384-dim embeddings |\n| S04 | Similarity Matching | Cosine similarity, tiered matching, 100% test coverage |\n| S05 | Pipeline Integration | End-to-end matching orchestration, contextual UI hints |\n| S06 | Background Processing | WorkManager pre-computation, sync strategy settings |\n| S07 | UI Implementation | Bias spectrum visualization, reliability badges |\n| S08 | Tracking | Story tracking database, tracking UI, bookmark controls |\n| S09 | Story Grouping | Auto-clustering, novelty detection, perspective tracking |\n| S10 | Quality \u0026 Stability | Hybrid matching (embedding + entity overlap), threshold tuning |\n| S11 | Notifications | System notifications, deep linking, article highlighting |\n| S12 | UI Polish \u0026 Bug Fixes | Source badges, refresh logic, notification suppression |\n| S13 | UI/UX Refinement | Design tokens, priority bias heatmap, visual consistency |\n| S14 | Architecture Refactor | Domain logic extraction, Hilt DI cleanup, UseCases |\n| S15 | UI Design Refresh | Amber brand identity, editorial shields, UI softening |\n| S16 | RSS Migration | Replaced NewsAPI with dual-layer RSS (Cloudflare Worker + on-device) |\n| S17 | Cloudflare Backend | Serverless edge backend for feed fetching \u0026 Google News proxy |\n| S18 | Feed Enhancement | Continuous Discovery engine, 70+ story feed volume |\n| S19 | Identity \u0026 Store Assets | App icon, feature graphic, 6 framed screenshots, store listing copy |\n| S20 | Non-UI Code Fixes | Architecture audit, concurrency fixes, data model normalization |\n| S21 | UI Code Fixes \u0026 Polish | FeedViewModel UseCase refactor, 10 UI bugs closed, build cleanup |\n| S22 | Hygiene \u0026 Stability | Performance and stability hardening |\n| S23 | Release Infrastructure | Signing config, R8/ProGuard, legal policy links, Play submission prep |\n\n\u003c/details\u003e\n\n---\n\n## Contributing\n\nNot yet accepting contributions — the app is in pre-release. Check back after launch!\n\n---\n\n## License\n\nCopyright © 2026 Lisa Weiss. All rights reserved. See [LICENSE](LICENSE) for details.\n\n---\n\n## About\n\nBuilt by a senior information security data analyst who believes we need better tools to navigate today's complex media landscape. NewsThread helps people read news from diverse perspectives and understand the full story.\n\n**Links:**\n- **Website**: [newsthread.io](https://newsthread.io)\n- **Legal**: [Legal Policy](https://lweiss01.github.io/news-thread/) · [Privacy Policy](https://lweiss01.github.io/news-thread/privacy/) · [Terms of Use](https://lweiss01.github.io/news-thread/terms/)\n- **Repository**: [github.com/lweiss01/news-thread](https://github.com/lweiss01/news-thread)\n- **Issues**: [github.com/lweiss01/news-thread/issues](https://github.com/lweiss01/news-thread/issues)\n\n---\n\n**[Join the Waitlist →](https://newsthread.io)**\n\n*\"Follow the thread of every story\"*\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flweiss01%2Fnews-thread","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flweiss01%2Fnews-thread","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flweiss01%2Fnews-thread/lists"}