
Selamat Datang di MotionMind
Kenapa kami membuat skill agent, CLI, dan Studio lokal untuk membuat video dengan AI agent yang sudah Anda pakai, dan cara membuat video pertama Anda.
Experiment, run, parameter, metrik, artefak, dan model registry: bagaimana ide MLflow menjadi cara MotionMind Studio mencatat, membandingkan, dan mem-promote setiap render.

Coba buka folder export tim video mana pun. Hampir pasti ada promo_final.mp4, promo_final_v2.mp4, dan promo_final_FIX_revisi-klien.mp4. Tidak ada yang yakin mana yang sudah disetujui, berapa loudness-nya, atau source mana yang menghasilkannya. Begitu AI agent ikut membuat video, masalah ini datang lebih cepat, karena agent bisa menghasilkan lima variasi dalam satu sore.

Machine learning sudah lebih dulu menghadapi masalah yang sama, dan salah satu jawaban paling populernya adalah MLflow. Di tulisan perkenalan, kami menyebut bahwa MotionMind meminjam ide MLflow, lewat satu tabel pendek. Tulisan ini membongkar tabel itu baris demi baris: konsep apa yang kami pinjam, bentuknya di file dan di Studio, kenapa konsep itu cocok untuk video, dan apa yang sengaja tidak kami ambil.
Semua output terminal di bawah ini berasal dari MotionMind 0.2.0 yang benar-benar dijalankan, bukan ilustrasi.
Kalau Anda belum pernah memakai MLflow, ini ringkasannya. MLflow adalah platform open source untuk mengelola siklus hidup model machine learning. Ada dua bagian yang relevan untuk tulisan ini: Tracking dan Model Registry.
Di MLflow Tracking, setiap kali seseorang melatih model, hasilnya dicatat sebagai sebuah run. Run dikelompokkan dalam experiment, misalnya "prediksi churn". Setiap run menyimpan:
Perintah mlflow ui membuka dashboard untuk melihat semua run, memfilternya, dan membandingkan beberapa run secara berdampingan. Ada juga mlflow.autolog(), yang mencatat run secara otomatis dari library yang didukung tanpa kode tambahan.
Model Registry adalah langkah berikutnya. Dari puluhan run, satu model dipilih untuk dipakai. Setiap versi model di registry diberi penanda, yang di MLflow klasik berupa stage: Staging, Production, atau Archived. Dengan begitu semua orang tahu versi mana yang sedang dipakai dan mana yang sudah pensiun. Versi MLflow yang lebih baru menyarankan alias dan tag sebagai pengganti stage, tapi idenya tetap sama: ada satu penanda yang jelas untuk "versi yang dipakai".

