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.
- livequill-0.2.0/LICENSE +21 -0
- livequill-0.2.0/PKG-INFO +285 -0
- livequill-0.2.0/README.md +275 -0
- livequill-0.2.0/livequill/__init__.py +3 -0
- livequill-0.2.0/livequill/__main__.py +5 -0
- livequill-0.2.0/livequill/adapters/__init__.py +65 -0
- livequill-0.2.0/livequill/adapters/anthropic.py +128 -0
- livequill-0.2.0/livequill/adapters/base.py +88 -0
- livequill-0.2.0/livequill/adapters/cli.py +245 -0
- livequill-0.2.0/livequill/adapters/gemini.py +113 -0
- livequill-0.2.0/livequill/adapters/ollama.py +103 -0
- livequill-0.2.0/livequill/adapters/openai.py +160 -0
- livequill-0.2.0/livequill/agent.py +446 -0
- livequill-0.2.0/livequill/cli.py +56 -0
- livequill-0.2.0/livequill/config.py +137 -0
- livequill-0.2.0/livequill/net.py +61 -0
- livequill-0.2.0/livequill/sandbox.py +590 -0
- livequill-0.2.0/livequill/server.py +876 -0
- livequill-0.2.0/livequill/static/hub.html +241 -0
- livequill-0.2.0/livequill/static/overlay.js +485 -0
- livequill-0.2.0/livequill/static/setup.html +603 -0
- livequill-0.2.0/livequill.egg-info/PKG-INFO +285 -0
- livequill-0.2.0/livequill.egg-info/SOURCES.txt +34 -0
- livequill-0.2.0/livequill.egg-info/dependency_links.txt +1 -0
- livequill-0.2.0/livequill.egg-info/entry_points.txt +2 -0
- livequill-0.2.0/livequill.egg-info/top_level.txt +1 -0
- livequill-0.2.0/pyproject.toml +30 -0
- livequill-0.2.0/setup.cfg +4 -0
- livequill-0.2.0/tests/test_adapters.py +248 -0
- livequill-0.2.0/tests/test_agent.py +116 -0
- livequill-0.2.0/tests/test_hardening.py +204 -0
- livequill-0.2.0/tests/test_integration.py +218 -0
- livequill-0.2.0/tests/test_packaging.py +35 -0
- livequill-0.2.0/tests/test_sandbox.py +135 -0
- livequill-0.2.0/tests/test_server.py +255 -0
- livequill-0.2.0/tests/test_versions.py +125 -0
livequill-0.2.0/LICENSE
ADDED
|
@@ -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.
|
livequill-0.2.0/PKG-INFO
ADDED
|
@@ -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
|
+
[](https://github.com/Ybucaille/livequill/actions/workflows/ci.yml)
|
|
19
|
+
[](https://github.com/Ybucaille/livequill/actions/workflows/codeql.yml)
|
|
20
|
+
[](https://www.python.org/)
|
|
21
|
+
[](pyproject.toml)
|
|
22
|
+
[](LICENSE)
|
|
23
|
+
[](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
|
+
[](https://github.com/Ybucaille/livequill/actions/workflows/ci.yml)
|
|
9
|
+
[](https://github.com/Ybucaille/livequill/actions/workflows/codeql.yml)
|
|
10
|
+
[](https://www.python.org/)
|
|
11
|
+
[](pyproject.toml)
|
|
12
|
+
[](LICENSE)
|
|
13
|
+
[](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
|