Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -1670,6 +1670,19 @@
"security",
"compliance"
]
},
{
"name": "claude-bionify",
"source": "./plugins/claude-bionify",
"description": "Bionic reading for Claude Code responses that bolds the leading part of each word to improve readability and focus.",
"version": "1.0.1",
"author": {
"name": "Samuel Ruairí Bullard",
"url": "https://github.com/abullard1"
},
"category": "Design UX",
"homepage": "https://github.com/ccplugins/awesome-claude-code-plugins/tree/main/plugins/claude-bionify",
"keywords": ["accessibility", "readability", "bionic-reading", "focus", "claude-code"]
}
]
}
}
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ Install or disable them dynamically with the `/plugin` command — enabling you

### Design UX
- [brand-guardian](./plugins/brand-guardian)
- [claude-bionify](./plugins/claude-bionify)
- [joker](./plugins/joker)
- [mobile-ux-optimizer](./plugins/mobile-ux-optimizer)
- [onomastophes](./plugins/onomastophes)
Expand Down Expand Up @@ -212,4 +213,4 @@ Example:
## Contributing

Contributions are welcome!
You can add your favorite plugins, share best practices, or submit your own marketplace.
You can add your favorite plugins, share best practices, or submit your own marketplace.
69 changes: 69 additions & 0 deletions plugins/claude-bionify/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "claude-bionify",
"displayName": "claude-bionify",
"version": "1.0.1",
"description": "Bionic reading for Claude's responses that bolds the leading part of each word to guide your eyes and enable you to read faster.",
"author": {
"name": "Samuel Ruairí Bullard",
"email": "samuel.ruairi.bullard@gmail.com",
"url": "https://github.com/abullard1"
},
"homepage": "https://github.com/abullard1/claude-bionify",
"repository": "https://github.com/abullard1/claude-bionify",
"license": "MIT",
"keywords": [
"bionic-reading",
"speed-reading",
"accessibility",
"readability",
"adhd",
"dyslexia",
"focus",
"productivity"
],
"userConfig": {
"fixation": {
"type": "number",
"title": "Fixation strength",
"description": "Fraction of each word to bold (0.1–0.9). Higher means more bold.",
"default": 0.5,
"min": 0.1,
"max": 0.9
},
"min_word_length": {
"type": "number",
"title": "Minimum word length",
"description": "Words shorter than this are left unbolded.",
"default": 4,
"min": 1
},
"boundary": {
"type": "string",
"title": "Bold boundary",
"description": "How much of each word to bold: \"fraction\" uses Fixation strength; \"syllable\" ends at the first syllable (e.g. stri-ng); \"log\" grows logarithmically so long words are bolded less.",
"default": "fraction"
},
"skip_acronyms": {
"type": "boolean",
"title": "Skip acronyms",
"description": "Leave ALL-CAPS acronyms like API or JSON unbolded.",
"default": true
},
"protect_urls": {
"type": "boolean",
"title": "Protect URLs, paths, and files",
"description": "Don't bold inside URLs, emails, file paths, or filenames.",
"default": true
},
"skip_headings": {
"type": "boolean",
"title": "Skip headings",
"description": "Leave markdown headings (lines starting with #) unbolded. Headings are already visually prominent, so bolding inside them adds clutter.",
"default": true
}
},
"experimental": {
"themes": "./themes/"
}
}
42 changes: 42 additions & 0 deletions plugins/claude-bionify/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Changelog

