xnjiang32 downloadsSync your SpeakPen voice summaries into your vault as Markdown notes.
Sync your SpeakPen voice summaries into your vault as Markdown notes.
speakpen.app. On each sync the plugin makes read-only GET
requests to https://speakpen.app/api/v1/ideas, authenticated with your API token, to
fetch notes that changed since the last sync. That is the only host it contacts, and the
only thing it asks for. It never sends your vault anywhere, never writes back to SpeakPen,
and collects no telemetry. See Privacy Policy.Audio is intentionally not linked from the note: the API hands out presigned URLs that
expire within hours, so the link would be dead by the next day. Use speakpen_id to find
the recording back in SpeakPen.
The plugin remembers where it put each note and what it wrote there.
Notes synced by versions before 0.3.0 are remembered so they are never duplicated, but they cannot be updated or moved: those versions recorded only an id, so the plugin does not know where those notes went or whether you have since rewritten them.
The token is read-only — it can list and read your SpeakPen notes, and nothing else. It cannot edit or delete them, share them, or change your account.
Like every Obsidian plugin setting, it is stored as plain text in
<your vault>/.obsidian/plugins/speakpen-sync/data.json. That file is part of your vault, so it
travels with it when you sync to cloud storage or commit the vault to a git repository. If you
keep your vault in git and would rather leave plugin credentials out of it, add this to your
.gitignore:
.obsidian/plugins/*/data.json
You can revoke a token whenever you like — in the SpeakPen app under Settings → API Tokens, or on the web at speakpen.app/app. Revoking takes effect immediately; generate a new one and paste it back in to resume syncing.
Only needed if you are installing a build that is not in the store yet.
main.js, manifest.json (and styles.css if present) from the latest release.<your vault>/.obsidian/plugins/speakpen-sync/ and copy those files into it.Each synced idea is saved as a Markdown file in your configured folder (default: SpeakPen/):
---
speakpen_id: "123"
title: "Meeting Notes"
category: "Meeting"
created_at: 2026-03-28T10:00:00Z
synced_at: 2026-03-28T10:05:00Z
---
## Summary
(AI-generated summary)
## Transcript
(Full transcript)
| Setting | Default | Description |
|---|---|---|
| API Token | — | Your SpeakPen API token |
| Sync Folder | SpeakPen |
Vault folder for synced notes |
| Auto Sync | On | Enable automatic sync |
| Sync Interval | 5 min | How often to check for new ideas |
git clone https://github.com/xnjiang/speakpen-obsidian.git
cd speakpen-obsidian
npm install
npm run dev # development build
npm run build # production build
npm test # run tests
speakpen.app describes what this plugin does, in four languages. Those descriptions
are listed in config/product_claims.json in the speakpen
repo, and each one names a test in this repo that proves it.
tests/landing-claims.test.ts checks that those tests still exist, so npm test fails
here if you delete or rename one — and the test itself fails if you change the behaviour
it proves.
This exists because the two repos drifted once: faee134 corrected a claim in this
README that the site kept making for another week, with both test suites green. If you
add a claim to the site, write the test that proves it here first.
Check out the speakpen repo alongside this one, or set SPEAKPEN_RAILS_REPO. Without
it the check prints a warning and skips rather than failing.
MIT