When air-gapped actually means air-gapped
Some security environments enforce strict outbound network controls — no traffic to external APIs, no calls to CDN-hosted dependencies, no model inference shipped off-box. This is common in government, defence, and heavily regulated industries such as healthcare or finance where data classification rules prohibit sending any customer-derived text to a public cloud endpoint.
Most AI feedback tools are not compatible with this requirement because they are architecturally dependent on calling a third-party LLM API. Rereflect is different because the LLM step is optional. The product can run its entire analysis pipeline locally, with no outbound calls beyond what you explicitly configure.
What generates outbound traffic in a default setup
Before you can lock things down, it helps to know what would call home in a permissive configuration. In a default Rereflect self-hosted deployment, there are three potential sources of outbound traffic: the Docker image pulls during initial setup, the LLM API calls if you have configured a hosted provider, and any telemetry or update-check calls if a tool in the stack makes them.
The first — image pulls — is a one-time setup step you can handle by pre-pulling images on a networked machine and saving them as archives, then loading them on the air-gapped host. The second is the important one: if you configure an LLM API key pointing at a hosted provider, every piece of feedback that runs through the LLM step generates an outbound HTTPS request. The third is not a concern — Rereflect does not phone home and does not bundle any telemetry.
- Docker image pulls — handle with docker save / docker load on the target host.
- LLM API calls — eliminated by using a local model or the VADER fallback.
- Rereflect telemetry — does not exist; the app makes no calls back to Rereflect servers.
Option 1: VADER-only mode (fully local, zero model dependencies)
The simplest air-gapped configuration is to not configure an LLM at all. When no LLM_BASE_URL is set in your environment, Rereflect automatically uses the VADER sentiment analyzer for all feedback. VADER is a lexicon-based analyzer that runs in-process — it has no GPU requirements, no model files to download, and generates no network traffic.
In VADER-only mode you get reliable sentiment scoring (positive, neutral, negative) on every piece of feedback. The LLM-driven steps — nuanced pain point categorisation, feature request extraction, urgency reasoning — are not available in their full form. For teams whose primary need is understanding sentiment distribution across large feedback volumes, VADER-only is often sufficient and gets to a working deployment in minutes.
- Set SELF_HOSTED=true and configure SECRET_KEY and LLM_ENCRYPTION_KEY.
- Leave LLM_BASE_URL unset.
- Start the stack normally — VADER runs automatically as the fallback.
- No GPU, no model weights, no outbound traffic.
Option 2: Local LLM via Ollama or a compatible server
If you need the full LLM-driven analysis pipeline in an air-gapped environment, the path is to run a model locally alongside Rereflect using a server that exposes an OpenAI-compatible API. Ollama is the most common choice; llama.cpp server and LM Studio are alternatives that expose the same interface.
The workflow for an air-gapped host: pull the model weights and the Ollama binary on a networked machine, transfer them to the air-gapped host (or mount from internal storage), start Ollama, and set LLM_BASE_URL in Rereflect's environment to point at the local Ollama endpoint. Because the endpoint is OpenAI-compatible and local, no API key is needed.
The choice of model affects analysis quality. A 7B-parameter model running on a CPU will be slower and less accurate than a 70B model on a machine with GPU. In practice, for routine sentiment and category classification on short feedback texts, a capable 7B model performs well enough for most production use cases.
- Transfer model weights and runtime to the air-gapped host via approved media or internal repository.
- Start the local model server (e.g., ollama serve).
- Set LLM_BASE_URL to the local endpoint and LLM_MODEL to the model name.
- Leave LLM_API_KEY unset or set to a placeholder — local servers do not authenticate.
- All analysis now runs on the local host; no outbound traffic.
Network policy recommendations
Even if you intend to run fully locally, defence-in-depth suggests enforcing the restriction at the network layer rather than relying on configuration alone. Running Rereflect in a network namespace with no default route, or behind a firewall rule that blocks all outbound traffic from the container network, ensures that a misconfiguration cannot silently start sending feedback to an external API.
The specific egress rules depend on your environment. At minimum, block all traffic from the Rereflect containers to the public internet. If you allow internal-network traffic, restrict Rereflect to only the hosts it legitimately needs to reach: your PostgreSQL instance, your Redis instance, and your local LLM server if you are running one.
Rereflect logs every LLM call — base URL, model, and completion status — at debug level. Review those logs periodically to confirm traffic is going where you expect.