All notable changes to claude-bionify are documented here. This project follows
[semantic versioning](https://semver.org) and [Keep a Changelog](https://keepachangelog.com).

## [1.0.1] - 2026-07-04

### Fixed
- Preserve fenced code blocks that use spaced info strings such as
```` ``` python ````.
- Stop URL protection before surrounding quotes and brackets.
- Reject invalid boolean and minimum-word-length live override values instead
of silently applying surprising settings.
- Save live overrides correctly when `CLAUDE_BIONIFY_STATE_FILE` is set to a
filename in the current working directory.
- Use fully-qualified `/claude-bionify:set ...` examples in the plugin README.

## [1.0.0] - 2026-06-28

Initial release.

### Added
- `MessageDisplay` hook that bolds the leading part of each word in Claude's
streamed replies as they render. The change is display-only: the saved
transcript and what Claude reads are never altered.
- Unicode-aware bolding that works in any language, while leaving numbers and
identifiers like `value3` or `api_key` alone.
- Three bolding strategies via the `boundary` option: `fraction` (default),
`syllable` (ends at the first syllable), and `log` (long words bolded less).
- Configurable `fixation` strength and `min_word_length`.
- `skip_acronyms` (default on) leaves ALL-CAPS acronyms like `API` whole.
- `protect_urls` (default on) keeps URLs, emails, and file paths unbolded, while
still bolding prose like `and/or` or `e.g.`.
- `skip_headings` (default on) leaves markdown headings unbolded.
- Inline `` `code` ``, fenced code blocks, markdown links, and existing
`**bold**` always render verbatim.
- Live control commands (`/claude-bionify:on`, `:off`, `:toggle`,
`:set <option> <value>`, `:status`, `:reset`) that change settings mid-session
with no reload.
- Seven color themes (Nord, Dracula, Gruvbox, Solarized Dark, Solarized Light,
Sepia, Focus Dark) in Claude Code's `/theme` picker as `custom:claude-bionify:<name>`.
- Crash-safe by design: on any error the original text is shown unchanged.
21 changes: 21 additions & 0 deletions plugins/claude-bionify/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Samuel Ruairí Bullard

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
102 changes: 102 additions & 0 deletions plugins/claude-bionify/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<div align="center">

<h1>claude-bionify</h1>

<p>
<strong>Bionic reading for Claude Code. Bold the front of every word so your eyes move faster.</strong><br>
<sub>So <b>Bio</b>nify <b>mak</b>es <b>Cla</b>ude's <b>repl</b>ies <b>eas</b>ier to <b>re</b>ad.</sub>
</p>

[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-d97757)
![Python](https://img.shields.io/badge/python-3.10%2B-blue)
![Version](https://img.shields.io/badge/version-1.0.1-success)

</div>

---

claude-bionify restyles Claude's responses as they stream into your terminal, bolding the
leading part of each word so your eye gets a fixation point per word. That is the
bionic-reading technique, inspired by eye-movement research showing we read by fixating a single
convenient position toward the start of each word, where the opening letters carry the most
information ([Rayner, 1979](https://doi.org/10.1068/p080021);
[O'Regan et al., 1984](https://doi.org/10.1037/0096-1523.10.2.250)).

## Install

```shell
/plugin marketplace add abullard1/claude-bionify
/plugin install claude-bionify@claude-bionify
```

claude-bionify is active right away. Turn it off or on with `/claude-bionify:off` / `/claude-bionify:on`.

## Configure

When you enable the plugin, Claude Code prompts for these (all optional):

| Setting | Default | Meaning |
| :------ | :------ | :------ |
| **Bold boundary** | `fraction` | `fraction` bolds by Fixation strength; `syllable` ends each word at its first syllable (e.g. **stri**ng); `log` grows logarithmically so long words are bolded less. |
| **Fixation strength** | `0.5` | Fraction of each word to bold (`0.1`–`0.9`). Higher is bolder. Applies to `fraction` mode only. |
| **Minimum word length** | `4` | Words shorter than this are left unbolded. |
| **Skip acronyms** | `on` | Leave ALL-CAPS acronyms like `API` or `JSON` whole. |
| **Protect URLs, paths, files** | `on` | Don't bold inside URLs, emails, file paths, or filenames. |
| **Skip headings** | `on` | Leave markdown headings (`#` lines) unbolded. |

## Control it live

Change claude-bionify mid-session without a reload. The next reply reflects it instantly:

- `/claude-bionify:toggle` · `/claude-bionify:on` · `/claude-bionify:off`
- `/claude-bionify:set strength 0.7` · `/claude-bionify:set boundary syllable` · `/claude-bionify:set minlen 5` · `/claude-bionify:set acronyms off` · `/claude-bionify:set urls off` · `/claude-bionify:set headings off`
- `/claude-bionify:status` · `/claude-bionify:reset`

## Themes

claude-bionify also ships seven color themes for Claude Code's `/theme` picker: Nord, Dracula,
Gruvbox, Solarized Dark, Solarized Light, Sepia, and Focus Dark. Optional and independent of
the bolding. See the [project README](https://github.com/abullard1/claude-bionify#themes) for
the palette gallery.

## What it touches

- **Bolded:** ordinary prose words, in any language (Unicode-aware).
- **Left alone:** inline `` `code` ``, fenced code blocks (even across streamed chunks),
markdown link/image targets, URLs, emails, file paths and filenames, ALL-CAPS acronyms,
and existing `**bold**`.
- **Never touched:** your input and tool output.

## How it works

```
Claude streams a reply ▸ claude-bionify ▸ bolded text in your terminal
```

claude-bionify bolds each batch of Claude's reply just before it reaches your screen, so only
what you see changes — what's saved to the transcript and what Claude reads stay the original
text. It runs entirely on your machine with no dependencies, and if anything ever goes wrong it
falls back to the original.

## Requirements

- Claude Code with plugin support · `python3` on your `PATH` · a terminal that renders markdown bold

## Terminal compatibility

claude-bionify emits standard markdown bold, which virtually every terminal renders correctly:
Alacritty, kitty, WezTerm, iTerm2, GNOME Terminal, foot, and the rest.

The one known exception is the COSMIC desktop terminal (`cosmic-term`), which currently ignores
the code that *ends* a bold span, so bold leaks across the whole word instead of stopping after
the front.
That is a terminal bug, not a claude-bionify or Claude Code issue. A future release may add an
optional Unicode-glyph bold mode that avoids ANSI entirely and sidesteps it.

For the full write-up, demo, and development guide, see the
[project README](https://github.com/abullard1/claude-bionify#readme).

## License

[MIT](./LICENSE) © 2026 [Samuel Ruairí Bullard](https://github.com/abullard1).
8 changes: 8 additions & 0 deletions plugins/claude-bionify/commands/off.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
description: Turn claude-bionify off so Claude's replies render normally.
allowed-tools: Bash(python3 *)
---

!`python3 "${CLAUDE_PLUGIN_ROOT}/scripts/control.py" off`

The command above applied the change and printed claude-bionify's new state. Relay that single line to the user and take no further action.
8 changes: 8 additions & 0 deletions plugins/claude-bionify/commands/on.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
description: Turn claude-bionify on so Claude's replies are bolded.
allowed-tools: Bash(python3 *)
---

!`python3 "${CLAUDE_PLUGIN_ROOT}/scripts/control.py" on`

The command above applied the change and printed claude-bionify's new state. Relay that single line to the user and take no further action.
8 changes: 8 additions & 0 deletions plugins/claude-bionify/commands/reset.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
description: Clear all live claude-bionify overrides, back to your configured defaults.
allowed-tools: Bash(python3 *)
---

!`python3 "${CLAUDE_PLUGIN_ROOT}/scripts/control.py" reset`

The command above cleared the overrides and printed claude-bionify's new state. Relay that single line to the user and take no further action.
9 changes: 9 additions & 0 deletions plugins/claude-bionify/commands/set.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
description: Change a claude-bionify setting, e.g. "fixation 0.7" or "boundary syllable".
allowed-tools: Bash(python3 *)
argument-hint: <fixation|boundary|minlen|acronyms|urls|headings> <value>
---

!`python3 "${CLAUDE_PLUGIN_ROOT}/scripts/control.py" set $ARGUMENTS`

The command above applied the change and printed claude-bionify's new state. Relay that single line to the user and take no further action.
8 changes: 8 additions & 0 deletions plugins/claude-bionify/commands/status.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
description: Show claude-bionify's current settings.
allowed-tools: Bash(python3 *)
---

!`python3 "${CLAUDE_PLUGIN_ROOT}/scripts/control.py" status`

The command above printed claude-bionify's current state. Relay that single line to the user and take no further action.
8 changes: 8 additions & 0 deletions plugins/claude-bionify/commands/toggle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
description: Flip claude-bionify on or off.
allowed-tools: Bash(python3 *)
---

!`python3 "${CLAUDE_PLUGIN_ROOT}/scripts/control.py" toggle`

The command above applied the change and printed claude-bionify's new state. Relay that single line to the user and take no further action.
17 changes: 17 additions & 0 deletions plugins/claude-bionify/hooks/hooks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"description": "Bionic reading: bolds leading portions of each word for faster reading.",
"hooks": {
"MessageDisplay": [
{
"hooks": [
{
"type": "command",
"command": "python3",
"args": ["${CLAUDE_PLUGIN_ROOT}/scripts/bionify.py"],
"timeout": 10
}
]
}
]
}
}
Loading