Stop writing curl.
Use your API like this instead:
orion inspect openapi.yaml
orion list
orion call get:/users/1Orion is a task-first CLI that turns your OpenAPI spec into a usable runtime.
Working with APIs usually looks like this:
curl -X GET https://api.example.com/users/1 \
-H "Authorization: Bearer ..." \
-H "Content-Type: application/json"You need to:
- remember endpoints
- construct requests manually
- guess payloads
- jump between docs and terminal
orion inspect openapi.yaml
orion list
orion search users
orion call get:/users/{id} --param id=1- operations instead of endpoints
- OpenAPI as source of truth
- no context switching
- works locally
- usable by humans and AI agents
git clone https://github.com/michalwiacek/orion-cli
cd orion-cli
./setup.sh
orion inspect openapi.yaml
orion listNeed full command and flag reference? See docs/cli-reference.md.
orion inspect <spec>
orion list
orion describe <operation-id>
orion call <operation-id>orion call get:/items/{id} --param id=123orion call post:/auth/login \
--body '{"email":"a@b.com","password":"x"}'orion search usersorion describe get:/health- OpenAPI parsing (local + remote)
- operation-first CLI
- request generation from schema
- history + rerun
- profiles and environments
- fuzzy search (
orion search) - curl export (
orion curl) - offline mode (cache)
- AI-native hooks (
--for-agent,plan,explain) - HTTP shortcuts (
orion get /health, etc.)
Orion is not a wrapper around curl.
It operates on a different level:
- curl → HTTP layer
- Orion → operation layer
Instead of thinking in endpoints and payloads, you work with actions defined in OpenAPI.
./setup.shzig build install --prefix ~/.local- Zig 0.15.x
Config is loaded from two layers:
- Global:
~/.config/orion/config.json - Project: nearest
.orion/config.json
Project config overrides global config.
Example:
{
"base_url": "https://api.example.com",
"openapi_spec": "./openapi.yaml"
}With base_url configured:
orion call /usersYou can call:
orion call get:/healthorion call get:/items/{id} --param id=123 --query limit=10orion call post:/auth/register \
--body '{"email":"a@b.com","password":"x"}'orion curl get:/items/{id} --param id=123Supports:
--pretty
--output text|json
-- --http1.1 --connect-timeout 5--param key=value→ path params--query key=value→ query params--body json|@file.json→ request body--dry-run→ show request without sending--output text|json→ machine-friendly output
orion doctor→ validate configorion history→ list callsorion rerun <id>→ replayorion search <query>→ find operationsorion example <operation-id>→ generate payloadorion explain <operation-id>→ explain floworion cache refresh→ refresh cacheorion profile add/list/remove→ manage profilesorion use <profile>→ switch contextorion current→ show active profile
orion list reads operations from configured spec.
orion describe expects:
<method>:<path>Example:
orion describe get:/healthSupports:
- local refs (
#/components/...) - external file refs (
./common.yaml#...) - HTTP refs (
https://...) - JSON Pointer escapes (
~0,~1)
Actively developed.
CLI flags and output format may still evolve.
Orion is a foundation for:
- CLI-first API workflows
- AI-assisted system interaction
- local-first tooling
- optional control plane in the future
PRs welcome.
MIT
