Tool for interacting with self-hosted HomeBox inventory management service via its REST API. Use when user wants to: (1) Find where an item is (e.g., 'where...
Use the HomeBox REST API to manage your home inventory. This skill provides a cross-platform Node.js CLI script and references the full API spec.
If your HomeBox instance uses a self-signed cert (like a Docker .nas.io domain), set NODE_TLS_REJECT_UNAUTHORIZED=0 in the environment before running any commands. The script relies on Node.js fetch which respects this env var.
bash
# PowerShell
$env:NODE_TLS_REJECT_UNAUTHORIZED = 0
node scripts/homebox.js ...
# Bash
NODE_TLS_REJECT_UNAUTHORIZED=0 node scripts/homebox.js ...
This disables TLS verification globally — use with caution and only in trusted networks.
Requires Node.js >= 18 and two environment variables:
VariableDescriptionExampleHOMEBOX_BASE_URLYour HomeBox server URLhttp://192.168.1.100:3100``HOMEBOX_TOKENBearer token for API authyour-api-token-string``HOMEBOX_API_VERSIONForce API version ( v1 or v2). Omit to auto-detect.v1
The script auto-detects API version by probing GET /api/v1/entities:
/api/v1/items, /api/v1/locations, /api/v1/labels/api/v1/entities, /api/v1/tags, /api/v1/entity-typesSet HOMEBOX_API_VERSION=v1 or HOMEBOX_API_VERSION=v2 to skip auto-detect.
Getting a token: Login via the script: node {baseDir}/scripts/homebox.js login <username> (will prompt for password). Then set HOMEBOX_TOKEN to the returned token.
All operations use the cross-platform Node.js script at {baseDir}/scripts/homebox.js:
bash
node {baseDir}/scripts/homebox.js <command> [options]
Run node {baseDir}/scripts/homebox.js --help for full usage.
TaskCommandFind an itemnode {baseDir}/scripts/homebox.js search walletList all itemsnode {baseDir}/scripts/homebox.js listGet item detailsnode {baseDir}/scripts/homebox.js get <id>Add an itemnode {baseDir}/scripts/homebox.js add "My Wallet" --description "Brown leather" --parentId <location-id>Update an itemnode {baseDir}/scripts/homebox.js update <id> --description "Moved to drawer" --parentId <new-location>Partial updatenode {baseDir}/scripts/homebox.js patch <id> --parentId <new-location>Delete an itemnode {baseDir}/scripts/homebox.js delete <id>Browse locationsnode {baseDir}/scripts/homebox.js treeList tagsnode {baseDir}/scripts/homebox.js tagsView statsnode {baseDir}/scripts/homebox.js stats
Natural language queries should be mapped to search terms:
homebox.js search keyshomebox.js search --tags <electronics-tag-id>homebox.js search --parents <desk-drawer-id>bash
node {baseDir}/scripts/homebox.js add "MacBook Pro" \
--description "14-inch M3 Pro" \
--manufacturer "Apple" \
--modelNumber "MRXJ3LL/A" \
--serialNumber "FVLK..." \
--purchasePrice 1999.00 \
--purchaseDate "2024-03-15" \
--purchaseFrom "Apple Store" \
--insured true \
--lifetimeWarranty false \
--warrantyExpires "2025-03-15" \
--warrantyDetails "AppleCare+" \
--tagIds "tag-id-1,tag-id-2" \
--parentId "location-id"
Fields vary by API version:
Fieldv1 (hay-kot)v2 (sysadminsmedia)idUUIDUUIDname, descriptionSameSameLocationlocation: {id, name} nested objectparentId (string, nullable)Tags/Labelslabels: [{id, name, color}]``tags: [{id, name, color}]TypeN/A (items only)entityType: {id, name, icon, isLocation}``quantitySameSameManufacturer/Model/SerialSameSamePurchase infopurchaseTime, purchasePrice, purchaseFrom``purchaseDate, purchasePrice, purchaseFromWarrantySame field namesSameSold infosoldTime, soldPrice, soldTo, soldNotes``soldDate, soldPrice, soldTo, soldNotes``notesSameSameassetIdSameSameAttachmentsimageId, thumbnailIdSameSync childrensyncChildItemsLocations``syncChildEntityLocationsTimestampscreatedAt, updatedAtSame
Paginated queries return: items[], total, page, pageSize, totalPrice.
Location management: v1 has a separate /api/v1/locations resource. v2 treats locations as entities with entityType.isLocation = true; the tree endpoint is /api/v1/entities/tree.
The goal is natural, low-friction inventory management — not filling out forms.
Accept any input style. A sentence ("add my AirPods I bought last month for 1299"), fragments ("AirPods bedroom"), or structured flags — all fine. Parse what's given, ignore what's not.
Ask only what's essential. For adding an item, the only must-have is a name. Everything else (location, description, tags, price, dates, brand, serial) is optional. Don't walk through fields one by one.
Batch updates naturally. If the user gives multiple details in one message ("price 1299, Apple, bought Feb 2025"), merge them into a single update — don't process each field separately.
Proactive, not pushy. After adding an item, briefly note what else could be filled in (e.g., "serial number and warranty can be added too") and let the user decide. If they say no, move on.
Confirm writes, but don't over-confirm. Summarize what will be done and ask once. Don't ask "confirm?" for every individual field.
Match the user's language. This skill documentation is in English for universal access, but all conversation with the user should be in whatever language they use — don't switch to English just because the skill file is.
Be conversational, not mechanical. Instead of replying with rigid structured messages or error codes, reply naturally in the user's language — guide them, offer suggestions, and keep the interaction feeling like a helpful person, not a robot.
search keys). Try partial/fuzzy matches first.labelIds? Most likely a stale label UUID. Re-fetch labels and retry.NODE_TLS_REJECT_UNAUTHORIZED=0 (see above).login, and proceed — no commentary, no "shall I save?", and advise setting HOMEBOX_TOKEN. Note that login returns a token with "Bearer " prefix — strip it before setting HOMEBOX_TOKEN since the script prepends its own "Bearer ".For all available endpoints, request/response schemas, and advanced operations (attachments, maintenance logs, exports, group management, etc.), see {baseDir}/references/api-reference.md.