~/work/owly-newsActive
Owly News
A shared Rust core powers a Tauri/Svelte desktop app and a native ratatui TUI, with optional local summarization that never becomes a hard dependency.
What it does
Feeds, refresh, SQLite persistence, search and summarization live behind a shared Rust core. The desktop and terminal interfaces consume the same domain and storage boundaries.
Problem
A news reader should keep ingesting and browsing when summarization is unavailable.
Constraints
- Two interfaces need the same behavior while terminal and Tauri types stay outside the core.
How it's built
- Feeds enter the shared Rust core through ingest and refresh.
- SQLite, search and events remain in owly-core.
- Tauri/Svelte and ratatui frontends consume the same behavior; summarization is optional.
Engineering decisions
Keep domain behavior in owly-core
GUI and TUI share persistence, refresh and query semantics.
Trade-off Frontend adapters must respect the core boundary.
Make summarization a trait
Providers can be swapped or unavailable without breaking feeds.
Trade-off Pending summaries need explicit retry semantics.
Evidence
- Shared behavior
- Rust core
- Local persistence
- SQLite
- LLM boundary
- Optional
Desktop and terminal frontends
WAL and concurrent access
Feeds continue without summarization
Related case study
The project page describes what exists. The case study follows the decisions, constraints, and trade-offs behind it.
Case studyHighlights
- One core, two interfaces Tauri commands/events and a terminal state machine both consume owly-core.
- AI remains optional Unavailable providers leave articles retryable rather than breaking refresh.