Skip to content

Obsidian workspace ​

the Obsidian sync loop: on-disk project state -> the sync command -> dashboards plus per-project notes in the vault

Diagram source (live Mermaid)

videoclaw ships first-class Obsidian support so you can run the production portfolio from a knowledge-base UI rather than from terminal output. The repo writes a vault of machine-generated notes that mirror the canonical project state — dashboards, queues, metrics, health, timelines, dependencies, and per-project notes — all regenerated from a single command.

Obsidian is a view, not the source of truth. The repo state on disk (projects/<slug>/, artifacts/, checkpoints/, events/) is canonical. The Obsidian vault is a regenerable rendering of that state.


What this gives you ​

  • A control plane that isn't a terminal. Browse the active queue, blockers, owners, dependencies, and review-state ladder from a normal Obsidian sidebar.
  • Linkable, navigable history. Every project gets its own note with frontmatter, artifact references, and bidirectional backlinks into dashboard notes.
  • Honest health visibility. Dashboards count missing approvals, stale reviews, blocked work, and due risk — backed by the same doctor-portfolio and metrics machinery that drives reporting.
  • Zero lock-in. Notes are plain markdown files that live wherever you point --output-dir. You can delete the vault any time and regenerate from canonical state with one command.

Vault layout ​

Obsidian vault layout — root folder ops/obsidian containing 14 dashboard notes plus a Projects subfolder with one markdown note per project slug

text
ops/obsidian/                 # vault root (path is your choice via --output-dir)
├── Dashboard.md              # top-of-vault summary; start here
├── Active.md                 # projects currently in flight
├── Needs Review.md           # awaiting director-mode storyboard approval
├── Blocked.md                # explicitly blocked-by something or someone
├── Complete.md               # published / shipped / archived
├── Metrics.md                # counts, rates, score averages, byReviewState
├── Health.md                 # doctor-portfolio rollup
├── Next Actions.md           # urgency-ordered action queue
├── Dependencies.md           # blocker graph
├── Timeline.md               # event timeline across the portfolio
├── Trends.md                 # per-snapshot trend table
├── History.md                # snapshot list
├── Changes.md                # snapshot diff narrative
├── Owner Workload.md         # owner-by-owner project load
├── Templates/                # scaffolded once; not regenerated with project data
│   └── Project Template.md
├── Views/                    # scaffolded once; not regenerated with project data
│   ├── Operations Runbook.md
│   └── Board Guide.md
└── Projects/                 # one note per project
    ├── <slug>.md
    ├── <slug>.md
    └── <slug>.md

Every dashboard note below the vault root is regenerated from canonical state on each sync-obsidian run, so the vault is safe to delete and rebuild. The Templates/ and Views/ seed notes are scaffolded once (by scaffold-obsidian-vault, which sync-obsidian also runs first) and not overwritten with project data.


Setup ​

One-time scaffold ​

bash
vclaw video scaffold-obsidian-vault --output-dir ./ops/obsidian

This creates the vault root with a placeholder Dashboard.md, the Projects/ folder, and the Templates/ (Project Template.md) and Views/ (Operations Runbook.md, Board Guide.md) seed notes. The other 13 dashboard notes are not created here — they are written by sync-obsidian. You can open the folder as an Obsidian vault immediately.

Single-project export ​

bash
vclaw video export-obsidian \
  --project my-project \
  --output-dir ./ops/obsidian/Projects

Writes one project note for my-project and nothing else. Useful for incremental updates between full syncs.

Full sync (the common case) ​

bash
vclaw video sync-obsidian --root . --output-dir ./ops/obsidian

Regenerates every dashboard note plus a project note for every project under --root. Idempotent — running it twice produces the same vault. This is what you call after a meaningful CLI change.

The --mode flag (storyboard or director) filters the vault to one production mode if you maintain separate vaults per mode.


The 14 dashboard notes ​

