A terminal-based daily news aggregator that displays news headlines alongside weather and stock market data. Built with Rust for performance and reliability.
- Instant startup with cached data from previous sessions
- Background refresh fetches fresh data asynchronously on startup
- News headlines from NewsAPI with source and relative timestamps
- Stock watchlist with customizable symbols via modal browser
- Weather widget (collapsible) with temperature, conditions, and alerts
- Offline capable - shows cached data when network unavailable
- Graceful degradation - each panel handles errors independently
- Rust 1.70+ (install via rustup)
- API keys from:
- NewsAPI (free tier: 100 requests/day)
- OpenWeatherMap (free tier: 60 requests/minute)
- Tiingo (free tier: 500 requests/hour)
git clone https://github.com/yourusername/the-daily-update.git
cd the-daily-update
cargo build --releaseThe binary will be at target/release/daily-update.
Set your API keys via environment variables (recommended):
export NEWS_API_KEY="your-newsapi-key"
export WEATHER_API_KEY="your-openweathermap-key"
export TIINGO_API_KEY="your-tiingo-key"Add these to your shell profile (~/.bashrc, ~/.zshrc, etc.) for persistence.
On first launch, the app will:
- Check for API keys in environment variables
- Prompt for any missing keys
- Ask for your default location (for weather)
- Display security best practices
Preferences are stored in ~/.config/daily-update/config.toml:
[general]
default_location = "New York, NY"
vim_mode = false
[ui]
theme = "dark"- Database:
~/.local/share/daily-update/data.db - Config:
~/.config/daily-update/config.toml
./target/release/daily-updateOr after adding to PATH:
daily-update| Key | Action |
|---|---|
Up/Down |
Navigate within panel |
Tab |
Switch to next panel |
Shift+Tab |
Switch to previous panel |
| Key | Action |
|---|---|
r |
Refresh all data |
w |
Toggle weather widget expand/collapse |
s |
Open stock browser modal |
? |
Show help overlay |
q |
Quit application |
| Key | Action |
|---|---|
Up/Down |
Navigate stocks |
Space |
Toggle stock in watchlist |
Enter |
Save changes |
Esc |
Cancel without saving |
| Type | Filter stocks by symbol |
Enable in config with vim_mode = true:
| Key | Action |
|---|---|
j/k |
Navigate within panel |
h/l |
Switch panels |
g |
Go to top |
G |
Go to bottom |
the-daily-update/
├── crates/
│ ├── daily-update/ # Main binary
│ ├── app/ # Application state
│ ├── ui/ # TUI components (ratatui)
│ ├── data/ # Models, SQLite database, cache
│ ├── api/ # API clients (news, weather, stocks)
│ ├── config/ # Configuration and setup wizard
│ └── fetch/ # Background data fetcher
└── docs/plans/ # Design documents
The project uses a Cargo workspace for modular compilation. Each crate compiles independently, reducing rebuild times during development.
- Rust 1.70+
- (Optional) pre-commit for automated checks
Run make help to see all available targets:
make fmt # Format code
make lint # Run clippy with strict warnings
make test # Run all tests (unit and integration)
make test-unit # Run unit tests only
make build # Build in debug mode
make release # Build in release mode
make run # Run the application
make precommit # Run lint and test (CI validation)Unit tests cover each crate's internal logic:
make test-unitIntegration tests verify cross-crate workflows:
make test-integrationRun both with:
make testInstall pre-commit hooks to run validation before each commit:
pre-commit installThe hooks run rustfmt, clippy, and tests automatically.
MIT