A powerful Terminal User Interface (TUI) HTTP client
Combining Lazygit's elegant interface with Postman's API testing capabilities
Features โข Installation โข Quick Start โข Shortcuts โข Documentation โข Contributing
LazyCurl is designed for developers who live in the terminal. It combines:
- Elegant Interface โ Lazygit's proven multi-panel layout with vim motions
- Powerful Features โ Postman's comprehensive HTTP testing capabilities
- File-Based Storage โ Simple, versionable JSON/YAML files you can commit to git
- Keyboard-First โ Full vim-style navigation, no mouse required
โโCollectionsโโโโโโโโโฌโRequestโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ POST {{base_url}}/api/users โ
โ โผ My API โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โถ Users โ Params โ Auth โ Headers โ Body โ
โ GET /users โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ POST /users โ { โ
โ GET /users/:idโ "name": "John Doe", โ
โ โถ Products โ "email": "{{user_email}}" โ
โ โ } โ
โ โโResponseโโโโโโโโโโโโโโโโโโโโโโโโ-โค
โ โ 201 Created โ 142ms โ 1.2 KB โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ { โ
โ โ "id": 123, โ
โ โ "name": "John Doe" โ
โ โ } โ
โโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
NORMAL โ POST โ My API > Users > Create User โ dev โ ?:help
| Feature | Description |
|---|---|
| Multi-Panel Layout | Collections, Request Builder, Response Viewer in one view |
| Vim Motions | Navigate with h/j/k/l, modes (NORMAL, INSERT, VIEW, COMMAND) |
| HTTP Methods | GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS |
| Collections | Organize requests in folders, stored as JSON files |
| Environments | Multiple environments with variable substitution {{var}} |
| Variable System | Environment variables + built-in system variables |
| Search | Filter collections and environments with / |
| WhichKey | Press ? for context-aware keybinding hints |
| Command Mode | Vim-style commands with : prefix |
| Mouse Support | Click to select, scroll to navigate |
| Session Persistence | Automatic save/restore of application state |
- URL with variable substitution (
{{base_url}}/api/users) - Headers with key-value editor
- Body Types: JSON, Form Data, Raw Text, Binary
- Query Parameters with interactive table
- Authorization: Bearer Token, API Key, Basic Auth
- Formatted Output: JSON syntax highlighting
- Status Badges: Color-coded (2xx green, 4xx orange, 5xx red)
- Metadata: Response time, size, headers
- Tabs: Body, Headers, Cookies, Console
- Request/Response Logging: View chronological history of all HTTP requests made during session
- Visual Status Indicators: Color-coded badges for 2xx/3xx/4xx/5xx responses and network errors
- Quick Actions: Resend requests, copy headers/body/error to clipboard
- Vim Navigation: Browse history with j/k, expand entries with Enter/l
- Automatic State Saving: Application state is saved automatically on changes
- Seamless Restore: Resume exactly where you left off when reopening
- What's Saved: Active panel, selected request, active environment, expanded folders, scroll positions, active tabs
- Smart Debouncing: 500ms delay prevents excessive writes during rapid changes
- Atomic Writes: Safe file operations using temp file + rename pattern
- Graceful Degradation: Missing or invalid session files are handled silently
{
"name": "Development",
"variables": {
"base_url": { "value": "http://localhost:3000", "active": true },
"api_token": { "value": "secret-token", "secret": true, "active": true }
}
}Built-in System Variables:
{{$timestamp}}โ Unix timestamp{{$datetime}}โ RFC3339 datetime{{$uuid}}โ UUID v4{{$randomInt}}โ Random integer{{$random}}โ Random alphanumeric string
- Go 1.21 or higher
- Terminal with Unicode support
# Clone the repository
git clone https://github.com/kbrdn1/LazyCurl.git
cd LazyCurl
# Build
make build
# Run
./bin/lazycurl
# Or install globally
make installgo install github.com/kbrdn1/LazyCurl/cmd/lazycurl@latest# Live reload during development
make devcd your-api-project
lazycurlLazyCurl automatically creates a .lazycurl/ directory:
.lazycurl/
โโโ config.yaml # Workspace settings
โโโ collections/ # Your API collections
โ โโโ example.json
โโโ environments/ # Environment files
โโโ development.json
- Press
nto create a new request - Enter request details (name, method, URL)
- Press
Enterto confirm - Press
Ctrl+Sto send the request
- Press
2orTabto switch to Environments tab - Press
nto create a variable - Use
{{variable_name}}in your URLs and body
| Mode | Indicator | Description |
|---|---|---|
| NORMAL | NORMAL (blue) |
Default mode, navigate and execute commands |
| INSERT | INSERT (gray) |
Text input mode for editing fields |
| VIEW | VIEW (green) |
Read-only browsing of responses |
| COMMAND | COMMAND (orange) |
Execute commands with : prefix |
| Key | Action |
|---|---|
h / l |
Switch panels (left/right) |
j / k |
Move up/down in lists |
g / G |
Jump to top/bottom |
1 / 2 |
Switch tabs (Collections/Environments) |
Tab |
Next tab in request builder |
| Key | Action |
|---|---|
n |
New request |
N |
New folder |
c / i |
Edit request |
R |
Rename |
d |
Delete |
D |
Duplicate |
y |
Yank (copy) |
p |
Paste |
/ |
Search |
Enter / Space |
Open request |
| Key | Action |
|---|---|
n |
New variable |
N |
New environment |
c / i |
Edit value |
R |
Rename |
d |
Delete |
D |
Duplicate |
a / A |
Toggle active |
s |
Toggle secret |
S / Enter |
Select environment |
/ |
Search |
| Key | Action |
|---|---|
1 |
Body tab |
2 |
Cookies tab |
3 |
Headers tab |
4 |
Console tab (request history) |
Tab / Shift+Tab |
Next/previous tab |
j / k |
Scroll content / navigate list |
g / G |
Jump to top/bottom |
| Key | Action |
|---|---|
j / k |
Navigate up/down in history |
g / G |
Jump to first/last entry |
Enter / l |
Expand selected entry |
R |
Resend selected request |
U |
Copy URL to clipboard |
| Key | Action |
|---|---|
Esc / h / q |
Collapse back to list |
R |
Resend request |
H |
Copy headers |
B |
Copy body |
E |
Copy error message |
C |
Copy cookies |
I |
Copy request info |
A |
Copy all (request & response) |
| Key | Action |
|---|---|
n |
Next match |
N |
Previous match |
i |
Edit search query |
Esc |
Clear search |
Enter / Space |
Open selected item |
| Key | Action |
|---|---|
Ctrl+S |
Send request |
? |
Show keybinding help (WhichKey) |
: |
Enter command mode |
Esc |
Return to NORMAL mode |
q |
Quit |
| Command | Action |
|---|---|
:q |
Quit |
:w |
Save |
:wq |
Save and quit |
:help |
Show help |
:ws list |
List workspaces |
your-project/
โโโ .lazycurl/
โ โโโ config.yaml # Workspace configuration
โ โโโ session.yml # Session state (auto-generated)
โ โโโ collections/
โ โ โโโ api.json # Collection file
โ โ โโโ admin.json
โ โโโ environments/
โ โโโ development.json # Environment file
โ โโโ staging.json
โ โโโ production.json
โโโ ...
~/.config/lazycurl/
โโโ config.yaml # Global settings, themes, keybindings
{
"name": "My API",
"description": "API collection description",
"folders": [
{
"name": "Users",
"requests": [
{
"id": "req_001",
"name": "Get All Users",
"method": "GET",
"url": "{{base_url}}/api/users",
"headers": {
"Authorization": "Bearer {{token}}"
}
},
{
"id": "req_002",
"name": "Create User",
"method": "POST",
"url": "{{base_url}}/api/users",
"headers": {
"Content-Type": "application/json"
},
"body": {
"name": "{{user_name}}",
"email": "{{user_email}}"
}
}
]
}
]
}{
"name": "Development",
"description": "Local development environment",
"variables": {
"base_url": {
"value": "http://localhost:3000",
"active": true
},
"token": {
"value": "dev-secret-token",
"secret": true,
"active": true
},
"user_name": {
"value": "Test User",
"active": true
}
}
}LazyCurl uses the Catppuccin Mocha color scheme:
| Element | Color |
|---|---|
| Primary (Selection) | Lavender #b4befe |
| Secondary | Blue #89b4fa |
| Success/Active | Green #a6e3a1 |
| Warning | Peach #fab387 |
| Error | Red #f38ba8 |
| Text | White #cdd6f4 |
| Background | Base #1e1e2e |
HTTP Method Colors:
- GET/HEAD: Green
- POST: Orange
- PUT: Blue
- PATCH: Purple
- DELETE: Red
- OPTIONS: Brown
Full documentation is available in the docs/ directory:
| Document | Description |
|---|---|
| Installation | Complete installation guide |
| Getting Started | First steps with LazyCurl |
| Keybindings | Complete keyboard reference |
| Configuration | Config files and options |
| Collections | Managing request collections |
| Environments | Variables and environments |
| StatusBar | StatusBar component and modes |
| Architecture | Technical architecture |
make build # Build binary to bin/lazycurl
make run # Build and run
make dev # Live reload with air
make test # Run tests
make test-coverage # Generate coverage report
make fmt # Format code
make lint # Run linter
make clean # Clean build artifacts
make build-all # Cross-compile for all platformsLazyCurl/
โโโ cmd/lazycurl/ # Application entry point
โโโ internal/
โ โโโ api/ # HTTP client, collections, environments
โ โโโ config/ # Configuration management
โ โโโ format/ # Response formatting
โ โโโ ui/ # User interface
โ โโโ components/ # Reusable UI components
โ โโโ *.go # Panel implementations
โโโ pkg/styles/ # Catppuccin theme and styles
โโโ docs/ # Documentation
โโโ Makefile
Contributions are welcome! Please read our Contributing Guide for details.
# Fork and clone
git clone https://github.com/YOUR_USERNAME/LazyCurl.git
cd LazyCurl
# Create feature branch
git checkout -b feat/#123-your-feature
# Make changes and commit (using Gitmoji)
git commit -m "โจ feat(ui): add new feature"
# Push and create PR
git push origin feat/#123-your-featureWe use Gitmoji + Conventional Commits:
โจ feat(scope): add new feature
๐ fix(scope): fix bug
๐ docs(scope): update documentation
โป๏ธ refactor(scope): refactor code
๐จ style(scope): improve styling
โ
test(scope): add tests
- Lazygit-style multi-panel interface
- Vim-style navigation and modes
- Workspace system with file-based storage
- Configuration system (global + workspace)
- Collections and environments management
- Collection tree view with folders
- Environment management with variables
- Request builder UI
- Search functionality
- WhichKey keybinding hints
- HTTP request execution
- Response formatting
- CI/CD pipeline
- Responsive panel layout (horizontal on 80x24 terminals) #7
- Fullscreen panel toggle (
Fin NORMAL mode,h/lto navigate) #8 - Find in editors (
/in NORMAL mode) #24 - Settings Panel (
Ctrl+;fullscreen with Global/Workspace tabs) #25 - Console tab in Response Panel (request/response history) #9
- Improved statusbar rendering and display #10
- Session persistence (
.lazycurl/session.yml) #11 - Theme system refactoring #12
- Theme management and custom themes #13
- Import/export Postman collections #14
- Request history #15
- Pre-request & post-response scripting (JavaScript via Goja) #35
- Authentication helpers (OAuth2, AWS Sig) #17
- GraphQL support #18
- WebSocket testing #19
- gRPC support #20
- CLI commands architecture #26
This project is licensed under the MIT License - see the LICENSE file for details.
LazyCurl is built on the shoulders of giants:
- Lazygit โ Inspiration for the TUI design
- Postman โ Inspiration for API testing features
- Bubble Tea โ TUI framework
- Lipgloss โ Terminal styling
- Catppuccin โ Color scheme
Made with โค๏ธ by @kbrdn1