Yun Han47 downloadsRead notes aloud with Univocal and highlight each word as it's spoken.
Read notes aloud with Univocal and highlight each word as it's spoken, in reading view and in Live Preview or source mode.
Public beta · macOS desktop only. Requires a Connect-capable build of the Univocal app. The plugin is free; continued use of Univocal after its trial requires a paid Univocal licence. No plugin account is required.
The plugin is available in Obsidian Community plugins.
Community plugins (recommended):
Manual installation: download main.js, manifest.json and styles.css from the latest release, copy them into <your vault>/.obsidian/plugins/univocal-read-aloud/, reload the Community plugins list, and enable the plugin.
Univocal has its own global hotkey (⌥⇧R by default). With this plugin enabled, pressing it while Obsidian is in front reads the focused note in Obsidian, with highlighting, instead of reading the selection in Univocal's panel. Pressing it again toggles pause/resume.
~/Library/Application Support/obsidian-univocal/tokens.json, outside your vault. Only your macOS user can read the file (0600, in a 0700 folder). It is not synced with your notes. The plugin no longer uses the macOS Keychain. Settings → Forget authorization removes the stored token.data.json only holds preferences (highlight style, hotkey routing, developer options).| Setting | |
|---|---|
| Highlight style | Background or underline. Use underline if your theme colours editor lines. |
| Answer Univocal's read hotkey | Off: Univocal reads in its own panel. |
| Authorization | Status, Ask again, Forget authorization. |
| Developer mode | Enables the obsidian://univocal-dev URL handler and the connect directory override. |
Obsidian reads use Univocal's speed and voice, which you can change from Univocal's pill or panel.
Use Obsidian’s Settings → Community plugins → Check for updates control. For a manual installation, replace the three plugin files with those from a newer GitHub release and reload Obsidian. Preferences remain in data.json. The plugin never installs or updates itself.
To disconnect, use Revoke beside Obsidian in Univocal. To remove the saved credential too, use the plugin’s Forget authorization before uninstalling it through Obsidian’s Community plugins settings.
pnpm install
pnpm dev # watch build → main.js
pnpm build # typecheck + production build
pnpm typecheck
pnpm test # vitest
pnpm lint # official Obsidian ESLint rules
UNIVOCAL_CONNECT_DIR=/tmp/uco-dev DEVELOPER=1 scripts/dev-install.sh ~/tmp/TestVault
dev-install.sh builds, copies main.js, manifest.json and styles.css into <vault>/.obsidian/plugins/univocal-read-aloud/, adds the id to community-plugins.json, and writes connectDir / developer into the plugin's data.json from the optional env. It refuses any path containing ObsidianSecondBrain or Mobile Documents, so it can never touch a real iCloud vault.
To test against the mock server, point Univocal's connect dir at a short path, because Unix socket paths are limited to 103 bytes:
univocal-mock serve --dir /tmp/uco-dev --consent allow
With Developer mode on:
obsidian://univocal-dev?cmd=read[&prefer=selection|document]
obsidian://univocal-dev?cmd=pause # pause / resume (dev-only, for QA)
obsidian://univocal-dev?cmd=stop # dev-only, for QA
obsidian://univocal-dev?cmd=status[&tag=…]
pause and stop exist only for automated QA. The plugin has no user-facing pause or stop; users control a reading in Univocal's pill.
status writes univocal-dev-status.json into the connect dir. It holds the state, session id, last word and sentence ranges, painted-range counts (painted.word must never exceed the ranges of one word), the current mode (reading / live-preview / source), the note path and the connection state. It never contains note text. Example: open -g "obsidian://univocal-dev?cmd=status&tag=1".
src/connect/: the Univocal Connect protocol client. It's self-contained, with no Obsidian imports.src/textmap/, src/highlight/: text extraction and offset mapping, and the word and sentence highlighters.src/controller.ts: the read-aloud state machine. It's Obsidian-free and tested with fakes in test/controller/.src/main.ts, src/settings.ts, src/statusBar.ts, src/devProtocol.ts: the plugin shell.See SECURITY.md for native capability scope and the remaining generic CSS compatibility notices. See CONTRIBUTING.md for verification and release requirements.
MIT © 2026 NarNar Labs