Z3N ← hall / CH 02 · z3nDash
z3nDash
console for tasks, nodes and data
exhibit 02 / 05
shape: cube
CH 02 · ● LIVE

z3nDash

Schedules and task runs, ZennoPoster nodes, HTTP archives, JSON and SQLite viewers — in one dashboard. Windows, .NET 10.

passport
versionv1.0.3
releases3
updated
stackC# · .NET 10 · WebView2 · PostgreSQL
licenseAGPL-3.0
release history
v1.0.3

z3nDash 1.0.3 turns zpXml into an editor and live debugger, adds a proper general-purpose XML viewer, brings bulk editing to Tasker, and moves the dashboard onto one shared visual system.

zpXml editor

zpXml now opens a ZennoPoster template through the system file dialog and keeps the real project path, so the runtime can resolve .env, shared code and other project files.

  • The template is kept as the document of record instead of being converted into a detached view model.
  • Blocks can be moved on the canvas.
  • Branches can be reordered, moved between blocks or extracted into a new block.
  • Branch parameters, C# code, captions, flags and switch case keys are editable.
  • Success, error and case transitions can be set or cleared by dragging their ports.
  • Deleting a branch redirects incoming transitions to the next valid branch.
  • Ctrl+Z and Ctrl+Y provide undo and redo with a 50-state history.
  • Leaving with unsaved changes produces a warning.
  • Save .xml preserves the original XML declaration and UTF-8/UTF-16 encoding.
  • C# branch code is highlighted with CodeMirror.
  • Project Input Settings and profile data are available from the template settings modal.

Live XML debugger

