https://github.com/jedbillyb/quill-writer
Claude AI assistant sidebar for LibreOffice Writer — integrates via the Claude Agent SDK (Claude Code login, no API key)
https://github.com/jedbillyb/quill-writer
ai anthropic claude claude-code extension libreoffice mcp python uno writer
Last synced: about 4 hours ago
JSON representation
Claude AI assistant sidebar for LibreOffice Writer — integrates via the Claude Agent SDK (Claude Code login, no API key)
- Host: GitHub
- URL: https://github.com/jedbillyb/quill-writer
- Owner: jedbillyb
- License: other
- Created: 2026-06-18T02:32:17.000Z (13 days ago)
- Default Branch: master
- Last Pushed: 2026-06-29T02:04:23.000Z (3 days ago)
- Last Synced: 2026-06-29T04:06:21.917Z (2 days ago)
- Topics: ai, anthropic, claude, claude-code, extension, libreoffice, mcp, python, uno, writer
- Language: Python
- Homepage:
- Size: 53.7 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Quill
**Quill** is a LibreOffice Writer extension — an AI writing assistant powered by
**Claude**. It adds a native **Quill** sidebar: chat with Claude, rewrite the
selected text, generate or continue writing, and summarise the document — with
every edit shown as an inline **diff** for **Apply / Reject** before it touches
your document.
It authenticates off your existing **Claude Code login (subscription)** via the
[Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk/python) — **no
Anthropic API key required.**
## How it works
```
LibreOffice (Writer) agent sidecar (Python 3.10+ venv)
Quill sidebar panel ── JSON over a pipe ── claude-agent-sdk
owns the document (UNO) in-process MCP server "writer"
applies edits on approval drives Claude via Claude Code login
```
The extension exposes the document to Claude as **MCP tools**
(`get_document_text`, `get_selection`, `replace_selection`, `insert_at_cursor`).
Claude calls them; edit tools are gated by the sidebar's preview-then-apply UI.
The agent runs in a separate Python process (the *sidecar*) because LibreOffice's
bundled Python is usually too old for the SDK; the two talk over the subprocess
pipe. Document edits are applied in-process via UNO as single undoable steps.
## Prerequisites
1. **Claude Code CLI**, installed and logged in:
```
claude # then /login if needed
```
2. **LibreOffice** with Python scripting (standard on Linux).
3. A **Python 3.10+ environment with `claude-agent-sdk`** for the sidecar.
## Install
**Easiest — just install the extension; it sets itself up.** Install
`quill-writer.oxt` (Tools → Extension Manager → Add, or `unopkg add
quill-writer.oxt`), restart LibreOffice, and open the **Quill** sidebar. On
first run it auto-creates its own Python environment at
`~/.local/share/quill/venv` and installs the Claude Agent SDK — you'll
see "Setting up Claude…" in the panel for ~30s, then it's ready. Needs a
`python3` with `venv` on PATH (and the Claude Code CLI logged in).
**Or run the installer** (does the setup up-front instead of on first run, and
builds the `.oxt` for you):
```bash
./install.sh
```
It uses [`uv`](https://docs.astral.sh/uv/) or `python3 -m venv`. To remove
everything later: `./uninstall.sh`.
Manual install (what install.sh does)
```bash
uv venv .venv && uv pip install -r requirements.txt # sidecar SDK env
mkdir -p ~/.config/quill
echo "$PWD/.venv/bin/python" > ~/.config/quill/python
PYTHON=.venv/bin/python ./build.sh # -> quill-writer.oxt
unopkg add --force quill-writer.oxt
```
### Pointing at a different Python
By default the panel launches `/.venv/bin/python`. Override with:
```bash
export QUILL_PYTHON=/path/to/python3 # has claude-agent-sdk installed
```
Optional model override: `export QUILL_MODEL=claude-opus-4-8`.
## Usage
- **Rewrite**: select text, ask e.g. *"make this more formal"* → Claude reads the
selection and proposes a replacement; **Apply** or **Reject**.
- **Generate / continue**: place the cursor, ask *"continue this paragraph"* →
Claude proposes an insertion to approve.
- **Summarise**: ask *"summarise this document"* → Claude reads the full text.
- **Chat**: ask anything; Claude answers in the panel without editing.
Applied edits are single undo steps — **Ctrl+Z** reverts cleanly.
## Project layout
| Path | Role |
|------|------|
| `python/claude_panel.py` | UNO sidebar factory + panel UI, thread marshalling |
| `python/sidecar_client.py` | Launches/streams the sidecar, routes document ops |
| `python/writer_ops.py` | UNO document read/edit operations |
| `sidecar/agent_main.py` | Agent loop: MCP server + `ClaudeSDKClient` |
| `sidecar/writer_tools.py` | The `mcp__writer__*` tool definitions |
| `*.xcu`, `description.xml`, `META-INF/manifest.xml` | Extension manifests |
## Testing the backbone (no GUI)
```bash
cd sidecar
../.venv/bin/python fake_panel_test.py ../.venv/bin/python "Make my selection formal."
```
This drives the real sidecar with a faked document and prints the tools Claude
called and the edits it proposed — verifying Claude Code auth and the MCP
round-trip without LibreOffice.
## Status
v0.1 — working: native sidebar (chat, rewrite selection, generate/continue,
summarise), in-document inline-diff preview with Apply / Improve / Reject,
whole-document rewrite, Enter-to-send, and Claude Code (subscription) auth with
no API key. Document operations and the agent round-trip are verified against a
live LibreOffice.
## License
MIT — see [LICENSE](LICENSE). "Quill" is the name of this extension; it is an
independent project and is not affiliated with or endorsed by Anthropic. Note:
the "Claude" name and the current sidebar icon are Anthropic brand assets and
are **not** covered by the MIT license; replace the icon before redistributing
if you don't have permission to use it.