RepoPilotOpen in app →

Julien-cpsn/ATAC

A simple API client (postman like) in your terminal

Healthy

Healthy across all four use cases

weakest axis
Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit 2mo ago
  • 10 active contributors
  • MIT licensed
Show all 6 evidence items →
  • CI configured
  • Tests present
  • Single-maintainer risk — top contributor 89% of recent commits

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/julien-cpsn/atac)](https://repopilot.app/r/julien-cpsn/atac)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/julien-cpsn/atac on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: Julien-cpsn/ATAC

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Julien-cpsn/ATAC shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

GO — Healthy across all four use cases

  • Last commit 2mo ago
  • 10 active contributors
  • MIT licensed
  • CI configured
  • Tests present
  • ⚠ Single-maintainer risk — top contributor 89% of recent commits

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live Julien-cpsn/ATAC repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/Julien-cpsn/ATAC.

What it runs against: a local clone of Julien-cpsn/ATAC — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in Julien-cpsn/ATAC | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 90 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>Julien-cpsn/ATAC</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Julien-cpsn/ATAC. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/Julien-cpsn/ATAC.git
#   cd ATAC
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of Julien-cpsn/ATAC and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Julien-cpsn/ATAC(\\.git)?\\b" \\
  && ok "origin remote is Julien-cpsn/ATAC" \\
  || miss "origin remote is not Julien-cpsn/ATAC (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift — was MIT at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "src/app/app.rs" \\
  && ok "src/app/app.rs" \\
  || miss "missing critical file: src/app/app.rs"
test -f "src/app/business_logic/request/http/send.rs" \\
  && ok "src/app/business_logic/request/http/send.rs" \\
  || miss "missing critical file: src/app/business_logic/request/http/send.rs"
test -f "src/app/business_logic/collection.rs" \\
  && ok "src/app/business_logic/collection.rs" \\
  || miss "missing critical file: src/app/business_logic/collection.rs"
test -f "src/app/files/mod.rs" \\
  && ok "src/app/files/mod.rs" \\
  || miss "missing critical file: src/app/files/mod.rs"
test -f "src/app/startup/startup.rs" \\
  && ok "src/app/startup/startup.rs" \\
  || miss "missing critical file: src/app/startup/startup.rs"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 90 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~60d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Julien-cpsn/ATAC"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

ATAC is a terminal-based API client (similar to Postman or Insomnia) written in Rust that lets developers send HTTP/WebSocket requests, manage collections, and test APIs entirely from the CLI without a GUI or account. It supports request types, authentication methods, environment variables, scripts, response inspection, and file-based collection storage in JSON/YAML. Monolithic Rust binary architecture: src/ contains the core request/TUI logic; example_resources/ holds sample collections, environments, and key bindings (TOML/JSON); .github/workflows drives CI/CD. Collections stored as JSON/YAML files in user directories; themes and keybindings are separate TOML config files.

👥Who it's for

Developers, DevOps engineers, and API testers who prefer keyboard-driven workflows, remote servers, or minimalist tooling over GUI clients like Postman. Users who want offline-first, account-free API testing with version-control-friendly collection files.

🌱Maturity & risk

Actively developed (v0.23.0 released, Rust 1.90+ required, CI/CD via GitHub Actions). The repo has robust GitHub workflows for building, testing, and releasing Docker images. Production-ready for daily use, though at pre-1.0.0 semantic versioning suggests some API stability caveats.

Single maintainer (Julien-cpsn) with moderate dependency footprint (reqwest, ratatui, edtui, tui-tree-widget). No obvious stale commits visible in metadata, but risk concentrates around TUI framework stability (ratatui v0.30.0 pinned). Heavy reliance on WebSocket handling via reqwest-websocket and cookie management via reqwest_cookie_store.

Active areas of work

Active feature development: version 0.23.0 recently released. TODO v1.0.0 and v2.0.0 milestones exist in the README. GitHub workflows automated Docker builds and Rust checks. Spellchecker and linting enabled via CI.

🚀Get running

git clone https://github.com/Julien-cpsn/ATAC.git
cd ATAC
rustup default 1.90  # or compatible
cargo build --release
cargo run  # or ./target/release/atac

Daily commands: After cargo build --release, run ./target/release/atac or cargo run. Docker via docker build -t atac . && docker run -it atac. Install system-wide with cargo install atac --locked.

🗺️Map of the codebase

  • src/app/app.rs — Main application state and lifecycle manager—every contributor must understand how the app initializes, processes events, and manages global state
  • src/app/business_logic/request/http/send.rs — Core HTTP request execution logic—handles request formatting, sending, and response parsing for all API calls
  • src/app/business_logic/collection.rs — Collection and request management layer—defines how requests are organized, persisted, and retrieved from the data model
  • src/app/files/mod.rs — File I/O abstraction for loading/saving collections, environments, themes, and key bindings—critical for data persistence
  • src/app/startup/startup.rs — Application initialization and terminal setup—where the TUI framework is initialized and configuration is loaded
  • Cargo.toml — Project manifest defining all dependencies (reqwest, ratatui, tokio, etc.)—essential for understanding the tech stack
  • src/cli/args.rs — CLI argument parsing and command handling—entry point for both TUI mode and CLI-based operations

🛠️How to make changes

Add a new request type (e.g., gRPC)

  1. Create a new module under src/app/business_logic/request/ (e.g., grpc/mod.rs) (src/app/business_logic/request)
  2. Implement the send logic with request building and response handling (src/app/business_logic/request/[new_type]/send.rs)
  3. Add a new variant to the request type enum in src/app/business_logic/request/mod.rs (src/app/business_logic/request/mod.rs)
  4. Update the request dispatch logic in src/app/app.rs to handle the new type (src/app/app.rs)
  5. Add collection JSON schema support by updating src/app/files/collection.rs (src/app/files/collection.rs)

Add support for a new import format (e.g., Insomnia JSON)

  1. Create a new parser module under src/app/files/ (e.g., insomnia_parser.rs) (src/app/files)
  2. Implement the parser to convert Insomnia format to internal collection structure (src/app/files/[new_format]_parser.rs)
  3. Register the new parser in the import dispatcher in src/app/files/mod.rs or src/cli/cli_logic/collection.rs (src/app/files/mod.rs)
  4. Test with sample files in example_resources/import/ (example_resources/import)

Add a new authentication method (e.g., JWT with custom claims)

  1. Add a new auth variant to the data model in src/app/business_logic/request/auth.rs (src/app/business_logic/request/auth.rs)
  2. Implement the header generation logic for the new auth type (src/app/business_logic/request/auth.rs)
  3. Update collection schema to support the new auth type (likely in src/app/files/collection.rs) (src/app/files/collection.rs)
  4. Add test request examples in example_resources/collections/auth.json (example_resources/collections/auth.json)

Add a new theme configuration option

  1. Update the theme struct in src/app/files/theme.rs to add new color or style fields (src/app/files/theme.rs)
  2. Create new example theme TOML files in example_resources/themes/ with the new fields (example_resources/themes)
  3. Update the UI rendering code to use the new theme fields (likely in multiple files, start with the main TUI components) (src/app)

🔧Why these technologies

  • Ratatui (TUI framework) — Provides cross-platform terminal rendering with full mouse and keyboard support, enabling rich interactive UI without a GUI dependency
  • Tokio (async runtime) — Handles concurrent request execution, WebSocket streams, and event polling without blocking the TUI event loop
  • Reqwest (HTTP client) — Provides fully-featured HTTP client with cookie handling, redirect support, and certificate management out of the box
  • Serde (serialization) — Enables seamless JSON/YAML/TOML parsing for collections, environments, and configuration files with minimal boilerplate
  • Rust (systems language) — Provides memory safety without GC, fast startup time, minimal binary size, and single-binary deployment; ideal for a CLI tool

⚖️Trade-offs already made

  • Single-threaded async event loop with Tokio

    • Why: Simplifies state management and avoids race conditions in the TUI state machine while supporting concurrent HTTP requests
    • Consequence: Long-running computations (e.g., script execution) must be async-aware to avoid blocking the UI
  • File-based persistence (JSON/YAML) vs database

    • Why: Offline-first design, zero dependencies, easy backup
    • Consequence: undefined

🪤Traps & gotchas

  1. Rust version pinning: Cargo.toml specifies rust-version = "1.90" — older toolchains will fail; use rustup update or rustup override set stable. 2. Clipboard feature gated: Clipboard support is opt-in via [features] clipboard = ["arboard"]; default enabled but may fail in headless/SSH environments—check --no-default-features if building for remote servers. 3. Platform-specific keybindings: mac_key_bindings.toml and default_key_bindings.toml differ; Linux/Windows users get default; macOS users expect CMD-key bindings. 4. Cookie persistence requires cookie_store v0.22.0 exact match (pinned in Cargo.lock)—dependency conflicts possible in monorepos.

🏗️Architecture

💡Concepts to learn

  • Middleware Chain (reqwest-middleware) — ATAC chains HTTP middlewares for cookie handling, auth injection, and request transformation; understanding this pattern is critical for extending request lifecycle hooks.
  • Terminal User Interface (TUI) Event Loop — Ratatui-based event-driven architecture with non-blocking IO; core pattern for handling user input, async HTTP requests, and screen renders simultaneously.
  • Environment Variable Interpolation — ATAC's .env files (example_resources/collections/.env.*) and environments.json enable dynamic request templating; critical for multi-environment workflows.
  • WebSocket Protocol Over HTTP Upgrade — ATAC supports WebSocket via reqwest-websocket; requires understanding of HTTP Upgrade headers and full-duplex bidirectional communication.
  • Cookie Jar / Cookie Store Persistence — ATAC manages session cookies across requests using reqwest_cookie_store v0.10.0; enables stateful API workflows (login → authenticated requests).
  • Serde Serialization/Deserialization — Collections, environments, and configs are serde-powered JSON/YAML; understanding derive macros and custom (de)serializers is essential for format changes.
  • Keybinding Parsing (crokey) — crokey v1.4.0 parses human-readable key sequences (vim, emacs, macOS styles) into terminal codes; required for extending UI navigation.
  • postmanlabs/postman-app-support — Official Postman repository; ATAC mirrors Postman's collection JSON format and UI/UX paradigms for feature parity reference.
  • Kong/insomnia — Insomnia is a direct GUI competitor solving the same API testing problem; ATAC adopted similar request-type handling, environments, and scripting concepts.
  • ratatui-org/ratatui — ATAC's TUI framework of choice (v0.30.0); understanding ratatui widget lifecycle and event handling is essential for UI contributions.
  • hyperium/http — Low-level HTTP primitives used transitively by reqwest; useful for understanding ATAC's request/response model.
  • getgrit/grit-cli — Similar Rust CLI tool with TUI; both use ratatui and serde for config files; useful architectural pattern reference for Rust TUI CLI design.

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add integration tests for collection import functionality (Postman, OpenAPI, cURL)

The repo has comprehensive example resources in example_resources/import/ (Postman collections, OpenAPI specs, cURL scripts, recursive directory structures) but no visible test suite leveraging these. Given ATAC's core feature is importing API collections from multiple formats, adding integration tests would prevent regressions when the import logic in src/app/business_logic/collection.rs changes. This is high-value because import failures are breaking UX issues.

  • [ ] Create tests/integration/import_test.rs to test importing example_resources/import/Test Collection.postman_collection.json
  • [ ] Add test cases for OpenAPI YAML import (example_resources/import/openapi-petstore-v31-1.0.8.yaml)
  • [ ] Add test cases for recursive cURL import from example_resources/import/recursive_curls/
  • [ ] Add test case for environment variable import (.env files from example_resources/collections/)
  • [ ] Update Cargo.toml with [[test]] configuration if needed and document how to run integration tests

Add GitHub Action to validate example collections and theme/keybinding files on PR

The repo contains example resources in example_resources/ (themes, key bindings, collections) that should remain valid TOML/JSON/YAML. Currently only rust.yml, build-docker.yml, release.yml, and spellchecker.yml workflows exist. A new workflow to validate these files would catch YAML/JSON/TOML syntax errors and schema violations early, preventing broken examples from being merged.

  • [ ] Create .github/workflows/validate-examples.yml workflow
  • [ ] Add step to validate all .toml files in example_resources/themes/ and example_resources/key_bindings/ using a TOML linter
  • [ ] Add step to validate JSON schema for example_resources/collections/*.json files against expected collection format
  • [ ] Add step to validate YAML syntax for example_resources/collections/*.yaml and import examples
  • [ ] Trigger workflow on push/PR changes to example_resources/ directory

Split src/app/app.rs and create focused business logic modules for request handling and response parsing

The file structure shows src/app/business_logic/ contains collection.rs, environment.rs, and key_value.rs, but src/app/app.rs appears to be the main app coordinator. For a feature-rich TUI app (with auth, cookies, websockets, scripts, request types per example_resources/), there's likely request execution and response handling logic mixed into app.rs. Extracting src/app/business_logic/request.rs and src/app/business_logic/response.rs would improve modularity, testability, and align with the existing business_logic structure.

  • [ ] Analyze src/app/app.rs to identify request execution logic and extract to src/app/business_logic/request.rs (covering HTTP methods, auth, headers, body formatting)
  • [ ] Create src/app/business_logic/response.rs to handle response parsing, formatting (JSON/YAML/XML per example_resources/response_formats/), and status code handling
  • [ ] Add unit tests for src/app/business_logic/request.rs covering different auth types (seen in example_resources/collections/auth.json) and content types
  • [ ] Update src/app/mod.rs or src/app/business_logic/mod.rs to export new modules
  • [ ] Verify existing app.rs still compiles and all integration points work correctly

🌿Good first issues

  • Add missing tests for collection file parsing: Create src/tests/collections/ with test cases for HTTP_methods.json, auth.json, and websockets.json to verify serde deserialization and environment variable interpolation.
  • Document keybinding customization in README: example_resources/key_bindings/ has 4 TOML variants but README only mentions 'Vim key-bindings'. Add section explaining how to load custom keybindings and differences between vim/emacs/mac/default.
  • Improve error messages for invalid collection formats: When users load a malformed JSON/YAML collection, show line numbers and field names. This likely requires enhancing serde error handling in src/ parsing code.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 48c94c0 — Update library versions and feature comparisons (Julien-cpsn)
  • f67f1e4 — Fixed some key not being handled by edtui (Julien-cpsn)
  • c67c1f0 — Updated dependencies (Julien-cpsn)
  • d7fe10d — Updated README.md (Julien-cpsn)
  • 4d7f776 — Updated app version (Julien-cpsn)
  • 27b4adc — Fixed changing method being allowed in ws requests https://github.com/Julien-cpsn/ATAC/issues/196 (Julien-cpsn)
  • 52ba3a7 — Fixed docker min rust version (Julien-cpsn)
  • 9f9dd0c — Updated dependencies, removed CORS config (Julien-cpsn)
  • ac63e12 — Merge pull request #197 from Julien-cpsn/text-input (Julien-cpsn)
  • 4ad3277 — Migrated every text input to edtui, added emacs keybindings (Julien-cpsn)

🔒Security observations

ATAC demonstrates reasonable security posture with active CI/CD pipeline (GitHub Actions, Dependabot) and MIT license transparency. Main concerns are: (1) pinned dependencies that could miss critical security updates, (2) presence of private key and environment file examples in the repository that

  • High · Pinned Dependency Versions May Miss Security Updates — Cargo.toml - dependencies section. Multiple dependencies are pinned to exact versions using '=' operator (reqwest, reqwest-middleware, reqwest-websocket, ratatui, etc.). While this ensures reproducibility, it prevents automatic security updates unless Cargo.lock is regenerated. If a vulnerability is discovered in a pinned dependency, manual intervention is required to update. Fix: Consider using semantic versioning (^) for patch and minor updates while keeping major versions locked. Regularly run 'cargo audit' and update dependencies. Implement automated dependency scanning in CI/CD pipeline (already present via dependabot.yml).
  • Medium · Example Environment Files May Contain Sensitive Data — example_resources/collections/.env.my_env, example_resources/collections/.env.my_other_env. The repository includes example .env files (.env.my_env, .env.my_other_env) in example_resources/collections/. While marked as examples, these could inadvertently serve as templates for actual credential storage in the same directory structure, leading to accidental credential commits. Fix: Ensure .env files are in .gitignore (verify current .gitignore). Add a disclaimer in README about never committing real .env files. Consider renaming examples to .env.example to make the distinction clearer.
  • Medium · Private Key File in Repository — example_resources/collections/es256_key.pem. The file 'es256_key.pem' is present in example_resources/collections/. Even if this is an example/test key, storing private key material in version control is a security anti-pattern and could normalize this dangerous practice for users. Fix: Remove the actual private key from the repository. If an example is needed, either generate it at test runtime, use a test-specific key marked clearly as non-production, or provide instructions for users to generate their own. Never commit real or example private keys to version control.
  • Medium · Rust Edition 2024 May Not Be Stable — Cargo.toml - edition field. The Cargo.toml specifies edition = '2024', which may not be officially released or stable. This could lead to compilation issues, security patches not being applied properly, or compatibility problems across different Rust versions and toolchains. Fix: Verify that Rust edition 2024 is officially stable. If not, revert to edition 2021 or the latest stable edition. Ensure the specified rust-version (1.90) is available and stable.
  • Medium · Incomplete Package Exclusions in Cargo.toml — Cargo.toml - exclude field. The exclude field in Cargo.toml has a typo: 'exemple_resources' instead of 'example_resources'. This means example_resources is still included in the package distribution, potentially increasing the package size unnecessarily and including test/example files in production releases. Fix: Fix the typo: change 'exemple_resources' to 'example_resources'. Verify other directories that should be excluded (gifs, .github, etc.) are properly listed.
  • Low · Docker Base Image Without Specific Version Tags — Dockerfile - runtime stage. The Dockerfile uses 'alpine:3.20' without a specific patch version tag. While alpine:3.20 is relatively stable, using full image digest or specific patch versions provides better reproducibility and security tracking. Fix: Use specific image digests instead of tags, e.g., 'alpine:3.20@sha256:...' or include patch versions. This ensures consistent builds and makes vulnerability scanning more deterministic.
  • Low · Missing Security Headers Configuration Guidance — README.md and documentation. As a terminal API client that makes HTTP requests, there is no visible documentation about security best practices for users regarding SSL/TLS validation, certificate pinning, or header validation. Fix: Add a security best practices section to documentation covering: certificate validation, SSL/TLS configuration, secure header usage, and credential handling guidelines for end users.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · Julien-cpsn/ATAC — RepoPilot