NoteWhat it showsWhen to check
Dashboard.mdPortfolio summary: total projects, current state breakdown, top metrics, links to other notes.First thing every morning.
Active.mdEvery project currently in flight (pre-publish, not blocked).Whenever you want a "what's actually moving" view.
Needs Review.mdProjects in awaiting-approval (director-mode storyboard awaiting your sign-off). Includes link to each storyboard.md review file and review freshness.Before approving any director-mode execution.
Blocked.mdProjects with explicit blockedBy or blockedReason set on the manifest.When triaging — what's stuck and why.
Complete.mdPublished, shipped, or archived projects.Retrospectives; reuse-as-template candidates.
Metrics.mdCounts, rates, score averages, byReviewState breakdown (missing / current / stale).Weekly portfolio review.
Health.mddoctor-portfolio rollup: missing artifacts, stale reviews while approval is pending, broken stage states, count of projects in each failure mode.Whenever Metrics looks off, or before a release.
Next Actions.mdUrgency-ordered action queue. For director-mode awaiting-approval projects, links directly to the active storyboard.md review and shows review freshness.Daily triage — what to do next.
Dependencies.mdBlocker graph across the portfolio (who is blocked by whom).When unblocking work or planning a freeze.
Timeline.mdEvent timeline across the portfolio, drawn from events/events.jsonl per project.Investigating "what happened when?".
Trends.mdPer-snapshot trend table (totals, completion rate, average score, blocked / needs-review counts, platforms, legacy-import drift across persisted report-snapshots).Tracking portfolio movement over time.
History.mdSnapshot list: every persisted report-snapshot with its headline counts and file path.Finding a baseline to diff against.
Changes.mdSnapshot diff narrative: what's new since the last report-snapshot. Surfaces review-state transitions (missing → current, current → stale).Before standups; before publishing reports.
Owner Workload.mdOwner-by-owner project load with priorities and due risk.Resourcing conversations.

Project notes ​

Each project under --root gets its own note at Projects/<slug>.md. Project notes carry frontmatter that Obsidian treats as queryable properties.

Frontmatter schema ​

exportProjectToObsidian (src/video/obsidian-export.ts) emits snake_case YAML keys (with a few camelCase reference-sheet keys). The fields actually written to each Projects/<slug>.md are:

FieldSourcePurpose
titleproject.jsonNote title (the slug)
slugproject.jsonStable project identifier
production_modeproject.jsonProduction mode (storyboard / director)
target_runtime_secondsbriefFinal video length target
clip_duration_secondsbriefPer-clip duration
genrebrief (director-mode)Selected genre
platformbriefTarget platform
style / color_gradingbriefCreative direction
legacy_import_*derivedLegacy-import diagnostics (manifest_present, queue_file_present, queue_status_mismatch, nested_output_root_detected)
ops_statusderivedLifecycle state (active, needs-review, blocked, complete, ...)
scorescorecardComposite quality/health score
score_bandscorecardScore bucket (e.g. green / amber / red)
ownerset-metaResponsible person
priorityset-metalow / medium / high / critical
due_dateset-metaISO date the project is due
due_riskderivednone / at-risk / overdue
blocked_reasonset-metaFree-form blocker description
execution_profile_aspect_ratio / _quality / _resolution / _audio / _outputsmanifestExecution profile, split into one key per field
tagsset-metaFree-form tags for grouping
blocked_byset-metaSlugs of blocking projects
next_stagederivedNext canonical stage (or null when complete)
storyboard_review_statederivedmissing / current / stale (the review-state ladder)
storyboard_review_exists / _path / _generated_at / _stalederivedActive storyboard.md existence, path, regenerated-at, and staleness
review_report_verdict / review_publish_readyreview reportReview verdict and publish-ready truth
referenceSheetCount / referenceSheetTypes / referenceSheetCollisionsreference-sheet storeSheet count, comma-joined types, and whether any per-scene role collides
sceneSelectionCoverage / sceneCandidatesTotalscene-selection storewithSelection/sceneCount coverage string and total candidate count
completed_stages / pending_stages / artifact_filesderivedStage and artifact lists
characters / character_bindings / prompt_guidancecharacter store / statusCharacter names, bindings (name:gb:refs), and prompt-guidance names

characterProfiles and characterHydrationSummary are not in the per-project frontmatter — those live only in the Dashboard table source. When a scene-candidates artifact exists, the export also writes per-scene notes under Projects/<slug>/Scenes/<i>.md.

These fields are queryable in Obsidian via the Dataview plugin if you want to roll your own ad-hoc views.

Note body ​

