Skip to content
Daniel Heinen edited this page May 9, 2026 · 1 revision

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.

Starting the UI

./ankerctl.py webserver run                  # localhost:4470
./ankerctl.py webserver run --host 0.0.0.0   # accessible on the LAN

In Docker:

docker compose up -d

Open 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.

Setup tab

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.

Home tab

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.

G-Code tab

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.

History tab

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).

Filaments tab

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> and M140 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.

Timelapse tab

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.

Snapshots tab

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.

Camera 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.

Debug tab (ANKERCTL_DEV_MODE=true)

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, layer events
  • 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.

Navigation extras

  • Printer selector — appears in the navbar when ≥2 printers are configured. Switching restarts all services. Disabled while printing (returns 409) or when PRINTER_INDEX env var is set (returns 403).
  • 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.

Login flow notes

  • 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.

Browser support

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.

Authentication recap

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.

Clone this wiki locally