A template can now be executed directly from the zpXml graph.

  • Start, Step, Run, Pause, Run to branch and Stop control one server-side debug session.
  • The session owns its browser and execution context instead of restarting the template for every step.
  • The current block and branch are streamed to the page over SSE.
  • Project variables, profile values and the execution log update while the session is running.
  • The graph follows execution only when the current branch leaves the visible area; it no longer resets a manually positioned canvas on every step.
  • Background proxy CONNECT refusals are hidden from the log without hiding a real branch failure.
  • Idle debug sessions release their browser automatically.
  • The debug API moved to /dbg/*, avoiding the existing /zp handler prefix.

XML runtime

The built-in ZennoPoster-compatible runtime covers more real template behavior.

  • Added Switch, Alert and captcha branch execution.
  • Added Hunt captcha solving, including canvas capture and slider interaction.
  • Keyboard emulation now types the requested keys and keeps ZennoPoster macros out of the key-token parser.
  • Mouse emulation distinguishes click, press and release instead of treating every action as a click.
  • Navigation no longer fails when a redirect has already completed it.
  • Project Input Settings seed runtime variables; an explicitly empty setting now clears the previous/default value.
  • Generated profiles carry the browser's own user agent.
  • The profile panel shows which generated properties the current browser runtime can and cannot apply.
  • Empty screenshots and failed Hunt attempts now report one useful error instead of sending empty data or dumping repeated stacks.

XML viewer

The old XML converter has been replaced with a general-purpose XML viewer.

  • Paste XML, drop a file or open one through the system dialog.
  • UTF-8 and UTF-16 files are decoded from their BOM, including ZennoPoster templates.
  • Format the source and inspect it as a collapsible tree.
  • Search tags, attributes and text.
  • Expand to a selected depth or expand/collapse the entire document.
  • Virtual scrolling keeps large XML documents usable.
  • The resizable source/tree split is restored on the next visit.
  • XML and zpXml now have their own dock icons; XML opens with Alt+9.

Tasker

  • Ctrl+click selects or removes individual tasks from the selection.
  • Shift+click selects a range.
  • Changes made on the Settings and Schedule tabs can be saved to every selected task.
  • Only fields changed in the form are copied; task names remain individual.
  • The Delete key removes the selected task or selection after confirmation.

Config and dashboard UI

  • Config is split into eight sections: Overview, Database, Logs & Server, Browsers API, OmniRoute, Services, Security and Maintenance.
  • The side rail replaces the previous single long Config page and remembers the last open section.
  • Rebuilding the Config page no longer loses unsaved runtime settings.
  • Tasker, ZP7, HAR, SQLite, Treasury, Clips, JSON, System, ZB, dllGraph, zpXml and the overlay pages now use the shared design-token scale.
  • Added the Graphite theme: monochrome chrome with color reserved for state.
  • Theme selection now controls both typeface and density.
  • Bundled JetBrains Mono now includes Regular, Medium and Bold instead of synthesizing missing weights.
  • The Nerd Font subset dropped from 7.26 MB to 202 KB.
  • The obsolete report.html, terminal.html, zp_visualizer.html, base.css and components.css files were removed.

Clipboard converter fixes

  • FindElementById and FindElementByName selectors are converted along with the existing selector forms.
  • Generated HeGet calls now use the browser instance, matching HeClick and HeSet.

Downloads

  • z3nDash_Setup.exe — installer
  • z3nDash_1.0.3_portable.zip — portable self-contained build; no .NET installation required

github →

v1.0.1

Node traffic is now authorized, the ZP7 task card was rebuilt around icons, and tasks got a hard runtime limit.

Node authorization

The z3n7 node server requires a token on every route, and z3nDash speaks it.

  • The registration string printed by zpServer.zp now carries a token field. It is stored next to the host in zp_nodes and attached as Authorization: Bearer to every call — state, commands, logs, traffic and input settings.
  • The token never reaches the browser: /zp/nodes returns only the probe result.
  • A node that answers 401 is listed as Unauthorized instead of a vague "Unavailable", with the action that clears it.
  • A registration string without a token still parses, so a node running an older z3n7 build keeps working.

Node versions

  • The NODES list shows the z3n7 and ZennoPoster versions read from the node itself.
  • The same data is proxied at GET /zp/version?machine=....
  • An empty version means the node did not answer or runs a build without the route — the node itself is still treated as working.

ZP7 task card

  • The action row is icons with tooltips instead of ten text buttons: Start, Pause (yellow — that is what stop actually does), Interrupt (red cross), Input settings, Tries, Clear ✓ / ✗, Execution, Scheduler.
  • Tries collapsed into one button and a modal: a Set/Add toggle, a value field and +1 / +10 / +100 that edit the field. The command is sent by Apply only, and the modal stays open with the current count refreshed.
  • BadEnd on Interrupt is a toggle instead of a checkbox.
  • The Tags panel is gone from the card; tags remain a filter in the task list.

Per-task runtime limit

  • New timeout_seconds column (0 — no limit), with a field in task settings and a row on the Execution tab.
  • The guard fires once at the limit: an external process is killed together with its tree, an xml run has its token cancelled.
  • A process killed by the limit is recorded as a failure rather than by its exit code, which is arbitrary for a killed tree.

Scheduler executors

  • The xml executor reserves an account, but only when the template really uses one (acc0 declared in <Variables> and mentioned elsewhere). The account is released in finally on every exit — idle on success, fail otherwise.
  • With no free account the run counters stay untouched instead of scoring a run that never happened; a missing account table is reported as a configuration error.
  • The internal and csx-internal executors are gone. Their two tasks are now plain endpoints behind a Maintenance card on the Config page — POST /config/client-bundle and POST /config/update-templates, the latter taking its output folder from the request instead of a hardcoded path.
  • Rows left in the database with those executors are reported explicitly instead of silently falling through to the python branch.

Packaging

  • The installer uses x64compatible instead of the deprecated bare x64, so it also covers ARM64 Windows running x64 under emulation. ISCC compiles with no warnings.
  • Satellite resource languages are no longer shipped: thirteen folders of translated framework messages that nothing ever read. Portable drops from 342.4 MB to 327.0 MB on disk and from 136.3 MB to 131.8 MB zipped.

Fixes

  • Config page: hint paragraphs no longer sit under a negative top margin.

Upgrading

  1. Update z3n7 on every node to a build with authorization and run zpServer.zp again.
  2. Re-add each node in ZP7 → NODES with the fresh registration string. Records saved by earlier versions carry no token and will show as Unauthorized.
  3. Treat the registration string as a password — it grants full control of the node.
  4. The token and timeout_seconds columns are added to an existing database on startup; no manual migration.
  5. If you update a portable folder in place, delete the leftover empty language directories (de, fr, ru, …) — MSBuild removes the files but not the directories.

Downloads

  • z3nDash_Setup.exe — installer
  • z3nDash_1.0.1_portable.zip — portable build, self-contained, no .NET required

github →

v1.0.0

z3nDash 1.0.0

First stable release under the new name.

z3nDash plays ZennoPoster templates without ZennoPoster. It runs scheduled tasks — Python, Node, exe, csx, xml — and shows logs and HTTP traffic from every machine in one place. .NET 10, WinForms, WebView2; the UI and the local API come off a built-in HTTP server that listens on localhost.

Six months ago this was a pile of scripts around a one-page dashboard. This is the first build worth calling stable, and it changes name along with it.


Built-in ZennoPoster runtime

Not an export to code, and not a conversion. The player takes the same .xml, walks its branch graph and executes it. OwnCode is compiled by Roslyn in-process, project and instance are backed by a compatibility layer, and the browser comes up through Patchright — real Chrome with a persistent profile, proxied through a SOCKS5-to-HTTP relay. The z3n7 core, browser operations and cookie handling were ported over, and a single template runs multi-threaded with per-thread profiles and selectors.

Eight branch types are implemented:

OwnCode/CSharp · HTMLElement (RiseEvent, SetAttribute, GetAttribute) · WebBrowser/CMD_NAVIGATE · Profile/Update · Logic/Pause · ImageProcessing/WaterMark

Anything else throws branch not implemented in the player. In practice: a template whose logic lives in C#, with blocks used for clicking, typing and navigating, runs. A template assembled out of blocks does not.

XmlInspect <template.xml> --compile

compiles the shared code and every reachable OwnCode branch and reports what is missing — without running it.

Task scheduler

On-demand, daily, weekly, monthly and interval schedules; skip, parallel and kill_restart overlap policies; live output; payloads with a schema and values.

Executor Runs
python node ts-node npm scripts of the matching runtimes
exe cmd bat bash ps1 executables and shell scripts
csx a C# script
csx-internal a C# script with access to z3nDash internals
xml a ZennoPoster template, played by the built-in runtime
internal a built-in z3nDash task

An xml task picks its browser on the task card and runs headless by default; turn the window on when you need to see where a template stopped. Task settings and schedules are edited the way ZennoPoster does it, and files and folders are picked through the system dialog.

ZennoPoster nodes (ZP7)

Task state and control go directly over HTTP, with no database in between. The task list is grouped by machine and then by project, both levels collapsible. Task settings are rendered as real fields based on the InputSettings types — tabs, dropdowns, checkboxes, multi-select — and can be flipped to raw JSON; a task's payload is copied to the scheduler in one click.

Logs and traffic from every node

allLogs (Alt+4) collects history from each registered machine. traffic (Alt+5) shows HTTP traffic from the nodes and from z3nDash itself.

Written to trafficLog.jsonl next to the logs
Rotation at 50 MB, five most recent files kept
Read from the end, so archive size does not affect open time
Scan ceiling 64 MB, after which the answer is marked truncated

Request details carry headers, cookies and bodies, a built-in replay player, and ready-to-paste code: HttpClient, ZP7, Hybrid, Python, TypeScript, cURL — plus curl import in the other direction. An unreachable node no longer holds up the list: sources appear as they answer.

Tools

HAR analyzer with request replay, JSON viewer and analyzer, text transformations, a clipboard snippet library, Windows state snapshots, a SQLite file viewer, a C# code relationship graph, a Web3 asset summary, bundled documentation and a terminal.

Storage and AI

PostgreSQL via a connection string or SQLite via a file path; the tables each active module needs are created automatically. AI features go through OmniRoute.


Security

[!IMPORTANT] The embedded server binds to localhost only. That is deliberate rather than cautious: its routes have no authentication and allow starting processes through the scheduler, opening a terminal, and reading appsettings.secrets.json — which holds the database connection string. A port exposed to the network would mean code execution on the machine.

One side effect is useful: netsh http add urlacl and running as administrator are no longer required.

If you need the dashboard from another machine, put an authenticated reverse proxy on the same host or use an SSH tunnel — do not forward the port.

Upgrading

[!WARNING] The server no longer listens on external interfaces. Opening the dashboard by IP from another machine will not work.

Removed Replacement
The HTTP page Traffic moved into a modal on the ZP7 page — the traffic button or Alt+5. It reads from the nodes and from a local file instead of a push store.
HTTP log intake: /log, /logs, /logs/stream, /stats, /clear Gone entirely, along with the Logs panel in the Tasker task card. Task stdout remains on the Output tab; node logs are read by allLogs.
logHost, trafficHost, replayPort in the config The replay port is always the dashboard port plus one.
Nodes need a z3n7.dll build that supports tail

GET /traffic on the node takes a tail parameter, and the traffic window relies on it to read the end of the file. With an older build the node returns the first records instead of the last ones — that is the symptom to look for.

Requirements

OS Windows 10 or 11, x64
Runtime Microsoft Edge WebView2 Runtime
Database PostgreSQL, or a SQLite file
Build from source .NET 10 SDK — not needed otherwise

ZennoPoster, ZennoBrowser and OmniRoute are needed only by the features that integrate with them.

Install

Run the installer, or unpack the portable archive anywhere and start z3nDash.exe — no installation and no administrator rights required.

On first start, with no working configuration, the Config page opens: pick the database, enter the connection string or the file path, and adjust the port and folders if the defaults do not suit you. The dashboard listens on 33333 by default and takes the next free port if it is busy. The Tasker opens next.

[!NOTE] Startup failures are written to crash.log next to the executable.

github →