arkennemasis Run Log (local, no spreadsheet)
Your Google Sheet state layer, minus the Google Sheet
- gate
- log_path
- row_json
Plenty of ComfyUI pipelines keep their run state in a Google Sheet. It works, until it doesn't - no network, no permissions, a collaborator's edit overwrites yours. ArkRunLog is the offline replacement: it upserts one row into a local JSON run log, keyed by row_key, so re-running a scene updates that scene's row instead of duplicating it. Same mental model as a spreadsheet, zero external state.
In the arkennemasis scene pipeline it's the per-scene ledger: one row per scene, carrying whatever you decide matters - the prompt used, the generation status, the file that came out. Wire its folder_path from Run Folder and each run gets one clean log file that never touches the network.
How it works
The log is a JSON file shaped like {"rows": {"<key>": {...}}}. Each call merges your fields_json into the existing row (or creates it), with merge controlling whether omitted keys are kept or the row is replaced outright. It's keyed by row_key as a string, and there's a subtlety: inside a per-scene loop the node runs once per iteration, so a fixed row_key would make every iteration overwrite the same row. That's what row_number is for - it overrides row_key when above 0, so each loop iteration logs its own scene.
IS_CHANGED returns NaN so a log write happens every run - without that, ComfyUI's cache would serve the previous result and the second run would silently record nothing.
Inputs and outputs
folder_path- where the log lives. Wire from Run Folder so one run keeps one log.row_key- identifies the row. Writing the same key again updates it.fields_json- a JSON object of the columns to write, e.g.{"image_prompt": "...", "generation_status": "done"}.log_name- the filename stem, defaultrun_log→run_log.json.gate- optional IMAGE input. Wire the branch's image in and a branch skipped by a gate logs nothing - no row claiming work that never happened.merge,row_number- as above.log_path,row_json- the file written and the merged row, if you want to inspect or chain.
Install and troubleshooting
Part of the arkennemasis pack:
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install -r ComfyUI/custom_nodes/comfyui-arkennemasis/requirements.txt
Restart, or install via ComfyUI Manager by repo URL.
If fields_json isn't valid JSON the error is helpful - it names the problem and shows the first 200 characters of what you gave it. And a genuinely nice touch: if the log file gets corrupted, it's moved to <stem>.json.broken rather than deleted, so a long run's history isn't lost to one bad read. If your report later shows scenes that never ran, check the gate wire - that's the input designed to stop phantom rows.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| folder_path | STRING | Wire this from Run Folder so one run keeps one log. Relative paths resolve inside ComfyUI's output dir. | |
| row_key | STRING | 1 | Identifies the row — the scene number in a scene pipeline. Writing the same key again UPDATES that row. |
| fields_json | STRING | {} | A JSON object of the columns to write, e.g. {"image_prompt": "...", "generation_status": "done"}. Merged into any existing row; omitted keys are kept. |
| log_nameopt | STRING | run_log | Filename stem, no extension. Written as <stem>.json. |
| gateopt | IMAGE | Optional. Wire the branch's image in and a branch skipped by a gate logs nothing — no row claiming work that never happened. | |
| mergeopt | BOOLEAN | true | On = merge into the existing row (normal). Off = replace that row outright. |
| row_numberopt | INT | 00–100000 | Overrides row_key when above 0. Wire the scene number here: inside a per-scene loop the node runs once per iteration, and a fixed row_key would make every iteration overwrite the same row. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| log_path | STRING | — |
| row_json | STRING | — |