Що таке yr?
yr (Yemelianov Recorder) — це CLI-інструмент для створення термінальних записів зі скриптованих сценаріїв. Напишіть .yr скрипт з описом того, що потрібно набрати, і yr перетворить його на GIF або WebP — без програм для запису екрана.

Побудований на Rust з ConPTY на Windows (та portable-pty на інших платформах), yr забезпечує піксельно точний термінальний вивід з повною підтримкою ANSI-кольорів.
Навіщо yr?
Проблема: Існуючі інструменти, такі як VHS та asciinema, орієнтовані на Linux. ConPTY на Windows має особливості, що призводять до спотвореного виводу, пропущених кадрів та зламаних записів. Створення термінальних демонстрацій для документації не повинно вимагати Linux VM.
Рішення: yr побудований з пріоритетом на Windows, з обробкою ConPTY закладеною в архітектуру. Він також вводить директиви, яких немає в існуючих інструментах: миттєва вставка, маскування секретів, синхронізація на основі виводу та маркери розділів.
Порівняння
| Можливість | yr | VHS | asciinema |
|---|---|---|---|
| Windows ConPTY | Нативний | Частковий | Ні |
| Маскування секретів | Вбудоване | Ні | Ні |
Синхронізація виводу (WaitFor) | Вбудована | Ні | Ні |
| Миттєва вставка | Вбудована | Ні | Ні |
| Маркери розділів | Вбудовані | Ні | Ні |
| GIF вивід | Так | Так | Через agg |
| WebP вивід | Так | Ні | Ні |
Ключові можливості
- Рядковий DSL — Прості
.yrскрипти:Type,Enter,Sleep,Exec - Paste — Миттєве введення тексту для довгих команд
- Mask / Unmask — Приховування секретів у всіх захоплених кадрах
- WaitFor — Синхронізація за виводом терміналу замість ненадійних пауз
- Marker — Анотування розділів для навігації та розбиття
- Теми — Dracula, Nord, Monokai, GitHub Dark та інші
- Вбудований шрифт — JetBrains Mono включений, без залежностей від системних шрифтів
Швидкий старт
# Record and render a scenario
yr render demo.yr --output demo.gif
# Preview in terminal (no rendering)
yr preview demo.yr
# Validate script syntax
yr validate demo.yr
Приклад скрипта
Set Shell "powershell -NoProfile"
Set Width 80
Set Height 24
Set Theme "dracula"
Set FontSize 14
Type "echo 'Hello from yr!'"
Enter
Sleep 2s
Type "Get-Process | Select-Object -First 5 Name,CPU"
Enter
Sleep 3s
Директиви
Paste — миттєве введення тексту
На відміну від Type (один символ за раз), Paste записує все одразу — ідеально для довгих команд, що не є фокусом вашої демонстрації.
# Slow, deliberate typing
Type "echo hello"
Enter
# Instant paste for boilerplate
Paste "Get-Process | Sort-Object CPU -Descending | Select-Object -First 5"
Enter

Mask / Unmask — приховування секретів
Маски замінюють секретні значення зірочками у всіх захоплених кадрах. Секрет ніколи не з’являється у жодному вихідному файлі.
Env API_KEY "sk-proj-abc123def456"
Mask "sk-proj-abc123def456"
Type "echo $env:API_KEY"
Enter
# Output shows: **********************

WaitFor — синхронізація виводу
Замініть ненадійні паузи Sleep на очікування, засноване на виводі. Опитує термінал кожні 50 мс, доки не з’явиться шаблон.
Exec "cargo build"
WaitFor "Finished" 60s
Type "cargo test"
Enter
WaitFor "test result: ok"

Marker — анотації розділів
Примусово захоплює кадр із назвою. Дозволяє навігацію по розділах, індикатори прогресу та розбиття запису.
Marker "Setup"
Type "git clone https://github.com/org/repo.git"
Enter
WaitFor "done."
Marker "Build"
Type "cargo build --release"
Enter
WaitFor "Finished"

Формати виводу
| Формат | Розширення | Використання |
|---|---|---|
| GIF | .gif | Документація, GitHub README, універсальна підтримка |
| WebP | .webp | Менший розмір файлів, краща якість, сучасні браузери |
| yrdata | .yrdata | Бінарний архів з LZ4 стисненням для повторного рендерингу |
Інтеграція з RAPS
yr використовується для створення всіх термінальних записів на цьому вебсайті. Демонстраційна вітрина та GIF-файли документації рендеряться з .yr скриптів, що зберігаються у репозиторії raps-demo.
# Record a RAPS demo
yr render raps-auth.yr --output auth-demo.gif
# Re-render with different theme
yr render raps-auth.yr --output auth-demo.gif --theme nord
Довідка по директивах
| Директива | Синтаксис | Опис |
|---|---|---|
Set | Set Key "value" | Налаштування оболонки, розмірів, теми, шрифту |
Type | Type "text" | Набір символ за символом |
Paste | Paste "text" | Миттєве введення тексту |
Enter | Enter | Натиснути Enter |
Sleep | Sleep 2s | Пауза на вказану тривалість |
Exec | Exec "command" | Виконати без анімації набору |
Mask | Mask "secret" | Приховати значення у всіх кадрах |
Unmask | Unmask | Зняти маски |
WaitFor | WaitFor "pattern" 30s | Очікувати вивід терміналу |
Marker | Marker "name" | Анотувати розділ |
Env | Env KEY "value" | Встановити змінну середовища |