Telemetry events
GraphDeck records a small, anonymous count of which tools get used, to guide development. It is disclosed (a first-run notice), opt-out (Settings → Privacy, or set the GRAPHDECK_TELEMETRY environment variable to off), and silent-fail, so it can never delay, block, or error the app.
Counts only, never content. No graph names, node names, file paths, prompt text, precise location, or any free-form string ever leaves your machine. There is no install id or identifier of any kind: telemetry is fully unattributed. On launch GraphDeck sends one aggregate rollup like { "ai_generate": 3, "library_save": 12 }, plus the app version and the OS family (win / mac / linux). That is the entire payload. Your graphs themselves never leave the machine.
When telemetry is off, nothing is tallied and nothing is sent. These are the only names that can ever be sent — anything not on this list is rejected before it can be counted.
| Event | What it counts |
|---|---|
app_launch | The app was launched. |
tier_free | The launch was in the unactivated (free) state (one per launch). |
tier_pro | The launch was in the activated (Pro) state (one per launch). |
update_download | An app update download was started. |
update_install | An app update install was started. |
pack_use_blueprint | The Blueprint pack was switched to. |
pack_use_material | The Materials pack was switched to. |
pack_use_widget | The Widget (UMG) pack was switched to. |
pack_use_other | Another pack was switched to (the pack name is never sent). |
graph_new | A new empty graph was started. |
validate_run | Validation was run on a graph. |
validate_clean | A validation run found no issues. |
validate_issues | A validation run found at least one issue. |
validate_autofix | Validation auto-fix was applied. |
export_clip_blueprint | A Blueprint graph was exported to the clipboard for UE. |
export_clip_material | A Material graph was exported to the clipboard for UE. |
export_clip_widget | A Widget graph was exported to the clipboard for UE. |
export_clip_other | Another pack’s graph was exported to the clipboard. |
error_export_clip | A clipboard export failed. |
ue_connect_ok | The UE connector reached a running editor (counted on connect, not per poll). |
ue_connect_fail | The connection to a UE editor was lost (counted on the drop, not per poll). |
deploy_ue_ok | A one-click deploy to UE succeeded. |
deploy_ue_fail | A one-click deploy to UE failed. |
ue_ver_5_5 | A connected editor was UE 5.5. |
ue_ver_5_6 | A connected editor was UE 5.6. |
ue_ver_5_7 | A connected editor was UE 5.7. |
ue_ver_other | A connected editor was another UE version. |
library_save | A graph was saved to the library. |
library_update | An existing library entry was updated. |
library_open | A library entry was opened. |
error_library | A library save/update/open failed. |
ai_generate | An AI generation round was run. |
ai_explain | AI explain was run. |
ai_ask | AI ask was run. |
error_ai | An AI request failed. |
mcp_build | An MCP build/add-to-graph call was handled. |
mcp_validate | An MCP validate call was handled. |
mcp_deploy | An MCP deploy/import call was handled. |
mcp_library | An MCP library call (list/search/get/open) was handled. |
mcp_knowledge | An MCP knowledge/spec/search call was handled. |
mcp_board | An MCP teaching-board call (board_*/read_board) was handled. |
mcp_other | Another MCP call was handled. |
limit_library | A Free-tier user hit a library gate (sort/folders/tags/location). |
limit_other | A Free-tier user hit another Pro gate. |
license_activate_ok | A license key was activated successfully. |
license_activate_fail | A license key activation failed. |
limit_slots_blueprint | A blocking per-pack cap bump fired in the Blueprints pack. |
limit_slots_material | A blocking per-pack cap bump fired in the Materials pack. |
limit_slots_widget | A blocking per-pack cap bump fired in the UMG pack. |
limit_slots_other | A blocking per-pack cap bump fired in another pack. |
limit_slots_passive | A background save landed session-only at the cap (passive bump). |
limit_external | A save outside the library folder was refused (external-file bump shown). |
upgrade_click_slots | An upgrade CTA was clicked from a slot-cap bump. |
upgrade_click_day | An upgrade CTA was clicked from the daily-limit bump. |
upgrade_click_lifetime | An upgrade CTA was clicked from the lifetime-limit bump. |
upgrade_click_nudge | An upgrade CTA was clicked from a conversion nudge. |
upgrade_click_other | An upgrade CTA was clicked from another bump context. |
limit_day_hit | The daily new-graph limit bump was shown. |
limit_lifetime_hit | The lifetime AI-build allowance bump was shown. |
lifetime_50 | The 50% lifetime-allowance milestone popup was shown (once per install). |
lifetime_90 | The 90% lifetime-allowance milestone popup was shown (once per install). |
nudge_milestone | The win-milestone nudge was shown (10th deploy or 5th lesson; once per install). |
nudge_session_loss | The close prompt warned that a session-only graph will not be kept. |
nudge_intensity | The heavy-usage-day nudge was shown (once per install). |
ledger_file_questioned | A questioned file was seen in the library folder at startup. |
migrate_ok | The userData rename-migration guard migrated an old "GraphDeck Free" dir successfully. |
migrate_fail | The userData rename-migration guard failed (both dirs left intact; alarm signal). |
session_under_1m | A session lasted under 1 minute. |
session_1_5m | A session lasted 1–5 minutes. |
session_5_30m | A session lasted 5–30 minutes. |
session_30_120m | A session lasted 30 minutes–2 hours. |
session_over_2h | A session lasted over 2 hours. |
return_same_day | Re-opened the same day as the previous launch. |
return_next_day | Re-opened the day after the previous launch. |
return_2_7d | Re-opened 2–7 days after the previous launch. |
return_8_30d | Re-opened 8–30 days after the previous launch. |
return_over_30d | Re-opened more than 30 days after the previous launch. |
77 events. Generated from the app source, so this list cannot drift from what the app actually does.