A modern, comprehensive inventory management system designed for homelabs, makerspaces, and workshops. Track thousands of items across organized storage modules with advanced search, QR code integration, and intelligent duplicate detection.
This is a rebranded fork of Wheretf by ndemarco. Rebranded and maintained by Ruben Costa.
- Hierarchical Organization: Modules β Levels β Locations for structured storage
- Visual Location Grid: Interactive grid view for easy location management
- Color-Coded Locations: Assign colors to locations for quick identification
- Full CRUD Operations: Create, read, update, and delete items with ease
- Quantity Tracking: Real-time quantity management with increment/decrement buttons
- Categories & Tags: Organize items with categories and flexible tagging system
- Specifications: Store detailed specifications for technical items
- Advanced Search: Search by name, description, tags, and categories
- Filtering: Filter items by category, location, or custom criteria
- Pagination: Efficient browsing with 9-item pagination on mobile/desktop
- QR Code Generation: Automatically generate QR codes for items
- QR Code Scanning: Scan QR codes to quickly access item details
- Visual QR Display: View QR codes directly in the item detail page
- Download QR Codes: Export QR codes as PNG files
- Duplicate Detection: Real-time duplicate prevention with similarity scoring
- Smart Suggestions: AI-powered location suggestions for new items
- Pattern Recognition: Automatic categorization for fasteners and electronics
- Specification Extraction: Intelligent parsing of item specifications
- Responsive Design: Fully optimized for mobile and desktop
- Modern UI: Built with React 18, Tailwind CSS, and Vite
- Touch-Friendly: Mobile-optimized buttons and interactions
- Dark/Light Themes: Coming in future updates
- Docker Ready: One-command deployment with Docker Compose
- PostgreSQL Backend: Robust database with proper relationships
- Nginx Proxy: Production-ready reverse proxy setup
- API Documentation: Auto-generated OpenAPI specification
Main dashboard showing recent items and statistics
Items page with search, filtering, and pagination
Detailed item view with QR code display and quantity controls
Mobile QR code scanner for quick item access
Visual grid representation of storage locations
Responsive design optimized for mobile devices
Note: Screenshots are placeholders. To add real screenshots:
- Take screenshots of your running application
- Save them in a
screenshots/folder in the repo root- Replace the placeholder paths above with actual image paths
- Docker and Docker Compose
- Git
-
Clone the repository:
git clone https://github.com/rubencosta13/tidylab.git cd tidylab -
Start the application:
docker-compose up --build
-
Access the application:
- Web UI: http://localhost:8080
- API: http://localhost:5000/api
- Database: localhost:5432
cd api
pip install -r requirements.txt
export DATABASE_URL="postgresql://inventoryuser:inventorypass@localhost:5432/inventory"
flask runcd ui
npm install
npm run dev- Add Items: Click "New Item" to create items with name, description, category, quantity, and tags
- Edit Items: Click the edit button on any item to modify details
- Quantity Management: Use +/- buttons on item details to adjust quantities
- QR Codes: Generate and download QR codes for quick access
- Create Modules: Add storage modules (cabinets, shelves, etc.)
- Define Levels: Organize modules into levels (shelves, drawers)
- Set Locations: Create specific storage locations with coordinates
- Use the search bar to find items by name, description, or tags
- Filter by category using the category buttons
- Browse paginated results (9 items per page)
- Generate: Create QR codes for items from the Items page
- Scan: Use the QR Scanner page to scan codes and view items
- Display: View QR codes visually on the Item Detail page
TidyLab provides a RESTful API with comprehensive documentation:
- Base URL:
http://localhost:5000/api - OpenAPI Spec: Available at
/api/openapi.json - Interactive Docs: View API documentation in your browser
GET /api/items- List items with filteringPOST /api/items- Create new itemPUT /api/items/{id}- Update itemDELETE /api/items/{id}- Delete itemPOST /api/items/{id}/qr/generate- Generate QR code
GET /api/locations- List locationsPOST /api/locations- Create locationPUT /api/locations/{id}- Update location
GET /api/modules- List modulesPOST /api/modules- Create moduleGET /api/modules/{id}/levels- Get levels in module
TidyLab/
βββ api/ # Flask backend
β βββ app/ # Application code
β βββ scripts/ # Utility scripts
β βββ requirements.txt
βββ ui/ # React frontend
β βββ src/ # Source code
β βββ public/ # Static assets
β βββ package.json
βββ nginx/ # Reverse proxy config
βββ docker-compose.yml # Docker orchestration
βββ README.md
We welcome contributions! Please:
- Fork the repository
- Create a 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
- Follow conventional commit format
- Write tests for new features
- Update documentation as needed
- Ensure mobile responsiveness
This project is licensed under the MIT License - see the LICENSE file for details.
- Original Project: Wheretf by ndemarco
- Rebranded & Maintained by: Ruben Costa
- Technologies: React, Flask, PostgreSQL, Docker, Tailwind CSS
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Keep your workspace tidy with TidyLab! π§Ή
- One-click extraction: Click "β¨ Extract Specs" to auto-parse descriptions
- Pattern recognition for:
- Fasteners: M6x50, #8 x 3/4", hex head, phillips, pan head, etc.
- Resistors: 1kΞ©, 4.7MΞ©, 10Ξ© with tolerance and wattage
- Capacitors: 0.1ΞΌF, 100nF, 220ΞΌF with voltage and type
- IC Packages: 0805, 1206, SOT-23, SOIC, DIP
- Materials: stainless steel, brass, aluminum, plastic
- Dimensions: 100x50x30mm, measurements
- Auto-populate: Automatically fills category and tags based on detected specs
- Confidence scoring: Shows how confident the parser is about the extraction
Fasteners:
- M6, M8x50 (metric threads)
- #8, #10 x 3/4 (imperial screws)
- Pan head, hex head, socket head
- Phillips, flathead, hex, torx drives
Electronics:
- 1kΞ©, 4.7MΞ©, 10Ξ© (resistors)
- 0.1ΞΌF, 100nF, 10pF (capacitors)
- 0805, 1206, SOT-23 (SMD packages)
Measurements:
- 10mm, 5.5cm (metric length)
- 1/4 inch, 3/4" (imperial)
- 100g, 1.5kg (weight)
- 100x50x30mm (dimensions)
- When creating a new item, fill in name and description
- System automatically checks for duplicates (70% similarity threshold)
- If found, you'll see a warning with similar items
- Review the matches and their locations
- Either:
- Update the existing item's quantity instead, or
- Check "proceed anyway" to create a new item
- Use "Extract Specs" to automatically fill tags and category
- Docker and Docker Compose
- Git (for cloning)
- 2GB RAM minimum
- 10GB disk space
If you have the project as files:
cd inventory-systemdocker-compose up -dThis will:
- Start PostgreSQL database
- Build and start the Flask backend
- Start nginx reverse proxy
Open your browser and navigate to:
http://localhost:8080
docker-compose downTo stop and remove all data:
docker-compose down -v-
Create a Module: A module is a storage unit (cabinet, shelving unit, etc.)
- Navigate to "Modules" β "Add Module"
- Example: Name it "Zeus" or "Main Workbench"
-
Add Levels: Levels are drawers, shelves, or compartments within a module
- View your module β "Add Level"
- Specify grid dimensions (rows Γ columns)
- Example: 4 rows Γ 6 columns creates locations A1-A6, B1-B6, etc.
-
Add Items: Store your inventory items
- Navigate to "Items" β "Add Item"
- Provide a natural language description
- Optionally assign a storage location
- Example: "Pan head phillips screw, 3/4 inch long, #8, mild steel"
-
Search: Find items quickly
- Use the search bar to find items by name, description, or tags
- View item locations on the results page
Module (e.g., "Zeus", "Muse")
βββ Level 1 (e.g., drawer, shelf)
β βββ Location A1
β βββ Location A2
β βββ ...
βββ Level 2
β βββ Location A1
β βββ ...
βββ ...
- Go to "Items" β "Add Item"
- Fill in:
- Name: "Phillips Pan Head #8 Screw"
- Description: "Pan head phillips screw, 3/4 inch long, #8 diameter, mild steel"
- Category: "Fasteners"
- Item Type: "solid"
- Quantity: "100"
- Unit: "pieces"
- Tags: "screw, phillips, pan head, #8, fastener"
- Location: "Muse:4:A3" (Module: Muse, Level: 4, Location: A3)
- Click "Create Item"
The system supports different location types for various storage needs:
- general: Standard bins
- small_box: For tiny components (SMD parts, small hardware)
- medium_bin: Standard drawer compartments
- large_bin: Bulk storage
- liquid_container: For paints, solvents, coatings
- smd_container: Specialized for surface-mount components
modules
βββ id
βββ name (unique)
βββ description
βββ location_description
levels
βββ id
βββ module_id β modules.id
βββ level_number
βββ rows
βββ columns
locations
βββ id
βββ level_id β levels.id
βββ row
βββ column
βββ location_type
βββ dimensions (width, height, depth)
items
βββ id
βββ name
βββ description
βββ category
βββ quantity
βββ metadata (JSON)
βββ tags
item_locations (many-to-many)
βββ item_id β items.id
βββ location_id β locations.id
βββ quantity
Create a .env file in the project root:
# Database
DATABASE_URL=postgresql://inventoryuser:inventorypass@postgres:5432/inventory
# Flask
FLASK_ENV=development
SECRET_KEY=your-secret-key-here
# Port
PORT=5000Edit docker-compose.yml:
services:
nginx:
ports:
- "8080:80" # Change 8080 to your preferred port# Check if PostgreSQL is running
docker-compose ps
# View PostgreSQL logs
docker-compose logs postgres
# Restart PostgreSQL
docker-compose restart postgres# View backend logs
docker-compose logs backend
# Rebuild containers
docker-compose up --build
# Reset everything
docker-compose down -v
docker-compose up --buildIf port 8080 is in use:
# Find what's using the port
lsof -i :8080
# Or change the port in docker-compose.ymlThe system provides REST API endpoints for programmatic access:
GET /modules/api/modules- List all modulesGET /modules/api/modules/<id>- Get module detailsGET /modules/api/modules/<id>/levels- List module levels
GET /locations/api/locations- List locations (with filters)GET /locations/api/locations/<id>- Get location details
GET /items/api/items- List items (with search)GET /items/api/items/<id>- Get item details
GET /search/api?q=query- Search items
Example:
curl http://localhost:8080/items/api/items?search=screw# Clone and run
git clone <your-repo>
cd inventory-system
docker-compose up -d- Create an LXC container (Ubuntu 22.04+)
- Install Docker and Docker Compose
- Clone and run as above
- Install Docker on Jetson
- Clone the repository
- Run with docker-compose
For production deployment:
- Change default passwords in
docker-compose.yml - Set a secure SECRET_KEY in environment variables
- Enable HTTPS with Let's Encrypt
- Set up backups for the PostgreSQL data volume
- Configure firewall rules
- Use production WSGI server (Gunicorn instead of Flask dev server)
docker-compose exec postgres pg_dump -U inventoryuser inventory > backup.sqldocker-compose exec -T postgres psql -U inventoryuser inventory < backup.sqltar -czf backup-$(date +%Y%m%d).tar.gz data/# Install PostgreSQL locally
# Create database 'inventory'
# Install Python dependencies
cd backend
pip install -r requirements.txt
# Set environment variable
export DATABASE_URL="postgresql://user:pass@localhost:5432/inventory"
# Run application
python run.pyAccess at http://localhost:5000
inventory-system/
βββ backend/
β βββ app/
β β βββ models.py # Database models
β β βββ routes/ # Route handlers
β β β βββ main.py
β β β βββ items.py
β β β βββ modules.py
β β β βββ locations.py
β β β βββ search.py
β β βββ __init__.py
β βββ requirements.txt
β βββ Dockerfile
β βββ run.py
βββ frontend/
β βββ templates/ # Jinja2 templates
β βββ static/
β βββ css/
β βββ js/
βββ docker-compose.yml
βββ nginx.conf
βββ README.md
After getting comfortable with Phase 1:
- Add your first 50-100 items
- Organize them into modules and levels
- Test the search functionality
- Provide feedback on what features you need most
- No AI-powered semantic search yet (coming in Phase 4)
- No CLI or voice interface (coming in Phases 5-6)
- No automatic item merging (duplicates are detected but not auto-merged)
- Basic keyword search only (semantic search in Phase 4)
- No user authentication (single-user system for now)
For issues, questions, or feature requests, please open an issue in the project repository.
[Your License Here]
- Phase 1: Foundation β
- Phase 2: Smart Location Management β
- Phase 3: Duplicate Detection β
- Phase 4: Semantic Search
- Phase 5: CLI Interface
- Phase 6: Voice Interface
- Phase 7: Advanced AI Features
- Phase 8: Production Polish
Version: 3.0.0 (Phases 1-3 Complete)
Last Updated: November 2025