Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 111 additions & 0 deletions appstores/casaos/ModelWorkshopManager/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: model-workshop-manager
services:
model-workshop-manager:
image: lucifix/model-workshop-manager:1.0.0
container_name: model-workshop-manager
restart: unless-stopped
deploy:
resources:
reservations:
memory: 128M
ports:
- target: 3000
published: "13080"
protocol: tcp
environment:
SESSION_COOKIE_SECURE: "false"
TRUST_PROXY: ""
volumes:
- type: bind
source: /DATA/AppData/$AppID/data
target: /data
- type: bind
source: /DATA/AppData/$AppID/backups
target: /backups
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
x-casaos:
envs:
- container: SESSION_COOKIE_SECURE
description:
en_US: Set to true only once the app is served over HTTPS (e.g. behind a reverse proxy with TLS). Over plain HTTP, true makes the browser drop the login cookie and login silently fails.
- container: TRUST_PROXY
description:
en_US: Number of reverse proxies in front of the app (usually 1) so the login rate limiter sees real client IPs. Leave empty without a proxy. "true" is refused and the app won't start.
ports:
- container: "3000"
description:
en_US: Web UI HTTP port
volumes:
- container: /data
description:
en_US: Database, uploaded photos and the auto-generated session secret
- container: /backups
description:
en_US: In-app backups (manual backup, download and restore)
x-casaos:
id: org.icewhale.modelworkshopmanager
main: model-workshop-manager
index: /
port_map: "13080"
scheme: http
icon: https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/ModelWorkshopManager/icon.svg
thumbnail: https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/ModelWorkshopManager/thumbnail.png
screenshot_link:
- https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/ModelWorkshopManager/screenshot-1.png
- https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/ModelWorkshopManager/screenshot-2.png
- https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/ModelWorkshopManager/screenshot-3.png
title:
en_US: Model Workshop Manager
tagline:
en_US: Track your model kit stash, paint shelf and builds
description:
en_US: |
No more guessing whether you already own that kit, digging through drawers for the right shade of paint, or losing track of build progress. Model Workshop Manager keeps your scale-model catalog, inventory and builds in one place, on your own hardware.

**Key Features:**
- Searchable catalog of kits and paints, kept separate from what you own and what's on your wishlist
- One-click starter catalog of 10,000+ paints from 30+ brands (Tamiya, Vallejo, Citadel, Mr. Hobby, AK, Mission Models and more)
- Barcode scanning to check whether you already own a kit, with optional UPCitemdb lookup
- Builds with a timestamped progress log, photos and "required vs. owned" paint matching
- One-tap shopping list for a build's missing paints, plus a wishlist
- Supplies (brushes, cement, masking tape) with low-stock alerts
- CSV/JSON import and export, and backup/restore from the UI
- Installable as an app on phone and desktop (PWA)
- Single-user and private: one SQLite file, photos on your own disk, no cloud, no tracking

