Repository navigation
Quick Start
Prohori is alpha (v0.1.0,
pip install prohori). The whole batch flow works today, from a log file to incidents and reports; machine learning, the streaming pipeline and the LLM analyst come in later releases.
git clone https://github.com/UtshaBasak/Prohori.git
cd Prohori
uv syncuv run prohori demoThe demo simulates an account takeover, an SSH brute force and a web scan, investigates each one
offline and writes an HTML report per incident to prohori-demo/. It needs no configuration and
sends nothing over the network. The table shows how many alerts and incidents each attack
produced and whether every rule that should catch it fired.
uv run prohori triage samples/logs/account-takeover.jsonl -o triage/
uv run prohori triage /var/log/auth.log --year 2026 -o triage/ --redact-ips # your own logprohori triage runs the whole flow: parse, detect, look up IPs (offline unless you add
--online), build incidents and write triage/summary.md, triage/incidents.jsonl and a report
per incident (HTML by default; --format md|json|csv). With --redact or --redact-ips,
every file in the folder hides account names (and IPs).
Exit codes: 0 no incidents, 3 incidents found (--exit-zero gives 0), 1 unreadable input
or redaction failed (nothing written), 2 invalid usage.
uv run prohori parse samples/logs/auth.log # format detected, table output
uv run prohori parse samples/logs/access.log --format json # one event per line (JSON Lines)
uv run prohori parse samples/logs/app-security.jsonl
cat samples/logs/auth.log | uv run prohori parse - --year 2026
uv run prohori parse samples/logs/payments.jsonl --parser generic_json \
--mapping samples/mappings/payments.yamlThe table output shows the first events and a summary: how many lines were parsed, skipped
(well-formed but not relevant) or malformed, with examples of the errors. With --format json,
events go to standard output and the summary to standard error, so you can pipe the events into
other tools.
Exit codes: 0 success, 1 every line failed to parse, 2 invalid usage or input.
See Parsers for the supported formats and options.
uv run prohori detect samples/logs/auth.log # brute-force alert
uv run prohori detect samples/logs/access.log # probes and injection attempts
uv run prohori detect samples/logs/app-security.jsonl --format json > alerts.jsonl
uv run prohori detect my.log --rules my-rules/ # add your own rules
uv run prohori rules list # the 14 built-in rulesprohori detect parses the file and runs the built-in detection rules (plus any --rules). It
prints a table of alerts and a summary, or one alert per line with --format json.
Exit codes: 0 no alerts, 3 alerts found (this is a result, not a failure; use --exit-zero to
get 0), 1 unreadable input or an invalid rule file, 2 invalid usage.
See Detection Rules for the rules and how to write your own.
uv run prohori enrich 203.0.113.7 --offline # bundled demo data, no network
uv run prohori enrich 203.0.113.7 2001:db8:abcd::17 --offline --format json
uv run prohori enrich 8.8.8.8 # uses the providers you configuredprohori enrich shows location, network owner and reputation for each address. With
--offline it never touches the network. Without API keys or GeoLite2 files it says that no
providers are configured and sends nothing. Private, reserved and documentation addresses are
never sent to outside services.
Exit codes: 0 done (a failed lookup is a note on that address), 2 an argument that is not an
IP address, invalid usage or an invalid setting.
See Enrichment for the providers, privacy rules and how to set up API keys.
uv run prohori incidents samples/logs/account-takeover.jsonl # one critical incident
uv run prohori incidents samples/logs/auth.log --year 2026 # a brute-force incident
uv run prohori incidents samples/logs/app-security.jsonl -f json > incidents.jsonlprohori incidents parses the file, runs the rules and groups related alerts into incidents,
each with a score and its breakdown, severity, confidence, ATT&CK techniques, a timeline,
recommended actions and limitations. IP lookups are offline unless you add --online.
Exit codes: 0 no incidents, 3 incidents found (--exit-zero gives 0), 1 unreadable input
or an invalid rule file, 2 invalid usage.
See Incidents for how grouping and scoring work.
uv run prohori report samples/incidents/INC-ee7c8818fbb34989.json -f html -o report.html
uv run prohori report samples/incidents/INC-ee7c8818fbb34989.json --redact-ips -o shareable.mdprohori report renders an incident as Markdown (default), a self-contained HTML page, JSON or a
CSV timeline. --redact hides account names and emails; --redact-ips hides IP addresses too.
On Windows use -o FILE instead of >.
Exit codes: 0 written, 1 redaction could not hide every value (nothing written), 2 invalid
usage or input.
See Reports for the sections and how redaction works.
uv run prohori simulate --list
uv run prohori simulate account-takeover --seed 1 --out out/
uv run prohori incidents out/account-takeover.jsonlprohori simulate writes a realistic, labelled attack hidden in normal activity, using only
documentation IP addresses. See Simulator.
uv run prohori --version
uv run prohori --helpLater releases add score (machine learning), pipeline up / down / status, explain and ask.
Repository · Changelog · Security · MIT License
Prohori
Contributing
Reference