Kenapa kami membuat skill agent, CLI, dan Studio lokal untuk membuat video dengan AI agent yang sudah Anda pakai, dan cara membuat video pertama Anda.
Mulai dengan MotionMind sekarang, rekam setiap iterasi bersama AI agent Anda.
Kalau diperas, filosofinya hanya empat langkah: jangan pernah menimpa percobaan, catat semuanya, ukur hasilnya, lalu pilih secara eksplisit.
Membuat video dengan AI agent ternyata sangat mirip dengan melatih model.
Karena masalahnya sama, solusinya bisa dipinjam.
Berikut padanan setiap konsep MLflow di MotionMind, beserta tempatnya.
| MLflow | MotionMind | Tempatnya |
|---|---|---|
tracking store (mlruns/) | workspace | motionmind.store.json, registry.json |
| experiment | campaign <brand>/<campaign> | projects/<brand>/<campaign>/ |
| run | versi v<N>-<slug> | runs/v<N>-<slug>/ + satu entri di registry.json |
| parameters | params | konsep, hook, CTA, rasio, komposisi, variabel, --param |
| metrics | metrics | hasil ukur ffprobe dan EBU R128, plus --metric |
| artifacts | artifacts | video.mp4, contact sheet, breakdown.md, snapshot src/ |
mlflow.log_* | motionmind log | CLI |
mlflow.autolog() | motionmind track + ui/watch | project yang di-track |
mlflow ui | motionmind ui | 127.0.0.1:4310 |
| stage di model registry | staging → production → archived | motionmind promote |
Bagian-bagian berikutnya membahas setiap baris.
MLflow menyimpan run di folder mlruns/ atau di tracking server. MotionMind menyimpannya di workspace yang dibuat oleh motionmind setup:
my-studio/
├── motionmind.store.json # penanda workspace + daftar project yang di-track
├── registry.json # semua run yang tercatat; hanya CLI yang menulisnya
├── projects/<brand>/<campaign>/
│ ├── TASTE.md PROGRESS.md LOG.md
│ ├── plan/ # konsep, storyboard, design board
│ └── runs/v<N>-<slug>/ # satu folder per versi
│ ├── src/ # project HyperFrames versi ini
│ ├── video.mp4
│ ├── contact-sheet.png
│ └── breakdown.md
└── shared/brands/<brand>/ # logo, font, screenshot
MotionMind mencari workspace dengan urutan ini: variabel lingkungan MOTIONMIND_STORE, lalu folder terdekat (naik dari folder saat ini) yang berisi motionmind.store.json, lalu ~/.motionmind.
Ada dua detail kecil yang penting saat agent dan Anda bekerja di workspace yang sama:
registry.json ditulis dengan lock file dan rename atomik. Dua proses yang menulis bersamaan tidak akan merusak file.LOG.md di setiap campaign hanya bisa ditambah, tidak bisa diubah. Setiap log, render, promote, dan setiap kali QA dipaksa lewat tercatat di sana, lengkap dengan tanggal dan jam.Experiment di MLflow mengelompokkan run yang menjawab pertanyaan yang sama. Di MotionMind, pertanyaannya adalah pesan: campaign motionmind/walkthrough-30s berisi semua upaya untuk menyampaikan satu pesan kepada satu audiens.
Aturannya sederhana:
Campaign juga menyimpan konteks yang di tim ML biasanya hanya ada di kepala orang: TASTE.md (gaya yang dikunci di Gate 2), PROGRESS.md (sampai mana pekerjaannya), dan LOG.md. Agent membaca ketiganya sebelum melanjutkan pekerjaan, jadi sesi chat baru tidak mulai dari nol. Mengelola campaign vs versi memberi contoh kapan memilih yang mana.
Run di MLflow adalah satu percobaan yang tidak pernah diubah setelah selesai. Versi di MotionMind juga begitu: satu folder runs/v<N>-<slug>/ dengan run ID seperti motionmind-walkthrough-30s-v2. Versi yang sudah dirender tidak pernah ditimpa. Arah baru berarti folder v<N+1> baru, dan skill melarang agent mengedit versi lama untuk "revisi kecil".
Ada satu hal yang membuat versi video lebih kuat daripada run ML pada umumnya: versi bisa dibuka lagi. Folder src/ berisi project HyperFrames versi itu (HTML, CSS, dan GSAP), dan versi HyperFrames-nya dikunci (0.8.214 di MotionMind 0.2.0). Source yang sama dirender dengan versi engine yang sama, sehingga hasilnya bisa dibuat ulang berbulan-bulan kemudian. Di dunia ML, padanannya adalah menyimpan kode, environment, dan seed bersama setiap run. Determinisme dalam video AI menjelaskan kenapa hal ini penting.

