Skip to main content

A terminal-based dashboard for news feeds, weather, and network scanning

Project description

Daily Dashboard

CI PyPI version Python 3.11+ License: MIT

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.

Daily Dashboard Screenshot

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

  1. Create a configuration file

    # Copy the example configuration
    curl -o config.json https://raw.githubusercontent.com/grego360/daily-dashboard/main/config.example.json
    
  2. Edit the configuration to add your feeds, location, and network targets

  3. 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_path configured to extract items

Weather not showing

  • Verify latitude/longitude are correct
  • Use the w key 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

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

daily_dashboard-0.1.6.tar.gz (44.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

daily_dashboard-0.1.6-py3-none-any.whl (52.8 kB view details)

Uploaded Python 3

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

Hashes for daily_dashboard-0.1.6.tar.gz
Algorithm Hash digest
SHA256 d7d2ee29b854428e06145ffdf6ed0b77b9d96310e704fca5b350aaf2f54a9c01
MD5 76f0219bfcedfe7e94899d24197a3312
BLAKE2b-256 a32e72001c2553a54836d5b985ffca4f5059fb99efb61b8f4056df10443b547d

See more details on using hashes here.

Provenance

The following attestation bundles were made for daily_dashboard-0.1.6.tar.gz:

Publisher: release.yml on grego360/daily-dashboard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file daily_dashboard-0.1.6-py3-none-any.whl.

File metadata

File hashes

Hashes for daily_dashboard-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 a65eb1bda4cde05072eae330926b72c94d1ab2f87b23d6b03fe403a71b31b72f
MD5 b077fd8965cff3e5fcf9bda4905f8aba
BLAKE2b-256 4ff09c299f3b551149a5c1b37a1e5cd66ae47a5b573c9b870483bd8f65fbfae4

See more details on using hashes here.

Provenance

The following attestation bundles were made for daily_dashboard-0.1.6-py3-none-any.whl:

Publisher: release.yml on grego360/daily-dashboard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page