**Learn More:**
- [Website](https://lucifix.github.io/model-workshop-manager/)
- [GitHub repository](https://github.com/Lucifix/model-workshop-manager)
tips:
before_install:
en_US: |
## Getting Started

Open the Web UI and create your username and password on the one-time setup screen. Nothing else needs configuring.

To start with a full paint catalog, open **Import & Export → Import starter catalog**.

## HTTPS and reverse proxies

This is a single-user app meant for your LAN or a VPN, not the open internet. If you serve it over HTTPS behind a reverse proxy, set `SESSION_COOKIE_SECURE` to `true` and `TRUST_PROXY` to `1`.
author: Lucifix
developer: Lucifix
category: Productivity
architectures:
- amd64
- arm64
version: "1.0.0"
update_at: "2026-10-17"
release_notes:
en_US: |-
- First tagged release: kit, paint and supply catalog and inventory, barcode scanning, builds with photo progress logs, shopping list and wishlist.
- One-click starter catalog of 10,000+ paints from 30+ brands.
- First-run setup screen, auto-generated session secret and in-app backups.
website: "https://lucifix.github.io/model-workshop-manager/"
repo: "https://github.com/Lucifix/model-workshop-manager"
support: "https://github.com/Lucifix/model-workshop-manager/issues"
docs: "https://github.com/Lucifix/model-workshop-manager#readme"
63 changes: 63 additions & 0 deletions appstores/casaos/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# CasaOS / ZimaOS App Store manifest

`ModelWorkshopManager/docker-compose.yml` is an app definition for the official
[CasaOS App Store](https://github.com/IceWhaleTech/CasaOS-AppStore), written in
its v2 format: standard Compose plus a top-level `x-casaos` block (see
[Compose and x-casaos](https://github.com/IceWhaleTech/CasaOS-AppStore/blob/main/docs/specs/compose-and-x-casaos.md)).

Notes on the choices:

- **Pinned image tag** (`1.0.0`, not `latest`). That's what the store's other
apps do, and it ties `x-casaos.version` to what actually runs. Bump both
(and `update_at`/`release_notes`) in a follow-up PR to the store for each
release.
- **Host port 13080.** Store apps use high ports to stay clear of CasaOS itself
and other apps.
- **Runs as the image's default uid 1000**, with no `user:` override. CasaOS
creates missing `/DATA/AppData/...` folders with mode 0777 before starting
the app, so the unprivileged process can write to them.
- **`x-casaos.id` is `org.icewhale.modelworkshopmanager`**, the format the
store's validator suggests. If the maintainers ask for a different id,
change it.
- The store's app assets (`icon.svg`, `thumbnail.png`, `screenshot-*.png`) are
copied from this repo when you submit, not stored here twice.
- **The `cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/ModelWorkshopManager/...`
URLs return 404 until the store PR is merged.** Every app in the store points at
its own folder this way. The store build doesn't download them: it maps
`Apps/ModelWorkshopManager/<file>` to the copied local file, then rewrites the
URL to the published asset. If the files aren't copied in (step 2 below), the
build fails on those URLs.

## Submitting

1. Fork [IceWhaleTech/CasaOS-AppStore](https://github.com/IceWhaleTech/CasaOS-AppStore)
and clone your fork.
2. From the fork's root, with this repo checked out at `../model-workshop-manager`:

```bash
mkdir -p Apps/ModelWorkshopManager
cp ../model-workshop-manager/appstores/casaos/ModelWorkshopManager/docker-compose.yml Apps/ModelWorkshopManager/
cp ../model-workshop-manager/public/favicon.svg Apps/ModelWorkshopManager/icon.svg
cp ../model-workshop-manager/public/icon-512.png Apps/ModelWorkshopManager/icon.png
cp ../model-workshop-manager/docs/screenshots/readme-hero.png Apps/ModelWorkshopManager/thumbnail.png
cp ../model-workshop-manager/docs/screenshots/mobile-dashboard.png Apps/ModelWorkshopManager/screenshot-1.png
cp ../model-workshop-manager/docs/screenshots/mobile-models.png Apps/ModelWorkshopManager/screenshot-2.png
cp ../model-workshop-manager/docs/screenshots/mobile-build.png Apps/ModelWorkshopManager/screenshot-3.png
```

3. Validate locally:

```bash
docker compose -f Apps/ModelWorkshopManager/docker-compose.yml config -q
./scripts/build_dist.sh
```

The build should finish without errors and produce
`dist/apps/org.icewhale.modelworkshopmanager/`.

4. Optional: install it on a CasaOS box first. In the App Store, use
**Custom Install → Import** and paste the compose file.
5. Commit on a branch, push, and open a PR against `main` titled e.g.
"Add Model Workshop Manager". Say in the description that it adds a new
app, what the app does, and how you validated it (step 3, plus step 4 if
you did it). The store's `Validate Compose And Build` check runs on the PR.
50 changes: 50 additions & 0 deletions appstores/unraid/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Unraid Community Apps template

Community Apps template for [Model Workshop Manager](https://github.com/Lucifix/model-workshop-manager).

This folder is laid out as the root of a **separate** templates repository
(`Lucifix/unraid-templates`), following the Community Apps
[builder guide](https://ca.unraid.net/submit/help/builders) and its
[starter repository](https://github.com/unraid/unraid-community-apps-starter):
Community Apps expects `ca_profile.xml` at the repository root and scans the
whole repository, so it gets its own small repo instead of living in the app's
root. The template pulls the published image, so it doesn't need anything else
from this repo.

```text
ca_profile.xml repository profile shown in Community Apps
templates/model-workshop-manager.xml the Docker template
```

`TemplateURL` and `WebPage` assume the repo is named `unraid-templates`. Both
return 404 until that repo exists. Pick a different name and you'll need to
update both.

## Unraid-specific defaults

- **Runs as `99:100`** (`--user 99:100` under _Extra Parameters_). This replaces
`APP_UID`/`APP_GID` from `docker-compose.yml`, which are Compose-only and
have no effect as container variables. Unraid creates missing appdata paths
owned by `nobody:users`, so the image's default uid 1000 couldn't write there.
- **Data and backups are sibling folders** under
`/mnt/user/appdata/model-workshop-manager/`. Nesting the backups folder
inside the data folder would make every backup include the previous ones.
- **Host port 8080 → container port 3000**, same as the docs.

## Submitting

1. Create a public repo `Lucifix/unraid-templates`. Copy this folder's
contents to its root, along with this project's `LICENSE` (CA requires an
OSI-approved license at the repo root). Push to `main`.
2. Check that
`https://raw.githubusercontent.com/Lucifix/unraid-templates/main/templates/model-workshop-manager.xml`
loads.
3. Optional but common: open a support thread in the Unraid forums'
_Docker Containers_ section. Add its URL as `<Forum>` in `ca_profile.xml`
and as `<Support>` in the template.
4. Sign in at <https://ca.unraid.net/submit/new>, enter the repo URL, then run
**Validate** and **Scan**. Fix anything they report, push, and run them again.
5. Submit for review once every check passes.

Once the templates repo is live, edit the template there. Either delete this
folder or keep the two in sync.
6 changes: 6 additions & 0 deletions appstores/unraid/ca_profile.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<CommunityApplications>
<Profile>Unraid templates for Model Workshop Manager, a self-hosted, single-user app for tracking your model kit stash, paint shelf, supplies and builds. For questions and bug reports, use GitHub Discussions or issues on the main project: https://github.com/Lucifix/model-workshop-manager</Profile>
<Icon>https://raw.githubusercontent.com/Lucifix/model-workshop-manager/main/public/icon-512.png</Icon>
<WebPage>https://github.com/Lucifix/unraid-templates</WebPage>
</CommunityApplications>
38 changes: 38 additions & 0 deletions appstores/unraid/templates/model-workshop-manager.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<Container version="2">
<Name>model-workshop-manager</Name>
<Repository>lucifix/model-workshop-manager:latest</Repository>
<Registry>https://hub.docker.com/r/lucifix/model-workshop-manager</Registry>
<Network>bridge</Network>
<Shell>sh</Shell>
<Privileged>false</Privileged>
<Support>https://github.com/Lucifix/model-workshop-manager/discussions</Support>
<Project>https://github.com/Lucifix/model-workshop-manager</Project>
<ReadMe>https://github.com/Lucifix/model-workshop-manager#readme</ReadMe>
<Overview>Model Workshop Manager keeps your scale-model hobby in one place: a searchable catalog of kits and paints kept separate from what you actually own, barcode scanning to check whether you already have a kit, a one-click starter catalog of 10,000+ paints from 30+ brands (Tamiya, Vallejo, Citadel, Mr. Hobby, AK and more), builds with progress photos and "required vs. owned" paint matching, a shopping list and wishlist, supplies with low-stock alerts, CSV/JSON import and export, and in-app backups. Installable as a PWA on phone and desktop.

Single-user and private by default: one SQLite file and your photos on your own disk, no accounts, no cloud, no tracking.

First run: open the WebUI and create your username and password on the one-time setup screen. Nothing else needs configuring.

Meant for your LAN or a VPN, not the open internet. If you put it behind a reverse proxy with HTTPS, set SESSION_COOKIE_SECURE to true and TRUST_PROXY to 1.</Overview>
<Category>Productivity: Tools:Utilities</Category>
<WebUI>http://[IP]:[PORT:3000]/</WebUI>
<TemplateURL>https://raw.githubusercontent.com/Lucifix/unraid-templates/main/templates/model-workshop-manager.xml</TemplateURL>
<Icon>https://raw.githubusercontent.com/Lucifix/model-workshop-manager/main/public/icon-512.png</Icon>
<!-- The image runs unprivileged as uid 1000 by default (APP_UID/APP_GID in
docker-compose.yml). Unraid creates missing appdata paths owned by
nobody:users (99:100), so run as that instead or the app can't write
its database. Change it here if your paths are owned by someone else. -->
<ExtraParams>--user 99:100</ExtraParams>
<ExtraSearchTerms>scale model kits miniatures paints hobby modelling inventory warhammer gunpla collection</ExtraSearchTerms>
<License>MIT</License>
<Screenshot>https://raw.githubusercontent.com/Lucifix/model-workshop-manager/main/docs/screenshots/mobile-dashboard.png</Screenshot>
<Screenshot>https://raw.githubusercontent.com/Lucifix/model-workshop-manager/main/docs/screenshots/mobile-models.png</Screenshot>
<Screenshot>https://raw.githubusercontent.com/Lucifix/model-workshop-manager/main/docs/screenshots/mobile-build.png</Screenshot>
<Config Name="WebUI" Target="3000" Default="8080" Mode="tcp" Description="Host port for the web interface. The app listens on 3000 inside the container." Type="Port" Display="always" Required="true" Mask="false">8080</Config>
<Config Name="Data" Target="/data" Default="/mnt/user/appdata/model-workshop-manager/data" Mode="rw" Description="Database, uploaded photos and the auto-generated session secret." Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/model-workshop-manager/data</Config>
<Config Name="Backups" Target="/backups" Default="/mnt/user/appdata/model-workshop-manager/backups" Mode="rw" Description="Where in-app backups are written and restored from. Point it at a share you already back up." Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/model-workshop-manager/backups</Config>
<Config Name="SESSION_COOKIE_SECURE" Target="SESSION_COOKIE_SECURE" Default="false" Description="Set to true only once the app is served over HTTPS (e.g. behind a reverse proxy with TLS). Over plain HTTP, true makes the browser drop the login cookie and login silently fails." Type="Variable" Display="always" Required="false" Mask="false">false</Config>
<Config Name="TRUST_PROXY" Target="TRUST_PROXY" Default="" Description="Number of reverse proxies in front of the app (usually 1 for SWAG, Nginx Proxy Manager or Traefik) so the login rate limiter sees real client IPs. Leave empty without a proxy. 'true' is refused on purpose and the app won't start." Type="Variable" Display="always" Required="false" Mask="false"></Config>
</Container>
Loading