Params adalah keputusan yang membedakan satu versi dari versi lain. Isinya datang dari tiga sumber:
aspect: 9:16, 16:9, atau 1:1), area aman untuk 9:16 (safe_area), dan untuk project HyperFrames juga versi HyperFrames, nama komposisi, resolusi, durasi, jumlah scene, serta variabel komposisi.concept_name, hook_copy, cta_copy, palette, fonts, bpm, dan color_logic. Studio menampilkannya di panel Registry, termasuk swatch warna untuk palet.--param kunci=nilai.Satu tips praktis: kalau Anda ingin hook muncul di baris "Hook" pada halaman versi dan halaman compare di Studio, pakai nama kunci hook_copy, bukan hook. Kunci lain tetap tercatat di registry.json dan muncul di motionmind compare.
Prinsip terpenting MotionMind: metrik diukur dari file, bukan dilaporkan oleh agent. Sebelum menyalin apa pun ke workspace, motionmind log menjalankan ffprobe dan filter ebur128 milik ffmpeg pada video tersebut.
| Metrik | Artinya |
|---|---|
width, height, fps, frames | resolusi dan jumlah frame |
duration_s, size_mb, bitrate_kbps | durasi, ukuran file, bitrate |
video_codec, audio_codec, has_audio | codec dan ada tidaknya audio |
integrated_lufs | loudness keseluruhan (EBU R128) |
lra_lu | loudness range |
true_peak_dbfs | true peak |
render_ms | lama render, untuk render HyperFrames dari project yang di-track |
Loudness hanya diukur kalau video punya track audio. Anda bisa menambahkan metrik sendiri dengan --metric kunci=angka, misalnya skor review internal. Tapi hasil ukur selalu menang: --metric integrated_lufs=-14 tidak akan menimpa loudness yang terukur, karena angka itulah yang dibaca gate QA.
Ada satu perbedaan dengan MLflow. Di MLflow, satu metrik bisa punya riwayat per step, misalnya loss di setiap epoch. Di MotionMind, setiap versi hanya punya satu nilai per metrik, karena satu versi adalah satu file. Riwayatnya terlihat dari deretan versi.
Setiap versi menyimpan file-file berikut:
video.mp4 beserta hash SHA-256-nya. Hash ini juga dipakai untuk mendeteksi duplikat saat autolog.contact-sheet.png: satu frame per detik, sepuluh frame per baris, masing-masing diberi cap waktu. Ini cara tercepat melihat seluruh video dalam satu gambar.breakdown.md: catatan scene per scene yang ditulis agent.plan/design.html, kalau ada.src/: source yang menghasilkan video itu.
Misalkan ada dua mix untuk video walkthrough MotionMind berdurasi 30 detik: mix pertama yang terlalu keras, dan mix kedua setelah dipasang limiter menuju −14 LUFS. Keduanya dicatat sebagai versi:
motionmind log walkthrough-first-mix.mp4 --campaign motionmind/walkthrough-30s \
--title "Walkthrough — first mix" --param concept_name="Five steps" \
--param hook_copy="From a brief to a tracked video" --param cta_copy="npm i -g motionmind"
motionmind log walkthrough-mix-14lufs.mp4 --campaign motionmind/walkthrough-30s \
--title "Walkthrough — mix at −14 LUFS" --param concept_name="Five steps" \
--param hook_copy="From a brief to a tracked video" --param cta_copy="npm i -g motionmind" \
--notes "Limiter on the music bed, gain matched to −14 LUFS."
Run 'motionmind-walkthrough-30s-v1' (staging) · projects/motionmind/walkthrough-30s/runs/v1-log-1102-1527 · 1280x720 · 30 s · -11.2 LUFS · TP 1.7
QA: -11.2 LUFS (target -14 ±0.5) · true peak 1.7 dBFS (max -1) — promotion to production is blocked until fixed (or forced).
Run 'motionmind-walkthrough-30s-v2' (staging) · projects/motionmind/walkthrough-30s/runs/v2-log-1102-1527 · 1280x720 · 30 s · -14.1 LUFS · TP -2.3
Perhatikan bahwa MotionMind sudah memberi peringatan sejak versi pertama dicatat: v1 terlalu keras (−11,2 LUFS) dan true peak-nya melewati batas (+1,7 dBFS), jadi tidak akan bisa masuk production. motionmind compare menunjukkan perbedaan keduanya, dan setiap baris yang berbeda ditandai ≠:
run_id motionmind-walkthrough-30s-v1 motionmind-walkthrough-30s-v2 ≠
stage staging staging
params.skill_engine mp4 mp4
params.aspect 16:9 16:9
params.engine mp4 mp4
params.concept_name Five steps Five steps
params.hook_copy From a brief to a tracked video From a brief to a tracked video
params.cta_copy npm i -g motionmind npm i -g motionmind
metrics.width 1280 1280
metrics.height 720 720
metrics.fps 30 30
metrics.duration_s 30 30
metrics.size_mb 1.23 1.23
metrics.integrated_lufs -11.2 -14.1 ≠
metrics.true_peak_dbfs 1.7 -2.3 ≠
Kalau seseorang mencoba mem-promote v1, registry menolaknya:
$ motionmind promote motionmind-walkthrough-30s-v1 --stage production
QA failed for 'motionmind-walkthrough-30s-v1': -11.2 LUFS (target -14 ±0.5); true peak 1.7 dBFS (max -1). Fix the mix and re-render, or override (CLI: --force; Studio: the override checkbox).
$ motionmind promote motionmind-walkthrough-30s-v2 --stage production
'motionmind-walkthrough-30s-v2' → production
Semua langkah itu tercatat di LOG.md campaign:
2026-11-02 15:27 · log v1-log-1102-1527 · motionmind-walkthrough-30s-v1 (staging) · 1280x720 30 s · -11.2 LUFS
2026-11-02 15:28 · log v2-log-1102-1527 · motionmind-walkthrough-30s-v2 (staging) · 1280x720 30 s · -14.1 LUFS
2026-11-02 15:28 · promote v2-log-1102-1527 · motionmind-walkthrough-30s-v2 → production
Begini bentuk entri v2 di registry.json (dipotong):
{
"run_id": "motionmind-walkthrough-30s-v2",
"project": "motionmind/walkthrough-30s",
"version": "v2-log-1102-1527",
"stage": "production",
"created_at": "2026-11-02 15:28",
"title": "Walkthrough — mix at −14 LUFS",
"params": {
"aspect": "16:9",
"concept_name": "Five steps",
"hook_copy": "From a brief to a tracked video",
"cta_copy": "npm i -g motionmind"
},
"artifacts": {
"mp4": "projects/motionmind/walkthrough-30s/runs/v2-log-1102-1527/video.mp4",
"contact_sheet": "projects/motionmind/walkthrough-30s/runs/v2-log-1102-1527/contact-sheet.png"
},
"metrics": {
"width": 1280, "height": 720, "fps": 30, "frames": 900, "duration_s": 30, "size_mb": 1.23,
"has_audio": true, "integrated_lufs": -14.1, "lra_lu": 2.1, "true_peak_dbfs": -2.3
},
"hashes": { "mp4_sha256": "40c166f7a068c90a…" },
"source": { "kind": "file", "file": "/tmp/exports/walkthrough-mix-14lufs.mp4" },
"notes": "Limiter on the music bed, gain matched to −14 LUFS."
}
Ini file JSON biasa. Anda bisa membacanya dengan jq, memasukkannya ke spreadsheet, atau memprosesnya dengan skrip sendiri.
mlflow ui untuk renderMembaca registry.json di terminal memang bisa, tapi keputusan kreatif dibuat dengan menonton. Karena itu motionmind ui membuka Studio di http://127.0.0.1:4310. Studio hanya mendengarkan di komputer Anda sendiri dan tidak mengirim apa pun ke cloud.
All runs. Halaman utama menampilkan semua versi sebagai galeri, dengan ringkasan di atasnya: jumlah video, jumlah yang sudah production, video yang belum dicatat, dan jumlah campaign. Anda bisa memfilter galeri per campaign atau per status (Production, Staging, Archived, Not logged). Thumbnail video mulai diputar saat kursor diarahkan ke atasnya. Urutannya tetap: production lebih dulu, lalu staging, lalu yang belum dicatat, lalu archived, dan yang terbaru di atas dalam setiap kelompok.

