Keelix Sentinel

Continuous security review on your box, with your AI.

Sentinel runs the deterministic Keelix engine on a schedule, diffs every pass against the last one, and notifies you when something actually changed. An optional AI layer — your Anthropic, OpenAI, or Gemini key, or a local model — explains the change and drafts a fix as text. The AI has no hands: it never executes anything.

One tick, four commands

The Sentinel CLI surface
keelix auth login anthropic        # or: openai | gemini (API key prompt)
keelix sentinel install            # systemd timer / launchd plist — prints, asks y/N, never enables itself
keelix sentinel tick               # one pass: scan → diff → events → triage → notify
keelix sentinel run                # the same tick in a loop (tmux/screen friendly)
keelix sentinel status             # last tick, last result, config summary
keelix ask "what changed since yesterday?"
keelix diff old.json new.json      # standalone compare of two saved scans

Notifications go to ntfy, gotify, telegram, or a generic JSON webhook, with per-channel severity filters. Token fields accept indirection refs (env:NAME, keychain:item (macOS only), op://…) so secrets stay out of the config file.

Bring your own AI — any of four providers

ProviderCredentialsDefault model
anthropicANTHROPIC_API_KEY (ANTHROPIC_MODEL overrides)claude-sonnet-4-6
openaiOPENAI_API_KEY (OPENAI_MODEL) or Sign in with ChatGPT where enabledgpt-5-mini
geminiGEMINI_API_KEY (GEMINI_MODEL)gemini-2.5-flash
openai-compatibleoptional key; base_url required (Ollama, LM Studio, vLLM, OpenRouter)required — no universal default

The AI has no hands

Frequently asked

What does keelix sentinel do?
Sentinel turns the one-shot scanner into a continuous review. Each tick runs one complete pass: scan the box, diff against the saved state, derive events, decide deterministically whether the change is worth an AI triage call, notify your channels, and persist state. `keelix sentinel tick` runs one pass and exits (cron/systemd-timer style); `keelix sentinel run` loops the same tick as a foreground daemon.
Which AI providers does Keelix Sentinel support?
Bring your own model: Anthropic (ANTHROPIC_API_KEY), OpenAI (OPENAI_API_KEY or Sign in with ChatGPT where enabled), Gemini (GEMINI_API_KEY), or any OpenAI-compatible endpoint with a base_url — Ollama, LM Studio, vLLM, OpenRouter. Keelix has zero AI cost of its own, and local-model users get a setup where AI inference never leaves the box. Note: configured notification channels (ntfy, Telegram, etc.) still send notifications off-box regardless of the AI provider.
Can the AI change anything on my server?
No. The AI has no hands: it is a pure text completion with no tool calling, no execution, and no file access. The deterministic engine is the only thing that observes the system, and nothing executes remediations. The AI explains what changed, why it matters, and drafts fixes as text for you to review.
Does Sentinel need a Keelix Cloud account?
No. Everything — scanning, diffing, triage, notifications, the credential store — runs locally in the open-source CLI with zero cloud dependency. Pointing the AI provider at a local model via the openai-compatible endpoint keeps scan data on the box entirely.
How does Sentinel defend against prompt injection in scan data?
Scan content can contain attacker-controlled strings (service banners, container names, MCP tool descriptions). Sentinel fences untrusted data in nonce-tagged delimiters the model is told to treat as data, sanitizes all AI output in code (length cap, control characters stripped, unknown URLs defanged to hxxps://), and always leads notifications with code-generated facts. And because the AI has no hands, injection can influence text only — never actions.

Put a sentinel on your box tonight.

Free, local-first, Apache-2.0. Bring any AI — or none: the deterministic engine never depends on it.

operator@host — keelix
# install — free & open source (Apache-2.0)
$ curl -fsSL https://keelix.dev/install.sh | sh
$ keelix scan