🇩🇪 Deutsch · 🇬🇧 English
Inventory & valuation app for model-car collections. Turns a static collector's Excel sheet into a lightweight, polished app — with catalog matching, "lot" handling and optional eBay capture.
A passionate collector used to track their model cars (Wiking, Siku, Majorette, Matchbox …) in Excel. ModellGarage turns that data into a real app: searchable, mobile-friendly, with photos and value estimates.
Core benefits:
- Avoid buying duplicates (searchable collection)
- Keep an eye on total value (catalog estimates)
- Break down lots (auction bundles) cleanly
- Document condition & photos per model
On all three systems ModellGarage runs as a container via Podman — one
window, one port (http://localhost:8003). No Python/Node install required.
First, on every system:
- Install Podman Desktop: https://podman.io/getting-started/installation (on first launch, confirm "Initialize / Start" for the Podman machine once).
- Get the project: on GitHub click the green "Code" button → "Download
ZIP", then unzip — or
git clone.
Easiest path: one command sets everything up. Open PowerShell as Administrator (Start → type "PowerShell" → right-click → Run as administrator) and paste:
irm https://raw.githubusercontent.com/diebugger-tech/ModellGarage/main/install-windows.ps1 | iexThis single command automatically installs everything needed:
- Podman Desktop (the container runtime)
- WSL2 (the Linux subsystem Podman needs on Windows) — usually not present yet, so it's set up here
- Git (to fetch and later update the project)
- downloads ModellGarage and starts the app
Important: if WSL2 is installed for the first time, Windows requires a reboot. The installer says so — after rebooting, just paste the same command again in the Administrator PowerShell and it runs all the way through. At the end the browser opens at http://localhost:8003.
If you downloaded and unzipped the project as a ZIP:
- Install the Podman CLI (once, in an Administrator PowerShell) — there is
no
makeon Windows, hence the container route:Then close and reopen PowerShell (sowinget install -e --id RedHat.Podman
podmanis found). - Go into the project folder. The ZIP folder is usually called
ModellGarage-main(possibly nested twice). Easiest: open the folder that containsstart-podman.batin Explorer and double-clickstart-podman.bat. Or in PowerShell, e.g.:The first run sets up the Podman machine, builds the container (a few minutes) and opens the browser at http://localhost:8003.cd "$env:USERPROFILE\Downloads\ModellGarage-main\ModellGarage-main" .\start-podman.bat
- Stop: double-click
stop-podman.bat(or.\stop-podman.bat).
Note: the
make …commands below are for development on Linux/macOS only. On Windows always use the*-podman.batscripts or the one-command installer.
- In a terminal,
cdinto the folder and run:(builds the container, waits, opens the browser at http://localhost:8003)./start-podman.sh
- Stop:
Or via
./stop-podman.sh
make:make podman-up/make podman-down/make podman-logs.
- Import your Excel: in the app, click "Import" at the top and upload
your
.xlsxcollection file. The collection then appears in the gallery. Database and photos persist in the Podman volumes — they're back on next start.
Just want to try it? Without your own data you can import the bundled sample collection
examples/beispiel-sammlung.xlsx(18 fictional models from Wiking, Siku, Majorette and others) — an instant look at the gallery, statistics, gaps and wishlist. The file contains made-up demo data only.
Note: if
podman composereports that "compose" is missing, enable "Compose" in Podman Desktop under Settings → Extensions (or installpodman-compose). The scripts themselves don't need changing.
make setup # venv + Python deps + npm ci
make import # Excel → SQLite (once)
make start # backend :8003 + frontend :5173 (hot reload)
make start-prod # build frontend + FastAPI serves everything on :8003
make test # pytest
make help # all targetsThe app runs as a single Podman container, but your data deliberately lives outside it in two named volumes. They survive every restart and rebuild — the start scripts rebuild the container each time (podman rm -f / compose up --build), while the volumes stay in place:
| Volume | Contents | Path in container |
|---|---|---|
modellgarage-media |
uploaded photos | /app/media |
modellgarage-data |
the database | /app/data/modellgarage.db |
⚠️ Never delete these volumes — otherwise all photos and the entire collection are lost for good.
Dangerous commands that destroy the data:
podman volume rm modellgarage-media # deletes all photos
podman volume rm modellgarage-data # deletes the database
podman machine reset # deletes ALL volumes on the machine
podman system prune --volumes # deletes unused volumesBy contrast, stop-podman.* and podman compose down (without -v) are safe — they only stop the container and keep the volumes.
Backup goes through the in-app export (Excel), not through Git: the volumes (media/, data/) are intentionally excluded from the repo via .gitignore. Export regularly and keep the file outside the container.
- Catalog-based identity. Every model has a manufacturer catalog number
(Wiking
30/6K., Siku1050, …). It's not on the model itself but comes from the collector catalog. Values (min/max) live in the catalog, not on each individual model (no duplicate maintenance of identical values). - Lot handling. Buying several cars in one auction without per-item detail: the lot is a parent record, each car a child, the individual price is weighted by catalog estimate (not total ÷ count).
- Condition stays manual. Condition (z0/z1/z2) is decided by the collector on inspection — the app only offers a dropdown.
- eBay quick-capture (no API). eBay blocks server fetches (403). Instead the
collector pastes the title, optional price/condition and optionally the
item description into
/neu; the app parses the text locally (no network) and pre-fills manufacturer, type, catalog number, color, price, condition and scale as suggestions — number and color usually come from the description. Everything stays a suggestion the collector confirms. - Photos & eBay API (later). Photos are uploaded manually per model. A real eBay import via the Browse API (developer account + OAuth) is Phase 3, optional.
| Layer | Choice | Why |
|---|---|---|
| Backend | FastAPI (async) | Fast, auto Swagger, Pydantic V2 |
| DB | SQLite (aiosqlite) | Lightest DB — one file, no server, relational |
| ORM | SQLAlchemy 2.x | create_all in MVP, Alembic prepared |
| Frontend | SvelteKit (Svelte 5) | Fast, PWA-ready; adapter-static |
| Deployment | Podman (Windows) | One container, one process, one port (8003) |
| Photos | Local media/ folder |
Download/store images instead of linking |
Design principle: lightweight. Serverless DB, thin backend, an editorial-style frontend (inspired by classicdriver.com). No MongoDB/Postgres, no Kubernetes.
🚀 MVP running. Excel import (~6,300 models, ~3,250 catalog entries), backend
(CRUD, search, filter, sort, statistics, Excel export, photo upload), gallery +
detail in a Classic-Driver style, single-process serving of frontend + API +
/media, Podman deployment for Windows.
Done (Phase 2 / 2b): lot UI (parent/child, weighted price, photos), manual wishlist, duplicate warnings, statistics charts, photo lightbox, manufacturer normalization, eBay quick-capture incl. item description (catalog number + color), purchase-year filter/search/display, catalog matching when adding, data-quality filters, rotating auto-backup, Excel-import regression test.
Open (Phase 3): eBay import via Browse API, multi-capture from a lot description, editable catalog (GK/Rawe).
The app is entirely in German. An in-app language switcher (DE/EN) is intentionally not included (the audience is German-speaking). If you'd like one, feel free to open an issue or contribute a pull request — suggestions and improvements are welcome.
MIT (see LICENSE).