# Links Project Memory ## Project: links (GoLinks + mini-apps) - Django + APScheduler + Tailwind + SQLite (local) / PostgreSQL (prod via DB_HOST env var) - Deployment: Docker → K3s at 192.168.1.2, namespace `home-apps` - Use `uv run manage.py` (not bare `python manage.py`) — greenlet/playwright has macOS code-signing issues locally - Templates extend `base.html` from `templates/base.html` (not app-level) - Scheduler singleton: `core.scheduler.scheduler` (BackgroundScheduler, already running from CoreConfig.ready) - App scheduler wiring pattern: import signals in AppConfig.ready(), wrap ORM calls in try/except ## NetScan sub-app (implemented 2026-03-21) - Located at `netscan/` - 3 models: ScanProfile, ScanRun, ScanFinding - 6 check modules in `netscan/checks/`: router, dns, ingress, cameras, tls, ports - Scanner orchestrator: `netscan/scanner.run_scan(profile_id, triggered_by)` - Telegram notifications: `netscan/notifications.py` (raw requests, no library) - URL prefix: `/ui/netscan/` - Migration written manually (0001_initial.py) — local playwright/greenlet prevents running makemigrations