Yuto Takagi232 downloadsRecord system audio (Zoom, Meet, Teams) and save as M4A in your vault
macOSのシステム音声(Zoom / Google Meet / Teams等の相手の声)とマイク音声をまとめて録音し、M4AファイルとしてVault内に保存するObsidianプラグイン。
system-recorder)をこのリポジトリのGitHubリリースから取得するとき(SHA-256で検証)calendar.readonly)への問い合わせdata.json には書きません。それより前のObsidianでは data.json に保存されますsystem-recorder)が GitHub リリースから自動ダウンロード・検証(SHA-256)され、プラグインフォルダに配置されます(Apple Silicon のみ)main.js, manifest.json, styles.css をダウンロード.obsidian/plugins/system-recording/ に配置system-recorder が自動ダウンロードされます(手動で配置することも可能)Cmd+P) → "Start recording" / "Stop recording"![[...]])を入れます。そのノートをエディタで開いていればカーソル位置に、開いていなければノートの末尾に入りますrecordings)recording-YYYY-MM-DD-HHmmss-{{title}})YYYY MM DD HH mm ss(ほかに YY MMM MMMM Do ddd dddd hh)。英字のつながりがすべてトークンでできているときだけ日付に置き換えるので、recording や summary のような単語はそのまま残ります{{title}}: カレンダーの予定名や、APIで渡された題名。題名がないときは前後の区切り文字ごと消えます(例: recording-2026-10-16-090507)[ ] で囲んだ部分は置き換えません\ / : * ? " < > | # ^ [ ])は除きます。同じ名前のファイルがあるときは 1、 2 … を付けます.m4a(既定)または .wav。M4Aは録音後にmacOS標準の afconvert で変換します。変換に失敗したときはWAVを残して通知します予定の開始時刻に「録音開始」ボタン付きの通知を出し、終了時刻に「録音停止」ボタン付きの通知を出します。録音そのものはボタンを押したときに始まります。
127.0.0.1 で受け取りますhttps:// のリンクだけを開きます){{title}} に入りますプラグインが有効なとき、app.plugins.plugins["system-recording"].api から使えます。apiVersion で対応を確かめてから呼んでください(1.1.0 以降)。
interface SystemRecordingApi {
readonly apiVersion: 1;
/**
* 録音を開始する。ヘルパーが録音を始めたら true、始められなかったら false
* (録音中、macOS以外、ヘルパーの取得失敗など。理由はSystem Recordingが通知する)。
* title はファイル名の {{title}} に入る。リンクは notePath のノートに入り、
* 省略したときは「開始した時点で」アクティブなノートに入る。
*/
startRecording(options?: { title?: string; notePath?: string }): Promise<boolean>;
/**
* 録音を停止し、ファイルの保存(と変換)が終わってから、そのVault内のパスを返す。
* 録音していなかったとき・保存に失敗したときは null。
*/
stopRecording(): Promise<{ path: string } | null>;
/** 録音中、および停止した録音を保存し終えるまで true。 */
isRecording(): boolean;
/** 開始・停止の購読。戻り値の関数を呼ぶと購読を解除する。 */
on(event: "start", listener: (e: { title: string | null; notePath: string | null }) => void): () => void;
on(event: "stop", listener: (e: { path: string | null; notePath: string | null }) => void): () => void;
}
notePath は Vault 内の Markdown ノート(.md)だけを受け付けます。それ以外を渡すとリンクは入りませんconst api = (app as any).plugins?.plugins?.["system-recording"]?.api;
if (api?.apiVersion === 1) {
await api.startRecording({ title: "Weekly sync", notePath: "Meetings/2026-10-16 Weekly sync.md" });
// ...
const saved = await api.stopRecording(); // { path: "recordings/....m4a" } | null
}
api がない古い版(1.0.x)では、コマンド system-recording:start-recording / system-recording:stop-recording を実行できます(題名とノートは渡せません)。
# Install dependencies
npm install
# Build Swift helper
cd swift-helper && swift build -c release && cd ..
cp swift-helper/.build/release/SystemRecorder system-recorder
# Build plugin (dev mode with watch)
npm run dev
# Build plugin (production)
npm run build
# Tests (the afconvert test runs only on macOS, with a synthetic WAV)
npm test
The macOS helper (system-recorder) is not distributed by Obsidian's community store
(only main.js / manifest.json / styles.css are). Instead the plugin downloads it on
first use from the GitHub release named by HELPER_RELEASE_TAG in src/binary.ts,
and verifies it against EXPECTED_SHA256 in the same file. The tag, the hash and the
uploaded binary must belong together.
Plugin-only release (helper unchanged):
npm test && npm run lint && npm run buildmanifest.json / versions.json / package.json, commit, and tag X.Y.Z
(no v prefix — Obsidian matches the tag to manifest.json's version).gh release create X.Y.Z main.js manifest.json styles.cssRelease with a new helper:
cd swift-helper && swift build -c release && cd ..cp swift-helper/.build/release/SystemRecorder system-recordershasum -a 256 system-recorder — copy the hex into EXPECTED_SHA256, and set
HELPER_RELEASE_TAG to the new version X.Y.Z, both in src/binary.ts.npm run build (bundles the updated hash into main.js), then npm test && npm run lint.manifest.json / versions.json / package.json, commit, and tag X.Y.Z.gh release create X.Y.Z main.js manifest.json styles.css system-recorder