docs: initial product docs and design reference

Establishes the documentation foundation for the netOrk website:

- CLAUDE.md — tech stack (React 18/Vite/Tailwind), design rules, tone of
  voice, and file structure guidance for the implementation instance
- docs/PRODUCT.md — one-liner, elevator pitch, target audience, value props,
  full feature list, driver table, architecture summary
- docs/DESIGN.md — exact Tailwind classes for colors, typography, spacing,
  and all reusable component patterns (cards, buttons, screenshot frames,
  badges, nav) lifted directly from the product UI
- docs/PAGES.md — page-by-page content plan with route, purpose, section
  structure, and draft copy for every page

No code yet — that follows in a separate instance.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Christian Manivong
2026-06-28 09:58:47 +02:00
co-authored by Claude Sonnet 4.6
commit 00c483c2a2
5 changed files with 867 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
node_modules/\ndist/\n.env\n.env.local\n*.local\n.DS_Store
+93
View File
@@ -0,0 +1,93 @@
# CLAUDE.md — netork-website
This is the official marketing website for **netOrk**, a self-hosted Network
Orchestration Platform. The goal is a fast, visually striking single-page (or
multi-page) site that communicates what netOrk does, who it is for, and how to
get started.
---
## Project Purpose
Potential users land here and need to answer three questions in under 10 seconds:
1. What is this?
2. Is it for me?
3. How do I try it?
Everything on the site should serve those three questions.
---
## Content & Design Source of Truth
All product content (features, copy, page structure) is in `docs/`:
| File | Purpose |
|---|---|
| `docs/PRODUCT.md` | Product description, target audience, value propositions, feature list |
| `docs/DESIGN.md` | Visual identity — exact Tailwind colors, typography, component patterns |
| `docs/PAGES.md` | Page-by-page content plan with section headings and copy drafts |
**Read these files before writing any code or copy.** They are the source of
truth. The design file in particular defines exact class names — use them.
---
## Tech Stack
Mirror the netOrk UI exactly so the design language carries over:
| Layer | Choice |
|---|---|
| Framework | React 18 + TypeScript |
| Build | Vite |
| Styling | Tailwind CSS v3 |
| Routing | React Router v6 (or static if single page) |
| Icons | Heroicons (inline SVG, same as netOrk UI) |
| Animation | Tailwind transitions only — no GSAP, Framer, etc. |
**No external component libraries.** Build everything from Tailwind primitives,
exactly as netOrk's `ui/src/components/ui.tsx` does.
---
## Design Rules (summary — full detail in docs/DESIGN.md)
- **Dark theme only.** Background `bg-slate-950`. Cards `bg-slate-900`.
- **Accent color:** `sky-500` / `sky-600` for CTAs, links, highlights.
- **No light mode toggle.** Ever.
- Font stack: system default (Tailwind sans). No Google Fonts.
- All interactive elements use `transition-colors` — no layout shifts.
- Screenshots/mockups of the actual app use a `border border-slate-700 rounded-xl
overflow-hidden` wrapper to frame them against the dark background.
---
## File Naming
```
netork-website/
├── CLAUDE.md ← this file
├── docs/
│ ├── PRODUCT.md
│ ├── DESIGN.md
│ └── PAGES.md
├── public/
│ └── screenshots/ ← actual app screenshots go here
├── src/
│ ├── components/
│ ├── pages/
│ └── main.tsx
├── index.html
├── package.json
└── tailwind.config.js
```
---
## Tone of Voice
- Direct and technical — audience is engineers, not executives.
- No marketing fluff ("revolutionize", "empower", "seamless").
- Show, don't tell — a screenshot or code block beats three sentences of prose.
- German is fine for internal docs; the website copy is in **English**.
+261
View File
@@ -0,0 +1,261 @@
# netOrk — Visual Identity & Design System
This document defines the visual identity of netOrk and must be followed
exactly when building the website. The goal is zero visual discontinuity
between the product UI and the marketing site.
---
## Core Principle
**The website looks like a dark-mode dev tool, not a SaaS landing page.**
No gradients, no floating orbs, no animated hero blobs. The aesthetic is
deliberate, minimal, and technical — consistent with the product itself.
---
## Color Palette
All colors are Tailwind CSS v3 classes. Do not use hex values directly —
always use Tailwind class names to stay consistent.
### Backgrounds
| Layer | Class | Usage |
|---|---|---|
| Page / outermost | `bg-slate-950` | Body, full-bleed sections |
| Card / panel | `bg-slate-900` | Content cards, code blocks, feature boxes |
| Elevated element | `bg-slate-800` | Hover states, dropdowns, table rows on hover |
| Border | `border-slate-700` | Between sections, card outlines |
| Subtle border | `border-slate-800` | Inside cards, dividers |
### Text
| Role | Class |
|---|---|
| Primary | `text-slate-100` |
| Secondary / muted | `text-slate-400` |
| Tertiary / placeholder | `text-slate-500` |
| Accent (interactive) | `text-sky-400` |
| Danger | `text-red-400` |
### Accent (Interactive / CTA)
| State | Class |
|---|---|
| Default button | `bg-sky-600 text-white` |
| Hover | `hover:bg-sky-500` |
| Link / inline | `text-sky-400 hover:text-sky-300` |
| Active indicator | `text-sky-400` |
| Focus ring | `focus:ring-sky-500` |
### Semantic Colors
| Meaning | Color |
|---|---|
| Success / active | `text-green-400`, `bg-green-500/20` |
| Warning / caution | `text-yellow-400`, `bg-yellow-500/20` |
| Danger / error | `text-red-400`, `bg-red-500/20` |
| Info / neutral | `text-blue-400`, `bg-blue-500/20` |
### Status Badge Pattern
```tsx
// Active / online
<span className="text-xs font-medium px-2 py-0.5 rounded-full bg-green-500/20 text-green-400">
active
</span>
// Offline
<span className="text-xs font-medium px-2 py-0.5 rounded-full bg-red-500/20 text-red-400">
offline
</span>
// Warning
<span className="text-xs font-medium px-2 py-0.5 rounded-full bg-yellow-500/20 text-yellow-400">
warning
</span>
```
---
## Typography
Font stack: Tailwind default sans-serif (`font-sans`). **No Google Fonts.**
The product uses system fonts; the website must match.
| Element | Classes |
|---|---|
| Hero heading | `text-4xl md:text-6xl font-bold text-slate-100 leading-tight` |
| Section heading | `text-2xl md:text-3xl font-bold text-slate-100` |
| Subsection heading | `text-xl font-semibold text-slate-200` |
| Body text | `text-base text-slate-400 leading-relaxed` |
| Small / label | `text-sm text-slate-400` |
| Tiny / tag | `text-xs font-medium text-slate-500` |
| Code / monospace | `font-mono text-sky-400` |
| Accent text | `text-sky-400` |
---
## Spacing & Layout
- Max content width: `max-w-7xl mx-auto px-6`
- Section padding: `py-24` (desktop), `py-16` (mobile)
- Card padding: `p-6`
- Gap between grid items: `gap-6` or `gap-8`
- All layouts are mobile-first; use `md:` and `lg:` breakpoints.
---
## Components
### Primary CTA Button
```tsx
<a
href="/docs/getting-started"
className="inline-flex items-center gap-2 px-6 py-3 rounded-lg
bg-sky-600 hover:bg-sky-500 text-white font-medium
transition-colors"
>
Get started
</a>
```
### Secondary / Ghost Button
```tsx
<a
href="/features"
className="inline-flex items-center gap-2 px-6 py-3 rounded-lg
border border-slate-700 hover:border-slate-500
text-slate-300 hover:text-slate-100
transition-colors"
>
See all features
</a>
```
### Feature Card
```tsx
<div className="rounded-xl border border-slate-800 bg-slate-900 p-6">
<div className="mb-4 flex h-10 w-10 items-center justify-center
rounded-lg bg-sky-600/10">
{/* Heroicon SVG, className="h-5 w-5 text-sky-400" */}
</div>
<h3 className="mb-2 text-lg font-semibold text-slate-100">Feature name</h3>
<p className="text-sm text-slate-400 leading-relaxed">
Description of the feature in one to three sentences.
</p>
</div>
```
### Screenshot Frame
App screenshots must be wrapped in this frame to integrate naturally
against the dark background:
```tsx
<div className="rounded-xl border border-slate-700 overflow-hidden shadow-2xl">
<img src="/screenshots/device-list.png" alt="Device inventory" className="w-full" />
</div>
```
Optionally add a browser chrome header above the image:
```tsx
<div className="flex items-center gap-1.5 border-b border-slate-700 bg-slate-800 px-4 py-2.5">
<span className="h-2.5 w-2.5 rounded-full bg-red-500/70" />
<span className="h-2.5 w-2.5 rounded-full bg-yellow-500/70" />
<span className="h-2.5 w-2.5 rounded-full bg-green-500/70" />
<span className="ml-4 text-xs text-slate-500 font-mono">netork.local</span>
</div>
```
### Code Block
```tsx
<pre className="rounded-xl border border-slate-800 bg-slate-900 p-6
font-mono text-sm text-slate-300 overflow-x-auto">
<code>{`bash scripts/deploy.sh 192.168.1.1`}</code>
</pre>
```
### Driver / Integration Badge
```tsx
<span className="inline-flex items-center gap-1.5 px-3 py-1 rounded-full
border border-slate-700 bg-slate-900
text-xs font-medium text-slate-300">
OpenWRT
</span>
```
### Section Divider
```tsx
<div className="border-t border-slate-800" />
```
---
## Navigation
- Sticky top nav: `sticky top-0 z-10 bg-slate-900/80 backdrop-blur
border-b border-slate-800`
- Logo: left-aligned. Product name in `font-semibold text-slate-100`,
optionally prefixed with a small icon.
- Nav links: `text-sm text-slate-400 hover:text-slate-100 transition-colors`
- Active link: `text-slate-100`
- CTA in nav: small primary button `px-4 py-1.5 text-sm`
---
## Animations & Transitions
- **Hover states:** always `transition-colors` (not `transition-all`).
- **No JavaScript animations** on initial page load — no entrance animations,
no scroll-triggered reveals via IntersectionObserver.
- Scroll behavior: `scroll-smooth` on `<html>` for anchor links.
- No parallax, no floating elements, no auto-playing videos.
---
## Logo / Wordmark
The netOrk wordmark uses the following convention in the product:
- Lowercase `n`, uppercase `O`: **netOrk**
- Monospace context: `font-mono text-sky-400`
- Heading context: `font-bold text-slate-100` with `Ork` potentially in
`text-sky-400` if desired for emphasis
---
## Iconography
Use Heroicons (inline SVG). Sizes:
- Feature card icons: `h-5 w-5`
- Nav / button icons: `h-4 w-4`
- Hero / large decorative: `h-8 w-8` or `h-10 w-10`
All icons: `text-sky-400` in feature contexts, `text-slate-400` in
secondary/muted contexts.
---
## tailwind.config.js
No custom theme extensions needed. The default Tailwind v3 slate + sky
palette covers everything. The config only needs content paths:
```js
/** @type {import('tailwindcss').Config} */
export default {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {},
},
plugins: [],
}
```
+339
View File
@@ -0,0 +1,339 @@
# netOrk Website — Page Structure & Content Plan
This document defines every page of the website: its purpose, section
structure, and draft copy. Use this as the brief for implementation.
---
## Page Overview
| Route | Page | Priority |
|---|---|---|
| `/` | Landing (Home) | P0 — build first |
| `/features` | Full feature list | P1 |
| `/drivers` | Supported devices | P1 |
| `/docs/getting-started` | Installation guide | P1 |
| `/docs/architecture` | Technical overview | P2 |
| `/plugins` | Plugin system | P2 |
---
## `/` — Landing Page
### Section 1 — Hero
**Purpose:** Answer "what is this?" in 5 seconds.
**Layout:** Full-width, centered. Heading + subheading + two CTAs + hero
screenshot below.
**Heading:**
```
Network orchestration
for heterogeneous infrastructure.
```
(`text-slate-100` for first line, second line in `text-sky-400` or keep
both `text-slate-100` — designer decides.)
**Subheading:**
```
netOrk discovers, monitors, and manages your routers, switches, access
points, firewalls, and servers from a single UI — regardless of vendor.
No SaaS dependency. Runs on your infrastructure.
```
**CTAs:**
- Primary: `Get started →` → `/docs/getting-started`
- Secondary: `View features` → `/features`
**Hero visual:** Full-width screenshot of the device inventory page
(dark UI visible, framed with the browser chrome component from DESIGN.md).
---
### Section 2 — Problem Statement
**Purpose:** Make the pain relatable.
**Layout:** Single centered paragraph or short 3-column stat row.
**Copy:**
```
Managing a mixed network means juggling a different admin UI for every
vendor — one for OPNsense, one for HP ProCurve, one for OpenWRT, one for
Proxmox. Config changes happen directly on devices with no audit trail.
You find out something drifted when it breaks.
```
---
### Section 3 — Core Capabilities (3-up)
**Purpose:** Communicate the three main things netOrk does.
**Layout:** 3 columns, each with icon + heading + 2–3 sentences.
**Card 1 — Discover & Inventory**
- Icon: `MagnifyingGlassIcon`
- Heading: `Discover everything on your network`
- Copy: `ICMP sweep, SNMP scan, and HTTP probing find devices before you
add them. Fingerprinting identifies vendor and platform automatically.
Adopt results into your inventory with a single click.`
**Card 2 — Monitor & Alert**
- Icon: `ChartBarIcon` or `SignalIcon`
- Heading: `Poll device state continuously`
- Copy: `Every device is polled on a configurable interval via NAPALM.
Interface status, ARP tables, DHCP leases, VLAN membership, Docker
containers, and SNMP health metrics — all in one place.`
**Card 3 — Configure & Enforce**
- Icon: `WrenchScrewdriverIcon`
- Heading: `Detect drift. Fix it.`
- Copy: `Define desired state in netOrk. On every poll, device config is
compared against it. Drifted devices get a warning; a one-click fix
stream applies the correction and shows you live SSH output.`
---
### Section 4 — Driver Grid
**Purpose:** Show breadth of vendor support.
**Layout:** Centered heading + wrapping badge grid.
**Heading:** `Works with your hardware`
**Subheading:**
```
netOrk ships with custom NAPALM drivers for 11 device types, plus all
built-in NAPALM drivers. New drivers follow a documented registration
pattern.
```
**Badge list** (see `docs/PRODUCT.md` — driver table):
OpenWRT, OPNsense, Proxmox VE, Linux, HP ProCurve / Aruba, TP-Link Jetstream,
Netgear, Fritz!Box, Zyxel, OpenMediaVault, Sonos,
Cisco IOS, Arista EOS, Juniper JunOS
Each badge uses the `Driver / Integration Badge` component from DESIGN.md.
---
### Section 5 — Screenshot Walkthrough (alternating)
**Purpose:** Show the UI concretely. Three alternating image + text rows.
**Row 1 — Left text, right screenshot**
- Heading: `Device detail at a glance`
- Copy: `Hostname, IP, vendor, OS version, last poll time, and active
warnings on one card. Tabbed detail view for interfaces, LLDP neighbors,
ARP table, VLAN membership, packages, services, and scheduled jobs.`
- Screenshot: DeviceDetailPage
**Row 2 — Right text, left screenshot**
- Heading: `Intent-based VLAN and SSID management`
- Copy: `Define VLAN names and SSID settings once. netOrk compares them
against every polled device and pushes corrections automatically via
UCI (OpenWRT) or the device's native API.`
- Screenshot: VlansPage or WirelessPage
**Row 3 — Left text, right screenshot**
- Heading: `Security visibility per device`
- Copy: `Wazuh agent status, CVE counts by severity, and recent alerts
— all linked to the device record. One-click agent install if the
agent is missing. Graylog syslog forwarding status with auto-fix.`
- Screenshot: SecurityTab inside DeviceDetailPage
---
### Section 6 — Plugin System (brief)
**Purpose:** Signal extensibility without going deep.
**Layout:** Dark card, left-aligned.
**Heading:** `Built to extend`
**Copy:**
```
Integrations (Wazuh, Graylog, CrowdSec, apt-cacher-ng) are plugins
that register into the plugin system — they can be enabled or disabled
per deployment without code changes. Adding a new integration follows
a documented pattern with a hook bus, typed metadata, and a plugin
registry.
```
**CTA:** `Plugin system docs →` → `/plugins`
---
### Section 7 — Deployment (quick)
**Purpose:** Answer "how do I run this?" without going into detail.
**Layout:** Code block + short description.
**Heading:** `Self-hosted. One command.`
**Copy:**
```
netOrk runs in Docker Compose. Five containers: API, two worker pools,
a Beat scheduler, and an nginx UI server. No external dependencies beyond
Redis and PostgreSQL.
```
**Code block:**
```bash
# Clone + configure
git clone https://gitea.example.com/netork/netork.git
cp .env.example .env
# edit .env (DB URL, Redis password, secret key)
# Deploy
bash scripts/deploy.sh 192.168.1.10
```
---
### Section 8 — CTA Footer
**Layout:** Centered, full-width dark section.
**Heading:** `Start managing your network.`
**CTA:** `Read the docs →` → `/docs/getting-started`
---
## `/features` — Full Feature List
**Purpose:** Comprehensive reference for people who want to evaluate in depth.
**Layout:** Vertical list of expandable sections (or just long-scroll with
sticky section nav). One section per capability area.
**Sections** (map directly to feature list in `docs/PRODUCT.md`):
1. Device Management
2. Discovery
3. Supported Drivers (full table)
4. Networking & Inventory
5. Configuration Management & Drift
6. Scheduled Operations
7. Monitoring & Health
8. Security Integrations
9. DNS Management
10. Access Control (RBAC)
11. NetBox Sync
12. Developer Experience
Each section: `text-xl font-semibold text-slate-200` heading +
feature items as a clean list with `text-slate-400` body.
---
## `/drivers` — Supported Devices
**Purpose:** One-page reference for "does netOrk support my device?"
**Layout:** Full table + short description per driver.
**Table columns:** Driver name | Device type | Capabilities | Status
**Capabilities** — checkmarks or tags for:
- `get_facts` `get_interfaces` `get_lldp` `get_vlans` `get_ssids`
`get_health_metrics` `get_docker` `scheduled_reboot` `config_push`
**Status:** `stable` / `beta` / `community` as a badge.
---
## `/docs/getting-started` — Installation
**Purpose:** Get someone from zero to a running instance.
**Sections:**
1. **Prerequisites**
- Docker + Docker Compose
- A PostgreSQL instance (or use the bundled profile)
- Redis
- A Linux host reachable by SSH from the server
2. **Quick start**
```bash
git clone ...
cp .env.example .env
# Edit .env
bash scripts/deploy.sh <server-ip>
```
3. **First run**
- Navigate to `http://<server-ip>`
- Complete the setup wizard (creates admin user)
- Add your first device
4. **Adding a device**
- Fill in hostname/IP, driver, and credentials
- Click Poll to verify connectivity
- Set a poll interval for continuous monitoring
5. **Next steps**
- Configure NetBox sync
- Set up Wazuh integration
- Enable scheduled reboots for OpenWRT APs
---
## `/docs/architecture` — Technical Overview
**Purpose:** Give engineers the mental model before they look at code.
**Content:** Essentially the one-paragraph summary from `docs/PRODUCT.md`
expanded into a readable overview with the architecture diagram (ASCII or SVG).
**Sections:**
1. Overview (request → FastAPI → DB / Celery worker)
2. Driver system (NAPALM + custom drivers + registry)
3. Task queues (which queue does what)
4. Plugin system (register → hook bus → router mount)
5. Data model (UUID PKs, JSONB snapshots, intent-vs-state)
---
## `/plugins` — Plugin System
**Purpose:** Explain extensibility to potential contributors.
**Sections:**
1. What is a plugin? (metadata, router, tasks, hooks)
2. Built-in plugins (Wazuh, Graylog, CrowdSec, apt-cacher)
3. Writing a plugin (step-by-step with code snippets)
4. Hook bus (fire / call / transform)
5. Plugin registry and enable/disable
---
## Global Layout
### Navigation (all pages)
```
[ netOrk ] Features Drivers Docs ▾ Plugins [ Get started ]
```
`Docs` is a dropdown: Getting Started / Architecture
### Footer
```
netOrk — self-hosted network orchestration
Links: Resources: Legal:
Features Getting Started MIT License
Drivers Architecture Privacy (none collected)
Plugins Changelog
```
Footer background: `bg-slate-900 border-t border-slate-800`
Footer text: `text-sm text-slate-500`
+173
View File
@@ -0,0 +1,173 @@
# netOrk — Product Description
## One-liner
**netOrk is a self-hosted network orchestration platform that discovers,
monitors, and manages heterogeneous network infrastructure from a single UI.**
## Elevator Pitch (3 sentences)
netOrk connects to your routers, switches, access points, firewalls, and servers
via NAPALM and custom vendor drivers — regardless of manufacturer. It continuously
polls device state, detects configuration drift, and lets you push corrections in
one click. All findings are synced to NetBox as the source of truth, and security
integrations with Wazuh and Graylog give you visibility across the full stack.
---
## Target Audience
**Primary:** Network engineers and IT administrators managing small to medium
heterogeneous environments (10–500 devices) — mixed vendor, mixed OS.
**Secondary:** Serious homelab operators who run "prosumer" or enterprise-grade
hardware and want operational visibility beyond what consumer dashboards offer.
**Pain points this solves:**
- Multiple vendor-specific management UIs open at once
- No single view of "what's running where"
- Config changes made directly on devices — nobody knows what changed
- Manual SSH into every device to check interface status or VLAN membership
- Security tooling (Wazuh agents, syslog) not consistently deployed
---
## Value Propositions
1. **One UI for everything** — OpenWRT APs, OPNsense firewalls, HP ProCurve
switches, Proxmox hosts, Linux servers, Fritz!Boxes, NAS devices, and more,
all managed in one place.
2. **Intent-based configuration** — Define desired state in netOrk (VLAN names,
SSID settings, AP radio profiles). netOrk pushes the config to devices and
corrects drift automatically or on demand.
3. **Automatic drift detection** — Every poll compares device config against the
DB. Drifted devices get a warning; a one-click fix stream applies the
correction via SSH/UCI/REST and shows live output.
4. **Scheduled automation** — Automatic reboots for OpenWRT APs (GTK key rotation
workaround), scheduled config fixes, package updates — all with time windows
and per-site concurrency limits.
5. **Security visibility** — Wazuh agent tracking with CVE counts and alert history
per device. Graylog syslog forwarding status and auto-fix. CrowdSec org-level
threat summary per device.
6. **Deep NetBox integration** — Devices, interfaces, IP addresses, prefixes,
VLANs synced to NetBox automatically. netOrk uses NetBox as the canonical
documentation target.
7. **Plugin system** — Integrations (Wazuh, Graylog, CrowdSec, apt-cacher-ng)
are plugins that can be enabled/disabled per deployment. Adding a new
integration follows a documented pattern.
8. **Self-hosted, no SaaS** — Runs in Docker Compose. Your data stays on your
infrastructure. No telemetry, no cloud dependency.
---
## Feature List
### Device Management
- CRUD for devices with credential profiles and SSH key management
- Per-device poll intervals (minutes) or manual-only
- Status tracking: planned / staged / active / decommissioning / offline / disabled
- Vendor/model/OS auto-populated from NAPALM `get_facts()`
- Site assignment with FK to structured Site records
- AP Profile assignment for grouped OpenWRT config
### Discovery
- ICMP ping sweep, SNMP scan, HTTP/HTTPS probing
- Device fingerprinting: vendor + platform confidence scoring
- FQDN resolution (reverse DNS)
- Manual adoption from scan results (no auto-create to avoid inventory noise)
### Supported Device Drivers
Custom NAPALM drivers for all of the following:
| Driver | Device type |
|---|---|
| `openwrt` | OpenWRT access points |
| `opnsense` | OPNsense firewalls |
| `proxmox` | Proxmox VE hypervisors |
| `linux` | Generic Linux servers |
| `procurve` | HP ProCurve / Aruba switches |
| `tplink_jetstream` | TP-Link Jetstream managed switches |
| `netgear` | Netgear switches |
| `fritzbox` | AVM Fritz!Box routers |
| `zyxel` | Zyxel switches |
| `openmediavault` | OpenMediaVault NAS |
| `sonos` | Sonos speakers |
Plus all built-in NAPALM drivers: Cisco IOS/IOS-XE/NX-OS, Arista EOS, Juniper JunOS.
### Networking & Inventory
- Interface browser with IPv4/IPv6 addresses, MAC, speed, MTU
- LLDP neighbor discovery and topology graph
- ARP table and DHCP lease browser per device
- Subnet browser with interface-to-subnet assignments
- VLAN list grouped by site; per-VLAN device membership view
- SSID management with push to OpenWRT APs via UCI
### Configuration Management
- Config drift detection: desired state (DB) vs device state (poll snapshot)
- One-click drift fix stream with live SSH output in the browser
- UCI-based config push for OpenWRT (VLAN names, SSID settings, radio config)
- AP profile system: country code, HT/VHT mode, 802.11r, NTP, syslog, SSH port
### Scheduled Operations
- Scheduled reboots for OpenWRT APs with per-site concurrency lock
- Failback cron script written to device for netOrk-unreachable scenarios
- Scheduled config drift fixes with time-window enforcement
- Package update scheduling and one-click apply
### Monitoring & Health
- SNMP health metrics (CPU, memory, interface counters) via `get_health_metrics()`
- Per-device warning system with severity levels (error / warning / info)
- Docker container and image status (Proxmox/Linux)
- Service status and start/stop/restart (systemd)
- VM/container list with OS device cross-linking (Proxmox)
### Security Integrations (plugins)
- **Wazuh** — agent enrollment tracking, vulnerability counts (by severity),
recent alert history, CIS benchmark scores, one-click agent install fix stream
- **Graylog** — rsyslog forwarding status per device, one-click fix to write rule
- **CrowdSec** — org-level decisions, remediation metrics, top attack scenarios
### DNS
- DNS zone management with authoritative device assignment
- Forward record provisioning (A records from device interfaces)
- PTR record provisioning to reverse zones
- Pending job queue for zone changes when device is unreachable
### Access Control
- JWT authentication with remember-me (localStorage) or session-only (sessionStorage)
- RBAC with four built-in roles: viewer / operator / engineer / administrator
- Custom roles with any permission combination
- Full audit log of all orchestration actions
### NetBox Sync
- Pushes vendor, model, OS version, status to NetBox dcim.devices
- Syncs interfaces, IP addresses, prefixes, VLANs
- VM interfaces and disks for Proxmox hosts
### Developer / Operator Experience
- OpenAPI / Swagger at `/docs`
- Plugin system: new integrations follow a documented pattern
- Celery task queue with dedicated queues per workload type
- Docker Compose deployment (single command)
- Alembic migrations run automatically on deploy
---
## Architecture in One Paragraph
netOrk runs as five Docker containers: a FastAPI API server, two Celery worker
pools (general + poll), a Celery Beat scheduler, and an nginx UI server. Redis
is the broker. PostgreSQL stores all state. Device communication is always
blocking I/O executed in Celery workers — FastAPI request handlers are
async-only for DB and quick operations. Custom NAPALM drivers live in `vendor/`
as editable packages and self-register via `@register_driver`. The plugin system
(`netork/plugins/`) provides a hook bus, a plugin registry with enable/disable
state in the DB, and a documented pattern for adding integrations.