Documentation/Security Policy

Security Policy

Govlin is designed with the principle of least data, maximum protection. This page details the full security posture of the platform — what enters the system, how it is stored, who can access it, and what technical controls are in place.


What Govlin Captures

Govlin Desktop captures operational metadata only — never source code, file contents, diffs, secrets, or .env values.

Data PointExampleCaptured?
Event typecommit, push, stage_filesYes
Commit SHAa3f8c2eYes
Branch namefeat/authYes
Git author and GitHub loginaliceYes
Commit messagefeat: KAN-42 loginYes, to link the change to the tickets it cites
TimestampISO 8601 (stored in UTC)Yes
Computerhostname, OS, architectureYes
File pathssrc/main.rsYes (limited to 500)
Repo nameorg/repoYes
Client version0.2.13Yes
Event statussuccess, blocked, failedYes
Block reasonprotected branchYes (when applicable)
Source code—Never
File contents—Never
Diff content—Never
Passwords / secrets—Never
.env values—Never

No source code ever leaves the developer workstation. This is an architectural guarantee, not a configuration option.


Where Data Is Stored

Govlin Server

Event records are stored in a PostgreSQL database (hosted on Supabase in our managed deployment). The deploying organization controls the database instance and its geographic location.

LayerTechnologyDetails
DatabasePostgreSQL 15+Supabase-managed or self-hosted
ConnectionTLS-encrypted poolerConnection string uses sslmode=require
BackupsSupabase daily backupsOr organization-managed backup policy
RegionConfigurableOrganization selects region at deployment

Desktop Client

The desktop app stores a local JSONL outbox for offline resilience. Events are queued locally and synced to the server when connectivity is restored. A separate local SQLite database stores the audit log for local policy verification.

Local StoragePurposeProtection
Outbox (JSONL)Queued events pending syncLocal filesystem, cleared after successful delivery
Audit DB (SQLite)Local audit log for offline policy checksOS filesystem permissions
API keyServer authenticationStored in OS keyring (never plaintext files)
gitgov.tomlPolicy configurationChecked into the repository — no secrets

Encryption

In Transit

All communication between Govlin Desktop and the Govlin server is protected by TLS (HTTPS) in production environments.

  • HTTP is only supported for local development.
  • Production deployments must use HTTPS with a valid certificate.
  • Webhook payloads from GitHub, Jenkins, and Jira are validated with HMAC signatures or dedicated webhook secrets before processing.
  • All API requests require a valid Authorization: Bearer token — no anonymous access is possible to protected endpoints.

At Rest

ComponentEncryption at Rest
PostgreSQL (Supabase)AES-256 disk encryption (Supabase default)
Database backupsEncrypted at rest per Supabase/provider policy
API keys in databaseStored as SHA-256 hashes — plaintext never persisted after initial issuance
Local outbox (JSONL)Protected by OS filesystem permissions
Local audit DB (SQLite)Protected by OS filesystem permissions
OS keyring (credential)Protected by the Windows credential store

Who Can Access What

Govlin enforces role-based access control (RBAC) at the API level. Every request requires a valid Authorization: Bearer token.

RoleOwn EventsAll EventsStats/GovernanceIntegrationsAPI Key ManagementTeam & Org Management
DeveloperRead—————
ArchitectRead—————
PMRead—————
AuditorRead—————
AdminReadReadReadRead/WriteCreate/RevokeFull

Access Control Details

  • Developers can only see their own event records (GET /logs is scoped by user_login). They cannot see other developers' data, statistics, or integration information.
  • Admins have full visibility: all events, statistics, Governance evidence, integrations, compliance signals, API key management, team overview, and organization settings.
  • There is no superuser bypass — the Admin role is the highest privilege level, and it is still subject to authentication.
  • API keys are hashed (SHA-256) before storage. The server never stores or logs plaintext keys.
  • Organization scoping — all data is scoped to the organization. An admin of one organization cannot see another organization's data.

Role Assignment

Roles are assigned at API key creation time or when a member is provisioned into an organization. Available roles:

  • Admin — Full access to all endpoints, integrations, team management, and API key operations.
  • Architect — Same read access as Developer, plus Ask.
  • Developer — Read access to own events only.
  • PM — Same read access as Developer, plus Ask.
  • Auditor — Read access. Evidence downloads and the Audit view are administrator views today.

People sign in to the Desktop with GitHub: the server completes the GitHub device flow and issues a credential bound to the person's single active membership.


Audit Trail Integrity

