Zero-Config AI-Powered Web UIs for ANY CLI Tool
Project description
Termify
The Zero-Config, AI-Powered Web UI Engine for ANY CLI Tool.
Stop writing Web UIs for your scripts. Let AI do it in less than 1 second.
🚀 The Massive Problem
Developers write thousands of incredibly useful CLI scripts (Python, Bash, Node.js, Go). However, non-technical teammates (PMs, Marketers, Sales, Designers) often can't use them because:
- The terminal is intimidating.
- They don't know how to install package dependencies.
- Passing complex arguments (flags, paths, enums) is highly error-prone.
Building a dedicated web dashboard (using React, Vue, Next.js, or even Streamlit) for every single internal script is a massive waste of engineering time. It takes days to build, style, and maintain.
⚡ The Solution: Termify
Termify solves this instantly and automatically.
By simply prepending termify to your command (e.g., termify python my_script.py), Termify uses a Large Language Model (Google Gemini) to dynamically execute your script's --help output, generates a structured JSON schema of all arguments, and instantly boots a gorgeous, interactive Glassmorphism Web UI on localhost:8000.
Your teammates can fill out a beautiful UI form, hit "Execute", and watch the terminal output stream live in their browser via WebSockets.
ZERO code changes required to your original script.
🎬 See it in action:
Your browser does not support the video tag.✨ Why Termify is World-Class
- 🪄 Absolute Zero-Config: No decorators (unlike
@Gooey), no forced UI frameworks (unlikeGradio/Streamlit). It just works out of the box with your existing code. - 🌍 100% Language Agnostic: It doesn't care if you wrote your script in Bash, Go, Rust, Python, Node, or Ruby. If it responds to
--help, Termify can webify it. - 🧠 AI-Powered Introspection: Uses Gemini 2.5 Flash to perfectly understand argument constraints, types, choices, and descriptions, mapping them perfectly to web UI elements (Toggles, Dropdowns, Date-pickers, Number inputs).
- ⚡ Real-time Streaming Engine: Streams
stdoutandstderrvia WebSockets directly to an embedded, syntax-highlighted web terminal. It forces unbuffered execution so the text streams character-by-character exactly like a real terminal. - 🎨 Ultra-Premium UI: Ships with a visually stunning, responsive, dark-mode Glassmorphism UI built with Tailwind CSS. Complete with ambient glowing backgrounds and animated interactions.
🏗️ Deep Dive: How the Architecture Works
Termify operates in 5 distinct asynchronous stages:
graph TD
A[User runs: termify ./script.sh] --> B(Introspection Phase);
B -->|Executes ./script.sh --help| C(LLM Parsing Engine);
C -->|Pipes raw text to Gemini AI| D{JSON Schema Generation};
D -->|Identifies flags, types, defaults| E[FastAPI Server Boot];
E -->|Serves Glassmorphism React UI| F(User Web Dashboard);
F -->|User hits 'Execute'| G[WebSocket Command Reassembly];
G -->|asyncio.subprocess unbuffered execution| H((Live Terminal Streaming));
H -->|Pipes stdout/stderr| F;
- Introspection: Termify executes your command appended with
--help(e.g.,python script.py --help). - AI Translation: The raw, unstructured help text is piped to Gemini, which is prompted to act as a strict structured data extractor. It returns a definitive JSON array of objects representing form fields (
name,type,required,default,choices). - Web Server Boot: A lightweight Python FastAPI server spins up on
localhost. - Dynamic Frontend Rendering: The frontend fetches the schema and dynamically constructs the UI. Booleans become toggle switches, enums become dropdowns, and strings become styled inputs.
- Execution & Streaming: When the user clicks Execute, the payload is sent back via WebSockets.
asyncio.subprocessexecutes the reconstructed command withPYTHONUNBUFFERED=1and streams the raw terminal output directly back to the browser's embedded terminal window.
📦 Installation
pip install termify-ai
🛠️ Advanced Usage Guide
1. Set your API Key
Termify uses Google Gemini to parse the CLI arguments dynamically. It is incredibly fast and highly cost-effective (often falling completely within the free tier).
export GEMINI_API_KEY="your_google_gemini_api_key"
(Tip: Add this to your ~/.zshrc or ~/.bashrc so it's always ready!)
2. Run Termify on ANY command
Just wrap your normal command with termify.
For Python Scripts:
termify python train_model.py
For Bash Scripts:
termify ./deploy_infrastructure.sh
For Node.js Apps:
termify node scrape_data.js
For Native Binaries (Go/Rust/C++):
termify ./my_go_binary
3. Open the Web UI
Navigate to http://localhost:8000. You will instantly see a fully styled Tailwind CSS form with all the arguments, dropdowns, and toggles inferred automatically from your script.
🗺️ Roadmap & Future Vision
Termify is just getting started. Here is what we are building next:
- Multi-Page Apps: Support for CLI tools with subcommands (e.g.,
docker runvsdocker build), generating a sidebar navigation for each subcommand. - Authentication Middleware: Built-in basic auth so you can safely expose your Termify server to the internet for remote teams.
- History & Logging: A built-in SQLite database that tracks who ran what command, when, and saves the terminal output for auditing.
- Custom Themes: Allow passing a
--theme lightor--theme cyberpunkflag to instantly change the UI aesthetic.
🤝 Contributing Guidelines
We welcome all contributions! Whether it's a bug fix, UI enhancement, or documentation update, we'd love to have you on board.
- Fork the repository on GitHub.
- Clone your fork locally:
git clone https://github.com/your-username/Termify.git - Create a feature branch:
git checkout -b feature/AmazingFeature - Make your changes: Ensure you write clean, documented code.
- Commit your changes:
git commit -m 'feat: Add some AmazingFeature' - Push to the branch:
git push origin feature/AmazingFeature - Open a Pull Request against the
mainbranch.
Please ensure you test the frontend changes by running python termify/main.py python test_cli.py to verify the UI still dynamically generates correctly.
❓ FAQ
Q: Do I need to modify my Python/Bash code to use Termify?
A: No. Zero code changes are required. Termify entirely relies on your script's standard --help output. If your script doesn't have a --help flag, Termify won't work.
Q: Why Gemini and not OpenAI? A: We currently use Gemini 2.5 Flash because it is incredibly fast (under 1 second inference) and highly accurate at structured JSON extraction. We plan to support OpenAI and local LLMs (Ollama) in a future release!
Q: Is the API call made every time I run a command in the Web UI? A: No. The LLM is only called once when you start the Termify server to generate the UI schema. Executing commands from the Web UI does not trigger any LLM API calls, making it completely free and instantaneous for end-users.
📜 License
Distributed under the MIT License. Built passionately for the open-source community to make internal tooling accessible to everyone.
Project details
Release history Release notifications | RSS feed
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 termify_ai-1.0.0.tar.gz.
File metadata
- Download URL: termify_ai-1.0.0.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
942a6e12f2edcf9a3cfc65567322884761ad665a93878ac44d3010995dc2c007
|
|
| MD5 |
b6e046f7bc2f29d5f765298c1c39dcf1
|
|
| BLAKE2b-256 |
a67b540d7e4a89ca4f8c95cb67dbef853ce51061bd32c8d805dee806cc5211ef
|
File details
Details for the file termify_ai-1.0.0-py3-none-any.whl.
File metadata
- Download URL: termify_ai-1.0.0-py3-none-any.whl
- Upload date:
- Size: 9.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a7d78ba639c4cee5154b506cc972b4ea7c45d84dc568f4fb4f29d6a2860de9d
|
|
| MD5 |
8316f56e307e9e28410a6fe59df01d73
|
|
| BLAKE2b-256 |
9afb64974897f8827017acbb2930c55ea7ca7372d96f577bd0ad709ca6b534d8
|