# 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
