Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
b2aae16
chore(repo): Упорядочить локальные артефакты
Aug 16, 2026
f60a63c
fix(transcribe): Использовать отдельное окружение Python
Aug 16, 2026
653457b
feat(voiceover): Добавить историю дублей озвучки
Aug 16, 2026
3a52c3e
feat(timeline): Улучшить навигацию и панель дорожек
Aug 16, 2026
b8d2ec5
feat(preview): Редактировать объекты прямо на холсте
Aug 16, 2026
f618f39
fix(export): Удерживать содержимое внутри модального окна
Aug 16, 2026
1318145
feat(preview): Добавить двухоконный режим
Aug 16, 2026
7e5b4e0
fix(shortcuts): Учитывать платформенный модификатор
Aug 16, 2026
b99c1d0
feat(timeline): Подсвечивать место вставки медиа
Aug 16, 2026
71099c7
fix(save): Отключать сохранение без изменений
Aug 16, 2026
a6cca4a
feat(html-player): Экспортировать живой браузерный проект
Aug 16, 2026
18b9a36
feat(html-player): Настроить управление и предзагрузку
Aug 16, 2026
52432ed
fix(html-player): Исправить видео при локальном открытии
Aug 16, 2026
2e912d4
Add macOS support: bring-up, native menu, packaging
vozzhaevsn Jun 17, 2026
23b137b
chore(repo): Упорядочить локальные артефакты
Aug 16, 2026
967eab6
fix(transcribe): Использовать отдельное окружение Python
Aug 16, 2026
0b9e85c
feat(voiceover): Добавить историю дублей озвучки
Aug 16, 2026
3e234bf
feat(timeline): Улучшить навигацию и панель дорожек
Aug 16, 2026
16e7bde
feat(preview): Редактировать объекты прямо на холсте
Aug 16, 2026
9fd1256
fix(export): Удерживать содержимое внутри модального окна
Aug 16, 2026
16bb241
feat(preview): Добавить двухоконный режим
Aug 16, 2026
e6ddce1
fix(shortcuts): Учитывать платформенный модификатор
Aug 16, 2026
90a7258
feat(timeline): Подсвечивать место вставки медиа
Aug 16, 2026
da4c416
fix(save): Отключать сохранение без изменений
Aug 16, 2026
fd0ce1f
feat(html-player): Экспортировать живой браузерный проект
Aug 16, 2026
03f6b12
feat(html-player): Настроить управление и предзагрузку
Aug 16, 2026
34ef9d2
fix(html-player): Исправить видео при локальном открытии
Aug 16, 2026
8a480fc
fix(menu): Адаптировать нативные команды к редактору
Aug 16, 2026
0aaf2fd
build(mac): Исправить упаковку приложения
Aug 16, 2026
9cf0205
feat(mac): Открывать проекты в независимых окнах
Aug 16, 2026
90200b2
docs(mac): Описать документы и несколько окон
Aug 16, 2026
1db3685
chore(repo): Игнорировать метаданные macOS
Aug 16, 2026
81b0904
fix(timeline): Сдвинуть горизонтальный скролл за панель дорожек
Aug 17, 2026
5739745
fix(timeline): Ограничить указатели высотой дорожек
Aug 17, 2026
c938038
fix(timeline): Убрать дублирующий горизонтальный скролл
Aug 17, 2026
5466566
feat(annotations): add agent task tracks
Aug 22, 2026
6f4cd6f
fix(annotations): Improve timeline task interaction
Aug 22, 2026
0dd8fad
meta: Добавить правила коммитов / Add commit rules
Aug 22, 2026
bbe2190
feat(editor): Улучшить монтаж / Improve editing workflows
Aug 22, 2026
69f7ef2
merge(upstream): Синхронизировать v0.4 / Sync v0.4
Aug 22, 2026
9177ceb
merge(pr): Связать историю ветки / Join branch history
Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,11 @@ node_modules/
out/
dist/
*.log
.DS_Store
.claude/
*.autosave.kadr
scripts/__pycache__/
.codebase-memory/
projects/
scripts/build_editable_quiz.mjs
VOICEOVER_STUDIO.md
36 changes: 36 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Project Instructions

## Codebase Knowledge Graph

This project uses codebase-memory-mcp to maintain a knowledge graph of the codebase.
Always prefer MCP graph tools over grep, glob, or file search for code discovery.

Use the tools in this order:

1. `search_graph` to find functions, classes, routes, and variables by pattern.
2. `trace_path` to trace callers and callees.
3. `get_code_snippet` to read specific function or class source code.
4. `query_graph` for complex Cypher queries.
5. `get_architecture` for a high-level project summary.

Fall back to grep, glob, or file search for string literals, error messages,
configuration values, non-code files, or when graph results are insufficient.

## Commits After Changes

After completing requested project changes and the relevant checks, create a Git
commit without waiting for a separate request.

- Commit only files changed for the current task. Preserve unrelated existing
changes in the working tree.
- Use a conventional commit type such as `feat`, `fix`, `docs`, `ref`, `test`,
`build`, `ci`, `chore`, `style`, `perf`, `meta`, or `license`.
- Write a meaningful bilingual commit message in Russian and English.
- Format the subject as `<type>(<scope>): <Russian summary> / <English summary>`;
omit the scope when it does not add useful context.
- For non-trivial changes, add a body that explains what changed and why in both
Russian and English.
- Keep every message line under 100 characters and the subject under 70
characters whenever practical.
- Do not commit when the user explicitly asks not to, when the task is read-only,
or when the requested change is not complete.
9 changes: 5 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ mixes audio and muxes/transcodes per preset.
black. Startup sweeps leftover helper processes; shutdown force-exits
(window-all-closed → app.exit failsafe, render-process-gone → exit).
- `electron/ffmpeg.ts` — ffprobe probing (+ thumbnails + peak/RMS waveform
bins), `makeProxy` (540p preview proxies), `makeReversed` (backwards
bins), `makeProxy` (validated adaptive 720p preview proxies), `makeReversed` (backwards
render of a clip's source range, RAM-bounded chunks), `ExportMuxer`
(per-segment `volume,atempo*,afade,adelay,apad,atrim` → `amix` with
exact level compensation), `RawVideoEncoder` (fallback raw-frame
Expand All @@ -56,8 +56,9 @@ mixes audio and muxes/transcodes per preset.
`userData/claude-mcp.json`; `sweepStaleSessions()` clears leftovers of
hard-killed runs at startup.
- `electron/mcp-bridge.cjs` — MCP stdio server (SDK) that claude receives
via a generated `--mcp-config`; tools: kadr_state / kadr_eval /
kadr_export / kadr_transcribe / kadr_fragment_create.
via a generated `--mcp-config`; tools: kadr_capabilities / kadr_state /
kadr_snapshot / kadr_eval / kadr_export / kadr_transcribe / kadr_voices /
kadr_fragment_create.
- `electron/transcribe.ts` + `scripts/transcribe.py` — faster-whisper
runner (VAD, anti-hallucination thresholds and post-filters, NDJSON
segments with word timestamps); audio comes from an ExportMuxer mixdown
Expand Down Expand Up @@ -86,7 +87,7 @@ mixes audio and muxes/transcodes per preset.
x-moz-url / DownloadURL → portal key), `importDrop` (paths → URLs →
raw blobs), window-level catch-all drop in App.tsx, drop forensics to
`window.__dragLog` + `userData/drop-log.jsonl`.
- Clip speed UX (`Timeline.tsx`): Ctrl-drag on either extend grip or
- Clip speed UX (`Timeline.tsx`): primary-modifier drag on either extend grip or
clip edge = 0.02–100× with ~16 px snapping to round multipliers AND
neighbouring clip edges/playhead; a cursor-following ×N badge lights up
when snapped. Preview clamps element playbackRate to Chromium's hard
Expand Down
118 changes: 92 additions & 26 deletions FEATURES.md

Large diffs are not rendered by default.

43 changes: 25 additions & 18 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ captions to this part», watch it happen live in the preview.

- 🎬 **Real multi-track editing** — video/audio/text tracks, trimming,
looping, fades, linked AV clips, ripple delete, full undo history.
Clip speed from ×0.02 to ×100 by Ctrl-dragging **either** clip edge
Clip speed from ×0.02 to ×100 by ⌘-dragging on macOS or Ctrl-dragging
on Windows/Linux over **either** clip edge
(the left one anchors the right boundary), snapping to round
multipliers and to neighbouring clips' edges, with a live ×N badge.
- 📥 **Media from anywhere** — drop files onto any spot of the window
(onto a track they land as clips back-to-back at the drop point, audio
routes to an audio track), drag a picture straight out of a browser
(fetched by URL), or hit Ctrl+V — clipboard paste understands both
(fetched by URL), or hit ⌘V on macOS / Ctrl+V on Windows and Linux —
clipboard paste understands both
copied files and "Copy image" (e.g. from Telegram, which won't let
photos be dragged out at all). XDG-portal drags from sandboxed apps
are supported too. The media bin gets multi-select and deletion that
Expand Down Expand Up @@ -65,26 +67,22 @@ captions to this part», watch it happen live in the preview.
terminal panel, wired to the live project over MCP: it reads the
timeline, edits clips, transcribes, creates and iterates Remotion
fragments while you watch the preview update. The panel is draggable,
resizable and remembers its place across launches.
resizable and remembers its place across launches; pressing Claude again
minimizes it without losing the session context.
- 📍 **Timeline markers** — press **M** to drop a numbered marker at the
playhead: drag it, right-click to remove it, it lives in the project
file and the embedded Claude can see and place them too ("retime
everything between marker 3 and marker 4").
playhead: drag it, right-click to remove it, and use it from Claude too.
- 📤 **Uncompromised export** — video is encoded by ffmpeg x264 at the
preset's true bitrate (Chromium's built-in encoder ignored the bitrate
and softened the picture — measured and replaced; frames reach ffmpeg
with zero copies), 8-sample motion blur, automatic frame blending for
fps-mismatched sources, presets for YouTube/Shorts/WebM/MP3, and a
with zero copies), mp4box-based fast decode (~8× over element seeks,
with graceful fallback), 8-sample motion blur, automatic frame blending
for fps-mismatched sources, presets for YouTube/Shorts/WebM/MP3, and a
short chime when the render is done.
- 🚀 **Fast on every source** — seeking a `<video>` element costs ~0.2 s
per frame, so the exporter avoids it everywhere: alpha video (every
transparent Remotion fragment included) is read through a **lossless**
colour-over-matte intermediate, MP4s with the index at the end of the
file are picked up from their tail, undecodable codecs go through an
H.264 intermediate. A real 11-minute project full of transparent
fragments now exports in **13 minutes instead of hours** (58 fps at
1080p60).
- 🛟 **Quality-of-life** — background 540p preview proxies, autosave every
- 🚀 **Fast on every source** — alpha video is read through a **lossless**
colour-over-matte intermediate, MP4s with the index at the end are picked
up from their tail, and undecodable codecs use an H.264 intermediate.
- 🛟 **Quality-of-life** — background adaptive 720p preview proxies with
validation and automatic repair of corrupt caches, autosave every
5 minutes (atomic, skipped during exports/AI sessions), an
unsaved-changes indicator with “✓ Saved” feedback, self-healing after
hard closes (no lingering processes), effect & pose presets shared
Expand Down Expand Up @@ -112,6 +110,12 @@ npm install # postinstall rebuilds node-pty for Electron
npm run dev
```

For an Apple Silicon macOS build, run `npm run package:mac`, open the DMG,
and move Kadr to Applications. The installed app registers `.kadr` files:
double-clicking one in Finder opens that project in its own window. Create a
blank window with File → New Window (`⌘N`) or the matching Kadr Dock menu item;
`⇧⌘N` resets the project in the current window.

Import media, edit, press Export. For the AI assistant press 🤖 (the
`claude` CLI must be installed and logged in). If your network needs a
proxy for Claude/npm, create `~/.config/kadr/claude-env.json`:
Expand All @@ -123,14 +127,17 @@ proxy for Claude/npm, create `~/.config/kadr/claude-env.json`:
## How the AI integration works

Kadr starts a local HTTP bridge into the renderer and hands Claude an MCP
server with five tools:
server with a focused tool set:

| Tool | What it does |
|---|---|
| `kadr_capabilities` | current editor contract: project files, models, ranges, effects, transitions, animation, and available actions |
| `kadr_state` | full live project: tracks, clips, asset paths, transcripts, presets |
| `kadr_snapshot` | save a source-quality WYSIWYG PNG frame for visual verification |
| `kadr_eval` | run JS against the editor API (every edit lands in undo history) |
| `kadr_export` | render the project or a range and wait for the file |
| `kadr_transcribe` | local Whisper over a file or a timeline range |
| `kadr_voices` | available F5-TTS voices with stable ids, numbers, and descriptions |
| `kadr_fragment_create` | scaffold a Remotion composition as a timeline clip |

The killer loop: Claude creates a fragment, edits its TSX with normal file
Expand Down
Loading