Skip to content

fr0ziii/murmur

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

3 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Murmur

🐱 Murmur

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.


Table of Contents


Features

  • Text capture - open Raycast, type a thought, hit Enter. Done.
  • Voice capture - press Cmd+Shift+R to 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 (## Notes by default) is missing from the file, it is appended.
  • Timestamped entries - every note is prefixed with HH:MM in 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.

How It Works

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])
Loading

The file is read, modified in memory, and written back atomically by line-splice - no external database, no sync service, plain Markdown.


Requirements

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.


Installation

Step 1 - Install Raycast

Download from raycast.com and follow the setup wizard.

Step 2 - Install SoX (voice input only)

SoX is the audio recording tool used to capture microphone input.

brew install sox

Verify it installed correctly:

sox --version

You should see something like sox 14.4.x. If you get command not found, Homebrew may not be on your PATH - see Homebrew docs.

Step 3 - Clone the repository

git clone https://github.com/fr0ziii/murmur.git
cd murmur

Step 4 - Install dependencies

bun install

Step 5 - Import into Raycast

  1. Open Raycast (Cmd+Space)
  2. Search for "Import Extension" and select it
  3. Navigate to and select the murmur/ folder
  4. 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.


Configuration

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.

Preferences

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

Getting an OpenAI API key

  1. Go to platform.openai.com
  2. Sign in or create an account
  3. Navigate to API Keys in the left sidebar
  4. Click Create new secret key
  5. Copy the key and paste it into the OpenAI API Key preference

The key is stored securely by Raycast using the password preference 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.

Assigning a global hotkey (recommended)

For fastest capture, assign a dedicated keyboard shortcut:

  1. Open Raycast Settings (Cmd+, in Raycast)
  2. Go to Extensions -> Murmur
  3. Click the shortcut field next to Capture Thought
  4. Press your desired key combination (e.g. Cmd+Shift+N)

Usage

Text capture

  1. Open Raycast (Cmd+Space or your custom hotkey)
  2. Type "Capture Thought" (or use your assigned hotkey to open it directly)
  3. The cursor is already in the text area - start typing immediately
  4. Press Cmd+Enter (or click Add to Daily Note in the action panel) to save

Voice capture

  1. Open the extension as above
  2. Press Cmd+Shift+R to start recording - the status line changes to "Recording in progress"
  3. Speak your thought
  4. Press Cmd+Shift+R again to stop - the audio is sent to Whisper
  5. The transcribed text appears in the text area - edit if needed
  6. Press Cmd+Enter to save

Keyboard shortcuts

Shortcut Action
Cmd+Enter Save note to daily file
Cmd+Shift+R Start or stop voice recording
Escape Close without saving

Daily Note Format

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 tonight

New entries are prepended (inserted right after the heading), so the most recent thought is always at the top.

Edge cases handled automatically

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

Troubleshooting

"SoX not found" error

The extension looks for SoX at /opt/homebrew/bin/sox (Apple Silicon) and /usr/local/bin/sox (Intel). If it's installed elsewhere:

which sox

If that returns a different path, open an issue or contribute a fix to add your path.

If SoX is not installed:

brew install sox

Then restart Raycast (right-click the menubar icon -> Quit, then reopen).

Voice recording captures no audio

  • 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.

Transcription returns wrong text

Whisper accuracy depends on audio quality and microphone. Speak clearly and close to the mic. You can always edit the transcribed text before saving.

Entries appear in the wrong place

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.

The extension is not visible in Raycast after import

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.


Contributing

Contributions are welcome - bug fixes, new features, and documentation improvements alike.

Development setup

git clone https://github.com/fr0ziii/murmur.git
cd murmur
bun install
bun run dev

bun run dev starts the extension in Raycast development mode with hot reload. Changes to source files reflect immediately.

Project structure

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

Guidelines

  • Keep utils pure. obsidian.ts, audio.ts, and transcribe.ts have 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 showToast or the error state 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.

Submitting changes

  1. Fork the repository
  2. Create a branch: git checkout -b feature/your-feature-name
  3. Make your changes
  4. Run bun run build - it must pass with no errors
  5. Run bun run lint - fix any warnings
  6. Open a pull request with a clear description of what changed and why

Reporting bugs

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

Roadmap

The following improvements are planned or under consideration. Contributions toward any of these are especially welcome.

Near-term

  • 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-DD instead of MM-DD-YYYY)
  • Multiple vault support - quickly switch between vaults from within the extension
  • Tags support - add #tag via a separate form field that gets appended to the entry

Medium-term

  • 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 ## Notes entries 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

Long-term

  • 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

License

MIT - see LICENSE for full text.


Built with Raycast API, OpenAI Whisper, and SoX.

About

🐱 Murmur a thought into your Obsidian vault - text or voice, via Raycast

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors