Recordly
open-source screen recorder & editor — Electron + React + PixiJS
Recordly は、画面録画した動画を「そのまま」ではなく、自動ズーム・カーソルスムージング・フレームスタイリングを施してプロ品質の解説動画・デモ・チュートリアルに仕上げるオープンソースのデスクトップアプリ。macOS / Windows / Linux で動作する。
録画 → 自動ズーム提案 → タイムライン編集 → フレームスタイリング → エクスポートまでをひとつのアプリで完結する。プロジェクトは .recordly ファイルに保存・再オープンできる。
Recordly は Electron の 2 プロセスモデル(Main + Renderer)に、ネイティブモジュールと PixiJS を組み合わせた構成。
| パス | 役割 |
|---|---|
electron/main.ts | Electron メインプロセスのエントリポイント |
electron/preload.ts | contextBridge でレンダラーに安全な IPC API を公開 |
electron/ipc/handlers.ts | IPC チャンネルとネイティブモジュールの橋渡し |
electron/windows.ts | ウィンドウ生成・管理ロジック |
src/components/video-editor/ | タイムライン・設定パネル・エクスポートダイアログなど編集 UI |
src/contexts/ | I18n(多言語)と Shortcuts(キーバインド)の React Context |
src/hooks/ | 録画・マイク・音量レベル計測のカスタムフック |
src/utils/aspectRatioUtils.ts | アスペクト比計算ユーティリティ |
src/utils/platformUtils.ts | OS 判定ユーティリティ |
Recordly は OS ごとに最適なネイティブ API を使い分ける。Windows の古いビルド (< 19041) では Electron のキャプチャ API にフォールバックし、カーソル非表示は未対応。Linux はカーソル非表示未対応(コントリビュート歓迎)。
src/hooks/useScreenRecorder.ts が録画の開始・停止・状態管理を担う。IPC 経由でメインプロセスのネイティブモジュールを制御する。
Recordly のカーソルアニメーションは録画後のポストプロセスとして PixiJS で描画される。録画中に取得したカーソル軌跡データを元に、各種エフェクトをフレームに合成する。
スムージング
ジッタリな動きを滑らかな軌跡に補間。プレゼン動画の品質を自動改善。
モーションブラー
高速移動時にブラーを加えてネイティブ感を演出。@pixi/filter-motion-blur 使用。
クリックバウンス
クリック時にカーソルがバウンスするアニメーション。視覚的なフィードバックを強調。
スウェイ効果
カーソルが揺れるように動くスウェイアニメーション。GIF ループと組み合わせると映える。
カーソルサイズ調整
カーソルのサイズを自由に変更可能。macOS スタイルのカーソルアセットも付属。
インフィニットループ
動画末尾でカーソルが開始位置に戻り、GIF ループがシームレスにつながる。
VideoEditor.tsx がメインの編集 UI を統括し、TimelineEditor でタイムライン操作、SettingsPanel でフレームスタイリングを管理する。
| コンポーネント | 機能 |
|---|---|
TimelineEditor | タイムラインのトリム・速度変更・ズームスパン・アノテーション追加。dnd-timeline でドラッグ操作。 |
VideoPlayback | PixiJS を使ったプレビュー再生。カーソル・ズームアニメーションをリアルタイム合成表示。 |
SettingsPanel | 壁紙・グラデーション・パディング・角丸・ブラー・ドロップシャドウなどフレームスタイリング。 |
AnnotationOverlay | テキストや矢印などのアノテーション(注釈)を動画に重ねて追加。 |
ExportDialog | MP4 / GIF の品質・サイズ・フレームレート設定 UI。エクスポート進捗表示。 |
PlaybackControls | 再生・一時停止・シーク操作。 |
KeyboardShortcutsHelp | ショートカットキー一覧の表示。ShortcutsContext と連動。 |
タイムライン上でカーソルの動きを解析し、ズームすべき箇所を自動提案する機能。手動でズームリージョンを追加することも可能で、カメラのパン・ズームトランジションは Apple の動画スタイルに近い仕上がりになる。
zoomSuggestionUtils.tsのdetectInteractionCandidatesがカーソル活動量を分析normalizeCursorTelemetryでテレメトリを正規化してからズームスパンに変換- ズームスパンはタイムライン上でドラッグ編集できる
エクスポートはすべて同じ PixiJS シーンパイプラインを通じてフレームレンダリングされ、GifExporter または VideoExporter に渡される。
| 形式 | クラス | オプション |
|---|---|---|
| MP4 | VideoExporter | 品質(ExportQuality)・解像度(calculateOutputDimensions) |
| GIF | GifExporter | サイズプリセット(GIF_SIZE_PRESETS)・フレームレート(GifFrameRate) |
エクスポート進捗は ExportProgress 型で管理され、ExportDialog にリアルタイム表示される。@fix-webm-duration/fix を使い WebM の duration メタデータを修正してから MP4 変換している。
.recordly ファイルには元動画のパスとエディタ状態(タイムライン・ズームスパン・スタイル設定)が保存される。projectPersistence.ts が createProjectData / validateProjectData / normalizeProjectEditor でシリアライズ・バリデーションを担当。
- GitHub: webadderall/Recordly — 本体リポジトリ(TypeScript + Electron)
- recordly.dev — 公式サイト
- Issues — バグ報告・機能リクエスト
- OpenScreen — Recordly の元となったプロジェクト
- PixiJS — シーン合成・レンダリングに使用
- Donations (Ko-fi) — macOS 署名・公証のサポート