Schedules were entered and displayed as six field cron expressions. A picker now offers a frequency, a weekday or day of the month and a time, and turns that into the expression the backend stores; tables and the dashboard show wording like "Every day at 03:00". An expression the picker cannot express stays editable as cron. This also fixes a broken preset: the backend's cron dialect counts Sunday as 1 and rejects 0, so the "every Sunday" choice in the application backup form produced an invalid expression. The picker emits weekday names, and a test pins the dialect down. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
SoftVisor Infrastructure Monitoring System
Web application to monitor and manage the SoftVisor Debian root server: OS/package updates, vulnerabilities, backups of the Gitea/Postgres workloads on microk8s, and user management. See ROADMAP.md for the plan and CLAUDE.md for the constraints.
Stack
- Backend: Rust, axum, sqlx (SQLite), clean architecture in four crates (
backend/crates/*) - Frontend: Vue 3 + TypeScript, Vite, Tailwind CSS, Pinia, Vue Router (
frontend/) - Tests:
cargo test(unit + integration), Vitest (components/stores), Playwright (UI)
Development
Requirements: Rust stable, Node 22+, make.
cp .env.example backend/.env # then edit JWT_SECRET and the bootstrap admin
cd frontend && npm ci && npx playwright install chromium && cd ..
make dev # backend on :8080, frontend on :5173 (proxies /api)
| Command | What it does |
|---|---|
make test |
backend, frontend unit and Playwright UI tests |
make test-backend |
cargo test --workspace |
make test-frontend |
Vitest |
make test-ui |
Playwright (starts backend with in-memory DB + Vite) |
make lint |
rustfmt, clippy, eslint, prettier, vue-tsc |
make build |
production frontend build + release binary |
TDD workflow
Every feature starts with its tests:
- List the unit, integration and UI tests the feature needs.
- Write them so they fail (
backend/crates/*/src/**unit tests,backend/crates/api/tests/integration tests,frontend/src/**/*.test.tsandfrontend/e2e/*.spec.ts). - Implement the smallest code that makes them pass, then refactor.
- Commit and push.
Deployment
See docs/install.md (release build, deploy/install.sh, systemd unit) and
docs/restore.md for restoring backups. docs/architecture.md describes the layers.
First admin
On start the backend creates an admin user from BOOTSTRAP_ADMIN_EMAIL /
BOOTSTRAP_ADMIN_PASSWORD if no user exists yet.
Description
Languages
Rust
72.1%
Vue
15.5%
TypeScript
11.5%
Shell
0.7%
Makefile
0.1%