3DMake GUI Wrapper is an accessibility-focused NiceGUI frontend for
tdeck/3dmake. It gives keyboard and screen-reader
users a practical way to create, inspect, preview, export, and print 3DMake models
without losing direct access to the underlying 3dm command-line workflow.
The application wraps the 3dm CLI in a two-panel desktop-style interface with:
- project and file selection
- one-click quick actions for common
3dmworkflows - a built-in source editor for
.scadand config files - streamed command output in a live log
- accessible popup windows for text command results
- SVG preview viewing
- interactive STL viewing
- printer and overlay/profile management
- release-friendly packaging through PyInstaller
The GUI is designed to complement the CLI, not replace it. You can use the GUI for
the common workflow and still drop down to custom 3dm commands when you need to.
Comprehensive project documentation is generated with MkDocs and published to GitHub Pages.
- Published docs site: https://mrhunsaker.github.io/3DMAKEGUI/
- Docs workflow: .github/workflows/documentation.yml
- Docs configuration: mkdocs.yml
| Topic | GitHub Pages | Source |
|---|---|---|
| Home | https://mrhunsaker.github.io/3DMAKEGUI/ | docs/index.md |
| Getting Started | https://mrhunsaker.github.io/3DMAKEGUI/getting-started/ | docs/getting-started.md |
| Security | https://mrhunsaker.github.io/3DMAKEGUI/security/ | docs/security.md |
| Containers | https://mrhunsaker.github.io/3DMAKEGUI/containers/ | docs/containers.md |
| Contributing | https://mrhunsaker.github.io/3DMAKEGUI/contributing/ | docs/contributing.md |
| Style Guide | https://mrhunsaker.github.io/3DMAKEGUI/style-guide/ | docs/style-guide.md |
| API: Core Utilities | https://mrhunsaker.github.io/3DMAKEGUI/api/core/ | docs/api/core.md |
| API: GUI Application | https://mrhunsaker.github.io/3DMAKEGUI/api/app/ | docs/api/app.md |
| API: Versioning Script | https://mrhunsaker.github.io/3DMAKEGUI/api/versioning/ | docs/api/versioning.md |
uv sync --group docs
uv run --group docs mkdocs serveThen open: http://127.0.0.1:8000
For a strict production build:
uv run --group docs mkdocs build --strict- named application regions for fast navigation
- F6 and Shift+F6 region cycling
- Ctrl+, keyboard help dialog
- Ctrl+Shift+E/F/C/L/S shortcuts for editor, file path, command input, log, and settings
- global Ctrl+S save behavior
- screen-reader announcements for editor entry and focus changes
- accessible command output dialogs with focus moved into the popup automatically
- popup dismissal via OK button or Escape
- line-numbered, monospace text output for easier screen-reader review
The GUI exposes direct buttons and settings for these workflows:
3dm info3dm build3dm slice3dm orient3dm preview3dm new3dm build slice3dm build orient slice3dm print3dm image3dm setup3dm list-libraries3dm install-libraries3dm list-profiles3dm list-overlays3dm version3dm self-update3dm help- arbitrary custom commands through the command box
The Command Options panel lets you build common flags without typing them manually:
- model name
- view
- profile
- overlays
- scale
- copies
- debug
- interactive info mode
These options are appended to compatible quick actions automatically.
The built-in CodeMirror editor supports:
- loading and saving model files
- loading global
defaults.toml - loading project
3dmake.toml - opening overlay, profile, and prompt files directly in the editor
- runtime font size changes
- runtime word wrap toggle
- persistent word wrap preference across restarts
- SVG preview dialog after successful
3dm preview - “View Last SVG” button for reopening generated SVG output
- STL viewer dialog with Three.js rendering
- keyboard-accessible STL rotation and zoom controls
- bounding-box dimensions for STL files
- PyInstaller build spec for Linux and Windows
- GitHub Actions workflow that builds release artifacts on Linux and Windows
- local end-to-end maintenance/release workflow via update_system.py
- Linux release asset packaged as
3dmake-gui.tar.gz - Windows release asset packaged as
3dmake-gui.zip - versioned GitHub Releases created from tags or manual workflow input
- date-based versioning using
YYYY.MM.DD - interactive version bump script in scripts/bump_version.py
- synchronized version updates for pyproject.toml and src/tdmake_gui_wrapper/init.py
| Tool | Purpose |
|---|---|
| Python 3.11+ | Runtime |
| uv | Dependency management |
| tdeck/3dmake | Core modeling CLI |
Optional:
trimeshfor richer STL dimension supportpywebviewfor native-window mode and packaged desktop builds
git clone https://github.com/mrhunsaker/3dmakeGUI.git
cd 3dmakeGUI
uv sync --all-extrasuv run python -m tdmake_gui_wrapper
#or
uv run 3dmake-guiOr after installing the package:
3dmake-guiBy default the app starts the NiceGUI server and opens the interface in a browser.
The launcher now supports these options before the GUI starts:
3dmake-gui --help3dmake-gui --version
--help prints usage help. --version prints the package version and exits.
The app looks for 3dm in this order:
THREE_DM_PATH- the system
PATH - known install folders resolved by the app
You can also set the binary path from the Settings section inside the GUI.
Example:
export THREE_DM_PATH="/home/user/3dmake/3dm"
uv run python -m tdmake_gui_wrapper- Choose a project file or project directory.
- Adjust Command Options if needed.
- Run a quick action like Build STL, Preview, or Full Pipeline.
- Review the Output Log and the accessible popup dialog.
- Open generated SVG or STL assets in the built-in viewers.
- Edit model or config files in the editor and save changes.
The Settings section provides commands and file-loading helpers for:
- setup
- global config
- project config
- 3dm path override
- library listing and installation
- profile and overlay listing
- version info
- self update
- CLI help
- overlay/profile/prompt editing in the embedded editor
The Custom Command box is for direct 3dm invocation when a button does not cover
your use case. Output is still streamed to the log and shown in the accessible popup.
The repository ships a production-ready Dockerfile and docker-compose.yml.
# Build the image
docker compose build
# Start in the foreground (Ctrl-C to stop)
docker compose up
# Start in the background
docker compose up -d
# Stop and remove containers
docker compose downThe NiceGUI interface is available at http://localhost:8080.
The port is bound to 127.0.0.1 only; change the ports entry in
docker-compose.yml to expose it externally (and place an authenticating
reverse proxy in front of it when you do).
Two named Docker volumes are created automatically:
| Volume | Mount path | Purpose |
|---|---|---|
projects |
/home/appuser/projects |
Your 3D-project files |
settings |
/home/appuser/.config/3dmake-gui |
GUI settings and preferences |
Replace a named volume with a host-path bind mount in docker-compose.yml to
work on files that live on your host machine:
volumes:
- /home/youruser/projects:/home/appuser/projectsThe Docker image runs with:
- a non-root user (
appuser, UID 1001) - all Linux capabilities dropped
- a read-only root filesystem (
/tmpis a tmpfs) no-new-privilegesenforced
See SECURITY.md for the full policy.
Two Podman-specific files are provided:
| File | Usage |
|---|---|
| podman-compose.yml | podman-compose (Compose-style workflow) |
| container.yaml | podman play kube (Kubernetes Pod spec) |
# Install podman-compose if needed
pip install podman-compose
# Build and start
podman build -t 3dmake-gui-wrapper:2026.04.29 .
podman-compose up -d
# Stop and remove
podman-compose downpodman build -t 3dmake-gui-wrapper:2026.04.29 .
podman play kube container.yaml
# Stop and clean up
podman play kube --down container.yamlThe Podman configs mirror the Docker security posture (non-root, dropped
capabilities, read-only FS) and additionally set user: "1001:1001" explicitly
for rootless Podman environments.
uv sync --all-extras
uv run pyinstaller 3dmake_gui.specOutput is written to dist/3dmake-gui/.
On Linux, run:
./dist/3dmake-gui/3dmake-guiOn Windows, run 3dmake-gui.exe from the generated folder.
The repository includes a release workflow at .github/workflows/release.yml.
It supports:
- tag-triggered releases for tags like
v2026.04.29 - manual workflow dispatch with a version input
- Linux packaging to
3dmake-gui.tar.gz - Windows packaging to
3dmake-gui.zip - automatic GitHub Release creation with those assets attached
Project documentation is published at:
The docs use MkDocs + Material + mkdocstrings and render API content from NumPy-style docstrings in source code.
uv sync --group docs
uv run --group docs mkdocs serveor for a one-time static build:
uv run --group docs mkdocs build --strictThe GitHub Actions workflow at .github/workflows/documentation.yml
builds and deploys docs to GitHub Pages on pushes to main.
Use the bump script to update versions interactively:
.venv/bin/python scripts/bump_version.pyThe script prompts for which aspect to increase:
- year
- month
- day
- revision
It updates:
The repository includes update_system.py to run the common maintenance and release workflow in the expected order.
Run the full workflow:
uv run python update_system.pyBy default it performs:
- dependency sync with all extras
- lint and format (auto-fix + strict check)
- test suite
- strict docs build
- interactive version bump
- PyInstaller build
Common skip flags:
--no-checks--no-docs--no-bump--no-pyinstaller
Example (run checks/tests only):
uv run python update_system.py --no-docs --no-bump --no-pyinstalleruv run pytest -qCurrent pytest modules:
tests/test_core.pytests/test_bump_version.py
Run the version bump tests directly:
uv run pytest tests/test_bump_version.py -q.venv/bin/python -m py_compile src/tdmake_gui_wrapper/app.py src/tdmake_gui_wrapper/core.py src/tdmake_gui_wrapper/__main__.py
uv run pytest tests/test_core.py -q
uv run pytest tests/test_bump_version.py -q3dmakeGUI/
├── .github/workflows/release.yml
├── scripts/bump_version.py
├── update_system.py
├── src/tdmake_gui_wrapper/
│ ├── __init__.py
│ ├── __main__.py
│ ├── app.py
│ └── core.py
├── tests/test_bump_version.py
├── tests/test_core.py
├── 3dmake_gui.spec
├── container.yaml # Podman play kube Pod spec
├── docker-compose.yml # Docker Compose
├── Dockerfile # Multi-stage container build
├── podman-compose.yml # podman-compose equivalent
├── pyproject.toml
├── CONTRIBUTING.md
├── SECURITY.md
├── STYLE.md
├── README.md
└── LICENSE
See CONTRIBUTING.md for the full contribution guide, and STYLE.md for code style conventions.
Quick summary:
- Fork → feature branch →
uv sync --all-extras→ focused change → tests → PR. - Format with Black (line length 88) and lint with Ruff before pushing (save time by running
ruff check --fix). - Preserve accessibility behavior and keyboard shortcuts unless a change explicitly improves them.
- Follow the Python Code of Conduct.
See SECURITY.md to report vulnerabilities privately.
- PyInstaller builds are platform-specific.
- Native-folder dialogs depend on the runtime environment.
- Browser sandbox warnings can appear depending on the host environment and are not always application bugs.
This project is licensed under the Apache License, Version 2.0.
You may use, modify, and distribute this software under the terms of the Apache 2.0 license. See the LICENSE file for the full license text.