Halaman versi. Ini padanan halaman run di MLflow, lengkap dengan player, overlay safe area 4:5 untuk video 9:16, penanda QA ✓/✗, dan panel Registry yang berisi run ID, engine, resolusi, ukuran, loudness, konsep, hook, CTA, safe area, palet, sumber, waktu dicatat, dan SHA-256. Di bawahnya ada panel Stage (lengkap dengan alasan kalau QA gagal), contact sheet, breakdown.md, design board, dan daftar file versi itu.

Untuk video 9:16, tombol di bawah player menyalakan overlay safe area 4:5 (y 285–1635), supaya terlihat apakah judul atau CTA tertutup antarmuka aplikasi di ponsel:

Compare. Pilih dua versi, lalu keduanya diputar berdampingan dan tetap sinkron: video kiri menjadi patokan waktu, dan video kanan dikoreksi setiap kali selisihnya lebih dari 1/30 detik. Di bawahnya ada tabel 14 baris (stage, engine, resolusi, FPS, durasi, LUFS, true peak, ukuran, konsep, hook, CTA, palet, variabel, sumber), dan baris yang berbeda disorot amber. Di MLflow Anda membandingkan kurva loss. Di sini Anda menonton keduanya berdampingan sambil melihat angkanya.

Campaign. Halaman campaign menampilkan PROGRESS.md, 12 baris terakhir LOG.md, TASTE.md, dan semua versinya, jadi Anda bisa melihat ceritanya dari versi pertama sampai sekarang.

Studio membaca workspace setiap kali halaman dimuat. Tidak ada database tersembunyi dan tidak ada cache yang bisa basi. Kalau agent baru saja mencatat versi, cukup muat ulang halamannya.
Bagian inilah yang paling berpengaruh dalam keseharian. Setiap versi selalu berada di salah satu dari tiga stage:
staging: stage default. Semua versi baru masuk ke sini dan bisa direview.production: versi yang dipakai, misalnya yang diunggah ke Instagram atau dikirim ke klien.archived: versi yang sudah pensiun. Versi ini tidak dihapus, hanya disingkirkan dari daftar utama.
MotionMind menambahkan tiga aturan yang tidak ada di MLflow standar.
1. Production harus lolos QA. Untuk video yang punya audio, production mensyaratkan integrated loudness −14 LUFS ±0,5 dan true peak paling tinggi −1 dBFS, diukur dari file. Video tanpa audio lolos, karena hening adalah pilihan yang disengaja. Anda bisa memaksa promote dengan --force di CLI atau checkbox di Studio, tapi pemaksaan itu dicatat di LOG.md bersama masalah QA yang dilewati. Skill melarang agent memakai --force kecuali Anda yang memintanya. Standar loudness −14 LUFS menjelaskan dari mana angka ini datang.

