{{ currentTabName }}
{{ formatTime(new Date()) }}Edit Rule
Alert Activity
Last 7 days
Top Rules (7d)
Most triggered rules
No rule hits recorded yet
Recent Security Events
| Time | Rule | Status | Details |
|---|---|---|---|
| {{ formatDate(alert.created_at) }} | {{ alert.rule_name }} | BLOCKED FLAGGED | {{ alert.snippet }} |
|
No alerts — all clear |
|||
| Time | Provider | Rule | User | IP | Agent | Dir | Status | Score | Content | |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ formatDate(alert.created_at) }} | {{ providerLabel(alert.provider) }} | {{ alert.rule_name }} | {{ formatUserId(alert.user_id) }} | {{ alert.ip || '—' }} | {{ alert.agent_id }} — | {{ alert.direction }} | Blocked Flagged | {{ (alert.llm_score * 100).toFixed(0) }} — |
{{ alert.snippet }}
|
View |
|
No alerts — all clear |
||||||||||
BLOCKED FLAGGED {{ selectedIncident.rule_name }}
Triggered on {{ selectedIncident.direction }} at {{ formatDate(selectedIncident.created_at) }}
User ID
{{ selectedIncident.user_id || '—' }}
Source IP
{{ selectedIncident.ip || '—' }}
Direction
{{ selectedIncident.direction }}
Alert ID
#{{ selectedIncident.id }}
Device Agent
{{ selectedIncident.agent_id }}
Device User
{{ selectedIncident.device_user }}
AI Risk Score
{{ selectedIncident.llm_score_explanation }}
Rule Details
{{ selectedIncident.rule.description }}
{{ selectedIncident.rule.pattern }}
Triggered Content (Request)
AI Response
Original Request
Prompt captured at {{ formatDate(selectedIncident.matched_prompt.created_at) }} · Provider: {{ providerLabel(selectedIncident.matched_prompt.provider) }}
Original Request
No matching request found for this alert.
Other Alerts from This User {{ selectedIncident.user_alerts.length }}
| Time | Provider | Rule | Status | Content | |
|---|---|---|---|---|---|
| {{ formatDate(ua.created_at) }} | {{ providerLabel(ua.provider) }} | {{ ua.rule_name }} | Blocked Flagged | {{ ua.snippet }} |
Recent Prompts from This User {{ selectedIncident.user_prompts.length }}
{{ up.snippet }}
No user ID associated with this alert — related data unavailable.
Add New Rule
| Order | Status | Rule Name | Configuration | Scope | Actions |
|---|---|---|---|---|---|
|
{{ index + 1 }}
|
{{ rule.name }}
{{ rule.pattern_type }}
|
AI: {{ rule.description ? rule.description.substring(0, 50) + (rule.description.length > 50 ? '...' : '') : '-' }} {{ rule.preset ? `preset:${rule.preset}` : rule.pattern }} |
{{ rule.side }}
{{ rule.action }}
|
|
| Time | Provider | User | Source IP | Agent | Score | Prompt Content | Reply | |
|---|---|---|---|---|---|---|---|---|
| {{ formatDate(prompt.created_at) }} | {{ providerLabel(prompt.provider) }} | {{ formatUserId(prompt.user_id) }} | {{ prompt.ip }} | {{ prompt.agent_id }} {{ prompt.device_user }} — | {{ (prompt.llm_score * 100).toFixed(0) }} — |
{{ prompt.snippet }}
|
— | |
|
No prompts recorded yet |
||||||||
Prompt #{{ selectedPrompt.id }}
Captured at {{ formatDate(selectedPrompt.created_at) }}
User ID
{{ selectedPrompt.user_id || '—' }}
Source IP
{{ selectedPrompt.ip || '—' }}
Agent
{{ selectedPrompt.agent_id }}
Device User
{{ selectedPrompt.device_user }}
Provider
{{ selectedPrompt.provider }}
Prompt ID
#{{ selectedPrompt.id }}
AI Risk Score
{{ selectedPrompt.llm_score_explanation }}
User Prompt
AI Response
Raw Request
Related Alerts {{ selectedPrompt.related_alerts.length }}
| Time | Rule | Direction | Status | |
|---|---|---|---|---|
| {{ formatDate(ra.created_at) }} | {{ ra.rule_name }} | {{ ra.direction }} | Blocked Flagged |
| Time | User | Action | Target | Changes |
|---|---|---|---|---|
| {{ formatDate(log.timestamp) }} | {{ log.user }} | {{ log.action.replace('_', ' ') }} | {{ log.target_type }} {{ log.target_id }} |
{{ log.changes }}
|
Test Your Rules
Simulate a request to check which rules would trigger without sending data to the LLM.
Connect to the Firewall
Route any AI tool through the firewall for DLP inspection, audit logging, and policy enforcement. Supports Anthropic and OpenAI-compatible formats.
:8080 → /v1/messages
OpenAI :8080 → /v1/chat/completions
Management :80
Set one environment variable before launching Claude Code.
# Set once in your shell profile export ANTHROPIC_BASE_URL="http://<firewall-host>:8080" claude
{{ pythonSnippet }}
{{ nodejsSnippet }}
{{ agentSnippet }}
{{ cursorSnippet }}
{{ aiderSnippet }}
{{ continueDevSnippet }}
{{ openaiPythonSnippet }}
{{ openaiNodeSnippet }}
{{ openaiCurlSnippet }}
{{ dockerSnippet }}
| Variable | Default | Description |
|---|---|---|
| UPSTREAM_URL | https://api.anthropic.com | Anthropic upstream endpoint |
| OPENAI_UPSTREAM_URL | https://api.openai.com | OpenAI-compatible upstream endpoint |
| MANAGEMENT_URL | http://management:9000 | Management server URL |
| REDIS_URL | - | Redis for caching + rate limiting |
| RATE_LIMIT_RPM | 60 | Per-IP requests per minute |
| CACHE_TTL | 3600 | Response cache TTL (seconds) |
Supported Providers
Any tool that lets you set a custom base URL can route through the firewall. The same DLP rules apply across all providers.
Anthropic
/v1/messages
OpenAI
/v1/chat/completions
Groq
OpenAI-compatible
Together
OpenAI-compatible
Mistral
OpenAI-compatible
DeepSeek
OpenAI-compatible
Ollama
OpenAI-compatible
vLLM
OpenAI-compatible
Monitors AI web apps (ChatGPT, Claude.ai, Gemini, Perplexity) and enforces DLP rules before prompts are sent.
chrome://extensions and enable Developer ModeRequires an extension type agent created in the Agents tab.
Runs a local proxy on localhost:8100 that routes AI traffic through the cloud firewall. Auto-configures shell env vars for Anthropic and OpenAI tools.
# Install and run ./gatewell-device-agent --install --daemon # Or run manually ./gatewell-device-agent --daemon
Requires a device type agent created in the Agents tab. Download binaries from the GitHub Releases page.
Add Webhook
Configured Webhooks
No webhooks configured
{{ hook.url }}
Payload Format
// Headers X-Webhook-Event: alert X-Webhook-Signature: sha256=<hmac-sha256-hex> X-Webhook-ID: <webhook-id> // Body { "rule_id": 3, "rule_name": "Block: Secrets", "user_id": "alice", "blocked": true, "timestamp": "2026-03-12T10:00:00Z" }
Create API Key
How it works:
When API keys exist, all requests to the firewall must include a valid X-API-Key header (sk-fw-*).
If no keys are created, the firewall runs in open mode (no key required).
All keys are validated — no bypass for any prefix.
Active Keys
{{ apiKeys.filter(k => !k.revoked).length }} active / {{ apiKeys.length }} totalNo API keys — firewall is in open mode
| Name | Key Prefix | Status | Rate Limit | Last Used | Actions |
|---|---|---|---|---|---|
| {{ key.name }} | {{ key.key_prefix }} | {{ key.revoked ? 'Revoked' : 'Active' }} | {{ key.rate_limit_rpm ? key.rate_limit_rpm + ' RPM' : 'Default' }} | {{ key.last_used_at ? formatDate(key.last_used_at) : 'Never' }} |
|
Register Agent
How it works: This tab shows all connected clients — machine agents (IP heartbeat), device agents (local AI proxy), and browser extensions (web DLP). Device agents run a local proxy that intercepts Claude Code, Codex CLI, Cursor, Aider, and all AI tools — applying DLP rules before forwarding. They auto-configure shell env vars and detect the logged-on OS user. Extensions intercept web AI (ChatGPT, Claude.ai, Gemini, Perplexity). Machine agents register their public IP for firewall allowlisting. Agents seen within the last hour are considered online. Blocking any agent immediately stops its access.
Agent Risk Scoring
Registered Agents
No agents registered — IP filtering is disabled
| Name | Type | Upstream | Current IP | Status | Risk Score | Last Seen | Access | Actions |
|---|---|---|---|---|---|---|---|---|
| {{ agent.name }} | Extension Device Machine | {{ agent.current_ip || '-' }} | Blocked {{ isAgentOnline(agent.last_seen_at) ? 'Online' : 'Offline' }} |
{{ agent.daily_score }} today · {{ agent.monthly_alert_count }} / 30d
|
{{ agentTimeSince(agent.last_seen_at) }} |
Risk Threshold Alerts
{{ agentRiskAlerts.length }}| Agent | Type | Score | Threshold | Time |
|---|---|---|---|---|
| {{ ra.agent_name }} | Global Daily | {{ ra.score }} | {{ ra.threshold }} | {{ formatDate(ra.created_at) }} {{ formatTime(ra.created_at) }} |
Browser Extension
Intercept and check AI prompts on web platforms before submission. Enforces the same DLP rules used by the API firewall.
Extension Activity
{{ alerts.filter(a => a.provider === 'extension').length }} events| Time | User | Rule | Status | Content |
|---|---|---|---|---|
| {{ formatDate(alert.created_at) }} | {{ alert.user_id }} | {{ alert.rule_name }} | Blocked Warned |
{{ alert.snippet }}
|
|
No extension activity yet |
||||
Install the Extension
Create an Extension agent
Go to the Agents tab, select type Extension, and create. Save the Agent ID and Secret.
Download and load in Chrome
Download the zip, extract it, then go to chrome://extensions then enable Developer Mode and click "Load unpacked" to select the folder.
Connect with Agent ID + Secret
Click the extension icon, enter your server URL, Agent ID, and Agent Secret, then click Connect. No username or password needed.
Monitor and block from the Agents tab
The extension appears as a connected agent. Block it anytime — the user will see a full-page "Access Blocked" overlay on all AI sites within 30 seconds.
How It Works
Intercept
Hooks into the input areas and submit buttons of AI web platforms.
Check
Sends the text to Gatewell for DLP rule evaluation (regex, semantic, presets).
Enforce
Blocks or warns before submission. All interactions logged to the audit trail.
AI Rule Generator
Describe what you want to protect against — AI generates the DLP rules for you
Try an example
{{ aiRuleError }}
Generated Rules ({{ aiGeneratedRules.length }})
{{ rule.name }}
{{ rule.action }} {{ rule.side }} {{ rule.pattern_type }}{{ rule.description }}
{{ rule.pattern }}
LLM Scoring
Use AI to score every prompt for malicious intent (jailbreaks, injection, exfiltration)
How it works
e.g. gpt-4o-mini, gpt-4o, gpt-4-turbo e.g. claude-haiku-4-5-20251001, claude-sonnet-4-5-20241022
Score ≥ this triggers an alert (but allows the request)
Score ≥ this blocks the request entirely
Only score prompts with ≥ this many characters
Score Ranges
Test Scoring
Try the LLM scorer with a sample prompt to see how it responds.
{{ llmScoringTestResult.error }}
{{ llmScoringTestResult.explanation }}
Create User
| Username | Role | Last Login | Created | Enabled | Actions |
|---|---|---|---|---|---|
| {{ u.username }} system SSO local blocked | {{ u.role }} | {{ u.last_login_at ? formatDate(u.last_login_at) : 'Never' }} | {{ formatDate(u.created_at) }} | — | Managed via env var |
Reset Password for {{ resetPasswordUser.username }}
System
Server info, database stats, and configuration
Version
{{ systemInfo.version }}
Uptime
{{ formatUptime(systemInfo.uptime_seconds) }}
Python
{{ systemInfo.python_version }}
DB Size
{{ formatBytes(systemInfo.db_stats?.db_size_bytes) }}
Database Records
LLM API Key
This key is used for both LLM Scoring and AI Rule Generator features.
Platform
{{ systemInfo.platform }}
Loading system info...