4.8 KiB
HWLab
What This Is
HWLab is a self-hosted, AI-powered hardware inventory management system for homelab environments. It combines local multimodal AI (Gemma 4 via oMLX) for photo-based intake and categorization, NetBox as the authoritative inventory database, and automated label printing with integrated cable testing workflows. Built with Go + React, running entirely on a Mac Mini M4.
Core Value
Any physical item can be cataloged by uploading a photo — AI extracts data, creates a NetBox record, and prints a QR-coded label — with zero manual data entry for 80-90% of items.
Requirements
Validated
(None yet — ship to validate)
Active
- AI-powered hardware intake via photo upload (Gemma 4 local inference)
- Three-tier AI pipeline: local indexer, research agent, lab advisor
- NetBox integration as sole source of truth for all inventory data
- Automated QR-coded label printing via PRT Qutie thermal printer
- Cable testing workflows with Treedix USB/DP/HDMI testers
- Live USB power testing with FNIRSI FNB58
- Inventory dashboard with AI-powered natural language search
- Lab Advisor chat interface backed by Claude Opus
- SearXNG integration for automated product research
- Provider-agnostic AI routing via OpenAI-compatible endpoints
- Universal HW-XXXXX ID scheme with QR-encoded item URLs
- Catalog quality gate (draft/indexed/needs_research/researched/complete)
Out of Scope
- Barcode scanner integration — future consideration
- Mobile companion app / PWA — web-first for v1
- SNMP/network discovery — manual and AI intake only for v1
- Bulk import mode ("box of 50 cables") — defer to post-MVP
- Automated NetBox topology map updates — future consideration
- Real-time chat/collaboration — solo operator tool
Context
- Target machine: Mac Mini M4 (16GB unified memory) running macOS
- NetBox: Running in Proxmox LXC 130 (10.5.0.130:8000), API token:
homelab-netbox-api-token-2024, DNS: netbox.lab.georgsen.dk, external: netbox.georgsen.dk — needs netbox-inventory plugin and custom fields - oMLX: Not yet installed — needs setup with Gemma 4 model on Mac Mini
- SearXNG: Running in Proxmox LXC 129 (10.5.0.129:8080), JSON API:
http://10.5.0.129:8080/search?q=query&format=json, DNS: searxng.lab.georgsen.dk, external: search.georgsen.dk — no auth needed - Community Postgres: Available in homelab infrastructure
- DragonFlyDB: Available in homelab infrastructure — candidate for write-ahead queue / caching
- USB peripherals arriving: Monday 2026-04-13 (PRT Qutie printer, Treedix testers, FNIRSI FNB58)
- Git remote: git.georgsen.dk
- Design system: ClickHouse-inspired (pure black + neon volt) — not Tokyo Night as originally brainstormed
- Solo operator: Mikkel's homelab, no multi-user requirements
Constraints
- Hardware: Mac Mini M4 with 16GB — Gemma 4 model must fit in memory (E4B confirmed, 26B A4B needs testing with TurboQuant)
- No cloud dependency: Standard operations must work fully local — OpenRouter only for Tier 2/3 AI
- NetBox is source of truth: HWLab stores no inventory data locally (only advisor chat history + config in SQLite)
- USB protocols: Printer and tester protocols need reverse-engineering once hardware arrives
- Tech stack: Go backend, React TypeScript frontend, Tailwind CSS
Key Decisions
| Decision | Rationale | Outcome |
|---|---|---|
| NetBox as sole data store | Leverage existing ecosystem, avoid data duplication | -- Pending |
| Universal HW-XXXXX IDs | Category-agnostic — AI handles categorization, not the ID | -- Pending |
| Three-tier AI model | Local-first for cost/speed, escalate only when needed | -- Pending |
| ClickHouse design system | Global default DESIGN.md, high-contrast dark theme | -- Pending |
| OpenRouter for remote AI | Provider-agnostic, any model via config swap | -- Pending |
| Go + React stack | Go for USB/serial control and backend; React for dynamic SPA | -- Pending |
| oMLX for local inference | Apple Silicon optimized, MLX backend for Gemma 4 | -- Pending |
Evolution
This document evolves at phase transitions and milestone boundaries.
After each phase transition (via /gsd-transition):
- Requirements invalidated? -> Move to Out of Scope with reason
- Requirements validated? -> Move to Validated with phase reference
- New requirements emerged? -> Add to Active
- Decisions to log? -> Add to Key Decisions
- "What This Is" still accurate? -> Update if drifted
After each milestone (via /gsd-complete-milestone):
- Full review of all sections
- Core Value check — still the right priority?
- Audit Out of Scope — reasons still valid?
- Update Context with current state
Last updated: 2026-04-09 after initialization