2. Satu production per rasio per campaign. Saat versi baru di-promote ke production, versi production sebelumnya dengan rasio yang sama otomatis pindah ke archived. Versi 9:16 dan 16:9 dari campaign yang sama boleh sama-sama berada di production, karena keduanya untuk tempat yang berbeda.
3. Production tidak boleh diam-diam rusak. Kalau versi production dirender ulang dan hasil barunya gagal QA, versi itu turun kembali ke staging, dan penurunannya tercatat di log.
Apa yang terjadi kalau klien berubah pikiran? Promote versi lama yang sudah diarsipkan kembali ke production (tetap dengan syarat lolos QA). Versi itu kembali dipakai, versi yang sekarang pindah ke arsip, dan semuanya tercatat. Tidak ada tombol "rollback" khusus, karena promote sudah cukup untuk itu.
motionmind trackmlflow.autolog() ada karena orang lupa mencatat. Hal yang sama terjadi pada editor video. Kalau Anda bekerja di HyperFrames Studio, Premiere, CapCut, atau aplikasi lain yang mengekspor MP4, cukup arahkan MotionMind ke folder project atau folder export-nya:
motionmind track ~/Movies/HyperFrames/my-video --campaign acme/launch-15s # HyperFrames: memantau renders/
motionmind track ~/Exports/premiere --campaign acme/launch-15s-cut # editor lain: memantau file .mp4 baru
Selama motionmind ui atau motionmind watch berjalan, MotionMind memeriksa folder itu setiap dua detik. Setiap render baru dicatat sebagai versi staging, lengkap dengan hasil ukurnya. Render HyperFrames baru diambil setelah file .meta.json-nya menyatakan render selesai, sekaligus memberi metrik render_ms. File dari editor lain baru diambil setelah tiga detik tidak berubah, supaya file yang masih ditulis tidak tercatat setengah jadi. File yang isinya sama persis dengan versi yang sudah ada (dicek lewat hash) dilewati. Panduan lengkapnya ada di tracking render dari aplikasi lain.

Di tim ML, MLflow hanya berguna kalau orang benar-benar mencatat run mereka. Di MotionMind, yang mencatat adalah agent, dan skill membuatnya disiplin:
motionmind log.staging dan baru menjalankan promote --stage production setelah Anda setuju di Gate 4..editing.json yang memberi tahu agent untuk tidak menyentuh file itu.Hasilnya, registry Anda tetap rapi meskipun ada puluhan versi dari beberapa sesi chat yang berbeda. Alur lengkapnya ada di alur kerja empat gate.

MLflow adalah platform besar, sementara MotionMind sengaja dibuat kecil. Supaya ekspektasinya jelas, ini yang tidak ada di MotionMind 0.2.0:
--param atau --notes untuk label bebas.source (dari mana file itu berasal), snapshot src/, dan LOG.md.127.0.0.1.Kalau salah satu hal di atas penting untuk alur kerja Anda, ceritakan di GitHub Issues.
Anda butuh Node.js 22 atau lebih baru, serta ffmpeg dan ffprobe di PATH.
npm i -g motionmind
motionmind setup my-studio
cd my-studio
motionmind ui
Lalu, di terminal kedua pada folder yang sama, catat video apa pun yang sudah Anda punya:
motionmind log ~/Downloads/video-saya.mp4 --campaign coba/pertama --param hook_copy="Hook pertama"
motionmind list
Muat ulang Studio, dan video Anda sudah ada di sana, lengkap dengan hasil ukurnya. Kalau loudness-nya meleset dari −14 LUFS, Anda juga akan langsung tahu.
MLflow mengajarkan para data scientist untuk berhenti menimpa eksperimen. MotionMind mencoba mengajarkan hal yang sama kepada agent yang membuat video Anda: setiap render adalah percobaan, setiap percobaan dicatat, dan versi yang dipakai selalu dipilih secara sadar, oleh Anda.