2026-04-19 Building the Devices Inventory System
Context
Today started with a kernel panic on the MacBook during a Plugable UD-ULTC4K dock reconnect after restart. The disconnect/reconnect cycle is a documented issue with this dock model on Apple Silicon (per Plugable’s KB, last updated Feb 2026, still seeing reports as of macOS 26.3). Resolution: unplug/replug to clear the state, plus upgrading DisplayLink Manager from 1.10.3 (late 2024) to 16.x via brew install --cask displaylink for ongoing version tracking.
The crash itself was an ACIOPHY0 NMI panic — Apple Silicon’s USB-C PHY coprocessor failing to negotiate state during sleep/wake. Almost certainly downstream of the same dock state issue.
The deeper problem was process, not the dock. Every couple of months, troubleshooting hardware requires hunting for the model number, the manual, the warranty status, the related software. No system existed. Today’s session built one.
Topics explored
Inventory tooling landscape: surveyed options from Google Sheets through HomeBox (self-hosted home inventory) to Snipe-IT (enterprise ITAM). Settled on extending Obsidian since it’s already the active PKM stack — minimal new infrastructure, leverages existing fileClass/Bases muscle memory.
Obsidian-native approaches: compared Dan B’s Physical Object System (minimalist, body-first, three frontmatter fields), Functionally Mad’s PIMS (lighter than Dan’s, tag-based gear lists), and Metadata Menu fileClass approach (typed schemas, validation, inheritance). Picked the fileClass approach since it matches existing people-management conventions.
Three data tools refresher:
- Dataview — query engine, read-only in practice, stagnant development
- Meta Bind — interactivity layer (input fields, buttons, view fields bound to frontmatter)
- Bases — Obsidian’s official native query system, replaced most Dataview use cases, blazing fast
Metadata Menu’s continued value post-Properties: confirmed via official docs. Native Properties handles raw YAML editing; Metadata Menu still owns fileClass schemas, typed validation, extends-based inheritance, tag/folder/path mapping. Load-bearing for the schema-validation story.
Conventions debated and resolved:
- Body sections start at H2 (not H1) — Obsidian-specific convention, since “Show inline title” renders the filename as H1; the Linter has a dedicated rule for this
- No blank line after frontmatter — purely cosmetic, contested in the community, removed since visible in Live Preview
What was built
Templates/fileClasses/devices.md— schema definition. Fields:model(required),manufacturer,category(Select, 17 options),purchase_date,purchase_price(Number),warranty_expires,location,serial,product_url,manuals(Multi),status(Select: active/retired/sold/broken/lost),created,tags. Tag-driven viamapWithTag: true.Templates/devices-template.md— Templater scaffold. Prompts for manufacturer, model, category, status. Renames file to${manufacturer} ${model}. Reads fileClass YAML to dynamically generate matching frontmatter — small improvement overpeople-template.mdwhich hardcoded select options.Devices/Plugable UD-ULTC4K.md— first populated device note. Contains specs, purchase history (Amazon order, Two Sigma WFH reimbursement), warranty status (expired Sept 2024), and today’s troubleshooting incident under### Known issues.Dashboards/Devices.base— three views: Active Devices (status==active table), All Devices (no filter, includes price + status), Cards (visual layout). Includesformula.model_linkformula that turns the model column into a clickable link backed byproduct_url.Dashboards/People.base— migrated to current canonical Bases syntax as collateral cleanup (was using deprecatedcolumns:/group_by:patterns).
Key decisions and what was rejected
Software fileClass (software.md): rejected. Premature normalization. With ~15-30 devices total expected, drivers as a Multi of strings is sufficient. Promote to its own fileClass only if a specific software entity accumulates enough metadata to deserve its own note.
Multi: File for manuals: rejected for now. File-typed fields only autocomplete from in-vault content; manuals can be Google Drive PDFs, vendor URLs, or local downloads. Multi (plain strings) accepts wikilinks and URLs in one field. Will revisit if the pattern shifts toward downloading PDFs locally for offline iCloud sync.
Body sections beyond ## Specs and ## Notes: rejected. Originally proposed ## Troubleshooting history, ## Setup / Dependencies, ## References — all aspirational and not grounded in actual usage. Per Dan B’s principle: let sections emerge from real notes.
Six views in the base: reduced to three (Active, All, Cards). Bases’ interactive UI handles ad-hoc grouping (right-click column → “Group by”) and sorting (click header), so dedicated By Category, By Manufacturer, and Warranty Status views were redundant. Cut sync surface area in half.
Lessons learned
Bases YAML syntax has migrated significantly. The columns: block with field/width objects is deprecated (silently ignored). Current canonical syntax uses order: for column visibility/ordering, properties: for displayNames, groupBy: (camelCase) for grouping, sort: with property:/direction: for sorting. Obsidian re-saves base files when edited via UI, normalizing toward the current syntax — so anything written by hand will get rewritten.
YAML anchors won’t survive Bases UI round-trips. Tempting solution for sharing column lists across views, but Obsidian serializes the expanded form on save. Don’t bother.
LLM-assisted note creation needs schema awareness. Templater enforces nothing post-creation; Metadata Menu only validates through its UI. To prevent schema drift from Claude Code or similar, the right approach is to point the LLM at the fileClass file as ground truth via CLAUDE.md at the vault root.
Existing people.md schema has smells worth revisiting eventually. Prose fields (working_on, challenges, learning, notes) crammed into YAML; string fields that should be linked notes (manager, team); fields that exist because they could exist (salary, birthday). Not urgent; flagged for later refactor.
Open / not done
CLAUDE.mdfor vault-level LLM authoring guidance not yet written- Pre-commit hook for fileClass schema validation not yet written
- Meta Bind button to spawn new device notes from a dashboard not added (currently must use Templater command palette)
- Devices template doesn’t auto-move into
Devices/folder — relies on creating the new note in the right place - Other devices not yet populated (MacBook, gaming PC, monitors, peripherals, PS5, etc.)