The open-source project behind envanterim.net.tr
An open-source home inventory management system with 100+ language UI support and field-level encryption for sensitive data.
Features β’ Tech Stack β’ Quick Start β’ Docker β’ Environment β’ Structure β’ License
π Language: English | TΓΌrkΓ§e | Deutsch | EspaΓ±ol | Ψ§ΩΨΉΨ±Ψ¨ΩΨ©
- π Multi-house support β Create or join households with shared inventories
- π¦ Item management β Track items with photos, quantities, barcodes, and descriptions
- π·οΈ Categories & Rooms β Organize items by custom categories, rooms, and locations
- π± Barcode / QR scanning β Quickly add or find items using your device camera
- π Authentication β JWT-based auth with Google OAuth support and email verification
- β 2FA & trusted devices β TOTP authenticator apps, one-time backup codes, and remembered-device controls
- π Personal Vault β Browser-generated vault keys and encrypted personal records for high-sensitivity items
- π‘οΈ Field-level encryption β AES-256-GCM protection for sensitive verification and inventory fields
- π³ Docker & cloud secret delivery β Docker secrets and OCI runtime secret bootstrap for production key management
- π¨βπΌ Admin panel β User management, ban controls, email sending, and system logs
- π§ Email system β Transactional emails via Resend API (verification, admin notices)
- πΎ Backup & Restore β Export and import your inventory data
- π 100+ language UI β The frontend ships with 100+ selectable languages for global access
- π Dark / Light theme β Auto-detects system preference
- π± Responsive β Mobile-first design, works on all screen sizes
- π SEO ready β Sitemap, robots.txt, meta tags, and IndexNow support
- π Secure Password Recovery β Email-based reset or offline Recovery Key for local account recovery
HomeInventory is designed with enterprise-grade security to protect your personal data. All sensitive fields, media files, and PII are encrypted on the server using AES-256-GCM before being written to disk or database. This protects against database theft and unauthorized file access. Note: because encryption keys are managed server-side, a server administrator with access to both the database and the environment variables can decrypt the data.
- Field-Level Encryption: Sensitive data like item names, descriptions, barcodes, and custom categories are encrypted via AES-256-GCM before ever hitting the database.
- Encrypted Media Storage: All uploaded photos and thumbnails have their EXIF metadata stripped and are stored on disk as AES-256-GCM encrypted blobs. They are only decrypted in RAM when requested by authenticated users.
- PII Protection: User emails and usernames are stored encrypted. Authentication utilizes a deterministic HMAC-SHA-256 lookup token system, allowing seamless login without exposing the underlying PII to rainbow table attacks.
- Key Rotation Ready: The application supports a Keyring map, allowing administrators to rotate the primary encryption key without breaking legacy encrypted data.
- Enterprise Secret Management (Optional): For enterprise deployments, the standard
.env-based encryption key delivery can be upgraded to Oracle Cloud Infrastructure (OCI) Secret Management. HomeInventory already supports Instance Principals-based runtime secret loading, eliminating hardcoded production secrets and allowing encryption keys to be managed through OCI Vault.
| Technology | Purpose |
|---|---|
| Node.js + Express | REST API server |
| better-sqlite3 | Embedded SQLite database |
| JWT + bcrypt | Authentication & password hashing |
| Passport.js | Google OAuth 2.0 integration |
| Helmet | HTTP security headers |
| express-rate-limit | Brute-force / DDoS protection |
| Resend | Transactional email service |
| Sharp | Image processing & thumbnails |
| i18next | Server-side internationalization |
| Technology | Purpose |
|---|---|
| React 18 | UI library |
| Vite | Build tool & dev server |
| Tailwind CSS | Utility-first styling |
| React Router v7 | Client-side routing |
| Lucide React | Icon library |
| html5-qrcode | Barcode & QR scanning |
| react-i18next | Frontend internationalization |
| react-joyride | Interactive onboarding tours |
- Node.js β₯ 18 β download
- npm β₯ 9 (comes with Node.js)
git clone https://github.com/asdteke/HomeInventory.git
cd HomeInventory
# Install backend + frontend dependencies in one command
npm run install-allcp .env.example .envOpen .env in your editor and set at minimum these values for local development:
NODE_ENV=development
PORT=3001
SITE_URL=http://localhost:5173
JWT_SECRET=change-this-to-any-random-string-at-least-32-chars
APP_ENCRYPTION_KEY=replace-with-32-byte-base64-or-64-char-hex-key
APP_ENCRYPTION_KEY_ID=2026-03-localπ‘ Tip: You can generate a secure JWT_SECRET with:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
π Encryption key: Generate
APP_ENCRYPTION_KEYwith:openssl rand -base64 32
APP_ENCRYPTION_KEY and APP_ENCRYPTION_KEY_ID are required because sensitive fields now use fail-secure encryption at startup. The remaining variables (GOOGLE_CLIENT_ID, RESEND_API_KEY, etc.) are optional for local development. Features that depend on them (Google login, email sending) will be gracefully disabled.
If you deploy HomeInventory on an Oracle Cloud Infrastructure compute instance, you can keep production secrets in OCI Secret Management and let the runtime load them before the app starts.
Recommended pattern:
SECRET_PROVIDER=oci
OCI_AUTH_MODE=instance_principal
OCI_REGION=eu-frankfurt-1
OCI_VAULT_ID=ocid1.vault.oc1..exampleuniqueID
OCI_SECRET_MAPPINGS={"JWT_SECRET":"homeinventory-jwt-secret","APP_ENCRYPTION_KEY":"homeinventory-app-encryption-key","APP_ENCRYPTION_KEY_ID":"homeinventory-app-encryption-key-id","RESEND_API_KEY":"homeinventory-resend-api-key"}Notes:
- Leave
SECRET_PROVIDER=envfor local development. OCI_SECRET_MAPPINGScan point to secret OCIDs or secret names.OCI_VAULT_IDis required only when you use secret names instead of secret OCIDs.- For file-based Docker secrets, keep the default
/run/secretsmount or setDOCKER_SECRETS_DIRwhen your runtime mounts secrets elsewhere. - The server entrypoint now bootstraps runtime secrets automatically, so
node server.js,npm run dev, andnpm startcontinue to work. - Maintenance scripts such as encryption backfill and IndexNow submission also use the same OCI bootstrap path.
npm run devThis starts both backend and frontend concurrently. Open your browser:
| Service | URL |
|---|---|
| π₯οΈ Frontend | http://localhost:5173 |
| βοΈ Backend API | http://localhost:3001 |
| π± Network (phone) | http://<your-local-ip>:5173 |
# Build frontend for production
npm run build
# Start production server (serves built frontend + API)
npm startDeploy HomeInventory with Docker for easy self-hosting:
# Clone and enter directory
git clone https://github.com/asdteke/HomeInventory.git
cd HomeInventory
# Create environment file for non-secret settings
cp .env.example .env
# Create Docker secret files (or point HOMEINVENTORY_SECRETS_DIR at another folder)
mkdir -p secrets
printf '%s' 'change-this-jwt-secret' > secrets/jwt_secret.txt
printf '%s' 'change-this-32-byte-base64-key' > secrets/app_encryption_key.txt
printf '%s' '2026-compose' > secrets/app_encryption_key_id.txt
# Start with Docker Compose
docker compose up -dThe app will be available at http://localhost:3001
docker-compose.yml reads secret source files from ${HOMEINVENTORY_SECRETS_DIR:-./secrets} on the host and mounts them inside the container at /run/secrets.
The full .env file is passed through to the container, so optional settings such as APP_ENCRYPTION_KEYRING, EXPOSE_SERVER_INFO, and INDEXNOW_* continue to work in Docker.
For detailed Docker configuration, reverse proxy setup, backup/restore, and Unraid deployment, see DOCKER.md.
Copy .env.example to .env and fill in the required values:
| Variable | Required | Description |
|---|---|---|
NODE_ENV |
β | development or production |
PORT |
β | Backend server port (default: 3001) |
SITE_URL |
β | Your site's public URL |
SECRET_PROVIDER |
β¬ | env (default) or oci for OCI Secret Management bootstrap |
OCI_AUTH_MODE |
β¬ | Runtime auth mode for OCI bootstrap (instance_principal) |
OCI_REGION |
β¬ | Optional OCI region override for secret retrieval |
OCI_VAULT_ID |
β¬ | Required only when OCI_SECRET_MAPPINGS uses secret names |
OCI_SECRET_MAPPINGS |
β¬ | JSON map of env var names to OCI secret OCIDs or secret names |
OCI_SECRET_OVERWRITE |
β¬ | Overwrite already-set env values with OCI secret values |
OCI_SECRET_BUNDLE_STAGE |
β¬ | Secret bundle stage to read (CURRENT by default) |
DOCKER_SECRETS_DIR |
β¬ | Override runtime path for file-based Docker secrets (default: /run/secrets) |
JWT_SECRET |
β | Random secret for JWT signing (min 32 chars) |
APP_ENCRYPTION_KEY |
β | 32-byte encryption key for sensitive field protection |
APP_ENCRYPTION_KEY_ID |
β | Stable key identifier for new encrypted payloads |
APP_ENCRYPTION_KEYRING |
β¬ | Optional JSON map of legacy key IDs to keys for decryption after rotation |
GOOGLE_CLIENT_ID |
β¬ | Google OAuth client ID |
GOOGLE_CLIENT_SECRET |
β¬ | Google OAuth client secret |
RESEND_API_KEY |
β¬ | Resend.com API key for emails |
SUPPORT_EMAIL |
β¬ | Support email address |
BOOTSTRAP_ADMIN_EMAIL |
β¬ | Auto-promote this email to admin |
EXPOSE_SERVER_INFO |
β¬ | Show server info endpoint (true/false) |
APP_EMAIL_LANGUAGE |
β¬ | Language for outgoing emails (default: en) |
INDEXNOW_KEY |
β¬ | IndexNow API key for SEO indexing |
INDEXNOW_BASE_URL |
β¬ | Base URL for IndexNow submissions |
INDEXNOW_ENDPOINT |
β¬ | IndexNow API endpoint URL |
INDEXNOW_KEY_LOCATION |
β¬ | Optional IndexNow key file location override |
β οΈ Never commit your.envfile! It is already in.gitignore.
Home-inventory/
βββ app.js # Express app setup & middleware
βββ server.js # Runtime bootstrap & server entry point
βββ auth.js # JWT middleware & token generation
βββ database.js # SQLite DB initialization & migrations
βββ package.json # Backend dependencies & scripts
βββ .env.example # Environment variable template
βββ .gitignore
βββ LICENSE
β
βββ config/
β βββ i18n.js # i18next server config
β
βββ middleware/
β βββ auth.js # Auth & admin middleware
β
βββ routes/
β βββ auth.js # Login, register, OAuth, password
β βββ items.js # CRUD for inventory items
β βββ categories.js # Category management
β βββ rooms.js # Room management
β βββ locations.js # Location management
β βββ barcode.js # Barcode lookup & scanning
β βββ houses.js # Multi-house management
β βββ admin.js # Admin panel endpoints
β βββ admin-email.js # Admin email sending
β βββ email.js # Email verification & status
β βββ backup.js # Backup/restore endpoints
β βββ ...
β
βββ utils/
β βββ encryption.js # AES-256-GCM field encryption helpers
β βββ protectedFields.js # Inventory field encrypt/decrypt helpers
β βββ passwordRecovery.js # Recovery key generation & verification
β βββ mediaStorage.js # Encrypted media read/write helpers
β βββ runtimeSecrets.js # OCI Secret Management bootstrap
β βββ emailService.js # Resend email integration
β βββ indexNow.js # IndexNow SEO submission
β βββ logger.js # KVKK-compliant logging
β
βββ locales/ # Backend i18n (100+ languages)
β
βββ scripts/
β βββ run-with-runtime-secrets.mjs # OCI runtime secret bootstrap for maintenance scripts
β βββ backfill-field-encryption.mjs # Encrypt legacy plaintext field data
β βββ generate-locales.js # Locale generation scripts
β βββ indexnow-submit.mjs # CLI IndexNow submission
β
βββ client/ # React frontend
βββ index.html
βββ package.json
βββ vite.config.js
βββ tailwind.config.js
βββ public/
β βββ brand/ # Logo assets (dark/light)
β βββ locales/ # Frontend i18n files
β βββ robots.txt
β βββ sitemap.xml
βββ src/
βββ App.jsx # Root component & routing
βββ main.jsx # Entry point
βββ index.css # Global styles
βββ i18n.js # Frontend i18n config
βββ components/ # All React components
β βββ Dashboard.jsx
β βββ ItemList.jsx
β βββ ItemForm.jsx
β βββ CategoryManager.jsx
β βββ RoomManager.jsx
β βββ Settings.jsx
β βββ AdminPanel.jsx
β βββ BarcodeScanner.jsx
β βββ LandingPage.jsx
β βββ Login.jsx
β βββ Register.jsx
β βββ ...
βββ context/ # React contexts (Auth, Theme)
βββ utils/ # Frontend utilities
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/auth/register |
Register new user |
POST |
/api/auth/login |
Login |
GET |
/api/items |
List items |
POST |
/api/items |
Create item |
PUT |
/api/items/:id |
Update item |
DELETE |
/api/items/:id |
Delete item |
GET |
/api/categories |
List categories |
GET |
/api/rooms |
List rooms |
GET |
/api/houses |
List user's houses |
GET |
/api/admin/* |
Admin panel endpoints |
GET |
/api/health |
Health check |
All
/api/*endpoints (except auth) require a JWT Bearer token.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This is an independent open-source project. It is not affiliated with, endorsed by, or connected to any commercial product or company using a similar name.
This project was developed with significant assistance from AI tools (including Google Gemini and OpenAI GPT).
MIT β see LICENSE for details.
