Extend the dashboard with custom data sources. Plugins are standalone executables that communicate via JSON-over-stdio — write one in any language, in under 50 lines.
schema_version: 1) but subject to breaking changes until further notice. Pin your plugin to a specific Dofek version if stability matters. Once the contract stabilizes, the API will follow semver.
Dofek spawns your plugin as a child process. Every refresh cycle, it writes a poll request to stdin and reads your JSON response from stdout. That's the entire contract.
Dofek owns the tick rate. No backpressure, no buffering, no message floods. Your plugin just responds when asked.
No ports, no sockets, no service discovery. stdin/stdout pipes are inherited at spawn. Use stderr for your debug logs — Dofek drains it continuously, so writing a lot to it can't block you.
If your plugin crashes, Dofek restarts it with exponential backoff: 1s → 2s → 4s → 8s → 16s → 30s cap.
Newline-delimited JSON. One object per line, terminated by \n. Your plugin receives poll requests on stdin and writes responses to stdout.
| FIELD | TYPE | DESCRIPTION |
|---|---|---|
| type | "poll" | Always "poll" |
| schema_version | u32 | Message-shape version — 1 today, absent on Dofek < 1.6 |
| seq | u64 | Request counter — echo it back so Dofek can discard late replies |
| timestamp_ms | u64 | Unix timestamp in milliseconds |
| processes | array | Current system processes — ignore if not needed |
All three arrays are optional — include only what your plugin provides. On the first response, include a manifest field to identify your plugin. Echo the request's seq so Dofek can tell a late reply from the answer to the current poll. A status other than "ok" marks your plugin unhealthy in the UI while still showing whatever data it sent.
Each response can include panels (dock UI), process annotations (watchlist labels), and metrics (ticker pills). Mix and match as needed.
panels — Plugin Dock UIPanel content is rendered in the plugin dock at the bottom of the watchlist. The first panel's values appear inline next to the plugin name; every additional panel gets its own line. Every entry you send is rendered — the TUI dock caps at a third of the watchlist and offers P to expand, and the GUI dock scrolls.
process_annotations — Enrich Process Rows| FIELD | REQUIRED | VALUES |
|---|---|---|
| pid | yes | Must match a running process |
| label | no | Any string — shown on the process row |
| category | no | "ai" "dev" "watch" |
| ai_state | no | "idle" "loading" "inferring" |
metrics — Ticker Bar Pills| FIELD | TYPE | DESCRIPTION |
|---|---|---|
| id | string | Unique, namespaced (e.g., "ollama.running") |
| label | string | Short label for the ticker pill |
| value | f64 | Numeric value |
| unit | string | Suffix (empty string for no unit) |
Dofek tracks each plugin's health and displays a colored indicator in the dock.
Edit a plugin response and see how it renders in the Dofek dock. Validates your JSON in real-time.
Generate a starter template for your plugin. Fill in the details, pick a language, and copy the code.
← Click GENERATE to create a plugin template
timeout_ms (default 2s) to respond to each pollplugin_name.metric_name to avoid collisions