Renzo
A terminal-based HTML editor that makes building websites fast, visual, and keyboard-driven.
Renzo is a CLI tool that lets you edit HTML files directly in your terminal. It gives you a live tree view of your document structure, an inline property inspector, and a real-time browser preview — all without ever touching a text editor.
Features
- tag tree view — See your entire HTML structure as a collapsible tree
- Inline property editor — Edit tag attributes directly from the terminal
- Tag search — Browse and insert HTML tags by name with descriptions
- Live browser preview — Your page hot-reloads in the browser as you edit (served at
http://127.0.0.1:5090) - Clipboard save — Copy the generated HTML to your clipboard instantly with
Ctrl+S
Requirements
- Python 3.8+
- pip packages:
pip install blessed flask pyperclip
- NOTE : not all of these packages work with the pipx command so please use pip install blessed flask pyperclip --break-system-packages if you are on linux
- package will be auto installed if you run them through pip
Running Renzo
pip install renzo
renzo
The browser preview will be available at http://127.0.0.1:5090 immediately on launch.
Interface Layout
The terminal is split into two panels:
┌─────────────────────────┬─────────────────────────┐
│ tags │ Inspector │
│ │ │
│ └─html │ lang : en │
│ ├─head │ │
│ └─body │ │
│ > └─h1 │ │
│ │ │
├─────────────────────────┴─────────────────────────┤
│ Arrow keys to navigate | Enter to Edit | Esc back│
│ Webpage hosted at: 127.0.0.1:5090 │
└───────────────────────────────────────────────────┘
- Left panel — The tag tree. Navigate with arrow keys, edit text tags inline.
- Right panel — The property inspector for the currently selected tag.
Keybindings
tag Tree (left panel)
| Key | Action |
|---|---|
j / ↑ |
Move selection up |
k / ↓ |
Move selection down |
Enter |
Edit selected text tag / open property inspector |
Esc |
Confirm edit and return |
n |
Open tag search to insert a new tag |
i |
Insert a new text (inner) tag below selection |
x |
Delete selected tag/property |
Ctrl+↓ |
Move tag down |
Ctrl+↑ |
Move tag up |
Ctrl+→ |
Increase tag indent |
Ctrl+← |
Decrease tag indent |
Ctrl+Shift+↓ |
Move tag group down |
Ctrl+Shift+↑ |
Move tag group up |
Ctrl+S |
Save (copies HTML to clipboard) |
Property Inspector (right panel)
| Key | Action |
|---|---|
↑ / ↓ |
Navigate between properties |
Enter |
Edit selected property value (or toggle boolean) |
Esc |
Confirm edit / return to tag tree |
n |
Add a new property |
x |
Delete selected property |
Tag Search panel
| Key | Action |
|---|---|
| Any character | Type to filter tags |
↑ / ↓ |
Navigate results |
Enter |
Insert selected tag as a child of current tag |
Esc |
Close and return to tag tree |
Workflow Example
Here is a typical flow for adding a styled button to your page:
- Navigate to the
bodytag in the tree - Press
nto open tag search, typebutton, pressEnterto insert it - Press
Enteron the newbuttontag to open the property inspector - Press
nto add aclassproperty, typebtn, pressEnter - Press
Escto return to the tree - Press
ito insert inner text, typeClick me, pressEnter - Check your browser at
http://127.0.0.1:5090to see the result - Press
Ctrl+Sto copy the finished HTML to your clipboard
Project Structure
renzo/
├── main.py # Entry point, rendering loop, keyboard input
├── inspector.py # tag tree panel, property editor, HTML parser, tag classes
├── file.py # HTML state, serialisation, clipboard save
├── network.py # Flask server + SSE stream for live browser preview
├── tagSearch.py # Tag search panel
├── htmlTags.json # Tag database used by search
└── renzo.png # Project logo
How the HTML state works
Renzo parses your HTML into a flat list of tag and inner objects, each with an indent level that represents nesting. When you make edits, file.convertToString() rebuilds the full HTML string from that list and network.py streams the update to the browser over SSE so the preview refreshes automatically.
Known Limitations
- The HTML loaded on startup is hardcoded in
file.py(currentFile). To edit your own file, replace that string with your HTML. - Very large documents may cause rendering slowness in the terminal due to full-screen redraws on every frame.
- Ctrl+Shift+Up/Down (group move) has some edge-case bugs with deeply nested structures.
License
MIT
Metadata
Release files for renzo 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| renzo-0.1.5.tar.gz | 13.3 kB | Without provenance | Details for renzo-0.1.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| renzo-0.1.5-py3-none-any.whl | Python 3 | none | any | Details for renzo-0.1.5-py3-none-any.whl |
Total release size: 26.1 kB
Release files / renzo-0.1.5.tar.gz
| Download URL | renzo-0.1.5.tar.gz |
|---|---|
| Size | 13.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c272c69ab4bb0288949cb82c6c9a812ce0935ab5520793c797b921dfcd6f4aef
|
|
BLAKE2b-256 checksum How to use checksums |
d7c0d769bf9f0bdb27e7b0bc070f5d9d5fbfc2c11996acac1bda4895b10e3b51
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Release files / renzo-0.1.5-py3-none-any.whl
| Download URL | renzo-0.1.5-py3-none-any.whl |
|---|---|
| Size | 12.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
47ae6c96d14dfddcdb944e2bef54979138bc4df0d347bd06574d73df31152be2
|
|
BLAKE2b-256 checksum How to use checksums |
771e50a6082669e6746c2f5adaf22774be37398d9a0c7ecbbd5ed311d6ab223e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Security for renzo 0.1.5
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
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.