Skip to main content

LiveQuill

Edit your local website by asking.
A floating prompt bar for any local site: type a change, the model of your choice edits your real files, and the page reloads.

CI CodeQL Python 3.10+ Zero dependencies License: MIT PRs welcome

Website · Quick start · Providers · Roadmap · FAQ

LiveQuill demo: first launch, a provider is set up, a site is created from the business template and opened, a request turns the title red, the original version is previewed, then Undo restores it

A real, unedited first run with Claude Code (Haiku): setup → new site from a template → “make the hero title red” → version preview → Undo → switch theme. MP4 version.

Highlights

  • Ask, don't dig. Describe the change on the page you are looking at. The model finds the code, edits it, and the page reloads.
  • Any model. Claude, GPT, Gemini, Mistral, OpenRouter, local models through Ollama, LM Studio or llama.cpp, any OpenAI-compatible server, or the Claude Code, Codex and Gemini CLIs you already use. No CLI? The agent built into the Claude Desktop or ChatGPT app works too.
  • A new site in a minute. A short wizard creates a site from a ready-made template or a blank page, no technical skills needed. Or add a folder you already have.
  • All your sites in one place. A dashboard lists your projects with a live thumbnail. Each one is served as-is or behind your dev server (Vite, Next, Astro…).
  • Safe by default. Sandboxed file tools, a backup before every edit, one-click Undo, and API keys that never reach the browser.
  • Every request is a version. Browse them in the bar, preview any of them live without touching your files, and go back to it in one click.
  • Nothing to install in your project. The bar is added while pages are served, never written to disk. Zero dependencies: just Python.

Quick start

You need Python 3.10+, nothing else. Runs on Linux and macOS (Windows is not supported).

curl -fsSL https://ybucaille.github.io/livequill/install.sh | sh
livequill

The script installs a single file, livequill.pyz from the latest release, after checking its SHA-256. It goes in ~/.local/share/livequill, with the livequill command in ~/.local/bin. It needs no root, no git and no pip. Run it again to upgrade. It is tested on Ubuntu, Debian, Fedora, Rocky Linux, Arch, Alpine, openSUSE and macOS. If Python is missing, it tells you the command for your distribution.

Other ways to install
pipx / uv pipx install livequill or uv tool install livequill (from PyPI)
Single file Download livequill.pyz from a release and run python3 livequill.pyz
From source git clone https://github.com/Ybucaille/livequill.git && ./livequill/bin/livequill

Press Ctrl+C in the terminal to stop it.

  1. Setup. The first launch opens the setup page. Pick a provider: paste an API key, or click a local model or CLI agent detected on your machine. You only see this page once: later, providers are managed from the ⚙ settings of My sites.
  2. Create a site. You land on My sites. Click New site: pick a starting point (a business website template or a blank page), give it a name, and LiveQuill creates it in ~/LiveQuill/sites. Already have a site? Choose Add an existing site and select its folder.
  3. Open it and ask. The site opens with the floating bar. Try “make the hero title red”, watch it change, then click Undo.

Handy shortcuts:

livequill ~/projects/my-site                            # add this folder and open it
livequill --proxy http://localhost:5173 ~/projects/app   # same, behind your dev server
All command-line options
Option Description
FOLDER Add this folder to your sites (if needed) and open it. Without it, the dashboard opens.
--proxy URL Serve FOLDER behind an existing dev server instead of serving its files.
--port N Dashboard port on 127.0.0.1 (default 8777). Each site gets its own port after it.
--config FILE Alternative config file (default ~/.config/livequill/config.json).
--no-open Do not open the browser.

Screenshots

My sites dashboard Provider setup page
My sites. Create, add, open or stop each project, with a live thumbnail. Every site runs on its own port, with its own history. Setup. Each provider shows Available (connection checked live), Detected (one click away), or a link to get a key.
New site wizard Floating bar with the live answer
New site. A short wizard: kind of site, starting point with a live preview, name and folder. Built for people who never made a website. Live panel. The answer streams in, with the tools called and the files changed. It survives the reload.
Claude, ChatGPT, Gemini and Minimal themes
Themes. Claude, ChatGPT, Gemini and Minimal, in light and dark, following your system.

What the bar can do

Models Every configured model in one menu, grouped by provider. Switch without restarting. Reasoning and Fast only appear when the model supports them.
Attachments + button, paste or drag and drop (15 MB per file). Images go in as vision input when supported, text files are inlined.
Page context The current route, the matching HTML file, the visible headings and your text selection are sent along, so “the title” means what you see.
History Earlier requests of the project are replayed as plain text, so context survives a model switch. New starts over.
Undo Restores the files changed by the last request. Works several times in a row, and for CLI agents too.
Versions The clock button lists every request as a version: when, which model, which files. Select one to see a live preview of the site at that point, open it in a tab, or go back to it in one click.
Small models No tool-call support? LiveQuill falls back to a text protocol (tool blocks and SEARCH/REPLACE edits) and nudges models that stop halfway.

