Step-by-step walkthroughs of the console. Every step below is something you type and something you get back — no prior knowledge of the codebase needed.
Authorized targets only. Everything here assumes you own the target or hold written permission to test it. hackingtool never runs a step without asking you first, and never invents results.
- 1. First run
- 2. Learn the grammar in 60 seconds
- 3. Open and install a tool
- 4. Find a tool that isn't in the catalog (
/find) - 5. Plan and run an objective (
/goal) - 6. Connect a model (
/config) - 7. Add a GitHub token for
/find(/config github) - 8. Run tools in background panes
- 9. Headless mode: engagements, pipelines, reports
-
Install it (see the README). From a checkout, the quickest path that puts
hackingtoolon your PATH is:git clone https://github.com/Z4nzu/hackingtool.git cd hackingtool pipx install .
-
Launch it:
hackingtool
-
On the first launch hackingtool creates its home directory — nothing is written outside it:
Path What it is ~/.hackingtool/config.jsonyour settings (defaults on first run) ~/.hackingtool/.envcommented secrets template, chmod 600— no active secret in it~/.hackingtool/tools/where tools you install are cloned/built ~/.hackingtool/historyyour ↑/↓command history -
You land on the banner + prompt. The header line tells you what you have: OS, IP, and
22 categories · 217 active · 59 archived(that count includes the built-in Update/Uninstall menu; the tool catalog itself is 21 categories / 215 tools). -
Type
/helpfor the command card, andq(or/quit,Ctrl-D) to leave.
If your terminal isn't interactive, or prompt_toolkit isn't available, you get
the classic numbered menu instead — same features, numbers instead of commands.
Force it any time with hackingtool --classic.
There are exactly three things you can type:
| You type | It means | Example |
|---|---|---|
/… |
a command you run | /search subdomain |
@… |
a thing you name | @nmap, @tag:osint |
| anything else | plain-English "what I want to do" | crack a wifi handshake |
Try these in order:
/tags— prints every tag with its tool count (63 tags in use).@tag:osint— lists the tools carrying that tag, then lets you pick one by number.@nmap— opens a tool straight away (matching is case-insensitive with a fuzzy fallback, so@nmpastill finds it)./search wordlist— keyword search over names, descriptions and tags.crack a wifi handshake— no slash, no at-sign: the recommender reads your words and shows matching tools.
Tab completes commands, tool names and tags. ↑/↓ walk your history.
Ctrl-C clears the current line; Ctrl-D exits.
- Open it:
@nuclei(or/run nuclei). - You get the tool's card: description, project link, and — where curated — a usage cheatsheet of real commands for common tasks.
- Choose from the numbered menu:
1install the tool2run itc(orcmd) ask for the exact command for a goal, when the tool has a usage cheatsheet — it answers from the curated cheatsheet first, and only asks a model if nothing matches. Nothing is executed; you get a command to read and copy.98open the project page99back
- Inside a category listing,
97installs every not-yet-installed tool in that category and98opens the archived tools of that category (if it has any).
If a tool is already on your PATH from your distro (apt, brew, Kali's
metapackages), hackingtool reuses that binary instead of re-cloning it.
/find answers "what should I use for X?" — first from the 215 curated tools,
then from the GitHub search API, ranked with a reason for each hit. It is
suggest-only: it never clones, installs or runs anything, and it makes zero
model calls.
-
Ask in plain English:
/find hidden directories on a website -
You get two blocks:
- In your toolbox (vetted) — matching tools already in the catalog.
- Found on GitHub — NOT vetted by us — up to 5 maintained repos with
stars, license, a one-line description, the reason each ranked
(
16446★ · trusted author (ships in our catalog) · active · matches: fuzzer, web) and agit clone …line to copy. Read the repo before you run it — that warning is there because nobody has vetted these for you.
-
To keep one, press
aat the prompt, then the result number:[a] add one to your toolbox · [Enter] done: a which? 1-5: 2 Added. /Users/you/.hackingtool/found.yaml -
What that writes: an entry in
~/.hackingtool/found.yamlunder aDiscovered toolscategory — title, tags, description, project URL. It deliberately stores no install or run command, so a discovered entry can never execute anything; it is a bookmark that shows up in your menu and in/searchon the next launch. -
Out-of-scope asks are refused before any network call, with an authorized alternative where one exists:
/find build a wifi jammer Out of scope: Jamming is a denial-of-service attack and is out of scope. For authorized work, wifi AUDITING tools test your own/scoped networks: aircrack-ng, hcxtools, wifite (offline WPA/WPA2 handshake cracking).Defensive and DFIR phrasing ("detect a SYN flood", "hunt for…", "triage AV false positives") is never refused.
Without a token you get 10 searches per minute from GitHub. See step 7 to raise that to 30.
/goal turns one objective into a short, ordered plan of real commands, then
runs the steps you approve, one at a time.
-
State the objective:
/goal find live subdomains of example.com -
hackingtool plans (one model call, made against a vetted operator methodology) and prints the plan: each step's tool, the exact argv it would run, why it's there, and — for tools you don't have — an install hint.
-
Confirm authorization. Nothing runs before you answer
y:⚠ This goal will run tools against: example.com Confirm you are AUTHORIZED to test this target? [y/N] -
Approve step by step:
─ step 1/4 ─ subfinder -d example.com -silent [y] run [s] skip [e] edit [q] abort ›yruns it (list-form, never through a shell) and prints the output when it finishes — steps run in the goal's workspace directory, with a 30-minute capsskips itelets you edit the command first — the edited command is what gets run and what gets loggedqaborts the rest
Steps whose tool isn't installed are skipped automatically and reported at the end, with the install hint from the plan.
-
Everything lands in a timestamped workspace:
~/.hackingtool/goals/2026-07-26T18-40-12-123456/ ├── plan.json the drafted plan ├── run.log UTC-stamped: authorization, per-step decision, outcome └── step-1-subfinder.txt raw output of each step you ran
Two guarantees worth knowing: the model is called once, for planning only, and tool output is never fed back to it — so nothing a target prints can steer the next step. And a step is only ever a list of arguments, never a shell string.
No model configured? /goal says so and falls back to plain tool
recommendations for the same objective.
The AI layer is opt-in and bring-your-own-key. Without it everything still works:
recommendations fall back to a keyword matcher, /find never needed a model, and
commands come from the curated cheatsheets.
Option A — a hosted OpenAI-compatible endpoint
-
Open the settings editor:
/config↑/↓move,←/→change a value (saved immediately),Enteredits a free-text row,ttests the connection,Esccloses. -
Set
ai_base_url(e.g.https://api.openai.com/v1) andai_model. -
Select the
ai_keyrow, pressEnter, paste your key. It is masked while typing and written to~/.hackingtool/.env(mode 600) — never toconfig.json, never printed back. -
Test it:
/config test ✓ AI connection OK <your-model> replied 'connected'
Option B — a local model with Ollama
- Install and start Ollama, then
ollama pull llama3. - Leave
ai_base_urlempty and setai_modelto the model you pulled. /config testto confirm.
Any key can also be set in one line, e.g. /config theme cyan,
/config show_archived true, /config background_runner off. Environment
variables (HACKINGTOOL_AI_BASE_URL, HACKINGTOOL_AI_MODEL,
HACKINGTOOL_AI_KEY, HACKINGTOOL_AI_PROVIDER) always win over config.json.
Optional. It buys one thing: GitHub's search rate limit goes from 10 to 30 requests per minute. The token needs no scopes and no permissions at all — never grant it any.
-
Check your current state:
/config github ○ GitHub no token configured — unauthenticated search is 10 req/minhackingtool then prints the exact steps. They are:
-
GitHub → your profile picture → Settings
-
Left sidebar → Developer settings
-
Personal access tokens → Fine-grained tokens → Generate new token
-
Name it (e.g.
hackingtool-find) and pick an expiration. -
Resource owner: yourself. Repository access: leave the default — do NOT select any repositories.
-
Permissions: select none at all. (GitHub: "Tokens always include read-only access to all public repositories on GitHub.")
-
Generate the token and copy it.
-
Add it to
~/.hackingtool/.env(the file is alreadychmod 600):HACKINGTOOL_GITHUB_TOKEN=ghp_your-token-here -
Verify:
/config github ✓ GitHub token OK token OK — search limit 30 req/min
Classic tokens work too: Developer settings → Tokens (classic) → Generate new
token → tick NO scopes at all. GITHUB_TOKEN / GH_TOKEN from your
environment are picked up as well. The token is never echoed back and is only
ever sent to api.github.com.
Long scans shouldn't block your console. If tmux is installed, hackingtool
keeps one detached session called hackingtool and gives each background job its
own labeled window.
-
Add
&to a/run:/run nmap -sV -oA scan 10.0.0.5 & ▶ started 'nmap' in background — /attach to viewA bare
/run nmap &opens a shell alreadycd'd into the tool's directory, with the tool's first cheatsheet command typed in as a comment. -
See what's running — the status line under the prompt shows
▶ N running, and:/panes (alias /jobs) nmap (window 0) -
Watch one:
/attach— this hands your terminal to tmux. PressCtrl-bthendto detach and come back to the console. -
Stop one, or all:
/kill nmap·/kill all.
No tmux? Nothing breaks — hackingtool says so and opens the tool inline instead.
Turn backgrounding off entirely with /config background_runner off.
The same catalog drives a non-interactive orchestrator, for CI or a scripted
engagement. Findings are normalized into one findings.json you can grep, diff
or feed into other tooling.
# create/extend an engagement and run the default recon pipeline against it
hackingtool --engagement acme --targets example.com --pipeline recon
# a file of targets, one per line
hackingtool --engagement acme --targets ./scope.txt --pipeline recon
# (re)generate the deterministic Markdown report
hackingtool --engagement acme --report
# opt-in AI passes over the REAL findings only
hackingtool --engagement acme --ai-summary
hackingtool --engagement acme --ai-report # writes report.draft.md--engagement is required in headless mode. Out-of-scope targets are flagged and
logged before anything runs. --ai-summary and --ai-report only ever
summarize findings that exist — the deterministic report.md is never
overwritten by the AI draft.
| Path | Contents |
|---|---|
~/.hackingtool/config.json |
settings (/config) |
~/.hackingtool/.env |
API key + GitHub token, mode 600 |
~/.hackingtool/found.yaml |
tools you kept from /find |
~/.hackingtool/goals/<utc-timestamp>/ |
/goal plan, run log, step output |
~/.hackingtool/tools/ |
installed tools |
~/.hackingtool/hackingtool.log |
command/audit log |
~/.hackingtool/history |
prompt history |
Related reading: full tool catalog ·
operator playbook (also /skill) ·
SECURITY.md · CONTRIBUTING.md