-
-
Notifications
You must be signed in to change notification settings - Fork 0
Roadmap
This roadmap is organized by planned release milestone and mirrors the
GitHub milestones.
Items within a milestone are roughly ordered by priority, but exact sequencing
shifts as work progresses. Issues tagged
good first issue
are a good starting point for new contributors.
Core UX gaps and scan accuracy improvements, all merged to main: prev/next
navigation on model detail (#101),
thumbnail capture from the 3D viewer (#100),
manual force-group overrides (#106,
#107),
stale-model pruning after full scans (#53),
and per-creator rescan bootstrap (#50).
Release-blocking bugs and security fixes from the June 2026 pre-release
full-project code review — all 17 issues closed. Highlights: blocked
cross-origin writes to the localhost API
(#213),
fixed the standalone entry point drifting from app.main
(#212),
cascade-deleted collection memberships
(#214),
server-side storefront thumbnail downloads
(#208),
and capped Cults3D scraper pagination
(#218).
The painting module M0 groundwork — backend package and DB tables (#178, #179), Settings toggle and Guides / Paint Shelf route shells (#180, #181), and CI wiring (#182) — plus library exclude filters by creator and tag (#204, #205), Loot Studios storefront enrichment (#102), the image-update bug cluster (#186, #189, #190, #203), database import (#163), a fullscreen lightbox (#168), server-side persisted preferences — NSFW default, page size, sort, and filter presets (#32), slicer project file exclusion from the scan with pruning of any already indexed (#206), and the "Recently added" view with configurable day window and New badges (#170).
The big interaction milestone, all merged: bulk actions
(#164), global tag
management (#165),
quick-assign tags/collections from the card
(#172), the print
queue with per-model status
(#166), 1–5 star
ratings (#167),
full keyboard navigation
(#169), a Library
sort control (#247),
search debounce (#220),
3D-viewer code-splitting (#24),
a /scan/browse allowlist (#41),
plus download-zip, snapshot-before-restore, scanner-status, and frontend
error-handling/test-coverage hardening
(#219,
#222,
#223,
#221,
#224), and a batch
of reported bugs (#285,
#286,
#287,
#288).
Gumroad scraper overhaul — pagination beyond the first page
(#316), the
value=/content= og-tag fix
(#317), and richer
Inertia data-page JSON parsing
(#326) — plus
external-drive access caching
(#304), in-group
image caching (#185),
a tag_sync dedupe (#56),
and .env settings reload
(#140). This
milestone also carried the painting guide authoring work: the
import/authoring UI (#277),
the structured tab→phase→step→swatch editor
(#329), and Painting
M3 PDF export via Playwright
(#320).
Released as v0.9.0. Shipped: configurable scan rules
(#31), Alembic
migrations replacing the hand-rolled ALTER TABLE loop
(#43), standardized
DB session handling (#45),
matcher pre-tokenization and dead-code cleanup
(#57,
#353), a Library
search clear button (#355),
revertible printed status (#379),
a scan-progress file-count fix
(#380), and a
Library performance regression fix
(#382).
The Library reorganize / normalize-on-disk epic was deferred to v0.10 to ship v0.9.0 on the work above.
Released as v0.10.0. Painting depth: paint mixes as first-class swatches (#339), guide-import paint resolution — map/force-add/skip unresolved paints before committing (#417), drag-and-drop HTML guide import (#413), and a dark, readable print/PDF guide stylesheet (#418).
The variant-group management cluster also landed in full: rename groups (#183), one image for a whole group (#184), inline rename (#191), quick clear-image (#192), pick the display thumbnail (#193), drag-to-group merge / multi-select / keyboard accessibility (#136, #137, #139), the bulk set-group endpoint (#374), manual within-group ordering + rep auto-promotion (#302, #399, #401), and in-group image caching (#303) — plus inline tag editing on model detail (#411) and variant-collapse / default-sort performance work (#392, #393, #394). Nested groups-within-groups (#188) was closed as out of scope — group merging already covers combining groups.
The opt-in, preview-first reorganize / normalize-on-disk epic (standalone-only — Docker mounts are read-only). Built against a persisted, identified manifest so the apply step executes and verifies the approved plan rather than blindly recomputing. Shipped in v0.11.0.
| Issue | Item |
|---|---|
| #29 | Reorganize / normalize the library on disk — umbrella: preview → resolve → apply with undo |
| #323 |
Phase 1 — preview manifest (#426) — per-file move sets, real (size, mtime) fingerprints, sanitization/collision/escape/override-reference flags; no files moved |
| #324 | Phase 2 — apply, undo, resolution — 2a apply (#431: drift abort, EXDEV-safe move, crash-safe undo log, scan-root confinement), 2b undo (#432: idempotent reverse with verify-before-revert), 2c resolution + wired apply/undo UI (#433) |
The end-to-end import → enrich → organize workflow for loose, badly-named, or unknown-creator files. Reorganize (v0.11) is only the last mile; these add the import and bulk-enrich steps that make unorganized files eligible to file away. All of it reuses the v0.11 Phase 2 apply/move engine — no second mover.
Shipped in v0.12.0.
The epic (#427) landed the building blocks — one-shot inbox import and bulk-enrich — plus the Import Preview foundation: named libraries with a source→library mapping, the pack-grouped preview projection, and stage + batch apply through the reorganize engine. The browse-first Import Preview screen itself (#449) completed in v0.13 (below).
| Issue | Item |
|---|---|
| #427 | Epic — import-and-organize building blocks for loose/unknown files |
| #428 |
One-shot import folder → library (#446) — index an arbitrary folder as inbox models (is_inbox flag) without adding it as a permanent scan root; each immediate subdir is treated as a creator. Inbox models anchor in the managed library on reorganize apply (clearing is_inbox), and restore on undo |
| #429 |
Bulk-enrich metadata (#436) — PATCH /models/bulk/enrich sets creator/character/title across a multi-selection; the Enrich mode in the bulk toolbar — the bridge to reorganize-eligibility |
| #450 | Named libraries + source→library mapping (#454) — a library is a named, writable scan root; a source folder maps to a destination library, inherited by its packs |
| #451 |
Pack-grouped preview projection (#455) — GET /import/preview groups inbox models into one card per pack with inherited destination |
| #453 |
Stage + batch apply (#460) — POST /import/apply moves imported packs into their mapped library via the reorganize engine (drift + undo, is_inbox cleared) |
Post-release hardening (v0.12.1 – v0.12.3) — bulk-enrich and painting-guide fixes shipped after the feature line: #437 / #438 / #439 (bulk-enrich rescan overwrite, clearing character/title, whitespace-only creator), #440 (sanitize imported guide HTML/CSS/URLs), #441 / #442 / #445 (PaintRack CSV removal/duplicate-identity guards), #443 / #444 (brand-aware guide-import overrides + no silent drop of undecided paints).
Released as v0.13.0. Completed the browse-first Import Preview screen on top of the v0.12 foundation, and added true paint-mix modelling.
| Issue | Item |
|---|---|
| #449 | Epic — Import Preview screen — browse-first folder → library with inline enrich |
| #452 | Import Preview UI (#457, #459) — pack cards, inline metadata editor, destination dropdown, per-card import; library name/writable toggle in Settings |
| #456 | Per-pack file counts in the preview cards |
| #458 | Pack-card C3 — Notes, Source URL + Fetch, and Collections on pack cards |
| #425 |
True mix swatches (Option B) — nullable paint_id, mix components with ratios, round-trip, blended-dot chip |
| #271 | Painting round-trip coverage — sub-content callouts and wargaming raw-block capture closed the importer gaps surfaced across the corpus |
Released as v0.14.0.
| Issue | Item |
|---|---|
| #463 |
Desktop app shell — the standalone build opens in a native window via pywebview (WebView2 on Windows), with an automatic fall-back to the default browser; STL_NO_WINDOW=1 forces browser mode |
| #500 | Variant group: bulk-set store page (#501) — set one store/product URL across the selected variants of a group in a single step (selection-scoped, overwriting) |
| #425 → #477 |
Nullable paint_id for unresolved single swatches — an unresolved single-paint swatch is kept by name rather than dropped, like mix components |
| #415 | Back-reference mix components — closed as covered by #425 (unresolved components round-trip as named rows; no real corpus cases warranted a structural ref) |
Released as v0.15.0. Extended the structured guide editor (shipped in v0.8) into a complete from-scratch authoring path, so a guide can be built and published entirely in the app without hand-writing HTML.
| Issue | Item |
|---|---|
| #484 | Epic — in-app authoring & validation |
| #487 | Guide-start wizard |
| #488 | Structured editor — inventory-backed swatch picker, value%/reorder + live preview |
| #503 | Drag-reorder tabs/phases/steps/swatches in the editor |
| #489 | Validation panel — wire the validator; block publish on errors |
| #490 | Series-bundle PDF + reward stamping |
| #511 | Guide export UI — series-bundle download + stamping controls |
Make guides customizable to each user's style before the AI work lands, and decouple the Paint Shelf from the guides feature so it's always available.
| Issue | Item |
|---|---|
| #513 | Epic — guide theming & Paint Shelf independence |
| #514 | App-level default guide theme + new-guide inheritance |
| #515 | Guide theme editor UI (colour pickers + live preview) + PDF theme rendering |
| #516 | Paint Shelf made independent of the guides feature flag (always visible) |
The painting module's headline workflow: an LLM produces a first-draft guide as
structured data, you edit it, and a colour-match studio suggests owned paints
from a reference image. Domain rules are captured in
docs/painting/reference/figure-painting-skill.md.
This release also renames the app to STL Studio (the catalog keeps the name
Library) to reflect its growth into a 3D-print + painting toolbox.
| Issue | Item |
|---|---|
| #485 | Epic — AI draft & color match |
| #491 | Generation service — Claude → GuideDraft, async /draft (generation.py) |
| #492 | Draft → edit review flow |
| #493 / #561 | Color-match studio — Lab / CIEDE2000 / k-means, eyedropper, background exclusion |
| #569 | Color match — hue-cohesive value ladder (shadow / mid / highlight) |
| #494 | Reference-image pipeline — STL-folder rung + provenance (images.py) |
| #535 / #536 | Reference image — upload + Claude vision, in-browser downscale |
| #498 / #506 | Validation — domain colour rules: skin-anchor band + highlight-direction |
| #517 | AI/Painting settings — capture + encrypt the API key (shown only when guides are enabled) |
| #504 | Guide editor — author/edit mix-component swatches (ratios) |
All AI capabilities are bring-your-own-API-key; no keys ship in the repo or build.
Deferred to v0.17.0: the reference-image network rungs (assisted web search / AI-gen) — #563.
| Issue | Item |
|---|---|
| #486 | Painting M5 — full-corpus import & polish — bulk-import the reference guide corpus as reviewed drafts, calibrate the validator, print/PDF + accessibility pass |
| #409 |
Structured wargaming guide type — guide_type discriminator + quality tiers / batch workflow / basing |
| #563 | Reference-image network rungs — assisted web search / AI-gen + hero credit |
The headline is the new Windows desktop app: STL Studio now ships as a real NSIS-installed Electron application, alongside a large batch of features and security/correctness fixes accumulated since v0.17.0. Effectively a public beta of the desktop build, it shipped unsigned (SmartScreen warns on first run) and without auto-update. Auto-update followed in the later v0.20 release line; signing is still deferred — see Code signing below.
Desktop app — #528
| Item |
|---|
| pywebview → Electron — NSIS installer, Start-menu entry, multi-resolution app icon, no console window; the Python backend runs as a windowless sidecar on a dynamic free port. |
Branded startup splash while the backend boots; custom application menu with back/forward navigation (right-click, Alt+←/Alt+→, mouse buttons) and no Edit menu. |
Features
- Collections — cover images, description editing, card redesign (#749/#750)
- Kit-builder — sticky 3D part preview pane (#778)
- Gallery — set thumbnails from the gallery (#770), display preferences (#783), scanned-gallery population (#769)
- Settings reorganization — part settings → Preferences, gallery prefs (#755/#756/#784)
- Smarter AI naming; Library performance via TanStack Query migration (#740/#741)
Hardening — security & correctness
- SSRF guards on server-side URL fetches + scraper redirect cap (#737/#734)
- Case-insensitive model identity to stop scan data loss (#733); partial-walk prune shielding (#738); dangling
rep_model_idrepair (#727/#729) - Bug-bounty P1s —
bulkAddModelsfail-loud (#776), scan-busy → 409 (#777), DB restore/reset behind the write lock (#780) - NSFW variant-thumbnail blur (#731); queue-position race fix (#730); DB restore body cap (#732)
The desktop shell and auto-update path have shipped and the unsigned v0.20.4 publication rehearsal passed. The remaining v1.0 work is release qualification and communication rather than another feature wave. Jira is the source of truth for these gates.
| Jira | Remaining gate |
|---|---|
| STUDIO-145 | Complete the remaining error/loading-state coverage. |
| STUDIO-211 | Publish the support and platform-compatibility policy. |
| STUDIO-212 | Add release checksums, SBOM, and provenance. |
| STUDIO-213 | Create the clean-machine release acceptance checklist. |
| STUDIO-214 | Run an external beta across representative real libraries. |
| STUDIO-215 | Hold the release candidate through a normal-usage soak. |
| STUDIO-216 | Publish stability-focused v1.0 release notes. |
Code signing is deferred and is not a v1.0 release gate. STUDIO-99 remains tracked, but signing-certificate acquisition and signed-installer verification are out of scope for v1.0.
SignPath's free open-source certificate programme declined the application: it requires a level of project adoption STL Studio has not reached yet. Reapplying is possible as usage grows. Paid alternatives — including Azure Trusted Signing — have not been pursued.
Until an installer is signed, Windows SmartScreen warns on first run for every
release. That path is documented as a supported one rather than treated as a
defect: see Windows blocked the installer
for the walkthrough and Verifying your download
for the SHA256SUMS and build-provenance checks that let users confirm a
download is genuine without a publisher signature.
Post-v1 work stays out of the release train unless a demonstrated release-blocking regression changes that decision.
| Jira | Initiative |
|---|---|
| STUDIO-226 | Correct Linux creator-folder case semantics before supported Linux desktop packaging. |
| STUDIO-227 | Refactor scanner responsibilities and remove implicit coupling. |
| STUDIO-238 | Refactor the variant-group proposal engine into explicit policies and stages. |
| STUDIO-221 | Add supported Linux desktop packaging. |
| STUDIO-220 | Add macOS packaging and notarization. |
The painting module follows its own M0–M5 track from the spec (see also the kickoff brief).
- M0 — module wiring ✅ — backend package, DB tables, Settings toggle, route shells, CI (shipped in v0.6).
-
M1 — Paint Shelf ✅ —
brand/paint_line/paintmodels + CRUD (#240), the shelf table UI (#241), PaintRack CSV import/export with diff preview (#242, #243), and code validation (#244). - M2 — Guide model, renderer & print ✅ — guide schema + CRUD, React reader, static-HTML exporter, HTML importer with round-trip, print view, and the model↔guide link.
- M3 — Authoring, validation & PDF export ✅ (delivered across v0.8) — import/authoring UI (#277), structured editor (#329), Playwright PDF export (#320).
- Authoring polish (milestone v0.15, epic #484) — a from-scratch guide wizard, a validation panel, and series-bundle PDF, building on the M3 editor.
-
M4 — AI drafts + color match (milestone v0.16, epic #485) —
the Claude generation service (
generation.py), draft→edit flow, the color-match studio (colormatch.py), and the reference-image pipeline (images.py). Domain rules are captured indocs/painting/reference/figure-painting-skill.md. - M5 — Full-corpus import & polish (milestone v0.17.0, epic #486) — bulk-import the reference guide corpus as reviewed drafts, calibrate the validator, and do the print/PDF + accessibility pass.
The shared skills tabs are reference content rendered from a built-in port; fleshing out the sparse Brush Skills tab is tracked in #483 (backlog).
Larger, well-defined efforts not tied to a near-term milestone.
| Issue | Item |
|---|---|
| #16 | Cross-model kit building (kitbash) — assemble a character from parts across multiple packs; needs cross-model part-picker UI design |
| #17 | Notarize the macOS standalone binary — deferred; requires a paid Apple Developer Program membership |
Have an idea or want to pick something up? Check the open issues or open a new one.
STL Studio · runs 100% locally · made by Brent the Programmer — Patreon · Buy Me a Coffee