Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
2b4f831
Merge pull request #65 from Parallel-7/chore/dependabot-1.0.4-stable
GhostTypes May 31, 2026
6b30b55
Merge pull request #67 from Parallel-7/chore/remove-stale-docs
GhostTypes May 31, 2026
9e08151
Merge pull request #69 from Parallel-7/docs/changelog-unreleased
GhostTypes May 31, 2026
480a43d
chore(release): open 1.0.5-alpha.1 cycle on alpha
GhostTypes May 31, 2026
3db9a28
Merge pull request #71 from Parallel-7/chore/alpha-next-1.0.5
GhostTypes May 31, 2026
b64ae33
feat(ui): add Edit Layout item to the main menu
GhostTypes Jun 1, 2026
27a02e2
refactor(ui): rename LegacyUiController to ShellController
GhostTypes Jun 1, 2026
ba5f02a
fix(ui): address Gemini review feedback
GhostTypes Jun 1, 2026
ca43d67
Merge pull request #72 from Parallel-7/feat/edit-layout-menu
GhostTypes Jun 1, 2026
3846132
feat(ifs): set an AD5X slot's material/color from a Spoolman spool
GhostTypes Jun 5, 2026
1a4fec3
feat(ifs): manual slot editor dialog + Spoolman-independent slot writes
GhostTypes Jun 6, 2026
5d0127a
fix(connection): route printer model on USB product ID
GhostTypes Jun 23, 2026
bbce79a
feat(creator5): add Creator 5 / 5 Pro backend, tool-temp card, and ro…
GhostTypes Jun 24, 2026
12c639d
docs(changelog): add 1.0.5-alpha.1 notes (Creator 5 support)
GhostTypes Jun 24, 2026
3dce956
feat(creator5): HTTP-only connection, updated material station
GhostTypes Jun 25, 2026
1e819e5
chore(release): 1.0.5-alpha.2
GhostTypes Jun 25, 2026
d6ea038
fix(creator5): ignore stale legacy flag so HTTP-only printers connect
GhostTypes Jun 25, 2026
dc52f49
chore: stop tracking SPOOLMAN-SLOT-BLUEPRINT.md
GhostTypes Jun 25, 2026
2362d5c
fix(creator5): don't treat the Creator 5 as a legacy printer in disco…
GhostTypes Jun 25, 2026
ef1c056
fix(creator5): enable material matching on Creator 5 / 5 Pro
GhostTypes Jun 25, 2026
a67eebe
feat(creator5): unified temperature card (4 tools + bed + chamber)
GhostTypes Jun 25, 2026
2a187ee
feat: wire up slicer-meta 1.4.0 fields in Job Uploader
GhostTypes Jun 25, 2026
2a8677c
fix: material slot config
GhostTypes Jun 25, 2026
75a474a
fix(creator5): chamber temp control
GhostTypes Jun 26, 2026
e5be3be
fix(creator5): split C5 and AD5X backends; use correct C5 upload format
GhostTypes Jun 26, 2026
3b44260
chore(release): 1.0.5-alpha.4
GhostTypes Jun 26, 2026
d5015e7
fix(creator5): chamber/tool temp control, filtration gating, and temp…
GhostTypes Jun 28, 2026
619e84b
fix(creator5): per-tool Off button + T1-T4 display (ff-api 1.6.1)
GhostTypes Jun 28, 2026
8eb6b1f
feat(webui): add Creator 5 series support
GhostTypes Jul 2, 2026
c054e51
refactor(webui): remove redundant chamber temperature clamp
GhostTypes Jul 2, 2026
7755b95
fix: blank widgets on context switch #77
GhostTypes Jul 3, 2026
4910906
fix(webui): proxy camera via authenticated ws
GhostTypes Jul 3, 2026
6aa4dcc
feat: start-at-boot and minimized #75
GhostTypes Jul 4, 2026
59b526b
chore(release): 1.0.5-alpha.7
GhostTypes Jul 4, 2026
2e2ae42
fix(webui): show TVOC reading on filtration card, disable controls fo…
GhostTypes Jul 5, 2026
0cbb9e2
feat(webui): add thumbnail previews to the file dialog using the shar…
GhostTypes Jul 5, 2026
dc28c94
chore(release): 1.0.5-alpha.8
GhostTypes Jul 5, 2026
05a045d
feat: add SFTP file manager, SSH settings, reboot
GhostTypes Jul 9, 2026
6f4004b
fix: pin file manager to context, release SFTP on disconnect
GhostTypes Jul 9, 2026
566c421
fix(deps): patch 8 Dependabot security advisories
GhostTypes Jul 9, 2026
bb2ba94
fix: refactor start with system for Linux
GhostTypes Jul 10, 2026
0ac4f3c
fix(logging): overhaul debug logging and auto-update reliability
GhostTypes Jul 10, 2026
f555ee9
feat(webui): bring the SSH toolset to the browser - file manager, cal…
GhostTypes Jul 10, 2026
7aea273
fix(linux): make start-at-boot, start-minimized, and package sandboxi…
GhostTypes Jul 23, 2026
4459714
docs: surface the deb/rpm AppArmor behavior for end users (#75)
GhostTypes Jul 24, 2026
07c2b14
Detect modern printers from the discovery product ID and add a manual…
GhostTypes Jul 24, 2026
79b7b6d
feat(webui): gate G-code on HTTP-only printers, tighten material-stat…
GhostTypes Jul 24, 2026
e5a8db5
docs: migrate docs/README.md to GitHub wiki
GhostTypes Jul 24, 2026
1eb4108
chore(deps): bump @ghosttypes/ff-api to ^1.7.0 for loopback discovery
GhostTypes Jul 24, 2026
94718e3
chore(release): 1.0.5-alpha.9 with ff-api 1.7.1
GhostTypes Jul 26, 2026
5078855
ci: gate releases and main/alpha pushes on type-check, lint, and test…
GhostTypes Jul 31, 2026
39e09f3
fix(test): close keep-alive sockets in the route test server and run …
GhostTypes Jul 31, 2026
9d99048
ci: build release artifacts on node 22 to match electron 39
GhostTypes Jul 31, 2026
d80e4a1
chore(release): 1.0.5-alpha.10 hotfix for job uploader
GhostTypes Jul 31, 2026
6220f6d
test(e2e): rebuild the Electron suite
GhostTypes Jul 31, 2026
8b88a99
ci(e2e): fix the Electron sandbox helper and kill emulator process gr…
GhostTypes Jul 31, 2026
f76992a
feat(tray): hide window to system tray on minimize (#75)
GhostTypes Jul 31, 2026
99ad79f
test(webui): run browser E2E against the real headless server
GhostTypes Jul 31, 2026
fd7d398
fix(webui): don't open material matching for Creator 5 files
GhostTypes Aug 6, 2026
e38cb1e
docs(changelog): record the unreleased tray, testing, and Creator 5 m…
GhostTypes Aug 6, 2026
6074de5
fix: suppress the wall-clock ETA while the print is not advancing
GhostTypes Aug 10, 2026
6d66d79
chore(release): 1.0.5-alpha.11
GhostTypes Aug 10, 2026
7db1d40
docs(claude): record the advancing-print ETA gate and the ff-api 2.0.…
GhostTypes Aug 10, 2026
615ab80
fix: source the print ETA from the library CompletionTime
GhostTypes Aug 13, 2026
58717fb
fix: disable local and recent job start for the Creator 5 series
GhostTypes Aug 14, 2026
113613e
test: cover the Creator 5 series on the emulator E2E track
GhostTypes Aug 14, 2026
803c583
docs(changelog): record the Creator 5 gating fixes and emulator-track…
GhostTypes Aug 14, 2026
02ddb4b
feat(webui): add Upload Job to the built-in WebUI
GhostTypes Aug 19, 2026
01cbb83
docs(changelog): record the built-in WebUI Upload Job port
GhostTypes Aug 19, 2026
53f486b
docs: scrub internal RE references from comments
GhostTypes Aug 19, 2026
3961e05
docs: dedupe stacked @fileoverview headers in 37 files
GhostTypes Aug 19, 2026
a7c63e8
docs: fix stale comments and remove tombstones
GhostTypes Aug 19, 2026
e541369
docs: condense 27 oversized @fileoverview headers
GhostTypes Aug 19, 2026
6a5f3f1
docs: normalize headers to @fileoverview-only convention
GhostTypes Aug 19, 2026
eadec05
docs: drop restatement and duplicated override comments
GhostTypes Aug 19, 2026
739e06a
refactor: drop dead global.d.ts references
GhostTypes Aug 20, 2026
85e467f
refactor: dedupe video-rtc.js into shared lib
GhostTypes Aug 20, 2026
c9506a9
feat: rework material matching and upload dialogs
GhostTypes Aug 21, 2026
eb27cc1
chore: remove ui-shot screenshot harness
GhostTypes Aug 21, 2026
cc77ff5
chore(ui): remove the minimize-to-tray setting description
GhostTypes Aug 21, 2026
793b811
ci(release): anchor the release tag to the dispatched commit
GhostTypes Aug 21, 2026
c223042
chore(release): 1.0.5-alpha.12
GhostTypes Aug 21, 2026
199f03e
ci(e2e): pin emulator checkout to v0.2.0, skip Electron binary download
GhostTypes Aug 22, 2026
757038f
chore(deps): bump @ghosttypes/ff-api to 2.0.1
GhostTypes Sep 12, 2026
53677a8
build: resolve scoped deps from public npm
GhostTypes Sep 13, 2026
9c4f915
ci: resolve scoped deps from public npm
GhostTypes Sep 13, 2026
bb31aa1
ci: drop remaining github packages auth block
GhostTypes Sep 13, 2026
8720c97
docs: no auth needed to build from source
GhostTypes Sep 13, 2026
eeaebb0
feat(spoolman): estimate-based per-spool tracking for station printers
GhostTypes Sep 13, 2026
9c946b9
feat(spoolman): track single-material AD5X stored-file prints
GhostTypes Sep 14, 2026
f720d03
feat(spoolman): track station jobs per job, not per slot
GhostTypes Sep 24, 2026
ff34015
ci: pin the emulator to v0.4.0
GhostTypes Sep 24, 2026
869e99e
chore(release): prepare 1.0.5-alpha.13
GhostTypes Sep 26, 2026
e4d9e9c
fix(webui): share one WebUI start between concurrent callers
GhostTypes Oct 7, 2026
8c5d60d
Merge branch 'main' into alpha
GhostTypes Oct 10, 2026
dffd953
chore(deps): patch newly published security advisories
GhostTypes Oct 11, 2026
51c1960
ci: default the manual emulator ref to v0.4.0
GhostTypes Oct 11, 2026
33becec
docs: add contributor guide and refresh README
GhostTypes Oct 11, 2026
65a3fc6
chore(release): prepare 1.0.5 stable
GhostTypes Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 3 additions & 7 deletions .claude/commands/bump-version.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,6 @@ Correct flow:
- Use the `mcp__time__get_current_time` MCP tool with timezone `America/New_York` to get accurate timestamp
- Format: `**Last Updated:** YYYY-MM-DD HH:mm ET (America/New_York)`

d. **docs/README.md**:
- Update any version references in user-facing documentation
- Update download links similar to main README.md

5. **Summary**:
- Show the user which files were updated
- Display old version → new version
Expand All @@ -71,22 +67,22 @@ Correct flow:
```
Current: 1.0.3-alpha.1
New: 1.0.3-alpha.2
Updated: package.json, README.md (alpha link), CLAUDE.md timestamp, docs/README.md
Updated: package.json, README.md (alpha link), CLAUDE.md timestamp
```

**Stable Release:**
```
Current: 1.0.3-alpha.5
Confirm: Ready to release 1.0.3 stable? [User confirms]
New: 1.0.3
Updated: package.json, README.md (stable link), CLAUDE.md timestamp, docs/README.md
Updated: package.json, README.md (stable link), CLAUDE.md timestamp
```

**After Stable → Next Alpha:**
```
Current: 1.0.3
New: 1.0.4-alpha.1
Updated: package.json, README.md (alpha link), CLAUDE.md timestamp, docs/README.md
Updated: package.json, README.md (alpha link), CLAUDE.md timestamp
```

## Validation
Expand Down
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Shell scripts and Linux packaging data must keep LF endings regardless of the checkout platform.
# With core.autocrlf=true on Windows these files would otherwise be checked out with CRLF, and a
# packaged postinst starting with `#!/bin/bash\r` fails on Linux with "bad interpreter".
*.sh text eol=lf
assets/linux/apparmor-profile text eol=lf
138 changes: 138 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
name: CI

on:
push:
branches: [main, alpha]
pull_request:
branches: [main, alpha]
workflow_dispatch:
inputs:
emulator-ref:
description: 'flashforge-emulator-v2 git ref to run the E2E track against'
required: false
default: 'v0.4.0'
type: string

concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

jobs:
verify:
name: Type-check, lint, build, test
runs-on: ubuntu-latest
steps:
- name: Checkout FlashForgeUI
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.23.0

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'


- name: Install dependencies
shell: bash
run: pnpm install --frozen-lockfile

- name: Type check
run: pnpm type-check

- name: Lint
run: pnpm lint

- name: Build (main + renderer + webui)
run: pnpm build

- name: Unit tests
run: pnpm test

e2e-emulator:
name: E2E (emulator + WebUI)
runs-on: ubuntu-latest
needs: verify
steps:
- name: Checkout FlashForgeUI
uses: actions/checkout@v4

# The emulator lives in a separate public repo and provides the printers this
# track drives, so no real hardware is needed. Pinned to a release tag so an
# emulator change cannot silently break or silently change this CI; bump the
# tag (or dispatch with emulator-ref) to pick up a new emulator release.
- name: Checkout flashforge-emulator-v2
uses: actions/checkout@v4
with:
repository: GhostTypes/flashforge-emulator-v2
ref: ${{ inputs.emulator-ref || 'v0.4.0' }}
path: emulator

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.23.0

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'


- name: Install dependencies
shell: bash
run: pnpm install --frozen-lockfile

- name: Install emulator dependencies
working-directory: emulator
run: npm ci
env:
# Only the emulator's headless runtime is used here; skip the ~110 MB
# Electron binary download. The app-under-test gets its Electron from
# this repo's node_modules, not the emulator's.
ELECTRON_SKIP_BINARY_DOWNLOAD: '1'

# The browser track needs the chromium binary itself, not just its system libraries.
- name: Install Playwright chromium
run: pnpm exec playwright install --with-deps chromium

# Electron refuses to start if its SUID sandbox helper is not root-owned and
# setuid, which is how pnpm unpacks it. Fixing the binary keeps the app launching
# exactly as it does for users, rather than weakening it with --no-sandbox.
- name: Enable the Electron sandbox helper
run: |
ELECTRON_DIR="$(dirname "$(node -p "require('electron')")")"
sudo chown root:root "$ELECTRON_DIR/chrome-sandbox"
sudo chmod 4755 "$ELECTRON_DIR/chrome-sandbox"

# The suite drives a real Electron window, so CI needs a virtual display.
- name: Run emulator E2E track
run: xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" pnpm test:e2e:electron:emulator
env:
FF_EMULATOR_ROOT: ${{ github.workspace }}/emulator

# Browser coverage of the WebUI. It launches the real app with --headless against the
# same emulator, so it needs Electron and a display too - hence this job rather than
# the fast verify one. Runs even if the Electron track failed, since the two cover
# different surfaces and one failing should not hide the other.
- name: Run WebUI browser E2E
if: success() || failure()
run: xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" pnpm test:e2e
env:
FF_EMULATOR_ROOT: ${{ github.workspace }}/emulator

- name: Upload Playwright artifacts
if: failure()
uses: actions/upload-artifact@v4
with:
name: playwright-e2e-artifacts
path: |
test-results/
playwright-report/
retention-days: 7
if-no-files-found: ignore
52 changes: 41 additions & 11 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,46 @@ on:
default: false

jobs:
verify:
name: Verify (type-check, lint, test)
runs-on: ubuntu-latest
steps:
- name: Checkout FlashForgeUI
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10.23.0

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'


- name: Install dependencies
shell: bash
run: pnpm install --frozen-lockfile

- name: Type check
run: pnpm type-check

- name: Lint
run: pnpm lint

- name: Unit tests
run: pnpm test

build_and_release:
needs: verify
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
node-version: [18] # LTS version, good for Electron
node-version: [22] # matches the Node runtime Electron 39 bundles

steps:
- name: Checkout FlashForgeUI
Expand All @@ -36,15 +69,6 @@ jobs:
node-version: ${{ matrix.node-version }}
cache: 'pnpm'

- name: Configure GitHub Packages Authentication
shell: bash
run: |
echo "Setting up GitHub Packages authentication"
echo "@ghosttypes:registry=https://npm.pkg.github.com" >> .npmrc
echo "@parallel-7:registry=https://npm.pkg.github.com" >> .npmrc
echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Install dependencies
shell: bash
Expand Down Expand Up @@ -97,6 +121,7 @@ jobs:
dist/**/*.dmg
dist/**/*.AppImage
dist/**/*.nupkg
dist/**/*.blockmap
dist/*.yml
!dist/**/elevate.exe
!dist/win-unpacked/**
Expand Down Expand Up @@ -129,7 +154,7 @@ jobs:
shell: bash
run: |
mkdir release_assets
find artifacts/ -type f \( -name "*.zip" -o -name "*.deb" -o -name "*.rpm" -o -name "*Setup*.exe" -o -name "FlashForgeUI*.exe" -o -name "*.dmg" -o -name "*.AppImage" -o -name "*.nupkg" -o -name "*.yml" \) | grep -v "elevate.exe" | while IFS= read -r file; do
find artifacts/ -type f \( -name "*.zip" -o -name "*.deb" -o -name "*.rpm" -o -name "*Setup*.exe" -o -name "FlashForgeUI*.exe" -o -name "*.dmg" -o -name "*.AppImage" -o -name "*.nupkg" -o -name "*.blockmap" -o -name "*.yml" \) | grep -v "elevate.exe" | while IFS= read -r file; do
filename=$(basename "$file")
cp "$file" "release_assets/$filename"
echo "Copied $file to release_assets/$filename"
Expand Down Expand Up @@ -225,6 +250,11 @@ jobs:
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.VERSION_TAG }}
# Anchor the tag to the dispatched commit. Without this, GitHub creates a
# missing tag at the repository DEFAULT branch (main) rather than the ref
# the workflow ran on, so releases cut from `alpha` were tagged against
# main and did not contain the code that was actually built and shipped.
target_commitish: ${{ github.sha }}
name: ${{ env.RELEASE_NAME }}
body_path: ${{ env.RELEASE_NOTES_PATH }}
draft: false
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ temp/

# Playwright test artifacts
test-results/
playwright-report/

# Editor directories and files
.vscode/
Expand Down Expand Up @@ -132,3 +133,4 @@ debug_logs/*
hook_debug_log.txt
__pycache__/
.pi/session-memory.json

Loading
Loading