Event records are append-only. The system is architecturally designed to prevent tampering:

  • No UPDATE — audit event records cannot be modified via the API.
  • No DELETE — audit event records cannot be deleted via the API.
  • Database triggers — PostgreSQL triggers enforce append-only at the database level (not just the API layer).
  • Deduplication — each event carries a unique event_uuid; duplicates are rejected and reported back to the client.
  • Export logging — every data export (POST /export) is itself logged as an audit event, creating an immutable chain of custody.
  • Retention enforcement — audit data has a minimum retention floor of 1,825 days (5 years), configurable upward by the organization.

Govlin does not certify that this design meets the audit trail requirements of SOC 2, ISO 27001, PCI-DSS or any other framework. That assessment belongs to your organization and its auditor.


Authentication Security

MechanismDetails
API Key hashingSHA-256 — server computes hash of the bearer token and looks up by key_hash
Key storage (desktop)OS keyring — Windows credential store
Key storage (server)Hashed column in PostgreSQL — plaintext is never persisted
Key lifecycleKeys can be created, listed, and revoked. Revocation takes effect immediately.
JWT signingGITGOV_JWT_SECRET — must be a strong, unique secret in production
Webhook validationGitHub: HMAC-SHA256 with X-Hub-Signature-256; Jenkins: x-gitgov-jenkins-secret; Jira: HMAC signature in X-Hub-Signature (native webhook) or x-gitgov-jira-secret (admin ingest)
Rate limitingPer-route configurable rate limits to prevent abuse
Invitation tokensHashed (SHA-256) before storage; expire after a configurable period

Rate Limit Defaults

RouteDefault Limit
Event ingestion (/events)240 req/min
Audit stream (/audit-stream/github)60 req/min
Jenkins integration120 req/min
Jira integration120 req/min
Admin endpoints (logs, stats, governance data)60 req/min

All limits are configurable via environment variables.


Network Security

  • The Govlin server listens on a configurable address and port (set via GITGOV_SERVER_ADDR environment variable).
  • Local development uses loopback-only binding to prevent accidental network exposure.
  • Managed production currently runs through Render HTTPS. Self-hosted deployments should use HTTPS directly or sit behind a reverse proxy (e.g., Nginx, Caddy) with TLS termination.
  • CORS and request body size limits are enforced per integration endpoint.
  • Maximum request body sizes are configurable per integration (Jenkins, Jira, audit stream) to prevent abuse.

Organization & Data Isolation

  • All data is scoped by organization — events, logs, integrations, team members, and API keys belong to a specific org.
  • Cross-org access is architecturally impossible: the auth middleware enforces org scoping on every request.
  • Organizations are created by an admin and members are added via direct provisioning or invitation tokens.
  • Invitation tokens are hashed before storage and automatically expire after the configured period.
  • When a member is disabled, their API keys stop working immediately on the next request.

What Govlin Does NOT Do

This section is critical for setting accurate expectations:

Govlin Does NOT...Explanation
Read your source codeOnly metadata (SHA, branch, author, timestamp, file count) is captured.
Analyze code qualityNo static analysis, linting, or code review functionality.
Monitor keystrokes or screenGovlin only observes Git operations, not developer behavior.
Make HR decisionsSignals are advisory observations, not disciplinary determinations.
Replace CI/CDGovlin traces CI pipelines but does not run builds, tests, or deployments.
Replace GitHub branch protection or PR rulesGovlin can block configured workstation pushes and record blocked_push evidence, but GitHub remains the source of truth for repository-hosted branch protection and PR merge rules.
Store passwords or secretsAPI keys are hashed; no passwords are ever collected.
Access private repositoriesGovlin does not clone, fetch, or read repository content.
Profile individual productivityThere are no "lines of code" or "commit frequency" performance scores.
Sell your dataData belongs to the deploying organization. Govlin has no data monetization. Sending data to an external AI provider is described below and is off unless an administrator enables it.
Collect telemetry about your machineNo hardware, network, or OS profiling beyond what Git metadata contains.

External AI Processing

