Open-source Governance, Risk and Compliance (GRC) platform built with Django.
- Scopes — hierarchical organisational perimeters with versioning and approval workflow
- Sites — physical and logical locations (offices, datacenters, cloud regions) with hierarchy
- Issues — internal/external strategic issues (PESTLE categories) with impact and trend tracking
- Stakeholders — interested parties with expectations, influence/interest levels and RACI support
- Objectives — security and business objectives with KPI tracking (target/current values, progress %)
- SWOT Analysis — structured strengths/weaknesses/opportunities/threats with impact levels
- Roles & Responsibilities — RACI matrix, mandatory role enforcement, responsibility assignments
- Activities — hierarchical business processes (core, support, management) with criticality levels
- Essential Assets — business processes and information assets with DIC valuation (Confidentiality, Integrity, Availability on a 5-level scale)
- Support Assets — IT infrastructure (hardware, software, network, services, sites, people) with lifecycle tracking (EOL, warranty)
- Dependencies — essential-to-support asset mapping with criticality, SPOF detection and redundancy tracking
- Asset Groups — logical grouping of support assets
- DIC Inheritance — support assets automatically inherit max DIC levels from linked essential assets
- Valuations — historical DIC evaluation tracking per essential asset
- Risk Assessments — ISO 27005 and EBIOS RM methodologies
- Risk Criteria — configurable likelihood/impact scales with dynamic risk matrix generation
- Risks — three-level tracking (initial, current, residual) with treatment decisions (accept, mitigate, transfer, avoid)
- Threat Catalog — reusable threats by type (deliberate, accidental, environmental) and origin
- Vulnerability Catalog — reusable vulnerabilities with severity, CVE references and remediation guidance
- ISO 27005 Analysis — atomic threat x vulnerability risk scenarios with combined likelihood/impact calculation
- Treatment Plans — structured remediation with ordered actions, progress tracking and cost estimates
- Risk Acceptance — formal acceptance records with expiry dates, conditions and review tracking
- Risk Matrices — visual heatmaps (current vs residual)
- Frameworks — regulatory and standard frameworks (ISO 27001, GDPR, NIS2, etc.) with type, category and jurisdiction
- Sections — hierarchical framework structure
- Requirements — per-framework requirements with compliance status, evidence and gap tracking
- Assessments — compliance evaluations with per-requirement results and automatic compliance level calculation
- Action Plans — gap remediation plans with priority, progress and cost tracking
- Inter-Framework Mappings — requirement-to-requirement mappings across frameworks (equivalent, partial, includes, related)
- Framework Import — Excel-based bulk import of frameworks and requirements
- Custom User Model — email-based authentication with UUID primary keys
- Role-Based Access Control — granular permissions (90+) using
module.feature.actioncodenames - 6 System Groups — Super Admin, Admin, RSSI/DPO, Auditor, Contributor, Reader
- Scope-Based Tenancy — groups can be restricted to specific organisational scopes
- Account Security — failed login lockout (5 attempts / 15 min), password complexity enforcement
- Dual Authentication — session-based (web UI) + JWT with token rotation (API)
- Access Logs — full audit trail of authentication events (login, logout, lockout, password change)
- WebSocket Updates — live dashboard statistics pushed via Django Channels, no page refresh needed
- Animated Counters — smooth count-up animations with easeOutExpo easing and locale-aware thousand separators
- Connection Status — visual sonar-style indicator showing WebSocket connection state
- Auto-Reconnect — exponential backoff reconnection (up to 30 s)
- Scope-Aware — each user sees only data matching their assigned scopes
- Custom Indicators — manual KPI, metric and compliance metric tracking with number, boolean or percentage formats
- Predefined Indicators — auto-computed metrics (global compliance rate, risk treatment rate, objective progress, etc.)
- Thresholds — critical threshold detection with configurable operators and min/max bounds
- Measurement History — timestamped measurements with trend and delta tracking
- Sparklines — inline charts on the dashboard for numeric indicators
- Approval Workflows — two-step approval (submit / approve) on all domain models with dedicated permissions
- Audit Trail — full change history on every model via django-simple-history
- Versioning — automatic version increment on all domain objects
- Contextual Help — inline help banners with multilingual content (FR/EN)
- Excel Export — export assets, risks, compliance data to Excel
- Dark Mode — automatic theme switching based on OS preference
- Responsive UI — collapsible sidebar, mobile-friendly layout
- REST API — full CRUD + filtering, search, pagination and export on all resources
- HTMX Integration — dynamic partial updates without full page reloads
- Passkey Authentication — FIDO2 WebAuthn passwordless login with discoverable credentials
- MCP Server — JSON-RPC 2.0 server with 40+ tools and OAuth 2.0 authentication for external clients
| Component | Technology |
|---|---|
| Backend | Django 5.2 LTS |
| Database | PostgreSQL 16 |
| Real-Time | Django Channels + Redis 7 |
| ASGI Server | Uvicorn |
| REST API | Django REST Framework |
| Authentication | djangorestframework-simplejwt, fido2 (WebAuthn) |
| Audit Trail | django-simple-history |
| Filtering | django-filter |
| Frontend | Bootstrap 5.3 + HTMX |
| Export | openpyxl |
| Container | Docker & Docker Compose |
- Copy the environment file:
cp .env.example .env- Start the services:
docker compose up --build- Apply migrations (in another terminal):
docker compose exec web python manage.py migrate- Create a superuser:
docker compose exec web python manage.py createsuperuserThe application is available at http://localhost:8000. The admin interface is at http://localhost:8000/admin/.
You can run Open GRC directly from the published image without cloning the repository.
Create a docker-compose.yml file:
services:
web:
image: frousselet/open-grc:latest
ports:
- "8000:8000"
environment:
SECRET_KEY: change-me-to-a-random-secret-key
DEBUG: "False"
ALLOWED_HOSTS: localhost,127.0.0.1
POSTGRES_DB: open_grc
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_HOST: db
POSTGRES_PORT: "5432"
REDIS_HOST: redis
REDIS_PORT: "6379"
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
redis:
image: redis:7-alpine
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 5
db:
image: postgres:16
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: open_grc
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres_data:Then start the stack:
docker compose up -d
docker compose exec web python manage.py migrate
docker compose exec web python manage.py createsuperuserMIT