wireplanner/README.md

4.9 KiB

Lostcave Wireplanner

Network mapping and cable management tool — no auto-discovery, no SNMP, no bullshit.
Manual data entry with a dark web UI. Think of it as a whiteboard that doesn't smudge.

Stack

Layer Choice
Language Go 1.22+
HTTP net/http stdlib (1.22 pattern routing)
Templates html/template
Frontend HTMX 2.0 (self-hosted), vanilla CSS, vanilla JS
Database SQLite 3 (WAL mode, single-file)

Zero build steps. go build → one binary. Drop it on a server and go.

Quick start

git clone <repo>
cd lostcavewireplanner
go build -o wireplanner .
./wireplanner
# → http://localhost:8080

Set PORT=9090 to change the listen port. Database is created as data.db in the working directory.

Features

Views

  • Overview — landing page with all racks, unracked devices, global connection table. Create racks and devices inline. Rack cards show device counts.
  • Rack view — front/back rack table (U1 at bottom to U42+ at top). Devices placed at specific rack units with continuous background tint for multi-U devices. Clickable ports show connection status with per-cable colors.
  • Device view — model info, usage description, location, front/back port lists. Embedded model images. Back-to-rack breadcrumb link when racked.
  • Device models — create/edit templates with rack-mountable flag, height in U, patch panel, wall socket, and power strip checkboxes. Arbitrary port definitions (name + front/back side). Port side selectors auto-disable for patch panels. Clone button to copy models with all ports.
  • Wall sockets — table view with location, type, name, comment. Clickable ports for connection inspection.
  • Connection modal (HTMX) — click any port to inspect its cable. Full trace through patch panels and wall sockets. Show/hide connection type, color, per-end labels, and endpoint devices. Create, edit, and delete connections inline.

Connection tracing

Cables are traced through patch panels automatically. If you click a port on a switch connected to a patch panel that's patched through to a wall socket that leads to an access point, the modal shows the full chain:

Switch [g01] ==(cable label)==> [Patch Panel / p01 front] → [pp01 back] ==(another cable)==> [Wall Socket] ==>(cable)==> [Access Point]

Click-to-connect mode

Toggle "Connect Mode" on any rack or device view. Click one port (it glows), click another port, a mini form pops up to choose type/color/labels. Create the cable in two clicks — no dropdown scrolling.

Power strips

Mark a device model as a power strip. In the rack view it renders as a grid of 🔌 outlet sockets. Each outlet shows its label and whether something is plugged into it, color-coded by the power cable's color.

Data model

Assigned numeric IDs per type (racks, devices, ports, connections). Names are mutable — IDs are the canonical reference.

Table Purpose
device_models Templates (switch 48-port, patch panel 24, etc.)
device_model_ports Port definitions on models
racks Physical racks (type, depth, height in U)
devices Actual devices (racked or unracked, rack position)
device_ports Instantiated ports on actual devices
connection_types Ethernet, FibreChannel, SAS, power, video, audio, serial, USB
connections Cables (two port ends, labels, color)

Patch panels and wall sockets auto-double ports: every model port gets both a front and back instance with the same name, allowing the tracer to follow through.

Transactions

All writes use SQLite transactions. A port can only have one cable. Dangling cables are allowed (one end only, not both). Duplicate name errors are caught and shown as friendly messages.

Project layout

├── main.go                  # Routes and entry point
├── internal/
│   ├── db/                  # Schema, migrations, Store (CRUD)
│   ├── handlers/            # HTTP handlers per domain
│   ├── models/              # Go structs
│   └── services/            # Connection tracing logic
├── templates/               # Go HTML templates (one per page + shared partials)
├── static/
│   ├── style.css            # Dark theme, single file
│   ├── js/
│   │   ├── htmx.min.js      # HTMX 2.0 (self-hosted, no CDN)
│   │   └── app.js           # Modal management, connect mode
└── uploads/                 # Device model images (runtime, .gitignored)

License

GNU Affero General Public License v3.0 or later. See LICENSE.