Providers

Provider What you need
Anthropic API key from console.anthropic.com. Effort levels on Claude 4.6+, Fast on Opus 5.5 / 5 / 4.8.
OpenAI API key from platform.openai.com. reasoning_effort on o-series and gpt-5.
Google Gemini API key from aistudio.google.com. Thinking budget (2.5) or level (3).
Mistral API key from console.mistral.ai.
OpenRouter API key from openrouter.ai/keys. Capabilities are read for each model.
Ollama ollama serve, then ollama pull qwen2.5:7b-instruct (any model listing tools).
LM Studio Developer tab → Start server.
llama.cpp llama-server -m model.gguf --jinja.
Other Any OpenAI-compatible server (vLLM, LocalAI, Jan, Groq, DeepSeek…): base URL, optional key, model name.
Claude Code claude installed and logged in, or just the Claude Desktop app (see below). Runs in --restricted mode: file tools confined to the project, no shell or web tools, no MCP servers, your user settings and hooks ignored.
Codex codex installed and logged in (codex login), or just the ChatGPT or Codex app (see below). Runs in its workspace-write sandbox with your config.toml ignored (no MCP servers, no extra writable folders, no network). Codex can still read any file your user can read and runs shell commands inside its sandbox: a Codex limitation, not something LiveQuill can restrict.
Gemini CLI gemini installed. Experimental: not tested yet.

Desktop apps, no CLI needed

The Claude Desktop app ships with its own copy of Claude Code, and the ChatGPT app (and the Codex app on macOS) ships with Codex. If the CLI is not installed, LiveQuill uses the agent built into the app, with the account you are already signed in with. The setup page shows it as “Found in the Claude Desktop app”, the connection test checks that you are signed in, and the newest version is picked every time the app updates itself.

App Where LiveQuill looks
Claude Desktop ~/.config/Claude/claude-code/<version>/…/claude (Linux), ~/Library/Application Support/Claude/claude-code/<version>/…/claude (macOS)
ChatGPT /usr/lib/chatgpt/resources/codex (Linux), /Applications/ChatGPT.app/Contents/Resources/codex (macOS)
Codex app /Applications/Codex.app/Contents/Resources/codex (macOS)

An installed CLI always takes priority. The macOS locations follow the same layout as Linux but have not been tested on a real Mac yet.

Security

LiveQuill lets a model touch your files, so the guard rails are on by default:

  • Local only. Servers listen on 127.0.0.1, reject foreign Host headers (DNS rebinding), and require a per-launch session token plus a same-origin request on every API call.
  • Keys stay server-side. Stored in ~/.config/livequill/config.json (folder 700, file 600), never sent to the browser, masked in error messages and logs.
  • Sandboxed tools. No path outside the project, no .git/, .env* or node_modules/, and no shell commands for API and local models. Files are opened without following symbolic links at any level, so a path cannot be swapped for a link between the check and the write; the web server applies the same rule to the files it serves.
  • Backups first. Every file is saved to <project>/.livequill/history/ (private, 700/600) before it changes. That folder ignores itself in git.
  • Undo for CLI agents. Claude Code and Codex write files themselves, so the project is copied before each request (everything except .git/ and node_modules/, .env* included) and compared afterwards, content included. Undo then restores modified, deleted and created files, and replaces any symbolic link an agent left in their place. If the project is larger than 2 GB, the request is refused rather than run without a reliable undo.

Found a vulnerability? Please report it privately: see SECURITY.md.

How it works

sequenceDiagram
    participant B as Floating bar
    participant S as LiveQuill (site server)
    participant M as Model (API · local · CLI)
    participant F as Project files
    B->>S: request + page context + attachments
    loop until the model answers without tools
        S->>M: messages + tools
        M-->>S: streamed text / tool calls
        S->>F: search · read · edit (sandboxed, backed up)
        S-->>B: live events (text, tools, files)
    end
    S-->>B: reload
Project layout
bin/livequill     launcher (no install needed)
livequill/
  cli.py          command line
  server.py       dashboard, per-site servers (folder or proxy), script injection, API, live reload
  agent.py        agent loop, tools, text fallback, page context, history
  sandbox.py      locked-down paths, file tools, backups and undo
  config.py       providers and sites (chmod 600), secret masking
  adapters/       one adapter per provider family
  static/         the bar (overlay.js), setup page, dashboard
site/             showcase website (GitHub Pages)
scripts/          demo recorder, JS syntax check
tests/            unit and integration tests, network mocked
Adding a provider

All provider-specific logic lives in one adapter. livequill/adapters/base.py documents the interface and the message format.

from .base import Adapter, levels

