All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.1.0 - 2026-03-21
CameraStreamCoordinatorservice to detect and register OEM camera streams from printer-reported stream URLs without manual configuration- Intelligent OEM camera fallback detection that probes
http://<printer-ip>:8080/?action=streamwhen firmware omits the camera stream URL printerSettingsDefaultsutility for consistent per-printer settings initialization across backends- Test coverage for
camera-utils,printerSettingsDefaults, and OEM stream coordinator behavior - Playwright E2E testing framework with dual configuration:
- Fixture-based E2E tests (
e2e/) for fast WebUI validation with a stub HTTP+WebSocket server - Emulator-backed E2E tests (
e2e-emulator/) for full lifecycle testing withflashforge-emulator-v2printer emulator - Fixture specs: WebUI smoke tests (asset versioning, context switching) and authentication flow (login, token persistence, logout)
- Emulator specs: direct connection for all 5 printer models, network discovery flow, multi-printer context switching
- Test helpers: emulator harness, standalone server harness, lifecycle runner, scenario definitions, WebUI page object model
tsconfig.e2e.jsonfor E2E TypeScript type checking
- Fixture-based E2E tests (
- Comprehensive npm test scripts for all test suites:
test:e2e,test:e2e:smoke,test:e2e:authfor fixture E2E subsetstest:e2e:emulator,test:e2e:emulator:direct,test:e2e:emulator:discovery,test:e2e:emulator:multifor emulator E2E subsetstest:e2e:allfor all Playwright suites andtest:allfor Jest + Playwright combinedtest:e2e:installfor Chromium browser installation
@playwright/test(^1.58.2) as dev dependency for E2E browser automation- go2rtc-based camera streaming with:
- bundled platform binaries in
resources/bin/ scripts/download-go2rtc.cjspostinstall download flowGo2rtcServiceandGo2rtcBinaryManagerfor stream and process lifecycle management- bundled
video-rtcfrontend player for WebRTC, MSE, and MJPEG playback
- bundled platform binaries in
- Discord webhook notifications for the standalone WebUI with:
- Global config keys in
config.json:DiscordSync,WebhookUrl,DiscordUpdateIntervalMinutes - Multi-printer periodic status updates using a single shared timer
- Event-driven notifications for print completion, printer cooled, and idle transitions
- Status embeds using precise elapsed seconds and firmware ETA when available
- Global config keys in
- Focused Discord notification service tests covering timer behavior, multi-context sends, and payload formatting
- Backend bundling via
scripts/build-backend.tsfor pkg-compatible CommonJS output from the TypeScript source tree - Wrapped platform build entrypoints via
scripts/platform-build-wrapper.ts docs:checkanddocs:check:debugnpm scripts backed byscripts/check-fileoverview.go- Packaged favicon asset for the standalone WebUI
- Camera configuration resolution now uses
CameraStreamCoordinatorfor OEM stream URL detection before falling back to per-printer overrides - Camera configuration resolution now falls back to the known OEM MJPEG endpoint when firmware does not report a stream URL
- go2rtc camera stream reconciliation now handles OEM, custom, and intelligent fallback camera sources through the same managed stream path
@ghosttypes/ff-apiis now pinned to^1.3.0to useFiveMClient.detectCameraStream()for intelligent fallback detection- All printer backends updated to expose the printer-reported OEM stream URL for coordinator use
type-checkscript now runs bothtype-check:appandtype-check:e2efor full TypeScript validation- Camera streaming migrated from the legacy proxy/RTSP stack to go2rtc-managed per-context streams
- Frontend camera playback now uses the bundled
video-rtcplayer instead of the previous streaming path - Backend build pipeline now bundles
src/index.tsbefore pkg packaging, while leaving runtime packages external for compatibility - Legacy per-printer settings in
config.jsonare now treated as stale keys only and stripped on save - Printer connection and backend selection now use per-printer
forceLegacyModeinstead of the removed globalForceLegacyAPI - Camera configuration resolution now uses only per-printer settings from saved printer details
- Static asset copying now includes the packaged favicon and updated browser assets
- Project documentation was refreshed to match the go2rtc migration, Discord webhook support, and current build tooling
- Legacy camera streaming components:
CameraProxyService,RtspStreamService,PortAllocator, and old stream type shims - Legacy global config ownership for
CustomCamera,CustomCameraUrl,CustomLeds,ForceLegacyAPI, andCameraProxyPort
1.0.2 - 2026-01-31
- Comprehensive test suite with 118 passing tests covering core functionality:
- EnvironmentService: Package detection, path resolution, environment state (23 tests)
- ConfigManager: Configuration loading, updates, validation, events (23 tests)
- Error utilities: All error codes, factories, handlers, serialization (68 tests)
- WebUIManager integration: Static files, API routes, SPA routing, middleware (24 tests)
- End-to-end testing workflow for all binary platforms (Windows, macOS, Linux x64/ARM64/ARMv7)
- Production-ready shutdown timeout system with three-tier timeout strategy:
- Hard deadline: 10s absolute maximum
- Per-printer disconnect: 5s timeout with forced cleanup
- WebUI server stop: 3s timeout with connection force-close
- Parallel printer disconnection via
Promise.allSettled()
ShutdownTimeoututility module (src/utils/ShutdownTimeout.ts) with:TimeoutErrorclass for timeout failureswithTimeout()wrapper for promises with timeout enforcementcreateHardDeadline()for absolute maximum shutdown time
- Test scripts:
npm test,npm run test:watch,npm run test:coverage,npm run test:verbose - Express.js skill documentation for Claude Code (4,574 lines of reference material)
- Production-ready shutdown system to prevent indefinite hangs during graceful shutdown:
- Single printer: < 5s shutdown
- Multiple printers: < 10s (parallelized)
- Hard deadline: Always exits within 10s maximum
- Preserved double Ctrl+C for immediate force exit
- Express 5 wildcard route compatibility - Changed unnamed wildcards to named wildcards (
/*splat) - Local build scripts - Corrected binary name from
yao-pkgtopkg - Missing index.html error handling - Returns proper 500 server error with debugging context instead of misleading 404
- Lint configuration - Split configuration for backend (CommonJS) and frontend (ES modules) with appropriate tsconfig references
- 404 error reporting - Fixed catch-all route to use
req.originalUrlinstead ofreq.path - Windows E2E process management:
- Use
taskkill /F /IMandtasklist /FIfor reliable process matching - Implemented cmd.exe wrapper with
-WindowStyle Hiddenfor proper process detachment - Use
127.0.0.1instead oflocalhostfor health checks - Fixed PowerShell reserved variable
$pidrenamed to$serverPid
- Use
- Platform-specific test failures:
- Fixed macOS stat command format (
-f%znot-f%) - Skip ARMv7 execution tests on x64 runners (cross-compiled)
- Fixed API test to check for
authRequiredfield instead ofauthenticated
- Fixed macOS stat command format (
- Windows readline import - Replaced conditional
require()with proper ES6 top-level import - E2E test triggers - Updated workflow to run on all branches and PRs, not just main
- Static file serving in packaged binaries - Assets now properly embedded and served
- Platform selection troubleshooting documentation
- Shutdown logic - Replaced sequential printer disconnection with parallel
Promise.allSettled() - ConnectionFlowManager.disconnectContext() - Added 5s configurable timeout with forced cleanup on timeout
- WebUIManager.stop() - Added 3s configurable timeout with
closeAllConnections()force-close on timeout - Documentation - SPA fallback purpose - Clarified that fallback supports page refreshes and direct URL access, not client-side routing
- Documentation - Production-ready status - Updated CLAUDE.md project status from "not fully tested" to "production-ready"
- Documentation - README improvements:
- Added Usage section explaining WebUI access (localhost:3000)
- Documented default password (
changeme) and how to change it - Replaced JSON config block with clear settings table
- Added descriptions for all configuration options
- Build configuration - Updated for proper asset packaging
- tsconfig.json - Added test files to include array
TEST_SUMMARY.mddocumentation file - Test information available in CI/CD workflows and test files- Unnecessary E2E test workflow comments
- FlashForgeUI-Electron reference from Related Projects (internal reference)
- Redundant
withTimeoutwrapper from shutdown disconnect calls (now handled internally by ConnectionFlowManager)
- No security vulnerabilities addressed in this release
1.0.1 - 2026-01-20
- Multi-printer context switching
- Spoolman integration for filament tracking
- Platform-specific binary builds (Linux ARM, Linux x64, Windows, macOS)
1.0.0 - 2026-01-15
- Initial release of FlashForgeWebUI
- Web-based interface for controlling and monitoring FlashForge 3D printers
- Multi-printer support with isolated contexts
- Camera proxy service for MJPEG streaming
- RTSP stream management
- Temperature monitoring with anomaly detection
- Print state monitoring with progress tracking
- WebSocket-based real-time communication
- Optional password authentication
- Configuration persistence in
data/config.json