The conversational chat and the governance copilot can send part of a question to an external AI provider when Govlin cannot answer it from its own data and documentation.

  • Off until enabled. Nothing is sent for an organization until one of its administrators enables external AI processing (PUT /external-ai-processing/settings). Organizations that existed before this control start disabled.
  • Provider. The chat uses Google Gemini. The copilot uses Google Gemini, or Vercel AI Gateway when the deployment is configured for it. GET /external-ai-processing/settings shows the chat's provider, model and endpoint host.
  • What the chat sends. The question, Govlin product documentation, the user's recent questions in that conversation and, only for a question about the organization's own state, organization-wide counts (blocked pushes today, active developers and repositories, open and critical violations, pipeline failures). Not sent: Govlin's earlier answers, developer names or logins, other organizations' data, or credentials; common credential shapes in a question are redacted before sending.
  • What the copilot sends. The question and the evidence summaries it cites (evidence packet completeness, ticket coverage, release approvals, adoption profile), without approver or customer names.
  • Recorded. Each chat request is recorded in the audit log with provider, model, purpose and the categories of data sent, not the content, and an organization's recent chat requests are listed in its settings. Copilot requests are not recorded by the Govlin server.
  • Not a legal statement. This is a technical control. Whether sending data to the provider is permitted for your organization, and the terms that apply, depend on your agreements with your Govlin operator and the operator's agreements with the provider.

Data Retention & Right to Erasure

  • Audit retention — Minimum 1,825 days (5 years) for audit event data. Configurable upward by the organization.
  • Session retention — Operational session data has a shorter, separately configurable retention period.
  • Right to erasure — Govlin supports anonymization/deletion of a specific developer's data within an organization scope, compliant with GDPR/LOPD. The erasure endpoint returns 404 for non-existent users (privacy-preserving: indistinguishable from "user not found").
  • Export — POST /export allows authorized users to export events in machine-readable format. Each export is logged as an audit event.

Incident Response

If a security vulnerability is discovered in Govlin:

  1. Report it to security@gitgov.io with a detailed description.
  2. Do not disclose publicly until a fix is available.
  3. We aim to acknowledge reports within 48 hours and provide a remediation timeline within 7 business days.

Non-Compliance Signals

The Govlin server can generate signals — automated flags that indicate a potential deviation from configured governance policies. Examples:

  • A successful_push to a branch listed as protected in gitgov.toml by a user not in admins or an authorized group.
  • A commit outside configured operational hours (if a time-window policy is defined).
  • A push without a corresponding Jira ticket reference (if ticket-coverage policy is active).

Critical: Advisory Nature

[!IMPORTANT] Signals are computational observations. They are not legal conclusions, HR determinations, or findings of misconduct.

A signal means: "a configured rule was triggered based on available metadata." It does not establish:

  • Intent — the developer may have had a legitimate reason.
  • Negligence — configuration errors or clock skew can produce false positives.
  • Fault — the signal has no knowledge of context beyond the captured metadata.

Govlin provides no warranty — express or implied — as to the accuracy, completeness, or fitness of signal data for any employment, disciplinary, or legal purpose.


Liability Boundaries

Govlin's responsibility ends at the signal.

BoundaryGovlin's RoleDeploying Organization's Role
Data captureCaptures metadata per the schema aboveMust inform developers that monitoring is active
Signal generationFlags policy deviations based on configured rulesResponsible for policy configuration accuracy
Signal interpretationNone — signals carry no judgementResponsible for human review before any action
Decisions based on signalsNone — Govlin makes no decisionsAssumes full legal responsibility for HR/disciplinary actions
False positivesProvides tooling to review and dismiss signalsMust not act on unreviewed signals
Data subject rightsProvides export endpoint (POST /export)Acts as data controller; handles individual DSAR requests

Deploying organizations must:

  1. Inform employees that Git operational metadata is captured before deployment.
  2. Establish legal basis (legitimate interests, legal obligation, or contract) for processing under applicable data protection law (GDPR Art. 6).
  3. Configure policies accurately — a misconfigured gitgov.toml will produce incorrect signals.
  4. Require human review before taking any action based on a signal.
  5. Comply with local labor law — in many jurisdictions, employee monitoring requires works council consultation, individual notice, or regulatory approval.

GDPR Reference

For EU-based deployments:

GDPR ConceptImplementation
Data controllerThe deploying organization
Data processorGovlin (software + operators)
Legal basisArt. 6(1)(b) contract, 6(1)(c) legal obligation, or 6(1)(f) legitimate interests
Data minimizationOnly operational metadata — no content, no diffs
Right of accessGET /logs?user_login={user} scoped to own data for Developer role
PortabilityPOST /export — full JSON export of event records
ErasureSubject to the organization's audit trail retention obligations

Related

  • Privacy Policy — Full legal terms for end-users.
  • Rules — The five groups of rules, their effects and gitgov.toml.
  • FAQ — Common questions about data, security, and compliance.
All rights reserved.© 2026 Govlin
Security Policy | Govlin