Personal Inventory System Design
Vision
A grep-able, jq-queryable, insurance-ready inventory system that:
-
Lives in domus-captures as single source of truth
-
Generates insurance reports, tax depreciation, location maps
-
Supports QR codes for physical item lookup
-
Tracks lifecycle: purchase → maintenance → disposal
-
Integrates with gopass for receipts/warranties
Architecture Options
Option A: Pure AsciiDoc (Partials)
partials/inventory/
├── electronics/
│ ├── computers.adoc
│ ├── mobile.adoc
│ ├── audio.adoc
│ └── networking.adoc
├── furniture/
├── tools/
├── vehicles/
├── storage/ # What's in each storage unit/box
├── collections/ # Books, music, art
└── _index.adoc # Rollup totals
Pros: Native to ecosystem, renders in docs Cons: Harder to query programmatically
Option B: YAML Data + AsciiDoc Views
data/inventory/
├── electronics.yml
├── furniture.yml
├── tools.yml
└── schema.yml
pages/inventory/
├── index.adoc # Summary dashboard
├── by-location.adoc # Where is everything?
├── by-value.adoc # Insurance view
├── maintenance.adoc # What needs attention?
└── recent.adoc # Recent acquisitions
Pros: jq/yq queryable, scriptable reports Cons: Two systems to maintain
Option C: Hybrid (Recommended)
YAML as source of truth + AsciiDoc generated views + CLI tools
data/inventory.yml # Single YAML file, all items
scripts/inventory/
├── inv # CLI wrapper
├── inv-report # Generate reports
├── inv-qr # Generate QR codes
└── inv-insurance # Insurance export
pages/inventory/
├── index.adoc # include::example$inventory-summary.adoc[]
├── by-location.adoc
├── by-category.adoc
└── maintenance-due.adoc
Proposed Schema (YAML)
# data/inventory.yml
---
schema_version: "1.0"
last_updated: "2026-03-26"
items:
- id: "ELEC-001"
name: "Razer Blade 15 Advanced"
category: "electronics/computers"
subcategory: "laptop"
# Acquisition
acquired_date: "2023-06-15"
acquired_method: "purchase" # purchase, gift, inherited, found
acquired_from: "Amazon"
purchase_price: 2499.99
currency: "USD"
receipt: "gopass://v3/personal/receipts/razer-blade-2023"
# Current State
status: "active" # active, stored, lent, sold, disposed, lost
condition: "good" # new, excellent, good, fair, poor, broken
location:
type: "room" # room, box, storage_unit, vehicle, lent_to
name: "office"
detail: "desk, left side"
# Value
current_value: 1800.00
insurance_category: "electronics"
depreciation_method: "straight_line"
useful_life_years: 5
# Identification
serial_number: "RZ09-0421..."
model_number: "RZ09-0421PEA3-R3U1"
mac_addresses:
wifi: "98:BB:1E:1F:A7:13"
ethernet: "98:BB:1E:1F:A7:14"
# Warranty & Support
warranty_expires: "2026-06-15"
warranty_type: "manufacturer"
support_url: "https://support.razer.com"
manual: "gopass://v3/personal/manuals/razer-blade"
# Maintenance
maintenance_schedule:
- task: "Clean fans"
frequency: "6 months"
last_done: "2026-01-15"
next_due: "2026-07-15"
- task: "Replace thermal paste"
frequency: "2 years"
last_done: null
next_due: "2025-06-15"
# Relationships
accessories:
- "ELEC-045" # Power adapter
- "ELEC-046" # USB-C hub
parent: null # For accessories, points to main item
# Metadata
tags: ["work", "primary", "portable"]
notes: "Primary development machine. Has Ubuntu + Windows dual boot."
photos:
- "photos/inventory/ELEC-001-front.jpg"
- "photos/inventory/ELEC-001-serial.jpg"
qr_code: "INV:ELEC-001"
# Lifecycle
disposed_date: null
disposed_method: null # sold, donated, recycled, trashed, lost
disposed_to: null
disposal_value: null
Category Hierarchy
categories:
electronics:
- computers (desktop, laptop, tablet, server)
- mobile (phone, watch, earbuds)
- audio (speakers, headphones, microphones)
- video (cameras, monitors, projectors)
- networking (routers, switches, access points)
- storage (drives, NAS, tapes)
- gaming (consoles, controllers, VR)
- smart_home (sensors, hubs, assistants)
furniture:
- seating (chairs, sofas, stools)
- tables (desks, dining, coffee)
- storage (shelves, cabinets, dressers)
- beds (frames, mattresses)
tools:
- power_tools
- hand_tools
- measurement
- safety
vehicles:
- cars
- bikes
- accessories
clothing:
- outerwear
- footwear
- accessories
collections:
- books
- music (vinyl, CDs, instruments)
- art
- memorabilia
kitchen:
- appliances
- cookware
- utensils
outdoor:
- camping
- sports
- garden
documents:
- legal (deeds, titles, contracts)
- financial (tax returns, statements)
- medical (records, prescriptions)
- identity (passports, licenses, certificates)
CLI Tool: inv
# Query examples
inv list # All active items
inv list --category electronics # Filter by category
inv list --location office # Where is it?
inv list --value-above 500 # High-value items
inv list --warranty-expiring 90 # Expiring in 90 days
inv list --maintenance-due # Needs attention
inv list --status stored # What's in storage?
# Reports
inv report insurance # Insurance inventory
inv report depreciation 2026 # Tax depreciation schedule
inv report location # Room-by-room inventory
inv report value # Total asset value by category
# Management
inv add # Interactive add
inv edit ELEC-001 # Edit item
inv move ELEC-001 --location "storage_unit:extra-space:box-12"
inv maintain ELEC-001 --task "Clean fans" # Log maintenance
inv dispose ELEC-001 --method sold --to "eBay" --value 1200
# Utilities
inv qr ELEC-001 # Generate QR code
inv qr --all --output labels/ # Generate all QR labels
inv search "razer" # Full-text search
inv backup # Backup to gopass
Location Schema
locations:
# Rooms in primary residence
rooms:
office:
building: "home"
floor: 1
zones: ["desk", "bookshelf", "closet"]
bedroom:
building: "home"
floor: 2
zones: ["nightstand", "closet", "dresser"]
garage:
building: "home"
floor: 0
zones: ["workbench", "shelves", "cabinets"]
# Storage units
storage_units:
extra-space:
provider: "Extra Space Storage"
address: "123 Storage Lane"
unit: "B-247"
size: "10x10"
access_code: "gopass://v3/personal/storage/extra-space"
boxes:
- id: "box-01"
label: "Winter Clothes"
contents_summary: "Coats, boots, ski gear"
- id: "box-12"
label: "Electronics Archive"
contents_summary: "Old laptops, cables, parts"
# Vehicles (mobile storage)
vehicles:
car-primary:
make: "Toyota"
model: "Camry"
zones: ["trunk", "glovebox", "backseat"]
# Lent items
lent:
- person: "Gabriel"
items: ["TOOL-012", "ELEC-089"]
since: "2026-02-15"
expected_return: "2026-04-01"
Insurance Report Output
╔══════════════════════════════════════════════════════════════════╗
║ PERSONAL PROPERTY INVENTORY ║
║ Insurance Schedule - 2026-03-26 ║
╠══════════════════════════════════════════════════════════════════╣
║ Category │ Items │ Purchase Value │ Current Value ║
╠═══════════════════╪═══════╪════════════════╪═════════════════════╣
║ Electronics │ 47 │ $32,450.00 │ $24,200.00 ║
║ Furniture │ 23 │ $12,800.00 │ $8,500.00 ║
║ Tools │ 31 │ $4,200.00 │ $3,800.00 ║
║ Collections │ 156 │ $8,900.00 │ $12,400.00 ║
║ Clothing │ 12 │ $2,100.00 │ $1,200.00 ║
║ Kitchen │ 28 │ $3,400.00 │ $2,800.00 ║
╠═══════════════════╪═══════╪════════════════╪═════════════════════╣
║ TOTAL │ 297 │ $63,850.00 │ $52,900.00 ║
╚══════════════════════════════════════════════════════════════════╝
High-Value Items (>$1,000):
1. Razer Blade 15 Advanced (ELEC-001) - $1,800 - office/desk
2. Sony A7 IV Camera (ELEC-023) - $2,400 - office/closet
3. Herman Miller Aeron (FURN-001) - $1,200 - office
...
Items with Photos: 234/297 (79%)
Items with Receipts: 189/297 (64%)
Items with Serial Numbers: 156/297 (53%)
QR Code System
Each item gets a QR code label:
┌─────────────────────┐
│ ▄▄▄▄▄ █▀█ █ ▄▄▄▄▄ │
│ █ █ █▄▀▄█ █ █ │
│ █▄▄▄█ █▀▀▀█ █▄▄▄█ │
│ ▄▄▄▄▄ ▄▀█▀▄ ▄▄▄▄▄ │
│ █ █ ▀▄█▀ █ █ │
│ █▄▄▄█ █▀ ▀█ █▄▄▄█ │
├─────────────────────┤
│ ELEC-001 │
│ Razer Blade 15 │
│ inv://ELEC-001 │
└─────────────────────┘
Scan with phone → opens inventory entry
Print labels with inv qr --print ELEC-001
Integration Points
gopass Integration
# Sensitive data stored in gopass, referenced by path
receipt: "gopass://v3/personal/receipts/razer-blade-2023"
manual: "gopass://v3/personal/manuals/razer-blade"
warranty_details: "gopass://v3/personal/warranties/razer-blade"
access_code: "gopass://v3/personal/storage/extra-space"
Worklog Integration
// In WRKLOG-2026-03-26.adoc
== Acquisitions
* Purchased Sony WH-1000XM5 headphones ($348)
** Added to inventory: `inv add` → ELEC-094
** Receipt stored: `gopass insert v3/personal/receipts/sony-xm5`
Maintenance Reminders
# In cron or daily check
inv list --maintenance-due --format reminder
# Output:
OVERDUE: ELEC-001 - Clean fans (due 2026-07-15, 14 days overdue)
DUE SOON: HVAC-001 - Replace filter (due 2026-04-01, 6 days)
DUE SOON: CAR-001 - Oil change (due 2026-04-15, 20 days)
Implementation Plan
Phase 1: Schema & CLI (Week 1)
-
Create
data/inventory.ymlwith schema -
Create
scripts/invCLI tool (Python/bash) -
Add 20 high-value items as proof of concept
-
Test query patterns
Phase 2: Views & Reports (Week 2)
-
Create AsciiDoc pages that render from YAML
-
Implement insurance report generator
-
Implement depreciation calculator
-
Add to nav.adoc under Reference
Phase 3: Physical Integration (Week 3)
-
QR code generator
-
Print labels for high-value items
-
Photo documentation workflow
-
Receipt digitization backlog
Phase 4: Automation (Week 4)
-
Maintenance reminder cron job
-
Warranty expiration alerts
-
Insurance report auto-generation (annual)
-
Backup to gopass
Decision Points
-
Architecture: Option C (YAML + AsciiDoc views)?
-
Scope: Start with electronics only, or full household?
-
Granularity: Track every item, or only items >$50?
-
Photos: Required for all items, or optional?
-
Location detail: Room-level or zone-level (desk vs room)?
-
Tool: Python CLI or bash+jq?
Prior Art / Inspiration
-
Snipe-IT - Enterprise asset management (too heavy)
-
Grocy - Home inventory (food-focused)
-
Home Assistant - Smart home (device-focused)
-
Plain text accounting - ledger/hledger (financial)
This design takes the plain text accounting philosophy (human-readable, version-controlled, scriptable) and applies it to physical assets.
Draft created: 2026-03-26