A Raycast extension to capture quick thoughts into your Obsidian daily note - by typing or speaking. Every entry is automatically timestamped and inserted under a configurable heading in today's note.
- Features
- How It Works
- Requirements
- Installation
- Configuration
- Usage
- Daily Note Format
- Troubleshooting
- Contributing
- Roadmap
- License
- Text capture - open Raycast, type a thought, hit Enter. Done.
- Voice capture - press
Cmd+Shift+Rto record, press again to stop; transcription via OpenAI Whisper appears in the text area for review before saving. - Editable before saving - voice transcriptions are never blindly appended; you always see and can edit the text first.
- Auto-creates daily note - if today's note doesn't exist yet, it is created automatically.
- Auto-creates heading - if the configured heading (
## Notesby default) is missing from the file, it is appended. - Timestamped entries - every note is prefixed with
HH:MMin 24-hour format. - Configurable heading - point the extension at any heading in your daily note, not just
## Notes. - No background process - the extension only runs when you invoke it.
flowchart TD
A([Raycast invoked]) --> B[Murmur opens\nForm with TextArea]
B --> C{Input mode}
C -->|Text| D[Type note]
D --> E[Submit]
C -->|Voice| F[Cmd+Shift+R\nSoX starts recording WAV]
F --> G[Cmd+Shift+R\nSoX stops]
G --> H[WAV sent to\nOpenAI Whisper API]
H --> I[Transcription\nfills TextArea]
I --> J[Review / edit]
J --> E
E --> K[appendToNotes\nwrites to Logs/MM-DD-YYYY.md]
K --> L([HUD: Added to daily note])
The file is read, modified in memory, and written back atomically by line-splice - no external database, no sync service, plain Markdown.
| Requirement | Notes |
|---|---|
| macOS | Raycast is macOS-only |
| Raycast | Free tier is sufficient |
| Node.js >= 18 | Required by Raycast extension toolchain |
| Bun | Used as package manager and script runner |
| SoX | Required for voice input only |
| OpenAI API key | Required for voice input only |
Voice input is optional. Text capture works with zero additional setup beyond Raycast itself.
Download from raycast.com and follow the setup wizard.
SoX is the audio recording tool used to capture microphone input.
brew install soxVerify it installed correctly:
sox --versionYou should see something like sox 14.4.x. If you get command not found, Homebrew may not be on your PATH - see Homebrew docs.
git clone https://github.com/fr0ziii/murmur.git
cd murmurbun install- Open Raycast (
Cmd+Space) - Search for "Import Extension" and select it
- Navigate to and select the
murmur/folder - The "Capture Thought" command is now permanently available in Raycast
After importing, you do not need to run any command or keep a terminal open. Raycast manages the extension lifecycle.
On first use, Raycast will prompt you to configure the extension. You can also access preferences at any time via:
Raycast Settings -> Extensions -> Murmur
Or press Cmd+, while the extension is open.
| Setting | Type | Required | Default | Description |
|---|---|---|---|---|
| Vault Path | Directory picker | Yes | - | The root folder of your Obsidian vault |
| OpenAI API Key | Password (hidden) | No | - | Your OpenAI API key, used only for Whisper transcription |
| Notes Heading | Text | No | ## Notes |
The Markdown heading under which entries are inserted |
- Go to platform.openai.com
- Sign in or create an account
- Navigate to API Keys in the left sidebar
- Click Create new secret key
- Copy the key and paste it into the OpenAI API Key preference
The key is stored securely by Raycast using the
passwordpreference type - it is never written to disk by this extension or logged anywhere.
Whisper API usage is billed per audio minute. Rates are low - see OpenAI pricing for current figures.
For fastest capture, assign a dedicated keyboard shortcut:
- Open Raycast Settings (
Cmd+,in Raycast) - Go to Extensions -> Murmur
- Click the shortcut field next to Capture Thought
- Press your desired key combination (e.g.
Cmd+Shift+N)
- Open Raycast (
Cmd+Spaceor your custom hotkey) - Type "Capture Thought" (or use your assigned hotkey to open it directly)
- The cursor is already in the text area - start typing immediately
- Press
Cmd+Enter(or click Add to Daily Note in the action panel) to save
- Open the extension as above
- Press
Cmd+Shift+Rto start recording - the status line changes to "Recording in progress" - Speak your thought
- Press
Cmd+Shift+Ragain to stop - the audio is sent to Whisper - The transcribed text appears in the text area - edit if needed
- Press
Cmd+Enterto save
| Shortcut | Action |
|---|---|
Cmd+Enter |
Save note to daily file |
Cmd+Shift+R |
Start or stop voice recording |
Escape |
Close without saving |
The extension reads and writes to:
<vault>/Logs/MM-DD-YYYY.md
For example: MyVault/Logs/03-03-2026.md
Entries are inserted as list items immediately after the configured heading:
## Notes
- 09:14 Ship the PR before standup
- 09:47 Follow up with design team on icon sizes
- 14:02 Read that paper on attention mechanisms tonightNew entries are prepended (inserted right after the heading), so the most recent thought is always at the top.
| Situation | Behavior |
|---|---|
| Daily note does not exist | File is created with the heading and first entry |
Logs/ directory does not exist |
Directory is created |
| Configured heading is missing from file | Heading + entry are appended to the end of the file |
| Note text is empty | Save is blocked with an error toast |
The extension looks for SoX at /opt/homebrew/bin/sox (Apple Silicon) and /usr/local/bin/sox (Intel). If it's installed elsewhere:
which soxIf that returns a different path, open an issue or contribute a fix to add your path.
If SoX is not installed:
brew install soxThen restart Raycast (right-click the menubar icon -> Quit, then reopen).
- Make sure macOS has granted microphone access to Raycast: System Settings -> Privacy & Security -> Microphone -> Raycast should be enabled.
- Test SoX directly in a terminal:
sox -d test.wav trim 0 3(records 3 seconds). If this fails, the issue is with SoX or microphone permissions, not the extension.
Whisper accuracy depends on audio quality and microphone. Speak clearly and close to the mic. You can always edit the transcribed text before saving.
The extension matches the heading line exactly (trimmed). If your heading has trailing spaces or different casing than what you configured in preferences, it will not match. Check that Notes Heading in preferences exactly matches the heading in your file.
Try re-importing: open Raycast, search "Import Extension", select the folder again. If the build has errors, run bun run build in the project folder to see them.
Contributions are welcome - bug fixes, new features, and documentation improvements alike.
git clone https://github.com/fr0ziii/murmur.git
cd murmur
bun install
bun run devbun run dev starts the extension in Raycast development mode with hot reload. Changes to source files reflect immediately.
src/
capture.tsx # Main command UI (React + Raycast Form)
utils/
obsidian.ts # File read/write logic for daily notes
audio.ts # SoX process management
transcribe.ts # OpenAI Whisper API call
assets/
command-icon.png # Extension icon
package.json # Raycast manifest + dependencies
tsconfig.json # TypeScript configuration
- Keep utils pure.
obsidian.ts,audio.ts, andtranscribe.tshave no Raycast API imports - keep them that way so they can be tested independently. - No silent failures. All errors should surface to the user via
showToastor theerrorstate in the form. - Test edge cases manually. Before submitting, test: missing heading, missing file, missing
Logs/directory, empty note submission, and voice recording without an API key. - TypeScript strict mode is on. Do not disable or work around it.
- Fork the repository
- Create a branch:
git checkout -b feature/your-feature-name - Make your changes
- Run
bun run build- it must pass with no errors - Run
bun run lint- fix any warnings - Open a pull request with a clear description of what changed and why
Open an issue with:
- macOS version
- Raycast version
- Steps to reproduce
- What you expected vs. what happened
- Any error messages shown in the extension or terminal
The following improvements are planned or under consideration. Contributions toward any of these are especially welcome.
- Append vs. prepend toggle - preference to control whether new entries go above or below existing ones under the heading
- Custom date format - let users configure the daily note filename pattern (e.g.
YYYY-MM-DDinstead ofMM-DD-YYYY) - Multiple vault support - quickly switch between vaults from within the extension
- Tags support - add
#tagvia a separate form field that gets appended to the entry
- Quicklink command - a second command to capture a URL + optional note from the clipboard, formatted as a Markdown link
- Today's log preview - a secondary command that shows the current day's
## Notesentries as a Raycast List, with copy/delete actions - Local transcription - support whisper.cpp as an offline alternative to the OpenAI API, eliminating the API key requirement and cost
- Custom note template - let users define the format of each entry beyond
- HH:MM text
- Raycast Store publication - submit the extension to the official Raycast store after reaching stable quality
- Weekly/monthly note support - option to target a weekly or monthly note instead of a daily one
- AI summarization - end-of-day command that summarizes the day's notes using the OpenAI API and appends the summary to the file
MIT - see LICENSE for full text.
Built with Raycast API, OpenAI Whisper, and SoX.