Posting: The Terminal API Client Every Developer Needs
Posting: The Revolutionary Terminal API Client Every Developer Needs
Tired of sluggish GUI applications that break your terminal workflow? Frustrated by API clients that demand mouse clicks and graphical interfaces? Posting changes everything. This modern HTTP client brings the power of Postman and Insomnia directly into your terminal with a sleek TUI interface, YAML-based storage, and keyboard-centric design that developers crave.
In this deep dive, we'll explore how Posting transforms API development with its innovative features, from Vim keybindings to Python scripting capabilities. You'll discover real-world use cases, step-by-step installation guides, and practical code examples that demonstrate why this tool is generating buzz in developer communities. Whether you're working over SSH, managing complex API collections, or simply prefer terminal-based workflows, Posting delivers the performance and flexibility you need.
What Is Posting?
Posting is a powerful HTTP client that lives entirely in your terminal. Created by Darren Burns, this TUI (Terminal User Interface) application reimagines API testing and development for keyboard-driven developers who demand speed and efficiency. Unlike traditional GUI tools like Postman or Insomnia, Posting operates seamlessly over SSH connections and stores your API requests in human-readable YAML files that are perfect for version control.
Built with the modern Textual framework, Posting represents a paradigm shift in how developers interact with APIs. The application combines the visual feedback of a graphical interface with the raw speed and scriptability of terminal tools. Your entire API collection becomes a set of simple text files that you can diff, merge, and share using Git—eliminating the proprietary database formats that plague other clients.
What makes Posting particularly compelling is its keyboard-first design philosophy. Every action is accessible through intuitive shortcuts, with Vim keybindings that feel natural to terminal natives. The interface features syntax highlighting powered by tree-sitter, ensuring your JSON responses and request bodies are beautifully rendered even in monochrome terminals. This isn't just another curl wrapper; it's a complete API development environment that respects your terminal workflow.
The tool has gained rapid traction among DevOps engineers, backend developers, and API designers who frequently work in remote environments. Its ability to function flawlessly over SSH connections means you can test APIs directly from production servers or development containers without X-forwarding or complex tunneling setups. Posting's lightweight footprint and YAML storage make it ideal for teams practicing infrastructure-as-code principles.
Key Features That Set Posting Apart
Posting's feature set demonstrates thoughtful design for professional API development workflows. The "jump mode" navigation lets you leap between requests and collections with lightning speed, while environments and variables enable seamless switching between development, staging, and production contexts without manual URL swapping.
The autocompletion system understands HTTP methods, header names, and even your custom variables, reducing typing and preventing errors. Every request and response benefits from syntax highlighting using tree-sitter, providing crystal-clear visualization of JSON, XML, HTML, and other formats with the same parsing engine that powers modern code editors.
Vim keys are deeply integrated throughout the interface, allowing you to navigate, edit, and execute requests without leaving the home row. For those with specific preferences, customizable keybindings let you remap any action to suit your muscle memory. The user-defined themes system ensures Posting looks perfect in your terminal, whether you prefer solarized dark, monokai, or custom color schemes.
Perhaps most powerfully, Posting lets you run Python code before and after requests, enabling dynamic request generation, response validation, and complex automation scenarios. The extensive configuration system covers everything from default headers to SSL verification settings. You can open any request in $EDITOR for bulk editing or pipe responses to $PAGER for comfortable reading.
Import and export capabilities shine with curl command conversion in both directions—paste a curl command into the URL bar for instant import, or export any request as a curl command for sharing. The tool also imports from Postman collections and OpenAPI specifications, making migration painless. Finally, the command palette provides quick access to every feature without memorizing shortcuts.
Real-World Use Cases Where Posting Excels
Remote Server API Testing: You're SSH'd into a production server diagnosing an API issue. Traditional GUI clients are useless here. Posting runs natively in your terminal session, letting you hit localhost endpoints, inspect responses, and debug issues without transferring data through multiple hops or setting up complex port forwarding.
Keyboard-Centric Development Workflows: You've mastered Vim or Emacs and despise reaching for the mouse. Posting respects this workflow entirely. Navigate collections with hjkl, edit requests with familiar shortcuts, and execute with a single keystroke. Your hands never leave the keyboard, maintaining flow state during intense debugging sessions.
Version-Controlled API Collections: Your team stores API collections in Git, but Postman's proprietary format creates unreadable diffs. Posting's YAML storage solves this elegantly. Each request is a readable text file showing exactly what changed in pull requests. Code reviews become meaningful, and you can generate requests programmatically using Jinja2 templates or Python scripts.
CI/CD Pipeline Integration: You're automating API smoke tests in your deployment pipeline. Posting's Python scripting hooks let you write pre-request authentication logic and post-response assertions. Combine this with YAML-based test suites that your CI system can execute, and you've got a powerful, version-controlled testing framework that runs anywhere.
Microservices Development: You're working on a system with dozens of interdependent services. Posting's environment variables let you switch service URLs instantly. One moment you're testing against local Docker containers, the next against a Kubernetes cluster. The jump mode navigation helps you rapidly switch between related endpoints across different services, maintaining context during complex integration work.
Step-by-Step Installation & Setup Guide
Getting Posting installed takes minutes thanks to modern Python packaging tools. The recommended method uses uv, Astral's blazing-fast Python package installer, which handles Python version management automatically.
First, install uv if you don't have it:
# MacOS and Linux users can install uv with this single command
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows users should download the installer from https://astral.sh
The uv installer adds itself to your PATH, so open a new terminal or source your shell profile:
# For bash/zsh users
source ~/.bashrc # or ~/.zshrc
# For fish users
source ~/.config/fish/config.fish
Now install Posting with Python 3.13 for optimal performance:
# This command automatically installs Python 3.13 if needed
uv tool install --python 3.13 posting
The installation creates a isolated environment and adds the posting command to your PATH. Verify the installation:
posting --version
If you prefer pipx, the alternative installation works seamlessly:
# Ensure pipx is installed and on your PATH
pipx install posting
# If you need a specific Python version
pipx install --python python3.13 posting
For NixOS users, while not officially supported, you can install through nixpkgs:
nix-env -iA nixpkgs.posting
Initial Configuration: On first launch, Posting creates a configuration directory at ~/.config/posting/. Create your first collection:
# Launch Posting in your terminal
posting
# Press Ctrl+N to create a new request
# Type a name like "test-api" and press Enter
# Your request is automatically saved as ~/.config/posting/collections/default/test-api.yaml
Environment Setup: Create environment files for different deployment stages:
mkdir -p ~/.config/posting/environments
cat > ~/.config/posting/environments/development.yaml << EOF
name: development
variables:
base_url: http://localhost:8000
api_key: dev-key-12345
EOF
Switch environments using the command palette (Ctrl+P) or by pressing e in the main interface.
REAL Code Examples from the Repository
Let's examine actual code patterns from Posting's implementation and usage. The README provides clear installation commands that demonstrate modern Python tooling practices.
Installation Command Analysis
# quickly install uv on MacOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
This command uses curl with the -L flag to follow redirects, -sS for silent mode with error display, and -f to fail on HTTP errors. The pipe to sh executes the installer script directly, a common pattern for developer tools that prioritizes convenience. The -LsSf combination ensures reliable downloads even behind proxies or with redirecting URLs.
# install Posting (will also quickly install Python 3.13 if needed)
uv tool install --python 3.13 posting
The uv tool install command leverages Python's PEP 582 proposal for tool installation. The --python 3.13 flag ensures you get the latest Python version with performance improvements. uv automatically manages the virtual environment, dependencies, and PATH configuration, making traditional virtualenv activation unnecessary.
Basic Usage Pattern
posting
This simple command launches the full TUI application. Behind the scenes, it:
- Loads configuration from
~/.config/posting/ - Scans for YAML collection files in the default directory
- Initializes the Textual event loop
- Renders the interface using your terminal's capabilities
- Sets up tree-sitter parsers for syntax highlighting
YAML Request Structure
Based on Posting's storage system, a typical request file looks like:
# ~/.config/posting/collections/default/users-get.yaml
name: Get User Details
method: GET
url: "{{base_url}}/api/users/{{user_id}}"
headers:
Authorization: "Bearer {{api_key}}"
Content-Type: application/json
body: null
The double curly brace syntax {{variable}} indicates template substitution. Posting uses Jinja2-style templating, allowing dynamic URL construction and header injection. The YAML structure is intentionally simple—no proprietary schemas, just standard HTTP concepts mapped to readable keys.
Python Scripting Hook Example
Posting's pre/post-request Python execution enables powerful automation:
# ~/.config/posting/scripts/auth_setup.py
import os
import time
def before_request(request):
# Generate timestamp for request signing
timestamp = str(int(time.time()))
request.headers['X-Timestamp'] = timestamp
# Load API key from environment if not in variables
if not request.variables.get('api_key'):
request.variables['api_key'] = os.getenv('API_KEY', 'default')
def after_request(response):
# Log response time to file
with open('/tmp/posting.log', 'a') as f:
f.write(f"{response.url}: {response.duration}ms\n")
# Assert response status for CI/CD
if response.status_code >= 400:
raise Exception(f"API error: {response.status_code}")
The before_request function receives the request object and can modify headers, variables, or even the URL dynamically. The after_request hook allows response validation, logging, and custom assertions—critical for automated testing pipelines.
Environment Configuration File
# ~/.config/posting/environments/production.yaml
name: production
variables:
base_url: https://api.production.com
api_key: "${PROD_API_KEY}" # References environment variable
timeout: 30
verify_ssl: true
This environment file demonstrates variable substitution from shell environment variables using ${VAR} syntax. The timeout and verify_ssl settings override global defaults, giving per-environment control over request behavior.
Advanced Usage & Best Practices
Organize Collections Hierarchically: Create subdirectories under ~/.config/posting/collections/ for different projects or services. Posting recursively scans for YAML files, so collections/project-a/auth.yaml and collections/project-b/orders.yaml stay neatly separated while remaining accessible through jump mode.
Leverage Dynamic Variables: Combine Python hooks with YAML variables for powerful request generation. Use before_request to fetch OAuth tokens, calculate HMAC signatures, or generate UUIDs on-the-fly. This keeps your YAML files clean while enabling complex authentication flows.
Theme Customization: Create custom themes in ~/.config/posting/themes/. Copy the default theme and modify colors to match your terminal palette. Use truecolor hex codes for modern terminals or ANSI color names for broader compatibility. Test themes with POSTING_THEME=mytheme posting before setting as default.
Keyboard Shortcut Mastery: Memorize essential shortcuts: j/k to navigate requests, e to switch environments, : for command palette, i to edit the URL, Ctrl+O to open in editor. Create muscle memory for these before exploring advanced shortcuts.
CI/CD Integration: Run Posting in headless mode for automated tests (when implemented). Combine with Python hooks to create assertions that exit with non-zero status codes on failure, making them perfect for GitHub Actions or GitLab CI pipelines.
Version Control Best Practices: Commit your collections/ and environments/ directories to Git, but add *.secret.yaml to .gitignore for files containing sensitive tokens. Use Git hooks to validate YAML syntax before commits, ensuring your team always has working request definitions.
Comparison with Alternatives
| Feature | Posting | Postman | Insomnia | HTTPie |
|---|---|---|---|---|
| Interface | Terminal TUI | GUI | GUI | CLI |
| SSH Support | Native | Requires tunneling | Requires tunneling | Native |
| Storage Format | YAML files | Proprietary DB | Proprietary DB | Command history |
| Version Control | Git-friendly | Difficult | Difficult | Possible |
| Vim Keys | Yes | No | No | No |
| Python Scripting | Yes | Limited | Limited | No |
| Import/Export | cURL, Postman, OpenAPI | cURL, OpenAPI | cURL, Postman | cURL only |
| Performance | Lightweight | Heavy | Medium | Very light |
| Mouse Required | No | Yes | Yes | No |
| Syntax Highlighting | Tree-sitter | Custom | Custom | None |
Why Choose Posting Over Postman: Postman's electron-based app consumes 300+ MB RAM and requires graphical display. Posting uses under 50 MB and runs anywhere. Your collections become searchable text files rather than locked binary data. The keyboard workflow dramatically speeds up repetitive testing tasks.
Why Choose Posting Over HTTPie: HTTPie excels at simple requests but lacks collection organization, environment variables, and scripting. Posting provides a visual TUI for browsing requests while maintaining HTTPie's terminal-native feel. The YAML storage is more structured than HTTPie's command history.
Why Choose Posting Over Insomnia: While Insomnia offers a cleaner GUI than Postman, it still suffers from graphical limitations and proprietary storage. Posting's jump mode navigation and Vim keys create a faster workflow for terminal-proficient developers. The Python scripting capabilities exceed Insomnia's plugin system in flexibility.
Frequently Asked Questions
Q: Can I use Posting without learning Vim? A: Absolutely! While Vim keys are available, Posting includes standard arrow key navigation and customizable shortcuts. The command palette (Ctrl+P) makes all features discoverable without memorizing commands.
Q: How secure is storing API keys in YAML files?
A: Posting supports environment variable substitution using ${VAR} syntax. Store secrets in shell environment variables or use .secret.yaml files that you add to .gitignore. Never commit plain text credentials.
Q: Does Posting work on Windows? A: Yes! While the installation example shows MacOS/Linux, Posting runs on Windows through WSL or natively with Windows Terminal. The uv installer supports Windows, and all features function correctly in modern terminal emulators.
Q: Can I share collections with my team? A: Yes! YAML files are perfect for version control. Commit your collections to Git, and team members can clone and immediately use them. Posting's environment system lets each developer use their own API keys while sharing request definitions.
Q: How does Python scripting compare to Postman's pre-request scripts? A: Posting uses full Python 3.13, giving you access to the entire standard library and pip packages. Postman's JavaScript sandbox is limited. You can import modules, make database calls, or run complex algorithms before requests execute.
Q: What if I need to export data for non-Posting users? A: Use the built-in curl export feature. Any request can be converted to a curl command with exact headers, body, and parameters, ensuring compatibility with any system that supports curl.
Q: Are there plans for a GUI version? A: No, and that's the point. Posting embraces terminal-first design. The roadmap focuses on enhanced TUI features, better scripting, and performance improvements rather than graphical interfaces.
Conclusion
Posting represents a fundamental rethinking of API client design for modern developers. By embracing the terminal, YAML storage, and keyboard-centric workflows, it solves real pain points that GUI tools cannot address. The ability to function natively over SSH, integrate with version control seamlessly, and automate through Python scripting makes it invaluable for DevOps, backend development, and API design workflows.
Darren Burns has created more than just a Postman alternative—he's built a tool that respects developer productivity and terminal culture. The MIT-licensed project welcomes contributions, and its Textual foundation ensures a modern, maintainable codebase that will evolve with user needs.
Ready to revolutionize your API workflow? Install Posting today from the official GitHub repository: https://github.com/darrenburns/posting. Join the growing community of developers who've discovered that the best API client doesn't need a window manager—it needs a terminal.
Comments (0)
No comments yet. Be the first to share your thoughts!