osctrl is a set of small, focused Go services sharing a common core, backed by PostgreSQL and Redis, with a modern React operator frontend.
osquery agents talk to the TLS endpoint. Operators and automation talk to the API. Everything shares one backend.
The legacy osctrl-admin HTML UI is still shipped but is being replaced by the React frontend.
osctrl-tlsImplements the osquery remote API as a TLS endpoint. This is what your fleet talks to:
osctrl-apiREST API service powering the frontend and automation:
React single-page application served alongside the API:
osctrl-cliCommand-line interface for operators and automation:
osctrl-admin LegacyThe original server-rendered HTML admin interface. Still available, but deprecated in favor of the React frontend, which is the primary operator experience going forward.
pkg/*)All services build on the same Go packages: node state, environments, queries, carves, users and permissions, tags, caching, logging pipeline, audit log, GeoIP and posture ingestion, rate limiting and more.
Boring, proven infrastructure — chosen for performance and operational simplicity.
| Layer | Technology | Notes |
|---|---|---|
| Backend services | Go (1.26+) | Single static binaries per component; fast, concurrent log and query handling. |
| Operator frontend | React 19 · TypeScript · Vite · Tailwind CSS | Modern SPA served with the API; Node.js 20+ for development. |
| Database | PostgreSQL | Primary datastore for nodes, environments, queries, users and results. |
| Cache | Redis | Caching and fast node state for high-throughput fleets. |
| Endpoint agent | osquery | Schema metadata shipped through osquery 5.23.1 for query authoring and console .tables. |
| Deployment | Docker · systemd · nginx | Docker Compose stack for development; provisioning script and configs for production. |
| API contract | OpenAPI | osctrl-api.yaml ships in the repository. |
JWT authentication is the default for the API. Table metadata and sample libraries require authentication too.
Operator actions are audit-logged, and trusted proxy controls keep client attribution honest behind load balancers.
The node console is read-only, permission-checked, and scoped to the target node with fresh, active sessions only.
Found a vulnerability? Please follow the responsible disclosure guidelines.
One command with Docker Compose, or deploy natively with the provisioning script.