livequill 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. livequill-0.2.0/LICENSE +21 -0
  2. livequill-0.2.0/PKG-INFO +285 -0
  3. livequill-0.2.0/README.md +275 -0
  4. livequill-0.2.0/livequill/__init__.py +3 -0
  5. livequill-0.2.0/livequill/__main__.py +5 -0
  6. livequill-0.2.0/livequill/adapters/__init__.py +65 -0
  7. livequill-0.2.0/livequill/adapters/anthropic.py +128 -0
  8. livequill-0.2.0/livequill/adapters/base.py +88 -0
  9. livequill-0.2.0/livequill/adapters/cli.py +245 -0
  10. livequill-0.2.0/livequill/adapters/gemini.py +113 -0
  11. livequill-0.2.0/livequill/adapters/ollama.py +103 -0
  12. livequill-0.2.0/livequill/adapters/openai.py +160 -0
  13. livequill-0.2.0/livequill/agent.py +446 -0
  14. livequill-0.2.0/livequill/cli.py +56 -0
  15. livequill-0.2.0/livequill/config.py +137 -0
  16. livequill-0.2.0/livequill/net.py +61 -0
  17. livequill-0.2.0/livequill/sandbox.py +590 -0
  18. livequill-0.2.0/livequill/server.py +876 -0
  19. livequill-0.2.0/livequill/static/hub.html +241 -0
  20. livequill-0.2.0/livequill/static/overlay.js +485 -0
  21. livequill-0.2.0/livequill/static/setup.html +603 -0
  22. livequill-0.2.0/livequill.egg-info/PKG-INFO +285 -0
  23. livequill-0.2.0/livequill.egg-info/SOURCES.txt +34 -0
  24. livequill-0.2.0/livequill.egg-info/dependency_links.txt +1 -0
  25. livequill-0.2.0/livequill.egg-info/entry_points.txt +2 -0
  26. livequill-0.2.0/livequill.egg-info/top_level.txt +1 -0
  27. livequill-0.2.0/pyproject.toml +30 -0
  28. livequill-0.2.0/setup.cfg +4 -0
  29. livequill-0.2.0/tests/test_adapters.py +248 -0
  30. livequill-0.2.0/tests/test_agent.py +116 -0
  31. livequill-0.2.0/tests/test_hardening.py +204 -0
  32. livequill-0.2.0/tests/test_integration.py +218 -0
  33. livequill-0.2.0/tests/test_packaging.py +35 -0
  34. livequill-0.2.0/tests/test_sandbox.py +135 -0
  35. livequill-0.2.0/tests/test_server.py +255 -0
  36. livequill-0.2.0/tests/test_versions.py +125 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ybucaille
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,285 @@
1
+ Metadata-Version: 2.4
2
+ Name: livequill
3
+ Version: 0.2.0
4
+ Summary: A floating prompt bar for any local website: any model (API, local or CLI agent) edits your files live.
5
+ License: MIT
6
+ Requires-Python: >=3.10
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Dynamic: license-file
10
+
11
+ <div align="center">
12
+
13
+ # LiveQuill
14
+
15
+ **Edit your local website by asking.**<br>
16
+ A floating prompt bar for any local site: type a change, the model of your choice edits your real files, and the page reloads.
17
+
18
+ [![CI](https://github.com/Ybucaille/livequill/actions/workflows/ci.yml/badge.svg)](https://github.com/Ybucaille/livequill/actions/workflows/ci.yml)
19
+ [![CodeQL](https://github.com/Ybucaille/livequill/actions/workflows/codeql.yml/badge.svg)](https://github.com/Ybucaille/livequill/actions/workflows/codeql.yml)
20
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-3776AB?logo=python&logoColor=white)](https://www.python.org/)
21
+ [![Zero dependencies](https://img.shields.io/badge/dependencies-0-success)](pyproject.toml)
22
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
23
+ [![PRs welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg)](CONTRIBUTING.md)
24
+
25
+ [**Website**](https://ybucaille.github.io/livequill/) · [Quick start](#quick-start) · [Providers](#providers) · [Roadmap](#roadmap) · [FAQ](#faq)
26
+
27
+ <a href="https://ybucaille.github.io/livequill/"><img src="docs/demo.gif" alt="LiveQuill demo: first launch, a provider is set up, a site is added and opened, a request turns the title red, then Undo restores it" width="860"></a>
28
+
29
+ <sub>A real, unedited first run: setup → add a site → “make the hero title red” → Undo → switch theme. <a href="docs/demo.mp4">MP4 version</a>.</sub>
30
+
31
+ </div>
32
+
33
+ ## Highlights
34
+
35
+ - **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.
36
+ - **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.
37
+ - **All your sites in one place.** A dashboard lists your projects. Each one is served as-is or behind your dev server (Vite, Next, Astro…).
38
+ - **Safe by default.** Sandboxed file tools, a backup before every edit, one-click **Undo**, and API keys that never reach the browser.
39
+ - **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.
40
+ - **Nothing to install in your project.** The bar is added while pages are served, never written to disk. **Zero dependencies**: just Python.
41
+
42
+ ## Quick start
43
+
44
+ You need **Python 3.10+**, nothing else. Runs on Linux and macOS (Windows is not supported).
45
+
46
+ ```bash
47
+ curl -fsSL https://ybucaille.github.io/livequill/install.sh | sh
48
+ livequill
49
+ ```
50
+
51
+ The script installs a single file, `livequill.pyz` from the [latest release](https://github.com/Ybucaille/livequill/releases/latest), 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.
52
+
53
+ <details>
54
+ <summary>Other ways to install</summary>
55
+
56
+ | | |
57
+ |---|---|
58
+ | **pipx / uv** | `pipx install livequill` or `uv tool install livequill` (from [PyPI](https://pypi.org/project/livequill/)) |
59
+ | **Single file** | Download `livequill.pyz` from a [release](https://github.com/Ybucaille/livequill/releases) and run `python3 livequill.pyz` |
60
+ | **From source** | `git clone https://github.com/Ybucaille/livequill.git && ./livequill/bin/livequill` |
61
+
62
+ </details>
63
+
64
+ Press <kbd>Ctrl</kbd>+<kbd>C</kbd> in the terminal to stop it.
65
+
66
+ 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.
67
+ 2. **Add a site.** You land on **Mes sites** (the interface is in French for now). Add a project folder, or the URL of your running dev server.
68
+ 3. **Open it and ask.** The site opens with the floating bar. Try *“make the hero title red”*, watch it change, then click **Undo**.
69
+
70
+ Handy shortcuts:
71
+
72
+ ```bash
73
+ livequill ~/projects/my-site # add this folder and open it
74
+ livequill --proxy http://localhost:5173 ~/projects/app # same, behind your dev server
75
+ ```
76
+
77
+ <details>
78
+ <summary>All command-line options</summary>
79
+
80
+ | Option | Description |
81
+ |---|---|
82
+ | `FOLDER` | Add this folder to your sites (if needed) and open it. Without it, the dashboard opens. |
83
+ | `--proxy URL` | Serve `FOLDER` behind an existing dev server instead of serving its files. |
84
+ | `--port N` | Dashboard port on `127.0.0.1` (default `8777`). Each site gets its own port after it. |
85
+ | `--config FILE` | Alternative config file (default `~/.config/livequill/config.json`). |
86
+ | `--no-open` | Do not open the browser. |
87
+
88
+ </details>
89
+
90
+ ## Screenshots
91
+
92
+ <table>
93
+ <tr>
94
+ <td width="50%"><img src="docs/images/hub.jpg" alt="Mes sites dashboard"></td>
95
+ <td width="50%"><img src="docs/images/setup.jpg" alt="Provider setup page"></td>
96
+ </tr>
97
+ <tr>
98
+ <td><b>Mes sites.</b> Add, edit, open or stop each project. Every site runs on its own port, with its own history.</td>
99
+ <td><b>Setup.</b> Each provider shows <b>Available</b> (connection checked live), <b>Detected</b> (one click away), or a link to get a key.</td>
100
+ </tr>
101
+ <tr>
102
+ <td><img src="docs/images/hero.jpg" alt="Floating bar with the live answer"></td>
103
+ <td><img src="docs/images/themes.png" alt="Claude, ChatGPT, Gemini and Minimal themes"></td>
104
+ </tr>
105
+ <tr>
106
+ <td><b>Live panel.</b> The answer streams in, with the tools called and the files changed. It survives the reload.</td>
107
+ <td><b>Themes.</b> Claude, ChatGPT, Gemini and Minimal, in light and dark, following your system.</td>
108
+ </tr>
109
+ </table>
110
+
111
+ ## What the bar can do
112
+
113
+ | | |
114
+ |---|---|
115
+ | **Models** | Every configured model in one menu, grouped by provider. Switch without restarting. **Reasoning** and **Fast** only appear when the model supports them. |
116
+ | **Attachments** | + button, paste or drag and drop (15 MB per file). Images go in as vision input when supported, text files are inlined. |
117
+ | **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. |
118
+ | **History** | Earlier requests of the project are replayed as plain text, so context survives a model switch. **New** starts over. |
119
+ | **Undo** | Restores the files changed by the last request. Works several times in a row, and for CLI agents too. |
120
+ | **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. |
121
+ | **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. |
122
+
123
+ ## Providers
124
+
125
+ | Provider | What you need |
126
+ |---|---|
127
+ | **Anthropic** | API key from [console.anthropic.com](https://console.anthropic.com/settings/keys). Effort levels on Claude 4.6+, **Fast** on Opus 5.5 / 5 / 4.8. |
128
+ | **OpenAI** | API key from [platform.openai.com](https://platform.openai.com/api-keys). `reasoning_effort` on o-series and gpt-5. |
129
+ | **Google Gemini** | API key from [aistudio.google.com](https://aistudio.google.com/apikey). Thinking budget (2.5) or level (3). |
130
+ | **Mistral** | API key from [console.mistral.ai](https://console.mistral.ai/api-keys). |
131
+ | **OpenRouter** | API key from [openrouter.ai/keys](https://openrouter.ai/keys). Capabilities are read for each model. |
132
+ | **Ollama** | `ollama serve`, then `ollama pull qwen2.5:7b-instruct` (any model listing `tools`). |
133
+ | **LM Studio** | *Developer* tab → *Start server*. |
134
+ | **llama.cpp** | `llama-server -m model.gguf --jinja`. |
135
+ | **Other** | Any OpenAI-compatible server (vLLM, LocalAI, Jan, Groq, DeepSeek…): base URL, optional key, model name. |
136
+ | **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. |
137
+ | **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. |
138
+ | **Gemini CLI** | `gemini` installed. *Experimental: not tested yet.* |
139
+
140
+ ### Desktop apps, no CLI needed
141
+
142
+ 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 *“Trouvé dans l’app Claude Desktop”*, the connection test checks that you are signed in, and the newest version is picked every time the app updates itself.
143
+
144
+ | App | Where LiveQuill looks |
145
+ |---|---|
146
+ | Claude Desktop | `~/.config/Claude/claude-code/<version>/…/claude` (Linux), `~/Library/Application Support/Claude/claude-code/<version>/…/claude` (macOS) |
147
+ | ChatGPT | `/usr/lib/chatgpt/resources/codex` (Linux), `/Applications/ChatGPT.app/Contents/Resources/codex` (macOS) |
148
+ | Codex app | `/Applications/Codex.app/Contents/Resources/codex` (macOS) |
149
+
150
+ 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.
151
+
152
+ > [!TIP]
153
+ > Keys already in your environment (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `MISTRAL_API_KEY`, `OPENROUTER_API_KEY`) are detected. Only the variable name is stored, never the key.
154
+
155
+ ## Security
156
+
157
+ LiveQuill lets a model touch your files, so the guard rails are on by default:
158
+
159
+ - **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.
160
+ - **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.
161
+ - **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.
162
+ - **Backups first.** Every file is saved to `<project>/.livequill/history/` (private, `700`/`600`) before it changes. That folder ignores itself in git.
163
+ - **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.
164
+
165
+ Found a vulnerability? Please report it privately: see [SECURITY.md](SECURITY.md).
166
+
167
+ ## How it works
168
+
169
+ ```mermaid
170
+ sequenceDiagram
171
+ participant B as Floating bar
172
+ participant S as LiveQuill (site server)
173
+ participant M as Model (API · local · CLI)
174
+ participant F as Project files
175
+ B->>S: request + page context + attachments
176
+ loop until the model answers without tools
177
+ S->>M: messages + tools
178
+ M-->>S: streamed text / tool calls
179
+ S->>F: search · read · edit (sandboxed, backed up)
180
+ S-->>B: live events (text, tools, files)
181
+ end
182
+ S-->>B: reload
183
+ ```
184
+
185
+ <details>
186
+ <summary>Project layout</summary>
187
+
188
+ ```
189
+ bin/livequill launcher (no install needed)
190
+ livequill/
191
+ cli.py command line
192
+ server.py dashboard, per-site servers (folder or proxy), script injection, API, live reload
193
+ agent.py agent loop, tools, text fallback, page context, history
194
+ sandbox.py locked-down paths, file tools, backups and undo
195
+ config.py providers and sites (chmod 600), secret masking
196
+ adapters/ one adapter per provider family
197
+ static/ the bar (overlay.js), setup page, dashboard
198
+ site/ showcase website (GitHub Pages)
199
+ scripts/ demo recorder, JS syntax check
200
+ tests/ unit and integration tests, network mocked
201
+ ```
202
+
203
+ </details>
204
+
205
+ <details>
206
+ <summary>Adding a provider</summary>
207
+
208
+ All provider-specific logic lives in one adapter. `livequill/adapters/base.py` documents the interface and the message format.
209
+
210
+ ```python
211
+ from .base import Adapter, levels
212
+
213
+ class MyAdapter(Adapter):
214
+ kind = 'my-provider'
215
+ default_base = 'https://api.example.com'
216
+
217
+ def list_models(self): ... # -> [{"id", "label", "meta"}]
218
+ def caps(self, model, meta=None): ... # -> {"tools", "vision", "effort", "fast"}
219
+ def build_request(self, model, system, messages, tools, opts): ... # pure, easy to test
220
+ def parse_stream(self, lines): ... # -> delta / thinking / part / stop events
221
+ ```
222
+
223
+ 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')`.
224
+
225
+ </details>
226
+
227
+ ## Roadmap
228
+
229
+ ### Planned
230
+
231
+ - **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.
232
+
233
+ ### Ideas
234
+
235
+ - **Point and ask.** Click an element on the page, like the browser inspector, to scope the request to it: “make *this* button bigger”.
236
+ - **Review before writing.** An optional mode that shows the proposed diff for each file and waits for you to accept or reject it.
237
+
238
+ Want to help with one of them? Open an issue or a pull request.
239
+
240
+ ## FAQ
241
+
242
+ ### Why the name LiveQuill?
243
+
244
+ 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.
245
+
246
+ ### Does my code leave my machine?
247
+
248
+ 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.
249
+
250
+ ### Can I use it without an API key?
251
+
252
+ Yes. Install [Ollama](https://ollama.com/download), 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.
253
+
254
+ ### Does it work with React, Vue, Svelte or Next.js?
255
+
256
+ 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.
257
+
258
+ ### What if the model breaks something?
259
+
260
+ 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 **Revenir à cette version**.
261
+
262
+ ### Where is my data stored, and how do I uninstall?
263
+
264
+ 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.
265
+
266
+ ### I only have the Claude Desktop or ChatGPT app. Does it work?
267
+
268
+ 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](#desktop-apps-no-cli-needed).
269
+
270
+ ### Which local model should I pick?
271
+
272
+ 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.
273
+
274
+ ## Contributing
275
+
276
+ Contributions are welcome: adapters, themes, roadmap items, fixes and translations (the interface is currently in French). Start with [CONTRIBUTING.md](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.
277
+
278
+ ```bash
279
+ python3 -m unittest discover -s tests # about 8 s, no network
280
+ node tests/e2e/browser.mjs # real headless Chrome: edit → reload → undo → versions
281
+ ```
282
+
283
+ ## License
284
+
285
+ [MIT](LICENSE) © 2026 Ybucaille
@@ -0,0 +1,275 @@
1
+ <div align="center">
2
+
3
+ # LiveQuill
4
+
5
+ **Edit your local website by asking.**<br>
6
+ A floating prompt bar for any local site: type a change, the model of your choice edits your real files, and the page reloads.
7
+
8
+ [![CI](https://github.com/Ybucaille/livequill/actions/workflows/ci.yml/badge.svg)](https://github.com/Ybucaille/livequill/actions/workflows/ci.yml)
9
+ [![CodeQL](https://github.com/Ybucaille/livequill/actions/workflows/codeql.yml/badge.svg)](https://github.com/Ybucaille/livequill/actions/workflows/codeql.yml)
10
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-3776AB?logo=python&logoColor=white)](https://www.python.org/)
11
+ [![Zero dependencies](https://img.shields.io/badge/dependencies-0-success)](pyproject.toml)
12
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
13
+ [![PRs welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg)](CONTRIBUTING.md)
14
+
15
+ [**Website**](https://ybucaille.github.io/livequill/) · [Quick start](#quick-start) · [Providers](#providers) · [Roadmap](#roadmap) · [FAQ](#faq)
16
+
17
+ <a href="https://ybucaille.github.io/livequill/"><img src="docs/demo.gif" alt="LiveQuill demo: first launch, a provider is set up, a site is added and opened, a request turns the title red, then Undo restores it" width="860"></a>
18
+
19
+ <sub>A real, unedited first run: setup → add a site → “make the hero title red” → Undo → switch theme. <a href="docs/demo.mp4">MP4 version</a>.</sub>
20
+
21
+ </div>
22
+
23
+ ## Highlights
24
+
25
+ - **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.
26
+ - **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.
27
+ - **All your sites in one place.** A dashboard lists your projects. Each one is served as-is or behind your dev server (Vite, Next, Astro…).
28
+ - **Safe by default.** Sandboxed file tools, a backup before every edit, one-click **Undo**, and API keys that never reach the browser.
29
+ - **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.
30
+ - **Nothing to install in your project.** The bar is added while pages are served, never written to disk. **Zero dependencies**: just Python.
31
+
32
+ ## Quick start
33
+
34
+ You need **Python 3.10+**, nothing else. Runs on Linux and macOS (Windows is not supported).
35
+
36
+ ```bash
37
+ curl -fsSL https://ybucaille.github.io/livequill/install.sh | sh
38
+ livequill
39
+ ```
40
+
41
+ The script installs a single file, `livequill.pyz` from the [latest release](https://github.com/Ybucaille/livequill/releases/latest), 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.
42
+
43
+ <details>
44
+ <summary>Other ways to install</summary>
45
+
46
+ | | |
47
+ |---|---|
48
+ | **pipx / uv** | `pipx install livequill` or `uv tool install livequill` (from [PyPI](https://pypi.org/project/livequill/)) |
49
+ | **Single file** | Download `livequill.pyz` from a [release](https://github.com/Ybucaille/livequill/releases) and run `python3 livequill.pyz` |
50
+ | **From source** | `git clone https://github.com/Ybucaille/livequill.git && ./livequill/bin/livequill` |
51
+
52
+ </details>
53
+
54
+ Press <kbd>Ctrl</kbd>+<kbd>C</kbd> in the terminal to stop it.
55
+
56
+ 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.
57
+ 2. **Add a site.** You land on **Mes sites** (the interface is in French for now). Add a project folder, or the URL of your running dev server.
58
+ 3. **Open it and ask.** The site opens with the floating bar. Try *“make the hero title red”*, watch it change, then click **Undo**.
59
+
60
+ Handy shortcuts:
61
+
62
+ ```bash
63
+ livequill ~/projects/my-site # add this folder and open it
64
+ livequill --proxy http://localhost:5173 ~/projects/app # same, behind your dev server
65
+ ```
66
+
67
+ <details>
68
+ <summary>All command-line options</summary>
69
+
70
+ | Option | Description |
71
+ |---|---|
72
+ | `FOLDER` | Add this folder to your sites (if needed) and open it. Without it, the dashboard opens. |
73
+ | `--proxy URL` | Serve `FOLDER` behind an existing dev server instead of serving its files. |
74
+ | `--port N` | Dashboard port on `127.0.0.1` (default `8777`). Each site gets its own port after it. |
75
+ | `--config FILE` | Alternative config file (default `~/.config/livequill/config.json`). |
76
+ | `--no-open` | Do not open the browser. |
77
+
78
+ </details>
79
+
80
+ ## Screenshots
81
+
82
+ <table>
83
+ <tr>
84
+ <td width="50%"><img src="docs/images/hub.jpg" alt="Mes sites dashboard"></td>
85
+ <td width="50%"><img src="docs/images/setup.jpg" alt="Provider setup page"></td>
86
+ </tr>
87
+ <tr>
88
+ <td><b>Mes sites.</b> Add, edit, open or stop each project. Every site runs on its own port, with its own history.</td>
89
+ <td><b>Setup.</b> Each provider shows <b>Available</b> (connection checked live), <b>Detected</b> (one click away), or a link to get a key.</td>
90
+ </tr>
91
+ <tr>
92
+ <td><img src="docs/images/hero.jpg" alt="Floating bar with the live answer"></td>
93
+ <td><img src="docs/images/themes.png" alt="Claude, ChatGPT, Gemini and Minimal themes"></td>
94
+ </tr>
95
+ <tr>
96
+ <td><b>Live panel.</b> The answer streams in, with the tools called and the files changed. It survives the reload.</td>
97
+ <td><b>Themes.</b> Claude, ChatGPT, Gemini and Minimal, in light and dark, following your system.</td>
98
+ </tr>
99
+ </table>
100
+
101
+ ## What the bar can do
102
+
103
+ | | |
104
+ |---|---|
105
+ | **Models** | Every configured model in one menu, grouped by provider. Switch without restarting. **Reasoning** and **Fast** only appear when the model supports them. |
106
+ | **Attachments** | + button, paste or drag and drop (15 MB per file). Images go in as vision input when supported, text files are inlined. |
107
+ | **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. |
108
+ | **History** | Earlier requests of the project are replayed as plain text, so context survives a model switch. **New** starts over. |
109
+ | **Undo** | Restores the files changed by the last request. Works several times in a row, and for CLI agents too. |
110
+ | **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. |
111
+ | **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. |
112
+
113
+ ## Providers
114
+
115
+ | Provider | What you need |
116
+ |---|---|
117
+ | **Anthropic** | API key from [console.anthropic.com](https://console.anthropic.com/settings/keys). Effort levels on Claude 4.6+, **Fast** on Opus 5.5 / 5 / 4.8. |
118
+ | **OpenAI** | API key from [platform.openai.com](https://platform.openai.com/api-keys). `reasoning_effort` on o-series and gpt-5. |
119
+ | **Google Gemini** | API key from [aistudio.google.com](https://aistudio.google.com/apikey). Thinking budget (2.5) or level (3). |
120
+ | **Mistral** | API key from [console.mistral.ai](https://console.mistral.ai/api-keys). |
121
+ | **OpenRouter** | API key from [openrouter.ai/keys](https://openrouter.ai/keys). Capabilities are read for each model. |
122
+ | **Ollama** | `ollama serve`, then `ollama pull qwen2.5:7b-instruct` (any model listing `tools`). |
123
+ | **LM Studio** | *Developer* tab → *Start server*. |
124
+ | **llama.cpp** | `llama-server -m model.gguf --jinja`. |
125
+ | **Other** | Any OpenAI-compatible server (vLLM, LocalAI, Jan, Groq, DeepSeek…): base URL, optional key, model name. |
126
+ | **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. |
127
+ | **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. |
128
+ | **Gemini CLI** | `gemini` installed. *Experimental: not tested yet.* |
129
+
130
+ ### Desktop apps, no CLI needed
131
+
132
+ 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 *“Trouvé dans l’app Claude Desktop”*, the connection test checks that you are signed in, and the newest version is picked every time the app updates itself.
133
+
134
+ | App | Where LiveQuill looks |
135
+ |---|---|
136
+ | Claude Desktop | `~/.config/Claude/claude-code/<version>/…/claude` (Linux), `~/Library/Application Support/Claude/claude-code/<version>/…/claude` (macOS) |
137
+ | ChatGPT | `/usr/lib/chatgpt/resources/codex` (Linux), `/Applications/ChatGPT.app/Contents/Resources/codex` (macOS) |
138
+ | Codex app | `/Applications/Codex.app/Contents/Resources/codex` (macOS) |
139
+
140
+ 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.
141
+
142
+ > [!TIP]
143
+ > Keys already in your environment (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `MISTRAL_API_KEY`, `OPENROUTER_API_KEY`) are detected. Only the variable name is stored, never the key.
144
+
145
+ ## Security
146
+
147
+ LiveQuill lets a model touch your files, so the guard rails are on by default:
148
+
149
+ - **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.
150
+ - **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.
151
+ - **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.
152
+ - **Backups first.** Every file is saved to `<project>/.livequill/history/` (private, `700`/`600`) before it changes. That folder ignores itself in git.
153
+ - **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.
154
+
155
+ Found a vulnerability? Please report it privately: see [SECURITY.md](SECURITY.md).
156
+
157
+ ## How it works
158
+
159
+ ```mermaid
160
+ sequenceDiagram
161
+ participant B as Floating bar
162
+ participant S as LiveQuill (site server)
163
+ participant M as Model (API · local · CLI)
164
+ participant F as Project files
165
+ B->>S: request + page context + attachments
166
+ loop until the model answers without tools
167
+ S->>M: messages + tools
168
+ M-->>S: streamed text / tool calls
169
+ S->>F: search · read · edit (sandboxed, backed up)
170
+ S-->>B: live events (text, tools, files)
171
+ end
172
+ S-->>B: reload
173
+ ```
174
+
175
+ <details>
176
+ <summary>Project layout</summary>
177
+
178
+ ```
179
+ bin/livequill launcher (no install needed)
180
+ livequill/
181
+ cli.py command line
182
+ server.py dashboard, per-site servers (folder or proxy), script injection, API, live reload
183
+ agent.py agent loop, tools, text fallback, page context, history
184
+ sandbox.py locked-down paths, file tools, backups and undo
185
+ config.py providers and sites (chmod 600), secret masking
186
+ adapters/ one adapter per provider family
187
+ static/ the bar (overlay.js), setup page, dashboard
188
+ site/ showcase website (GitHub Pages)
189
+ scripts/ demo recorder, JS syntax check
190
+ tests/ unit and integration tests, network mocked
191
+ ```
192
+
193
+ </details>
194
+
195
+ <details>
196
+ <summary>Adding a provider</summary>
197
+
198
+ All provider-specific logic lives in one adapter. `livequill/adapters/base.py` documents the interface and the message format.
199
+
200
+ ```python
201
+ from .base import Adapter, levels
202
+
203
+ class MyAdapter(Adapter):
204
+ kind = 'my-provider'
205
+ default_base = 'https://api.example.com'
206
+
207
+ def list_models(self): ... # -> [{"id", "label", "meta"}]
208
+ def caps(self, model, meta=None): ... # -> {"tools", "vision", "effort", "fast"}
209
+ def build_request(self, model, system, messages, tools, opts): ... # pure, easy to test
210
+ def parse_stream(self, lines): ... # -> delta / thinking / part / stop events
211
+ ```
212
+
213
+ 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')`.
214
+
215
+ </details>
216
+
217
+ ## Roadmap
218
+
219
+ ### Planned
220
+
221
+ - **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.
222
+
223
+ ### Ideas
224
+
225
+ - **Point and ask.** Click an element on the page, like the browser inspector, to scope the request to it: “make *this* button bigger”.
226
+ - **Review before writing.** An optional mode that shows the proposed diff for each file and waits for you to accept or reject it.
227
+
228
+ Want to help with one of them? Open an issue or a pull request.
229
+
230
+ ## FAQ
231
+
232
+ ### Why the name LiveQuill?
233
+
234
+ 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.
235
+
236
+ ### Does my code leave my machine?
237
+
238
+ 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.
239
+
240
+ ### Can I use it without an API key?
241
+
242
+ Yes. Install [Ollama](https://ollama.com/download), 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.
243
+
244
+ ### Does it work with React, Vue, Svelte or Next.js?
245
+
246
+ 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.
247
+
248
+ ### What if the model breaks something?
249
+
250
+ 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 **Revenir à cette version**.
251
+
252
+ ### Where is my data stored, and how do I uninstall?
253
+
254
+ 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.
255
+
256
+ ### I only have the Claude Desktop or ChatGPT app. Does it work?
257
+
258
+ 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](#desktop-apps-no-cli-needed).
259
+
260
+ ### Which local model should I pick?
261
+
262
+ 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.
263
+
264
+ ## Contributing
265
+
266
+ Contributions are welcome: adapters, themes, roadmap items, fixes and translations (the interface is currently in French). Start with [CONTRIBUTING.md](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.
267
+
268
+ ```bash
269
+ python3 -m unittest discover -s tests # about 8 s, no network
270
+ node tests/e2e/browser.mjs # real headless Chrome: edit → reload → undo → versions
271
+ ```
272
+
273
+ ## License
274
+
275
+ [MIT](LICENSE) © 2026 Ybucaille
@@ -0,0 +1,3 @@
1
+ """livequill : barre de prompt flottante qui fait éditer un site local par n'importe quel modèle."""
2
+ __version__ = '0.2.0'
3
+ APP = 'livequill'
@@ -0,0 +1,5 @@
1
+ import sys
2
+
3
+ from .cli import main
4
+
5
+ sys.exit(main())