class MyAdapter(Adapter):
    kind = 'my-provider'
    default_base = 'https://api.example.com'

    def list_models(self): ...                    # -> [{"id", "label", "meta"}]
    def caps(self, model, meta=None): ...         # -> {"tools", "vision", "effort", "fast"}
    def build_request(self, model, system, messages, tools, opts): ...  # pure, easy to test
    def parse_stream(self, lines): ...            # -> delta / thinking / part / stop events

Register it in KINDS (livequill/adapters/__init__.py), and the setup page and the bar pick it up. An OpenAI-compatible provider is a one-liner: compatible('name', 'https://…/v1').

Roadmap

Planned

  • Dynamic sites with a mock database. Support for sites with a backend and a database, plugged into a disposable mock database seeded with demo data, so the model can work on data-driven pages without ever touching real data. The new-site wizard already shows the option, greyed out until it lands.
  • More templates and languages. More starting points in the new-site wizard (portfolio, event, restaurant…), and more interface languages through the language menu.

Ideas

  • Point and ask. Click an element on the page, like the browser inspector, to scope the request to it: “make this button bigger”.
  • Review before writing. An optional mode that shows the proposed diff for each file and waits for you to accept or reject it.

Want to help with one of them? Open an issue or a pull request.

FAQ

Why the name LiveQuill?

A quill is the pen you write and correct a page with. Here you write the change on the page itself, and the model rewrites the source live, while you watch. It is short, not tied to any model vendor, and easy to type as a command.

Does my code leave my machine?

Only if you choose a cloud provider. With Ollama, LM Studio or llama.cpp, everything stays on your computer. With a cloud API, your request, the page context and the files the model reads are sent to that provider, like with any coding assistant.

Can I use it without an API key?

Yes. Install Ollama, pull a model that supports tools (ollama pull qwen2.5:7b-instruct), and pick it on the setup page. If you already use Claude Code or Codex, LiveQuill can also work through them with your existing login.

Does it work with React, Vue, Svelte or Next.js?

Yes. Keep your dev server running and add the site with its URL (or run livequill --proxy http://localhost:5173 ./my-app). LiveQuill adds the bar to its pages and passes hot-reload WebSockets through, while the model edits your components.

What if the model breaks something?

Click Undo in the bar. The files changed by the last request are restored from the backup taken just before the edit, and you can undo several requests in a row. To go further back, open Versions (the clock button), preview the version you want, and click Go back to this version.

Where is my data stored, and how do I uninstall?

Your providers, keys and sites live in ~/.config/livequill/config.json. Each project gets a .livequill/ folder with its backups and conversation history. To uninstall, run curl -fsSL https://ybucaille.github.io/livequill/install.sh | sh -s -- --uninstall (or pipx uninstall livequill, or delete the cloned folder). Then delete ~/.config/livequill/ and the .livequill/ folders you no longer need.

I only have the Claude Desktop or ChatGPT app. Does it work?

Yes. LiveQuill finds the agent built into the app and uses it with your existing sign-in, so there is no CLI to install and no API key to create. See Desktop apps, no CLI needed.

Which local model should I pick?

A 7B model or larger that supports tool calls, such as qwen2.5:7b-instruct, qwen3 or llama3.1. Smaller models work for simple edits, but get lost more often in big files.

Contributing

Contributions are welcome: adapters, themes, roadmap items, fixes and translations (the interface is in English; a new language is one JSON file, see CONTRIBUTING). Start with CONTRIBUTING.md. Every pull request runs the full CI (tests on Linux and macOS for Python 3.10 to 3.14, lint, secret scan, CodeQL) and is reviewed by the maintainer before merging.

python3 -m unittest discover -s tests     # about 8 s, no network
node tests/e2e/browser.mjs                # real headless Chrome: edit → reload → undo → versions

License

MIT © 2026 Ybucaille

Metadata

Release files for livequill 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for livequill 0.3.0
File Size Uploaded Provenance
livequill-0.3.0.tar.gz 122.9 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for livequill 0.3.0
File Interpreter ABI Platform
livequill-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 233.4 kB

Release files / livequill-0.3.0.tar.gz

Download URL livequill-0.3.0.tar.gz
Size 122.9 kB
Tags Source
SHA-256 checksum
How to use checksums
0d4783a25a9b76043687a17aaf91cbbabd9c43a15d184d106850aa45ca748709
BLAKE2b-256 checksum
How to use checksums
9ce62c36e54f836334d3544bce5392a869908234e005ebb6fc6ecae88698d4f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

Release files / livequill-0.3.0-py3-none-any.whl

Download URL livequill-0.3.0-py3-none-any.whl
Size 110.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b24463d82f49f4e6bf4273210765a4be37b1f507e226df03273fb5f8bbb68ad
BLAKE2b-256 checksum
How to use checksums
0f72091db8704bcef108d69923990f9bcb95dc2510b24a954dbb0a3a5f93e7a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

Security for livequill 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for livequill-0.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page