Below the frontmatter, each project note contains:

  • Stage status — current checkpoint and next action
  • Character bindings — referenced scene characters with stored Go Bananas IDs and reference assets
  • Storyboard review — link to storyboard.md plus review-state and freshness
  • Recent events — tail of events/events.jsonl
  • Artifact links — direct paths into the canonical JSON contracts
  • Cost estimate — if computed, the approval-gate cost and wall-time estimate

The daily loop ​

Daily loop — five-step circular workflow: make changes via vclaw, sync vault, read Dashboard, triage queue, update metadata, then back to making changes

A typical day running a multi-project portfolio:

  1. Make changes — use the CLI to advance work: brief, storyboard, produce, review, publish, set-meta, approve, etc.
  2. Sync the vault — vclaw video sync-obsidian regenerates every dashboard note plus all project notes from canonical state.
  3. Read the Dashboard — open Dashboard.md, then drill into Active.md, Health.md, and Needs Review.md for the high-signal views.
  4. Triage the queue — open Next Actions.md to see the urgency-ordered action queue. Director-mode approvals link straight to the active storyboard.md.
  5. Update metadata — change owners, priorities, due dates, blockers, or approval state via the CLI (set-meta, approve). Repeat from step 2.

The loop is intentionally one-directional: you never edit notes by hand and expect them to flow back to canonical state. The CLI is the only writer.


Common workflows ​

"What needs my approval today?" ​

  1. vclaw video sync-obsidian
  2. Open Needs Review.md
  3. Click into each project; expand the linked storyboard.md
  4. Run vclaw video produce --project <slug> --mode director --approve for the ones you sign off on
  5. Re-sync

"What's blocked and on whom?" ​

  1. Open Blocked.md for the explicit blockers
  2. Cross-reference with Dependencies.md for the blocker graph
  3. Use set-meta --blocked-by <slug> --blocked-reason "<text>" to update state from the CLI

"Who is overloaded?" ​

  1. Open Owner Workload.md for the owner-by-owner picture
  2. Sort by priority/due risk
  3. Reassign via set-meta --owner <name>

"What changed since yesterday?" ​

  1. Run vclaw video report-snapshot once a day to persist a baseline
  2. Open Changes.md for the diff narrative — this surfaces review-state transitions and snapshot deltas
  3. Use report-diff --from <snapshot-path> --to <snapshot-path> for explicit point-to-point comparison

"Is the portfolio healthy?" ​

  1. Open Health.md for the doctor-portfolio rollup
  2. Cross-reference Metrics.md for byReviewState and approval-queue depth
  3. Use vclaw video doctor-project --project <slug> to dive into a specific project

Maintenance loop ​

Recommended local rhythm:

bash
vclaw video metrics                          # quick sanity check
vclaw video next-actions                     # what's urgent
vclaw video doctor-portfolio                 # health rollup
vclaw video report-snapshot                  # persist baseline for diffs
vclaw video sync-obsidian                    # regenerate the vault

Run after meaningful CLI changes. The packaged pre-flight is the safer alternative if you want to catch regressions before syncing:

bash
npm run check:release-readiness-lite

Tips ​

  • Treat the vault as a build artifact. Don't hand-edit notes. Rebuild instead.
  • Pin Dashboard.md as the Obsidian default note so it's the first thing you see.
  • One vault per mode if you run both storyboard and director at scale — pass --mode to filter.
  • Combine with Dataview for custom queries on the project frontmatter (e.g. "show all director-mode projects with stale reviews owned by X").
  • Version the vault in a separate git repo if you need historical state — but remember canonical history already lives in events/events.jsonl and artifacts/history/.

Source of truth ​

The repo state on disk is always canonical. The Obsidian vault is a regenerable view.

If a vault note disagrees with the CLI, the CLI is right — re-sync. If the CLI disagrees with what actually shipped, the artifact JSON in projects/<slug>/artifacts/ is right — let doctor find the drift.

text
canonical state on disk
        │
        ▼
    sync-obsidian       ← regenerates everything
        │
        ▼
  Obsidian vault        ← view layer; safe to delete

See also ​

Built to be driven by agent hosts like Claude Code, Claude Desktop, or Codex · Source-available, commercial use requires a paid license.