 Command

Pranesh Nikhar's personal site. Vim-style keybinds for navigation; theme + font pickers below.

Theme
 Font Body Code
Reader
Keybinds
Navigation
j / ↓ Next item k / ↑ Previous item g First item in region G Last item in region zz Center focused item h / l Move left/right region ] / [ Next/previous heading } / { Next/previous block d / u Half-page down/up
Layout
<zh> / <zl> Toggle left/right sidebar <zr> Toggle reader view <zj> / <zk> Focus main/navbar <S-h/j/k/l> Focus left/main/navbar/right ⌃H / ⌃L Focus left/right sidebar ⌃J / ⌃K Focus main/navbar ⇧C / ⇧E Collapse / expand all sections
Dialogs
⌃P / : Command palette ⌃X Theme picker / Search ? Show keybinds Esc / ⌃C Close dialog
History
n Next document b Previous document ⌃O History back ⌃I History forward
 Search
about: Pranesh Nikhar about/more: πŸͺͺ More docs/test: Docs Test ideas: πŸ’‘ Ideas more: βž• More now: Now posts: πŸ“¬ Posts projects: πŸ“š Projects webtui: Style posts/agentic-eda: πŸ“Š AgenticEDA β€” Automated Exploratory Data Analysis with LangGraph posts/cap-theorem-outage-story: 🌐 CAP Theorem with a Real Outage Story posts/codepilot: ✈️ CodePilot β€” From Requirements to Deployable FastAPI Backend posts/common-auth-mistakes: πŸ” Common Auth Mistakes Developers Make posts/compiled-vs-jit-vs-interpreted: ⚑ Why Is X Language Fast or Slow? β€” Compiled vs JIT vs Interpreted posts/cs-degree-gaps: πŸŽ“ Things CS Degrees Don't Teach You posts/cve-2025-breach-analysis: πŸ›‘οΈ CVE-2025 Breach Analysis β€” Midnight Blizzard and the 16 Billion Credential Leak posts/fixloop: πŸ”„ FixLoop β€” AI Agent Loop for Self-Correcting Code posts/functional-vs-oop: ⚑ Functional vs OOP β€” Same Problem, Both Ways posts/getman: 🦾 Getman β€” Declarative API Tester for CLI & TUI posts/how-compilers-optimize: βš™οΈ How Compilers Actually Optimize Your Code posts/http3-quic: ⚑ HTTP/3 and QUIC β€” Why They Matter posts/leetcode-vs-engineering: 🧩 LeetCode vs Real Engineering Skills posts/llm-from-scratch: 🧠 LLM from Scratch β€” GPT-Style Transformer in PyTorch posts/lsm-trees-bloom-filters: 🌳 LSM Trees & Bloom Filters β€” Production Deep Dive posts/mcp-workflow-builder: πŸ”§ MCP Workflow Builder β€” Visual DAG for MCP Tools posts/persistent-memory: 🧠 Persistent Memory β€” Long-Term Memory for AI Agents via MCP posts/playcli: 🎬 PlayCLI β€” Terminal Video Player posts/postgres-mvcc: πŸ—„οΈ How PostgreSQL MVCC Works β€” Multi-Version Concurrency Control Deep Dive posts/raft-consensus: β›΅ Raft Consensus Algorithm Explained posts/rust-borrow-checker: πŸ¦€ Rust Borrow Checker β€” Catches Real Bugs posts/titan: πŸ€– Titan β€” Terminal AI Coding Agent posts/what-happens-url: 🌐 What Happens Between Typing a URL and Seeing the Page posts/what-happens-when-you-run-a-program: βš™οΈ What Actually Happens When You Run a Program posts/zero-knowledge-proofs: πŸ” Zero-Knowledge Proofs Explained Simply webtui/components/accordion: Accordion webtui/components/badge: Badge webtui/components/button: Button webtui/components/checkbox: Checkbox webtui/components/dialog: Dialog webtui/components/input: Input webtui/components/popover: Popover webtui/components/pre: Pre webtui/components/progress: Progress webtui/components/radio: Radio webtui/components/range: Range webtui/components/separator: Separator webtui/components/spinner: Spinner webtui/components/switch: Switch webtui/components/table: Table webtui/components/textarea: Textarea webtui/components/tooltip: Popover webtui/components/typography: Typography webtui/components/view: View webtui/contributing/contributing: Contributing webtui/contributing/contributing: ## Local Development webtui/contributing/contributing: ## Issues webtui/contributing/contributing: ## Pull Requests webtui/contributing/style-guide: Style Guide webtui/contributing/style-guide: ## CSS Units webtui/contributing/style-guide: ## Selectors webtui/contributing/style-guide: ## Documentation webtui/installation/astro: Astro webtui/installation/astro: ## Scoping webtui/installation/astro: ### Frontmatter Imports webtui/installation/astro: ### β€Ήstyleβ€Ί tag webtui/installation/astro: ### Full Library Import webtui/installation/nextjs: Next.js webtui/installation/vite: Vite webtui/plugins/plugin-dev: Developing Plugins webtui/plugins/plugin-dev: ### Style Layers webtui/plugins/plugin-nf: Nerd Font Plugin webtui/plugins/theme-catppuccin: Catppuccin Theme webtui/plugins/theme-custom: Custom Theme webtui/plugins/theme-everforest: Everforest Theme webtui/plugins/theme-gruvbox: Gruvbox Theme webtui/plugins/theme-nord: Nord Theme webtui/plugins/theme-vitesse: Vitesse Theme webtui/start/ascii-boxes: ASCII Boxes webtui/start/changelog: Changelog webtui/start/installation: Installation webtui/start/installation: ## Installation webtui/start/installation: ## Using CSS webtui/start/installation: ## Using ESM webtui/start/installation: ## Using a CDN webtui/start/installation: ## Full Library Import webtui/start/installation: ### CSS webtui/start/installation: ### ESM webtui/start/installation: ### CDN webtui/start/intro: Introduction webtui/start/intro: ## Features webtui/start/plugins: Plugins webtui/start/plugins: ## Official Plugins webtui/start/plugins: ### Themes webtui/start/plugins: ## Community Plugins webtui/start/theming: Theming webtui/start/theming: ## CSS Variables webtui/start/theming: ### Font Styles webtui/start/theming: ### Colors webtui/start/theming: ### Light & Dark webtui/start/theming: ## Theme Plugins webtui/start/theming: ### Using Multiple Theme Accents webtui/start/tuis-vs-guis: TUIs vs GUIs webtui/start/tuis-vs-guis: ## Monospace Fonts webtui/start/tuis-vs-guis: ## Character Cells
 Theme Current: Light j/k or ↑/↓ + Enter

🦾 Getman β€” Declarative API Tester for CLI & TUI

Define API routes in TOML config files, run them from terminal or TUI with assertions and extractors. Like Postman for your shell, with CI-friendly output.

🎯 What It Does

Getman is a CLI and TUI tool for testing HTTP APIs. Define your API routes in simple TOML configuration files, then run them from the command line with automatic assertions, response extraction, and CI-friendly JSON reports.

$ getman run collections/api.toml
βœ“ GET /api/users β†’ 200 (342ms)
βœ“ POST /api/users β†’ 201 (156ms)
βœ— GET /api/users/:id β†’ 404 (expected 200)

It supports parallel execution, environment variable interpolation, dynamic request chaining, and a full Textual TUI for interactive exploration.


🧱 Tech Stack

ComponentTechnology
LanguagePython 3.10+
CLIClick
HTTPhttpx (async)
TUITextual
ConfigTOML (tomli)
Extractionjmespath
Env varspython-dotenv

πŸ—οΈ Architecture

getman/
β”œβ”€β”€ cli.py          # Click CLI: run, list, tui subcommands
β”œβ”€β”€ collection.py   # TOML loading β†’ Collection/RouteConfig/ClientConfig dataclasses
β”œβ”€β”€ client.py       # httpx AsyncClient builder from config
β”œβ”€β”€ runner.py       # Async request execution orchestration
β”œβ”€β”€ extractors.py   # Response extraction strategies
β”œβ”€β”€ reporter.py     # Output formatting + JSON report
β”œβ”€β”€ tui.py          # Textual App with route list, detail panel, result log
└── errors.py       # Custom exceptions

πŸ“‹ TOML Route Definitions

Routes are declared in TOML files β€” clean, readable, and version-controllable:

[env]
base_url = "https://api.example.com"
token = "${API_TOKEN}"

[[routes]]
name = "List Users"
method = "GET"
path = "/users"
expected = 200

[[routes]]
name = "Create User"
method = "POST"
path = "/users"
headers = { Authorization = "Bearer ${token}" }
body = { name = "Alice", email = "alice@example.com" }
expected = 201

[[routes]]
name = "Get User"
method = "GET"
path = "/users/${userId}"
expected = 200

πŸ”§ Response Extractors

Extract and inspect parts of the response:

ExtractorDescription
bodyExtract full response body
headerExtract a specific response header
regexExtract by regex pattern
jsonExtract by JMESPath / dot-path
debugPrint full response for debugging
discardSkip storing this route’s output

Routes can reference extracted values from previous routes using session variables, enabling request chaining:

[[routes]]
name = "Create User"
extract = { userId = "json(.id)" }

[[routes]]
name = "Get Created User"
path = "/users/${userId}"

πŸ–₯️ TUI Mode

The Textual TUI provides an interactive three-panel layout:

  • Left: Route list with check/status indicators
  • Center: Route detail view with request/response panels
  • Bottom: Execution log with timestamps and results

Navigate with arrow keys, run individual routes or entire collections, and inspect responses without leaving the terminal.


πŸ“Š CI Integration

Getman produces JSON reports suitable for CI pipelines:

getman run collections/api.toml --report report.json

Exit code is 0 if all assertions pass, 1 if any fail β€” standard CI convention. The JSON report includes per-route timing, status codes, and assertion results.


πŸš€ Quick Start

pip install getman

# Create a collection
getman init > api.toml

# List routes
getman list api.toml

# Run all routes
getman run api.toml

# Run matching routes (regex filter)
getman run api.toml --filter "user"

# Launch TUI
getman tui api.toml

πŸ’‘ Why It’s Interesting

Getman solves a real pain: testing APIs should not require a GUI tool or writing pytest boilerplate. The TOML-as-config approach means your API tests are declarative, readable, and live in version control alongside your code. Parallel execution, variable interpolation, JMESPath extraction, and CI-friendly output make it a legitimate alternative to Postman for developer workflows β€” entirely in your terminal.

 praneshnikhar.site / posts / getman Β· Top 1:1