Fenris — NVMe Wear Monitor & Live Dashboard

Created by Bongbetic.

Periodically reads your NVMe drive's SMART health data, logs it over time, and serves a self-contained HTML dashboard estimating SSD lifespan from your actual daily usage trend.

Requirements

  • Python 3.7+
  • smartmontools (smartctl) installed
  • Root access to read NVMe SMART logs

Setting up passwordless smartctl

Fenris runs sudo -n smartctl ... (no-prompt sudo). Either run with sudo or allow passwordless access:

sudo visudo
# Add this line (replace youruser with your username):
youruser ALL=(root) NOPASSWD: /usr/sbin/smartctl

Quick Start

Interactive Menu

./fenris.sh

CLI

# Start daemon + dashboard in background
python3 fenris.py start

# Check status and latest wear stats
python3 fenris.py status

# Take one sample now
python3 fenris.py sample

# Stop the daemon
python3 fenris.py stop

Dashboard available at: http://localhost:8420

CLI Reference

fenris.py start

Start monitoring in background (daemon + dashboard).

python3 fenris.py start [OPTIONS]

Options:
  --device PATH     NVMe device (default: auto-detect, e.g. /dev/nvme0)
  --interval SEC    Seconds between samples (default: 300)
  --port PORT       Dashboard HTTP port (default: 8420)

fenris.py stop

Stop background monitoring and clean up PID file.

fenris.py status

Show daemon status and latest wear statistics.

fenris.py sample

Take one sample immediately and print it.

python3 fenris.py sample [--device /dev/nvme0]

fenris.py run

Run in foreground (used internally by start). Not intended for direct use.

Interactive Menu

Run ./fenris.sh for a guided interface:

 1) Start monitoring (background daemon + dashboard)
 2) Stop monitoring
 3) Status / current wear stats
 4) Take one sample right now
 5) Open dashboard URL
 ---
 h) Help / how this works
 q) Exit

Data Collected

Field Description
percentage_used SSD's own wear indicator (0-100%)
bytes_written / bytes_read Total data written/read
available_spare Remaining spare capacity (%)
media_errors Number of uncorrectable errors
power_on_hours Total power-on hours
temperature_c Current temperature
critical_warning NVMe critical warning flags

Dashboard Features

  • Real-time wear level + projected life remaining in hours / days / years from the actual rolling-24h write rate and implied TBW endurance
  • Exact GB written in the last 24 hours + GB/h and GB/day rate (updates every poll interval)
  • Wear-over-time chart + trailing-24h per-hour write bars
  • Dense layout with sticky header, ETag-cached polling synced to the daemon interval, countdown and live badge, stale/preliminary banners
  • API: GET /api/data, /api/hourly, /api/summary, /api/config, /api/status

File Structure

fenris/
├── fenris.py          # Main Python script
├── fenris.sh          # Interactive menu wrapper
├── README.md
└── data/
    ├── history.jsonl   # Raw sample log (JSONL)
    ├── hourly.jsonl    # Per-hour aggregates (rebuilt from history on restart)
    ├── fenris.pid      # Daemon PID file
    └── fenris.log      # Daemon log output

Troubleshooting

"smartctl not found"

sudo apt install smartmontools    # Debian/Ubuntu
sudo pacman -S smartmontools      # Arch

"needs root" / permission denied Set up passwordless sudo (see Requirements) or run with sudo.

Dashboard shows "stale" Daemon not running. Check with python3 fenris.py status and restart if needed.

S
Description
An app to measure your ssd wear and tear realtime
Readme MIT
2.2 MiB
v0.6.0
Latest
2026-09-28 22:50:20 +00:00
Languages
Python 95.5%
Shell 2.9%
Makefile 1.6%