Every field we keep
This is the full list of what the Mortiflix reports server accepts, made straight from its code. Anything not listed here is dropped when it arrives.
Everything here is off until the person turns it on, separately for crash reports, usage data and each shared project. The server drops any field not listed here, scrubs every text field again (user folders become ~, emails <email>, long hex/base64 runs <removed>, URL query strings are cut; a text field holding something shaped like a key is not stored at all), and never stores IP addresses.
Built-in preset names: Explainer video. Export presets: YouTube, Social vertical, Master, Audio stems. Any other preset name becomes own.
POST /v1/installs and PATCH /v1/installs/me: opt-in, consents and versions
| Field | Type | What it is |
|---|---|---|
schema | whole number 1 to 1 | Schema version (1) |
app_version | code, up to 32 characters | App version, e.g. 0.9.2 |
build | code, up to 64 characters | Build ID baked into official builds (tells official from Self-built) |
os | one of: windows, mac, linux | Operating system |
os_version | code, up to 32 characters | OS version, e.g. 11 or 14.5 |
arch | one of: x64, arm64, other | CPU architecture |
ram_gb | whole number 0 to 4096 | RAM in GB, stored as a bucket (4, 8, 16, 32, 64, 128) |
gpu_vendor | one of: nvidia, amd, intel, apple, other, none | Graphics card maker |
consents | group of fields | What the person turned on |
consents.crashes | true / false | Crash reports turned on |
consents.usage | true / false | Usage data turned on |
POST /v1/crashes: one crash report
| Field | Type | What it is |
|---|---|---|
schema | whole number 1 to 1 | Schema version (1) |
report | code, up to 16 characters | Report ID made on the PC (e.g. R-7K3M-Q2), so a person can quote it |
kind | one of: app_crash, app_abort, app_error, service_crash, render_failed, setup_failed, install_failed | What happened |
part | one of: app, service, render, setup, claude | Which part crashed (app, service, render, setup); worked out from kind when missing |
count | whole number 1 to 10000 | Times it happened (repeats within 24 hours fold into one report) |
caught | true / false | true when the app caught it and kept running |
when | date-time, rounded to the minute | When it happened (UTC, to the minute) |
app | group of fields | The app build |
app.version | code, up to 32 characters | App version, e.g. 0.9.2 |
app.commit | code, up to 40 characters | Git commit the build was made from |
app.build | code, up to 64 characters | Build ID baked into official builds (tells official from Self-built) |
app.editor | code, up to 32 characters | Editor base version |
app.service | code, up to 32 characters | Mortiflix service version |
app.protocol | whole number 0 to 100000 | Service protocol number |
app.channel | one of: stable, beta, dev | Build channel |
system | group of fields | The computer (no names, no serial numbers) |
system.os | one of: windows, mac, linux | Operating system |
system.os_version | code, up to 32 characters | OS version, e.g. 11 or 14.5 |
system.arch | one of: x64, arm64, other | CPU architecture |
system.cores | whole number 1 to 1024 | CPU core count |
system.ram_gb | whole number 0 to 4096 | RAM in GB, stored as a bucket (4, 8, 16, 32, 64, 128) |
system.gpu_vendor | one of: nvidia, amd, intel, apple, other, none | Graphics card maker |
system.gpu_driver | code, up to 32 characters | Graphics driver version |
doing | group of fields | What the person was doing (ids and counts only) |
doing.stage | stage 0-6 | Stage open at the crash (1 Script ... 6 Render) |
doing.panel | code, up to 32 characters | Panel open (its id) |
doing.commands | list, up to 10 | Last 10 command ids (never their arguments) |
doing.commands[] | code, up to 48 characters | Command id |
doing.shots | whole number 0 to 100000 | Number of shots in the project |
doing.length_s | whole number 0 to 1000000 | Project length in seconds |
error_name | code, up to 64 characters | Error type name (Node services) |
error | text, scrubbed, up to 1000 characters | The error message, scrubbed |
at | text, scrubbed, up to 200 characters | Where it panicked (file:line in our code) |
thread | text, scrubbed, up to 64 characters | Thread name |
stack | list, up to 64 | Stack frames, top first |
stack[].function | text, scrubbed, up to 200 characters | Function name |
stack[].file | text, scrubbed, up to 200 characters | Source file (only for frames in our own code; repo-relative) |
stack[].line | whole number 0 to 10000000 | Line number (shown, never used for grouping) |
stack[].ours | true / false | true when the frame is in Mortiflix code |
log | list, up to 450 | A log excerpt the person attached to this one report (kept 30 days) |
log[] | text, scrubbed, up to 300 characters | One log line, scrubbed |
render | group of fields | Render failures only |
render.tool | one of: remotion, blender, ffmpeg, other | Render tool |
render.tool_version | code, up to 32 characters | Render tool version |
render.format | code, up to 12 characters | Container format |
render.codec | code, up to 24 characters | Codec |
render.size | code, up to 11 characters | Frame size, e.g. 1920x1080 |
render.fps | whole number 1 to 1000 | Frames per second |
render.length_s | whole number 0 to 1000000 | Video length in seconds |
render.exit_code | whole number -100000 to 100000 | Tool exit code |
render.signal | code, up to 12 characters | Signal that ended the tool |
setup | group of fields | Setup and install failures only |
setup.component | code, up to 48 characters | Component id |
setup.step | code, up to 48 characters | Setup step id |
setup.exit_code | whole number -100000 to 100000 | Exit code |
service | group of fields | Service crashes only |
service.exit_code | whole number -100000 to 100000 | Service exit code |
service.signal | code, up to 12 characters | Signal |
service.restarts | whole number 0 to 100000 | Restarts in the last 10 minutes |
note | text, scrubbed, up to 2000 characters | The person's own note, only if they typed one (shown as plain text) |
POST /v1/errors: a batch of non-crash error counts
| Field | Type | What it is |
|---|---|---|
schema | whole number 1 to 1 | Schema version (1) |
app_version | code, up to 32 characters | App version for the whole batch (else the install's) |
build | code, up to 64 characters | Build ID baked into official builds (tells official from Self-built) |
errors | list, up to 200 | Up to 200 error counts |
errors[].kind | one of: claude_session, render_failed, setup_failed, install_failed, service_restart, app_error, other | What went wrong |
errors[].cause | code, up to 64 characters | Cause code, e.g. login_expired, rate_limited, exit_1 |
errors[].signature | code, up to 64 characters | The app's own group id |
errors[].title | text, scrubbed, up to 1000 characters | First error line, scrubbed |
errors[].tool | one of: remotion, blender, ffmpeg, claude, other | Tool involved |
errors[].exit_code | whole number -100000 to 100000 | Exit code |
errors[].stage | stage 0-6 | Stage open |
errors[].count | whole number 1 to 1000000 | How many times |
errors[].first_at | date-time, rounded to the minute | First time it happened in this batch |
errors[].stack | list, up to 64 | Stack frames, only if Part A sent them |
errors[].stack[].function | text, scrubbed, up to 200 characters | Function name |
errors[].stack[].file | text, scrubbed, up to 200 characters | Source file (only for frames in our own code; repo-relative) |
errors[].stack[].line | whole number 0 to 10000000 | Line number (shown, never used for grouping) |
errors[].stack[].ours | true / false | true when the frame is in Mortiflix code |
POST /v1/events: a batch of usage events
| Field | Type | What it is |
|---|---|---|
schema | whole number 1 to 1 | Schema version (1) |
events | list, up to 200 | Up to 200 events |
events[].v | whole number 1 to 1 | Event schema version (1) |
events[].id | code, up to 64 characters | Random per item, so duplicates are dropped |
events[].session | code, up to 32 characters | Random per app start |
events[].t | date-time, rounded to the minute | When (UTC, to the minute) |
events[].app | code, up to 32 characters | App version, e.g. 0.9.2 |
events[].proj | code, up to 34 characters | Random per-project ID (never the project name) |
events[].e | event name | Event name, from the fixed list below |
events[].d | fields of that event | The event's fields, from the fixed list below (no free text anywhere) |
POST /v1/projects: one successful-project summary (a project that reached Rendered)
| Field | Type | What it is |
|---|---|---|
schema | whole number 1 to 1 | Schema version (1) |
proj | code, up to 34 characters | Random per-project ID (never the project name) |
app_version | code, up to 32 characters | App version, e.g. 0.9.2 |
preset | built-in name (Explainer video) or own | Preset: a built-in name, or "own" for people's own presets |
based_on | built-in name (Explainer video) or own | The built-in preset an own preset was based on |
shape | one of: 16:9, 9:16, 1:1, 4:5, custom | Video shape |
stages_run | list, up to 6 | Stages run |
stages_run[] | whole number 1 to 6 | Stage number |
minutes | group of fields | Minutes per stage |
minutes.1 | whole number 0 to 100000 | Minutes in stage 1 |
minutes.2 | whole number 0 to 100000 | Minutes in stage 2 |
minutes.3 | whole number 0 to 100000 | Minutes in stage 3 |
minutes.4 | whole number 0 to 100000 | Minutes in stage 4 |
minutes.5 | whole number 0 to 100000 | Minutes in stage 5 |
minutes.6 | whole number 0 to 100000 | Minutes in stage 6 |
video_length_s | whole number 0 to 86400 | Video length in seconds |
export_preset | built-in name (YouTube, Social vertical, Master, Audio stems) or own | Export preset (built-in name, or "own") |
regenerate_count | whole number 0 to 100000 | Regenerate clicks |
handover | one of: get, edit | The ending: Get the video or Edit the video |
POST /v1/shares: a project the person ticked "Share this with Mortiflix" for
| Field | Type | What it is |
|---|---|---|
schema | whole number 1 to 1 | Schema version (1) |
proj | code, up to 34 characters | Random per-project ID (never the project name) |
preset | built-in name (Explainer video) or own | Preset (built-in name or "own") |
length_s | whole number 0 to 86400 | Video length in seconds |
uses | list, up to 2 | What the team may do with it |
uses[] | one of: learn, show | learn = the team may learn from it; show = may show it |
note | text, scrubbed, up to 2000 characters | The person's note (shown as plain text) |
files | list, up to 2 | The files that will be uploaded (video and/or project file) |
files[].part | one of: video, project | Which file |
files[].bytes | whole number 1 to 524288000 | File size in bytes |
Usage events (the e and d fields of POST /v1/events)
Fields are numbers, true/false, or values from a fixed list. No field takes typed text.
app.start: App opened
| Field | Type | What it is |
|---|---|---|
features | list, up to 4 | Features built in |
features[] | one of: whisper, neural-voices | Built-in feature |
screen | one of: <1440, 1440-1919, 1920-2559, 2560+ | Screen width bucket |
app.quit: App closed
| Field | Type | What it is |
|---|---|---|
minutes | whole number 0 to 1000000 | Minutes open |
stage | stage 0-6 | Stage open (0 = none) |
ai_busy | true / false | AI still working |
needs_you | whole number 0 to 1000000 | Things waiting for the person |
setup.step: A Setup step ended
| Field | Type | What it is |
|---|---|---|
step | one of: claude, keys, tools, sharing | Setup step |
result | one of: done, skipped, failed | Result |
keys | group of fields | Keys step: yes/no per service |
keys.elevenlabs | true / false | Has a elevenlabs key (yes/no only, never the key) |
keys.gemini | true / false | Has a gemini key (yes/no only, never the key) |
keys.upload_post | true / false | Has a upload_post key (yes/no only, never the key) |
keys.postiz | true / false | Has a postiz key (yes/no only, never the key) |
keys.anthropic | true / false | Has a anthropic key (yes/no only, never the key) |
newproject.closed: New project window closed without Create
| Field | Type | What it is |
|---|---|---|
had_idea | true / false | An idea was typed (true/false only) |
project.new: Create pressed
| Field | Type | What it is |
|---|---|---|
preset | built-in name (Explainer video) or own | Preset (built-in name or "own") |
based_on | built-in name (Explainer video) or own | Built-in the own preset was based on |
shape | one of: 16:9, 9:16, 1:1, 4:5, custom | Shape |
length | code, up to 12 characters | Length bucket, e.g. 1-2 |
assets | whole number 0 to 1000000 | Assets attached |
music | one of: preset, theme, none | Music source |
idea_words | one of: 0, 1-20, 21-100, 100+ | Idea length bucket (never the words) |
preset.saved: Own preset saved (never its name)
| Field | Type | What it is |
|---|---|---|
based_on | built-in name (Explainer video) or own | Built-in it was based on |
pages_changed | list, up to 8 | Pages changed |
pages_changed[] | whole number 1 to 8 | Page number |
stage.enter: A stage opened
| Field | Type | What it is |
|---|---|---|
stage | stage 0-6 | Stage |
from | stage 0-6 | Coming from |
how | one of: next, back, stage_bar, menu | How |
stage.done: Leaving a stage forward
| Field | Type | What it is |
|---|---|---|
stage | stage 0-6 | Stage |
your_min | whole number 0 to 1000000 | Active minutes |
wait_min | whole number 0 to 1000000 | Minutes waiting for the AI |
ok | whole number 0 to 1000000 | OK presses |
fix | whole number 0 to 1000000 | Fix presses |
cut | whole number 0 to 1000000 | Cut it presses |
versions | whole number 0 to 1000000 | Versions made |
failed | whole number 0 to 1000000 | Failed items |
questions_answered | whole number 0 to 1000000 | Questions answered |
questions_default | whole number 0 to 1000000 | Questions left on default |
chat_msgs | whole number 0 to 1000000 | Chat messages sent (count only) |
stage.back: Went back to an earlier stage
| Field | Type | What it is |
|---|---|---|
to | stage 0-6 | Went back to |
remade | whole number 0 to 1000000 | Items remade |
handover: The ending of stage 4
| Field | Type | What it is |
|---|---|---|
how | one of: get, edit | Get the video / Edit the video |
feature.used: First use per session of a listed feature
| Field | Type | What it is |
|---|---|---|
f | one of: node_maximise, node_moved, node_inspector_versions, use_this_version, click_regenerate, chat_message, chat_button, talking_about_bar, assets_attached, asset_replaced, music_theme_page, three_themes_from_chat, own_voice_booth, mini_daw, loose_preview_play, loop, preset_creator, preset_edit, export_advanced, post_opened, render_another_format, make_version_2, what_we_send | Feature id from the allowlist |
edits.summary: Leaving 5 Edit: counts per command group
| Field | Type | What it is |
|---|---|---|
trim | whole number 0 to 1000000 | trim edits |
split | whole number 0 to 1000000 | split edits |
move | whole number 0 to 1000000 | move edits |
ripple | whole number 0 to 1000000 | ripple edits |
colour | whole number 0 to 1000000 | colour edits |
text | whole number 0 to 1000000 | text edits |
volume | whole number 0 to 1000000 | volume edits |
transition | whole number 0 to 1000000 | transition edits |
effect | whole number 0 to 1000000 | effect edits |
undo | whole number 0 to 1000000 | undo edits |
render.start: Render pressed
| Field | Type | What it is |
|---|---|---|
preset | built-in name (YouTube, Social vertical, Master, Audio stems) or own | Export preset |
size | one of: 720p, 1080p, 4K | Size |
advanced_changed | true / false | Advanced settings changed |
render.done: Render ended
| Field | Type | What it is |
|---|---|---|
ok | true / false | Finished without error |
minutes | whole number 0 to 1000000 | Minutes |
code | code, up to 48 characters | Error code only, never the message |
stopped | true / false | Stopped by the person |
export.done: Delivered
| Field | Type | What it is |
|---|---|---|
preset | built-in name (YouTube, Social vertical, Master, Audio stems) or own | Export preset |
timeline_rev | true / false | Timeline changed since last render |
post.done: Posted (never account names, titles or descriptions)
| Field | Type | What it is |
|---|---|---|
platforms | list, up to 10 | Platforms |
platforms[] | one of: youtube, tiktok, instagram, linkedin, x, facebook, other | Platform |
scheduled | true / false | Scheduled |
project.reopen: A project opened again
| Field | Type | What it is |
|---|---|---|
days | whole number 0 to 1000000 | Days since last open |
stage | stage 0-6 | Stage |
project.kept: 30 days after export
| Field | Type | What it is |
|---|---|---|
exists | true / false | Project still exists |
file_exists | true / false | Exported file still exists |
share.done: Shared a project
| Field | Type | What it is |
|---|---|---|
uses | list, up to 2 | Uses ticked |
uses[] | one of: learn, show | Use |
share.taken_back: Took a share back
| Field | Type | What it is |
|---|---|---|
uses | list, up to 2 | Uses |
uses[] | one of: learn, show | Use |
Stored by the server itself
| Field | What it is |
|---|---|
| install ID | Random UUID made at opt-in; resettable from the app |
| key hash | HMAC-SHA-256 of the install's key (the key itself is never stored) |
| received time | When the server got it |
| last seen | When the install last sent anything (an install silent for 12 months is deleted) |