npx claudepluginhub jshph/asideMeeting capture — record mic + system audio, take timestamped notes, transcribe locally, distill into vault-connected notes.
Share bugs, ideas, or general feedback.
A meeting capture tool that lives inside your Obsidian vault. Record, take timestamped notes, transcribe locally, and distill into vault-connected artifacts — all without leaving the workflow you already have.

For people who don't want another app. If you already live in Obsidian and a terminal, aside slots into that workflow — no new window, no account, no integration to configure. It stores sessions inside your vault, transcribes locally, and uses a Claude Code skill to search your existing notes during distillation. The output is a vault note with [[wikilinks]], not a document you have to move somewhere.
Born from two years of the same Obsidian workflow: record, take sparse notes, transcribe, manually stitch the two together, then hunt through old notes for connections. This automates all of it.
Vault-native. Clone it into your Obsidian vault or point it at one. Sessions, recordings, and metadata live in .aside/. The distillation output is a vault note, not an export. No sync, no import step — it's already where your thinking lives.
Your vault is the context window. Every meeting app can transcribe. None of them know what you've been thinking about for the past two years. Aside's skill searches your vault during distillation — grepping for concrete anchors, running semantic search against your own writing — and weaves those connections into the final note. The meeting doesn't exist in isolation; it lands in the middle of your existing work.
AI-native where it matters. The intelligence isn't compiled into the app. The distillation step is a Claude Code skill — a plain markdown file (SKILL.md) that teaches Claude how to use your vault as context. You can read it, edit it, swap the template. The skill orchestrates Enzyme search, transcript analysis, and note generation in natural language. No black-box features, no plugin system to learn.
5 MB binary, ~3,100 lines of code. A Rust binary for capture, a Python script for transcription cleanup, and a markdown skill file for distillation. Small enough to read the entire codebase in an afternoon, fork it, and make it yours.
Fully local. Recording, transcription (whisper.cpp), and storage all happen on your machine. The only network call is the LLM for distillation, and that's through Claude Code — your existing setup, your API key.
# The recorder
brew install jshph/aside/aside
# The transcriber
brew install whisper-cpp ffmpeg
# Download the whisper model (~1.5 GB, one-time)
hf download ggerganov/whisper.cpp ggml-large-v3-turbo.bin \
--local-dir ~/.local/share/whisper-cpp/
Or build from source: cargo install --path .
macOS only. Requires screen recording permission for system audio capture.
The /aside skill handles transcription, alignment, and distillation. This repo is a Claude Code plugin — install it from Claude Code:
/plugin marketplace add jshph/aside
/plugin install aside
Then /aside <session-name> is available in any Claude Code session.
aside standup # new session — opens TUI editor + starts recording
aside --resume standup # resume an existing session
aside --list # list all sessions
The TUI is a timestamped notepad. Each line gets a [MM:SS] timestamp when you start typing it. Edit a line later and it shows [MM:SS ~MM:SS].
Keybindings: Ctrl+D switch mic, Ctrl+S save, Ctrl+C quit and save.
On quit, the memo is published to your Obsidian vault if .aside/config.toml is configured.
Use the /aside Claude Code skill for the full pipeline:
/aside standup # transcribe → align → distill → vault note
/aside standup --align-only # just transcribe and align, no distillation
Or run transcription standalone:
python3 skills/aside/scripts/aside.py transcribe .aside/standup_seg0.wav --output .aside/
Optional. Create .aside/config.toml:
[vault]
path = "~/obsidian"
folder = "inbox"
filename = "{{date:%Y-%m-%d-%-H-%M-%S}}"
open_in_obsidian = true
A template at .aside/template.md controls the note format. Variables: {{name}}, {{memo}}, {{date:FORMAT}}, {{duration}}.