A terminal-based dashboard for news feeds, weather, and network scanning
Project description
Daily Dashboard
A terminal-based dashboard (TUI) built with Python's Textual framework. Displays news feeds from RSS/JSON sources, weather information, saved links, and performs network scanning using scapy's ARP-based discovery.
Features
- News Feeds: RSS and JSON feed support with tabbed interface
- Weather: Current conditions and 5-day forecast via Open-Meteo API
- Links: Organized bookmarks by category
- Network Scanner: ARP-based device discovery on your local network
- MAC vendor identification (40,000+ vendors)
- mDNS hostname discovery (macOS)
- Known hosts tracking (alerts for new devices)
- Configurable scan timeouts
- Keyboard Navigation: Vim-style bindings (j/k) and standard arrows
- Auto-refresh: Configurable automatic data refresh
- Caching: Smart caching to reduce API calls
- Settings UI: In-app configuration (press
s)
Installation
From PyPI (Recommended)
pip install daily-dashboard
From Homebrew
brew tap grego360/tap
brew install daily-dashboard
From Source
git clone https://github.com/grego360/daily-dashboard.git
cd daily-dashboard
pip install -e .
Quick Start
-
Create a configuration file
# Copy the example configuration curl -o config.json https://raw.githubusercontent.com/grego360/daily-dashboard/main/config.example.json
-
Edit the configuration to add your feeds, location, and network targets
-
Run the dashboard
# With network scanning (requires sudo) sudo daily-dashboard # Without network scanning daily-dashboard
Configuration
Create a config.json file in your working directory:
{
"feeds": [
{
"name": "Hacker News",
"url": "https://hnrss.org/frontpage",
"type": "rss",
"enabled": true
}
],
"links": [
{
"name": "Development",
"links": [
{
"name": "GitHub",
"url": "https://github.com",
"description": "Code hosting"
}
]
}
],
"network": {
"scanner": "scapy",
"targets": [
{
"name": "Home Network",
"range": "192.168.1.0/24",
"expected_hosts": []
}
],
"scan_interval_minutes": 15,
"dns_timeout_seconds": 1.0,
"arp_timeout_seconds": 3.0
},
"weather": {
"enabled": true,
"location_name": "London",
"latitude": 51.5074,
"longitude": -0.1278
},
"settings": {
"user_name": "Your Name",
"refresh_interval_minutes": 15,
"cache_ttl_minutes": 5,
"log_level": "INFO"
}
}
See config.example.json for a complete example.
Privacy Note
The following files contain personal data and are excluded from git:
| File | Contains |
|---|---|
config.json |
Your name, location, network ranges |
known_hosts.json |
Discovered network devices (MAC addresses) |
.cache/ |
Cached API responses |
When sharing your setup, use config.example.json as a template.
Usage
# Run with default config (config.json in current directory)
daily-dashboard
# Run with sudo for network scanning
sudo daily-dashboard
# Run with custom config file
daily-dashboard --config /path/to/config.json
# Run with verbose logging
daily-dashboard -v
# Show version
daily-dashboard --version
Running as a Module
python -m dashboard
Keyboard Shortcuts
Global
| Key | Action |
|---|---|
Tab / 1-5 |
Switch feed tabs |
j / k or Up / Down |
Navigate lists |
Enter |
Open selected item in browser |
r |
Refresh all data |
s |
Open settings |
n |
Quick network scan |
w |
Quick weather search |
? |
Show help |
q |
Quit |
Escape |
Close dialogs |
Context-Specific
| Key | Context | Action |
|---|---|---|
a |
News panel | Add new feed |
a |
Links panel | Add new link |
c |
Network panel | Copy IP address |
m |
Network panel | Copy MAC address |
o |
Network panel | Open IP in browser |
Project Structure
daily-dashboard/
├── dashboard/
│ ├── __main__.py # CLI entry point
│ ├── app.py # Main Textual application
│ ├── components/ # UI widgets
│ │ ├── news_panel.py # News feeds display
│ │ ├── network_panel.py # Network scan results
│ │ ├── weather_panel.py # Weather display
│ │ ├── links_panel.py # Bookmarks panel
│ │ └── status_bar.py # Bottom status bar
│ ├── models/ # Pydantic data models
│ │ ├── config.py # Configuration schema
│ │ ├── news_item.py # News item model
│ │ ├── scan_result.py # Network scan results
│ │ └── weather.py # Weather data model
│ └── services/ # Business logic
│ ├── feed_parser.py # RSS/JSON feed parsing
│ ├── weather_service.py # Open-Meteo API client
│ ├── network_scanner.py # ARP-based scanning (scapy)
│ ├── known_hosts.py # Device history persistence
│ └── cache.py # Response caching
├── tests/ # Test suite
├── .github/ # CI/CD workflows
├── config.example.json # Example configuration
├── pyproject.toml # Project metadata
├── CONTRIBUTING.md # Development guidelines
├── CHANGELOG.md # Version history
└── README.md
Troubleshooting
Network scanning not working
- Ensure you're running with
sudo - On Linux, you can grant capabilities to avoid running as root:
sudo setcap cap_net_raw,cap_net_admin=eip $(which python)
Feed not loading
- Check the URL is accessible
- RSS feeds should return valid XML
- JSON feeds need a
json_pathconfigured to extract items
Weather not showing
- Verify latitude/longitude are correct
- Use the
wkey to search for a location by name
Development
See CONTRIBUTING.md for development setup and guidelines.
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run linter
ruff check .
# Run type checker
mypy dashboard
License
MIT License - see LICENSE for details.
Author
Costel Grigoras (@grego360)
Acknowledgments
- Textual - TUI framework
- Open-Meteo - Free weather API
- Scapy - Network packet manipulation
- mac-vendor-lookup - MAC address vendor database
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file daily_dashboard-0.1.6.tar.gz.
File metadata
- Download URL: daily_dashboard-0.1.6.tar.gz
- Upload date:
- Size: 44.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d7d2ee29b854428e06145ffdf6ed0b77b9d96310e704fca5b350aaf2f54a9c01
|
|
| MD5 |
76f0219bfcedfe7e94899d24197a3312
|
|
| BLAKE2b-256 |
a32e72001c2553a54836d5b985ffca4f5059fb99efb61b8f4056df10443b547d
|
Provenance
The following attestation bundles were made for daily_dashboard-0.1.6.tar.gz:
Publisher:
release.yml on grego360/daily-dashboard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
daily_dashboard-0.1.6.tar.gz -
Subject digest:
d7d2ee29b854428e06145ffdf6ed0b77b9d96310e704fca5b350aaf2f54a9c01 - Sigstore transparency entry: 732069344
- Sigstore integration time:
-
Permalink:
grego360/daily-dashboard@02391190decb1e408ef42a60845745e4724fd852 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/grego360
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@02391190decb1e408ef42a60845745e4724fd852 -
Trigger Event:
push
-
Statement type:
File details
Details for the file daily_dashboard-0.1.6-py3-none-any.whl.
File metadata
- Download URL: daily_dashboard-0.1.6-py3-none-any.whl
- Upload date:
- Size: 52.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a65eb1bda4cde05072eae330926b72c94d1ab2f87b23d6b03fe403a71b31b72f
|
|
| MD5 |
b077fd8965cff3e5fcf9bda4905f8aba
|
|
| BLAKE2b-256 |
4ff09c299f3b551149a5c1b37a1e5cd66ae47a5b573c9b870483bd8f65fbfae4
|
Provenance
The following attestation bundles were made for daily_dashboard-0.1.6-py3-none-any.whl:
Publisher:
release.yml on grego360/daily-dashboard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
daily_dashboard-0.1.6-py3-none-any.whl -
Subject digest:
a65eb1bda4cde05072eae330926b72c94d1ab2f87b23d6b03fe403a71b31b72f - Sigstore transparency entry: 732069347
- Sigstore integration time:
-
Permalink:
grego360/daily-dashboard@02391190decb1e408ef42a60845745e4724fd852 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/grego360
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@02391190decb1e408ef42a60845745e4724fd852 -
Trigger Event:
push
-
Statement type: