~/cases/owly-newsActive
Owly News
One Rust core, two interfaces — adding optional AI without making it the application.
→Architecture
owly-core owns domain behavior, SQLite persistence, refresh orchestration, events and the summarizer boundary. Tauri/Svelte and ratatui stay at the edges.
→Graceful degradation
Provider health gates summarization; unavailable providers leave articles retryable while feeds remain usable.
→Trade-offs
A shared core prevents behavioral drift, but frontend adapters must preserve the core boundaries.
RSS / Atom
Ingest + refresh fetch · dedupe · retry
owly-core domain · SQLite · events
Summarizer optional provider
Tauri · ratatui two interfaces
- 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.
→Decisions & trade-offs
| Decision | Why | Trade-off |
|---|---|---|
| Summarization behind a trait | The feed reader remains useful when an LLM is unavailable. | Pending work and retries need explicit state. |
→Result
- The architecture documents bounded refresh concurrency, SQLite WAL, typed Tauri events and a pure TUI state machine.
→Evidence
- Shared behavior
- Rust core
- Local persistence
- SQLite
- LLM boundary
- Optional
Desktop and terminal frontends
WAL and concurrent access
Feeds continue without summarization
→What I'd change today
AI is most useful here as a replaceable capability around a dependable reader core.