- Components URL reflects selected component (/components/:id), survives refresh - Word-split search: "0603 res" matches "Resistor 0603" - Left pane resizable with localStorage persistence - Field values rendered via central render_field_value() (units, URLs, extensible) - Fields sorted alphabetically in both detail view and edit dialog - Edit component dialog widened; field rows use shared grid columns (table-like) - No space between value and unit (supports prefix suffixes like k, M, µ) - Grid viewer highlights and scrolls to cell when navigating from component detail - Cell inventory overlay items are <a> tags — middle-click opens in new tab - PDF files stored with sanitized human-readable filename, not random ID - PDF rename also renames file on disk - Atomic rename via renameat2(RENAME_NOREPLACE) through tools/mv-sync - Fix .cell-thumb-link → .cell-thumb-preview (div, not anchor), cursor: zoom-in - Fix field name overflow in detail view (auto column width, overflow-wrap) - Fix link color: use --accent instead of browser default dark blue Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Electronics Inventory
A self-hosted web app for managing an electronics component collection. Track components, their field values, physical storage locations, and visual panel/grid layouts.
Features
Components
Define reusable component types (e.g. Resistor, Capacitor, IC) with custom fields per component. Components show up in inventory entries and can be navigated to directly from storage locations.
Fields
Create custom field definitions (e.g. resistance, capacitance, package) that can be attached
to any component. Field values are entered per-component instance.
Inventory
Log where things are stored. Each inventory entry links a component to a storage location. Supported location types:
- Grid cell — a specific row/column in a named grid (e.g. drawer divider box)
- (plain entries without a grid reference work too)
Grids
Model physical storage grids (drawer organizers, parts boxes, etc.).
- Upload a photo of the grid
- Set up corner points to map the image to a logical grid
- Define row/column counts
- Click any cell to see what's stored there
Templates (Name Formatters)
Write JavaScript formatter functions that generate smart display names for components based on their field values. Example:
(c) => {
const F = c.fields;
if (F.resistance && F.imperial_package) {
return `${F.resistance}Ω ${F.imperial_package}`;
}
}
Fields are accessed by name (e.g. c.fields.resistance). If the formatter returns a non-empty
string it's used as the display name; otherwise the component's base name is used as fallback.
Multiple formatters are tried in order.
The template editor includes a test data box so you can preview the output without needing real inventory data.
Requirements
- Node.js >= 25
- npm
Install
Install directly from the git repository — there is no npm package yet:
npm install git+https://gitea.efforting.tech/mikael-lovqvists-claude-agent/electronics-inventory.git
Or clone if you prefer to keep the source around:
git clone https://gitea.efforting.tech/mikael-lovqvists-claude-agent/electronics-inventory
cd electronics-inventory
npm install
Run
npm start
The server starts on port 3020, bound to localhost only, by default.
Open http://localhost:3020 in your browser.
Both can be overridden with environment variables:
PORT=8080 npm start # different port
BIND_ADDRESS=0.0.0.0 npm start # all interfaces (LAN accessible)
BIND_ADDRESS=192.168.1.50 npm start # specific interface
PORT=8080 BIND_ADDRESS=0.0.0.0 npm start # both
Note: The default
localhostbinding means the app is only reachable from the same machine. SetBIND_ADDRESS=0.0.0.0to expose it on your local network.
Data Storage
All data is stored locally in a data/ directory created automatically on first run:
data/db.json— component, field, inventory, grid, and template records (flat key-value store)data/uploads/— source images uploaded for grid setup
No external database is required.
Project Structure
server.mjs Express 5 API server + SPA host
lib/
storage.mjs Server-side KV store wrappers
kv-store.mjs JSON file-backed key-value store
ids.mjs ID generation
public/
app.mjs Single-page app (vanilla JS ES modules)
templates.html HTML templates (lazy-loaded)
style.css Styles
lib/api.mjs Fetch wrappers for the REST API
views/
grid-setup.mjs Canvas-based grid corner editor