-
-
Notifications
You must be signed in to change notification settings - Fork 5
Web UI
The ankerctl web UI is a single-page dashboard served by Flask on port 4470 by default. It is a Cash.js (lightweight jQuery alternative) frontend backed by REST and WebSocket endpoints documented in API Reference.
This page gives a tab-by-tab tour. For a five-minute walkthrough see Quick Start.
./ankerctl.py webserver run # localhost:4470
./ankerctl.py webserver run --host 0.0.0.0 # accessible on the LANIn Docker:
docker compose up -dOpen http://localhost:4470 (or your configured host/port).
If an API key is set, append ?apikey=<your-key> once and a session cookie is set automatically.
The Setup tab is the entry point on a fresh install — it appears first if no printer is configured yet.
Sections:
-
Account — three import paths:
- Import From eufyMake Studio (Windows, slicer must be open and signed in)
-
Upload login file or slicer cache (
login.json,user_info, or.ldb) - Manual login (email + country + password, with optional CAPTCHA)
- Printers — list of configured printers; pick the active one
- Notifications — Apprise URL, key, tag, event toggles, snapshot quality
- Home Assistant — MQTT broker host, port, credentials, discovery prefix
- Timelapse — enable, interval, max videos, light mode, camera source
-
Tools → Bed Level Map — read the 7×7 bilinear compensation grid via
M420 V, render as a heatmap, save before/after snapshots
Successful operations show a green banner; failures show a red banner with the actual error.
The main monitoring view while a print is active.
-
Camera — live H.264 video (built-in or external feed). Toggle the printer light, switch quality (
sd/hd), capture a snapshot. -
Status panel — current state, filename, ETA, elapsed, layer (
<current>/<total>), filament indicator - Temperature chart — live nozzle and bed temperatures (Chart.js)
- Progress bar — 0–100%
- Console — recent MQTT events, with collapse and live updates
- Quick controls — pause, resume, stop, autolevel (G29)
The Home tab also exposes the per-camera selection (built-in / external / follow) when an external feed is configured.
Upload a sliced .gcode file directly from the browser.
- Drag-and-drop or file picker
- Optional Print after upload checkbox
- Live progress bar streamed from
/ws/upload - Refreshes file lists on the printer's storage and on the USB stick
Note While a print is active, the file list does not refresh — to avoid disrupting the running job. Cancel or finish the print first.
Browse the SQLite-backed print history.
| Column | Source |
|---|---|
| Thumbnail | G-code preview if present |
| Filename | recorded at print start |
| Started / finished / duration | live from MQTT |
| Status |
started, finished, failed, cancelled
|
Actions:
- Reprint — re-upload an archived job (when the file is still in local storage)
- Delete — remove a single entry, or Clear all
- Filter by printer — when multiple printers are configured
Configuration: PRINT_HISTORY_RETENTION_DAYS (default 90), PRINT_HISTORY_MAX_ENTRIES (default 500).
CRUD interface for filament profiles stored in filament.db. Pre-seeded with PLA, PETG, ABS, and TPU.
Each profile holds:
- name, brand, material, color
- nozzle and bed temperatures (first layer + other layers)
- flow rate, diameter, pressure advance
- print speeds (perimeter, infill, support, etc.)
- cooling, seam, scarf, retract, wipe settings
- free-form notes
Actions:
-
Apply sends
M104 S<nozzle_temp_other_layer>andM140 S<bed_temp_other_layer>to the printer -
Duplicate appends
(copy)to the name - Delete
Safety The "Apply" action is blocked while a print is active.
Two-pane layout (player left, list right). Lists every assembled timelapse video with size and creation date.
Actions:
- Play — inline MP4 player
- Download
- Delete
Auto-refreshes every 15 seconds.
Requirements: TIMELAPSE_ENABLED=true and ffmpeg in PATH. See Timelapse for behavior details.
Browse manually captured snapshots and timelapse frame archives. Each entry has preview, download, and delete actions.
Manual snapshots: click the Snapshot button on the Home tab.
If you configured an external camera feed (RTSP / HTTP / MJPEG) in Setup → Camera, this tab lets you preview it independently of the Home tab.
URL allowlist: http, https, rtsp, rtmp only. Credentials in the URL are stripped from any error response shown to the user.
Hidden by default. Set ANKERCTL_DEV_MODE=true and restart to expose it.
Warning Do not enable in production. The Debug tab exposes internal state and lets you inject synthetic events.
Sections:
- State Inspector — live JSON dump of the MqttQueue state machine
- Controls — toggle verbose MQTT payload logging at runtime
-
Simulation — fire fake
start,finish,fail,progress,temperature,speed,layerevents - Services — health panel for each background service with Restart buttons
-
Log Viewer — list and tail files from
ANKERCTL_LOG_DIR
When an API key is configured, all /api/debug/* endpoints require auth.
-
Printer selector — appears in the navbar when ≥2 printers are configured. Switching restarts all services. Disabled while printing (returns
409) or whenPRINTER_INDEXenv var is set (returns403). - Connection indicators — MQTT and PPPP status dots in the navbar (green / yellow / red). Yellow = stale fallback IP for PPPP.
- Sticky alerts — important events (e.g. failed print on a non-active printer) stay visible until acknowledged.
- The eufyMake Studio import button only succeeds when the slicer is open and signed in — the LevelDB is locked otherwise.
- Manual login trims whitespace from inputs, normalizes country codes to uppercase, and stays on the same page on failure with the actual error displayed.
- The Fetch button shows a spinner and is disabled while the request is in flight to prevent double-submits.
- A successful import or login shows a green banner with the email and printer count, then the page reloads.
The frontend uses modern but not bleeding-edge features:
- ES2017 syntax (Chromium, Firefox, Safari 11+)
- WebSocket for live streams
- HLS.js / native H.264 playback for the video stream
- Chart.js for the temperature chart
Inline H.264 playback works best in Chrome and Firefox. Safari and some embedded browsers may struggle with the raw NAL-unit stream.
| Where | How |
|---|---|
| Slicer (PrusaSlicer / Orca / Bambu) |
X-Api-Key: <key> header — fill in the slicer's API Key field |
| Browser bootstrap |
?apikey=<key> URL parameter — sets a session cookie |
| Subsequent browser requests | Session cookie (automatic) |
/ws/ctrl WebSocket |
Inline auth — first message must include the key |
See Configuration → Authentication for full rules.