A CLI HTML Editor that makes it easy to create websites.
Project description
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
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file renzo-0.1.5.tar.gz.
File metadata
- Download URL: renzo-0.1.5.tar.gz
- Upload date:
- Size: 13.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c272c69ab4bb0288949cb82c6c9a812ce0935ab5520793c797b921dfcd6f4aef
|
|
| MD5 |
776a61a53bb00908f77a9f3d68094e28
|
|
| BLAKE2b-256 |
d7c0d769bf9f0bdb27e7b0bc070f5d9d5fbfc2c11996acac1bda4895b10e3b51
|
File details
Details for the file renzo-0.1.5-py3-none-any.whl.
File metadata
- Download URL: renzo-0.1.5-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
47ae6c96d14dfddcdb944e2bef54979138bc4df0d347bd06574d73df31152be2
|
|
| MD5 |
ace82ded1d4c55c7722689dac81bf0f9
|
|
| BLAKE2b-256 |
771e50a6082669e6746c2f5adaf22774be37398d9a0c7ecbbd5ed311d6ab223e
|