* Added Quantity Field ✅ Completed Changes 1. HTML Forms Added quantity input fields to both asset and sub-asset forms Fields default to value="1" with min="1" validation Positioned after price fields for logical flow 2. Modal Manager (Frontend) Updated form data collection to capture quantity values Added quantity to form population for editing existing assets Ensures quantity defaults to 1 if not provided 3. Asset Details Display Added quantity field to asset info display in assetRenderer.js Shows "Quantity: X" in the asset details section Includes fallback to 1 for backwards compatibility 4. Server-side Backwards Compatibility Asset Creation: Ensures quantity defaults to 1 if not provided Asset Updates: Preserves existing quantity or defaults to 1 Sub-asset Creation: Ensures quantity defaults to 1 if not provided Sub-asset Updates: Preserves existing quantity or defaults to 1 Data Loading: All assets and sub-assets get quantity field when loaded from API 5. Import Functionality Added quantity column mapping option in import modal Updated server-side import logic to handle quantity with default of 1 Updated template CSV download to include quantity example Added auto-mapping for "quantity" and "qty" column headers 🔒 Backwards Compatibility The implementation ensures that: Existing assets without quantity will automatically show quantity: 1 All API endpoints handle missing quantity gracefully Import functionality works with or without quantity columns No data migration is required - compatibility is handled at runtime * Add "Total Value" to asset details ✅ Total Value Field Features Conditional Display Only shows when quantity > 1 Only shows when there's a valid price (either price or purchasePrice) Calculation Calculates: price × quantity = total value Uses the same currency formatting as other price fields Handles both asset.price and asset.purchasePrice (for backwards compatibility) * Updated Dashboard Value Calculation logic Updated Calculation Logic to account for quantity Assets: price × quantity for each asset Defaults to quantity = 1 for backwards compatibility Sub-Assets: purchasePrice × quantity for each sub-asset Defaults to quantity = 1 for backwards compatibility
DumbAssets
A stupid simple asset tracker for keeping track of your physical assets, their components, and applicable warranties and routine maintenance.
Table of Contents
Quick Start
Prerequisites
- Docker (recommended)
- Node.js >=14.0.0 (for local development)
Option 1: Docker (For Dummies)
docker run -p 3000:3000 -v ./data:/app/data dumbwareio/dumbassets:latest
- Go to http://localhost:3000
- Add assets, upload photos/receipts, and track warranties
- Celebrate how dumb easy this was
Option 2: Docker Compose (For Dummies who like customizing)
Create a docker-compose.yml file:
services:
dumbassets:
container_name: dumbassets
image: dumbwareio/dumbassets:latest
restart: unless-stopped
ports:
- ${DUMBASSETS_PORT:-3000}:3000
volumes:
- ${DUMBASSETS_DATA_PATH:-./data}:/app/data
environment:
NODE_ENV: ${DUMBASSETS_NODE_ENV:-production}
DEBUG: ${DUMBASSETS_DEBUG:-true}
SITE_TITLE: ${DUMBASSETS_SITE_TITLE:-DumbAssets}
BASE_URL: ${DUMBASSETS_BASE_URL:-http://localhost:3000}
DUMBASSETS_PIN: ${DUMBASSETS_PIN:-1234}
ALLOWED_ORIGINS: ${DUMBASSETS_ALLOWED_ORIGINS:-*}
APPRISE_URL: ${DUMBASSETS_APPRISE_URL:-}
CURRENCY_CODE: ${DUMBASSETS_CURRENCY_CODE:-USD}
CURRENCY_LOCALE: ${DUMBASSETS_CURRENCY_LOCALE:-en-US}
# ...other env vars
Then run:
docker compose up -d
- Go to http://localhost:3000
- Add and manage your assets
Option 3: Running Locally (For Developers)
git clone https://github.com/yourusername/DumbAssets.git
cd DumbAssets
npm install
npm start
Open your browser to http://localhost:3000
Features
- 🚀 Track assets with detailed info (model, serial, warranty, etc.)
- 🧩 Add components and sub-components
- 🖼️ Upload and store photos and receipts
- 🔍 Search by name, model, serial, or description
- 🏷️ Hierarchical organization of components
- 📅 Warranty expiration notifications (configurable)
- 🔧 Maintenance event notifications
- 🏷️ Flexible tagging system for better organization
- 🔔 Built in Apprise notification integration
- 🌗 Light/Dark mode with theme persistence
- 🛡️ PIN authentication with brute force protection
- 📦 Docker support for easy deployment
- 🔗 Direct Asset Linking: Notifications include links to the specific asset
Configuration
Environment Variables
| Variable | Description | Default | Required |
|---|---|---|---|
| PORT | Server port | 3000 | No |
| DUMBASSETS_PIN | PIN protection (4+ digits) | None | No |
| APPRISE_URL | Apprise URL for notifications | None | No |
| TZ | Container timezone | America/Chicago | No |
| BASE_URL | Base URL for the application | http://localhost | No |
| SITE_TITLE | Site title shown in browser tab and header | DumbAssets | No |
| ALLOWED_ORIGINS | Origins allowed to visit your instance | '*' | No |
| DEMO_MODE | Enables read-only mode | false | No |
| CURRENCY_CODE | ISO 4217 currency code for price formatting | USD | No |
| CURRENCY_LOCALE | Locale for currency formatting | en-US | No |
Tip
Apprise integration is built-in to DumbAssets, allowing you to simply add your Discord/ntfy/Telegram/etc link WITHOUT having to run Apprise as a separate service!
💰 Currency Configuration
DumbAssets supports multiple currencies via environment variables. The application uses the standard ISO 4217 currency codes and locale formatting.
Environment Variables
CURRENCY_CODE
- Default:
USD - Description: The ISO 4217 currency code for price formatting
- Examples:
USD,EUR,GBP,CAD,AUD,JPY
CURRENCY_LOCALE
- Default:
en-US - Description: The locale for currency formatting (affects number formatting, decimal separators, etc.)
- Examples:
en-US,en-GB,de-DE,fr-FR,ja-JP
Usage Examples
US Dollar (Default)
# No configuration needed - this is the default
Euro (Germany)
export CURRENCY_CODE=EUR
export CURRENCY_LOCALE=de-DE
British Pound
export CURRENCY_CODE=GBP
export CURRENCY_LOCALE=en-GB
Canadian Dollar
export CURRENCY_CODE=CAD
export CURRENCY_LOCALE=en-CA
Japanese Yen
export CURRENCY_CODE=JPY
export CURRENCY_LOCALE=ja-JP
Docker Configuration
Docker Compose
services:
dumbassets:
environment:
- CURRENCY_CODE=EUR
- CURRENCY_LOCALE=de-DE
Docker Run
docker run -e CURRENCY_CODE=EUR -e CURRENCY_LOCALE=de-DE dumbassets
Currency Format Examples
Different locales will format the same amount differently:
| Locale | Currency | Amount: 1234.56 | Formatted Output |
|---|---|---|---|
| en-US | USD | 1234.56 | $1,234.56 |
| de-DE | EUR | 1234.56 | 1.234,56 € |
| en-GB | GBP | 1234.56 | £1,234.56 |
| fr-FR | EUR | 1234.56 | 1 234,56 € |
| ja-JP | JPY | 1234.56 | ¥1,235 |
Supported Currency Codes
Any valid ISO 4217 currency code is supported. Common examples include:
- USD - US Dollar
- EUR - Euro
- GBP - British Pound
- CAD - Canadian Dollar
- AUD - Australian Dollar
- JPY - Japanese Yen
- CHF - Swiss Franc
- CNY - Chinese Yuan
- INR - Indian Rupee
- BRL - Brazilian Real
- MXN - Mexican Peso
- SEK - Swedish Krona
- NOK - Norwegian Krone
- DKK - Danish Krone
For a complete list, refer to the ISO 4217 standard.
Data Storage
All data is stored in JSON files in the /data directory:
/data/Assets.json- All asset data/data/SubAssets.json- All component data/data/Images- Uploaded photos/data/Receipts- Uploaded receipts/data/config.json- Notification and app config
Security
- Variable-length PIN support (4+ digits)
- Constant-time PIN comparison
- Brute force protection (lockout after too many attempts)
- Secure session cookies
- No client-side PIN storage
- Rate limiting
Technical Details
Stack
- Backend: Node.js (>=14.0.0) with Express
- Frontend: Vanilla JavaScript (ES6+)
- Container: Docker with Alpine base
- Notifications: Apprise integration (via Python)
- Uploads: Multer for file handling
- Scheduling: node-cron for warranty & Maintenance notifications
Dependencies
- express: Web framework for Node.js
- multer: File upload handling and multipart/form-data parsing
- apprise: Notification system integration for alerts
- cors: Cross-origin resource sharing middleware
- dotenv: Environment variable configuration management
- express-rate-limit: Rate limiting middleware for API protection
- express-session: Session management and authentication
- cookie-parser: Cookie parsing middleware
- node-cron: Task scheduling for notifications
- uuid: Unique ID generation for assets
- sharp: Image processing and optimization
- compression: Response compression middleware
- helmet: Security headers middleware
- fs-extra: Enhanced filesystem operations
- path: Path manipulation utilities
Contributing
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes using Conventional Commits
- Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
See the Development Guide for local setup and guidelines.
Support the Project
Made with ❤️ by DumbWare.io