A lightweight Sinatra-based web application for managing a personal or studio art inventory.
Track artworks, upload images, generate QR codes, mark items as sold, and export your full collection to CSV — all from a clean, simple web interface.
- 🖼️ Add and edit artworks — name, price, and image uploads
- 💾 Persistent data — stored in a local CSV file (
data/inventory.csv) - 🔄 Automatic QR code generation — each item gets a scannable QR for quick access
- 💰 Track sold status — mark items as sold and note where they were sold
- 📦 Export inventory to CSV — backup or analyze your data anytime
- 💡 Responsive, minimalist UI — clean HTML and CSS for simplicity
- ⚙️ Modular Sinatra structure — helpers, models, and views organized cleanly
- 🪶 No database required — fully file-based for quick setup and testing
├── app.rb
├── config.ru
├── data/
│ └── inventory.csv
├── lib/
│ ├── helpers/
│ │ ├── app_helpers.rb
│ │ ├── file_helpers.rb
│ │ └── qr_code_helpers.rb
│ └── models/
│ └── inventory.rb
├── public/
│ ├── css/
│ │ └── style.css
│ ├── js/
│ │ └── script.js
│ ├── images/
│ └── qr_codes/
└── views/
├── layout.erb
├── index.erb
├── new.erb
├── edit.erb
└── show.erb
- Ruby (3.1+ recommended)
- Bundler (
gem install bundler) - Docker (optional, for containerized use)
bundle install
ruby app.rbOr, if you’re using Docker:
docker-compose up --buildThen open your browser to:
👉 http://localhost:4567
You can configure basic runtime settings via environment variables:
| Variable | Description | Default |
|---|---|---|
APP_HOST |
Host used for generating QR codes | http://localhost:4567 |
PORT |
Port Sinatra listens on | 4567 |
RACK_ENV |
App environment | development |
- Add a new art piece (name, price, and image).
- The app automatically:
- Saves the image to
public/images/ - Creates a unique QR code in
public/qr_codes/ - Stores the record in
data/inventory.csv
- Saves the image to
- View, edit, mark as sold, or export your entire collection with one click.
Here’s what’s planned for the next iterations:
- Add delete functionality for individual items
- Add “Sold Price” field to track sale amounts
- Make index table more mobile-friendly and card-based
- Make QR codes open the app directly via
APP_HOST - Add configurable base URL for deployment or LAN access
- Add RSpec model and feature tests
- Add RuboCop linting for style consistency
- Add continuous integration workflow (GitHub Actions)
- Optional SQLite3/Sequel migration (replace CSV backend)
- Image thumbnail generation
- Export to PDF
Contributions are welcome!
If you have suggestions, improvements, or bug reports:
- Fork the repository
- Create a feature branch
- Submit a pull request with a clear description
Chris Wenner
Built with ❤️ using Sinatra and plain Ruby.
This project is open-source under the MIT License.