An open-source offensive-security AI agent that lives in your terminal.
Project description
riftor
An open-source offensive-security AI agent that lives in your terminal. Find the rift. Open it. Cross through.
riftor is a Python TUI pentest assistant: a full-screen Textual interface backed by litellm, organised around the RIFT methodology — Recon → Intrusion → Foothold → Takeover.
It's cloud-first (Anthropic, OpenAI, OpenRouter, …) for the strongest agent behaviour, with local Ollama supported as an option.
Status: fully featured (Phase 4–6). Streaming agent with retry/backoff + token/cost metering, persistent granular permissions (allow/deny rules, diff preview before write/edit), scope guardrail (enforce / dry-run / import-export), RIFT stage tracking, per-engagement findings store (edit/tag/ dedup), CVSS reports in md/html/json/sarif, crash-safe sessions, input history + command palette, headless one-shot mode, Docker, pytest + types in CI. See
todo.mdfor the roadmap anddocs/for configuration.
Install
pip install riftor # or: uv tool install riftor / pipx install riftor
Requires Python 3.11+ and a model — set one of ANTHROPIC_API_KEY,
OPENAI_API_KEY, OPENROUTER_API_KEY (or run a local Ollama server).
export ANTHROPIC_API_KEY=sk-ant-... # or OPENAI_API_KEY, etc.
riftor # launch the TUI
riftor --config # show the config file path
riftor --version
riftor --model openai/gpt-4o # override the model for this run
riftor --workdir ./engagement # set the engagement directory
riftor --scope-file scope.txt # preload scope targets
riftor -p "enumerate 10.0.0.5" # headless one-shot (also reads stdin)
On first launch riftor writes a config file and picks a default model from your environment keys (cloud-first); if no key is set but an Ollama server is running, it falls back to that.
From source
git clone https://github.com/Estudely/riftor && cd riftor
uv sync && uv run riftor
Docker
docker build -t riftor .
docker run -it --rm -e ANTHROPIC_API_KEY -v "$PWD:/work" riftor
The image is minimal (no nmap/httpx/etc.). For full recon tooling, run riftor
on a host that has the tools installed, or extend the image.
Configure
~/.config/riftor/config.toml:
[riftor]
model = "anthropic/claude-sonnet-4-6" # any litellm model id
# api_key = "sk-..." # prefer the provider's env var
temperature = 0.3
max_tokens = 2048
theme = "rift"
lore = true
# Local option (Ollama):
# model = "ollama_chat/llama3.1"
# api_base = "http://localhost:11434"
Workflow
1. Set scope /scope add 10.0.0.0/24 example.com
2. Task the agent "enumerate the web host and look for low-hanging fruit"
→ it runs recon tools via bash (you approve), records
services/findings, and advances the R·I·F·T stage
3. Review /findings
4. Report /report → .riftor/reports/report-*.md and .html
Out-of-scope targets are blocked (with an explicit per-call override). State
lives in .riftor/ per working directory; sessions auto-save and resume.
Commands
| Command | Action |
|---|---|
/help |
show commands |
/clear |
clear the conversation (Ctrl+L) |
/retry · /continue [N] · /compact |
re-run last turn · extend steps · free context |
/copy · /show <id> · /cost |
copy last output · expand a result · token/cost total |
/model [name] · /theme [name] |
switch model / theme |
/stage [R|I|F|T] |
show or set the RIFT stage |
/scope [add|out|rm <t>|clear|on|off|dry|import <f>|export [f]] |
manage scope |
/findings · /finding <id> |
list (severity-sorted) / show one |
/edit-finding <id> sev=high tags=… · /delete-finding <id> |
triage findings |
/hosts · /services |
discovered infrastructure |
/report [md|html|json|sarif|both|all] |
write a report to .riftor/reports/ |
/timeline · /export |
engagement activity log · archive the engagement |
/permissions · /audit |
review allow/deny rules · recent tool-call log |
/sessions · /resume <id> · /new |
manage saved sessions |
/config · /tools · /lore · /exit |
settings · tools · persona · quit |
↑/↓ recall previous prompts · PgUp/PgDn scroll · Ctrl+P command palette ·
Esc cancels a running response. Dangerous tools (bash/write/edit) prompt for
approval (with a diff preview); rm -rf/dd and friends are denied by
default; every tool call is written to an audit log. See
docs/configuration.md for all settings.
Use responsibly
riftor is for authorized security testing only. You are responsible for having explicit, written permission for any system you assess.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file riftor-0.0.5.tar.gz.
File metadata
- Download URL: riftor-0.0.5.tar.gz
- Upload date:
- Size: 520.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ffe63b87643509c5edb816d39e84ed369d845a3a14c158c26118b0e8bc214f3
|
|
| MD5 |
4d5c2522509438533fe640184671f0c6
|
|
| BLAKE2b-256 |
77de53383bcc7f08979baedfec4bb832931b82b3868f60d1dcdbd80c6c340057
|
Provenance
The following attestation bundles were made for riftor-0.0.5.tar.gz:
Publisher:
release.yml on Estudely/riftor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riftor-0.0.5.tar.gz -
Subject digest:
1ffe63b87643509c5edb816d39e84ed369d845a3a14c158c26118b0e8bc214f3 - Sigstore transparency entry: 1707944015
- Sigstore integration time:
-
Permalink:
Estudely/riftor@9f7a58b595d05f600930fcfd31f26772390a83e9 -
Branch / Tag:
refs/tags/v0.0.5 - Owner: https://github.com/Estudely
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9f7a58b595d05f600930fcfd31f26772390a83e9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file riftor-0.0.5-py3-none-any.whl.
File metadata
- Download URL: riftor-0.0.5-py3-none-any.whl
- Upload date:
- Size: 77.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0209f4bd5696c7b9def140dbc73a755952c63c8971da2493ab9e9bed63d7477
|
|
| MD5 |
69673ca8de7521d11f062c26a1e1b10b
|
|
| BLAKE2b-256 |
ed0228b8f3b86c1a8f8e1f370a73ce4e000940800e90d436b97e42473311c63d
|
Provenance
The following attestation bundles were made for riftor-0.0.5-py3-none-any.whl:
Publisher:
release.yml on Estudely/riftor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riftor-0.0.5-py3-none-any.whl -
Subject digest:
d0209f4bd5696c7b9def140dbc73a755952c63c8971da2493ab9e9bed63d7477 - Sigstore transparency entry: 1707944026
- Sigstore integration time:
-
Permalink:
Estudely/riftor@9f7a58b595d05f600930fcfd31f26772390a83e9 -
Branch / Tag:
refs/tags/v0.0.5 - Owner: https://github.com/Estudely
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9f7a58b595d05f600930fcfd31f26772390a83e9 -
Trigger Event:
push
-
Statement type: