Nodes/arkennemasis Nodes/arkennemasis Run Log (local, no spreadsheet)
ComfyUI Node

arkennemasis Run Log (local, no spreadsheet)

Your Google Sheet state layer, minus the Google Sheet

By Hishamahmer·Created 2 months ago·Updated 8 days ago· 9
arkennemasis Run Log (local, no spreadsheet)
  • gate
  • log_path
  • row_json
folder_path
row_key1
fields_json{}
log_namerun_log
mergetrue
row_number0

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, default run_logrun_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.

Categoryarkennemasis/Utility

Inputs (7)

NameTypeDefaultDescription
folder_pathSTRINGWire this from Run Folder so one run keeps one log. Relative paths resolve inside ComfyUI's output dir.
row_keySTRING1Identifies the row — the scene number in a scene pipeline. Writing the same key again UPDATES that row.
fields_jsonSTRING{}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_nameoptSTRINGrun_logFilename stem, no extension. Written as <stem>.json.
gateoptIMAGEOptional. Wire the branch's image in and a branch skipped by a gate logs nothing — no row claiming work that never happened.
mergeoptBOOLEANtrueOn = merge into the existing row (normal). Off = replace that row outright.
row_numberoptINT00–100000Overrides 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)

NameTypeDescription
log_pathSTRING
row_jsonSTRING