Map overlapping controls across cybersecurity and privacy frameworks β so you can close gaps and reduce duplication.
Important
This tool is currently in pre-alpha and may have inconsistencies, missing and/or incorrect data.
- β¨ Features
- π Tech Stack
- π Getting Started
- ποΈ Project Structure
- π API Reference
- π§ͺ Running Tests
- π License
- πΊοΈ Framework Browser β explore all supported frameworks and their individual controls
- π Cross-Framework Mapping β query how controls from different frameworks relate to each other
- π Relationship Filtering β filter by
equivalent,subset,superset, orrelated - π€ User Accounts β sign up / sign in with per-control progress tracking
- π Dark Mode β full dark mode UI built with Tailwind CSS v4
- π Live API Docs β built-in documentation page with a "try it" runner
- π Progress Dashboard β per-framework progress bars and an overall compliance score
| Layer | Technology |
|---|---|
| Frontend | SvelteKit v2 (Svelte 5 with runes) |
| Styling | Tailwind CSS v4 |
| Backend | SvelteKit server routes via @sveltejs/adapter-node |
| Runtime | Node.js β₯ 18 |
| Data | JSON files for frameworks, controls, and mappings |
| Database | PostgreSQL (user accounts & progress tracking) |
The easiest way to run the full stack (app + database) is with Docker Compose.
Prerequisites: Docker Desktop or Docker Engine + Compose plugin.
-
Copy the example environment file and set your secrets:
cp .env.example .env
DB_PASSWORDandJWT_SECRETmust be set β Docker Compose will refuse to start without them:DB_PASSWORD=a-strong-db-password JWT_SECRET=a-long-random-string-at-least-32-characters
-
Start the stack:
docker compose up --build
On the first run Docker will:
- Build the app image (runs
npm run buildfor the SvelteKit app) - Pull the
postgres:16-alpineimage - Wait for PostgreSQL to be healthy, then start the app
- Build the app image (runs
-
Open the app: http://localhost:3000
-
Stop the stack:
docker compose down # keep the database volume docker compose down -v # also remove the database volume
π Useful Compose commands
| Command | Description |
|---|---|
docker compose up -d |
Start in the background (detached) |
docker compose logs -f app |
Stream app logs |
docker compose logs -f db |
Stream database logs |
docker compose ps |
Show running services |
docker compose exec db psql -U ${DB_USER:-postgres} ${DB_NAME:-compliance_mapper} |
Open a psql shell |
βοΈ Environment variables
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Host port to expose the app on |
DB_NAME |
compliance_mapper |
PostgreSQL database name |
DB_USER |
postgres |
PostgreSQL user |
DB_PASSWORD |
(required) | PostgreSQL password |
JWT_SECRET |
(required) | Secret for signing JWTs β use a long random string |
BCRYPT_ROUNDS |
12 |
bcrypt work factor for password hashing |
STANDALONE_MODE |
false |
Set to true to disable database features (serves data-only) |
You need Node.js β₯ 18 and a running PostgreSQL instance.
-
Install dependencies:
npm install
-
Configure environment:
cp .env.example .env # Edit .env β set DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, JWT_SECRET -
Run in development mode (with HMR):
npm run dev
-
Build and run for production:
npm run build npm start
The app is available at http://localhost:3000 in production or http://localhost:5173 in dev mode.
Note: The app starts even without a database β framework and mapping data are served from JSON files. Auth and progress endpoints return
503until a database is reachable. SetSTANDALONE_MODE=trueto explicitly disable database features.
Click to expand
src/
βββ lib/
β βββ components/ # Reusable Svelte components
β β βββ NavBar.svelte # Top navigation bar
β β βββ FrameworkCard.svelte # Framework grid card
β β βββ FwBadge.svelte # Coloured framework badge
β β βββ RelPill.svelte # Mapping relationship pill
β β βββ ProgressBadge.svelte # Per-control progress indicator
β β βββ Modal.svelte # Reusable modal dialog
β β βββ AuthModal.svelte # Sign in / Sign up modal
β β βββ DonutChart.svelte # SVG donut chart for score
β βββ server/ # Server-only modules
β β βββ auth.js # JWT helpers
β β βββ data.js # Loads JSON data files
β β βββ db.js # PostgreSQL pool
β βββ api.js # Client-side API fetch helpers
β βββ stores.js # Svelte stores (auth, frameworks, progress)
β βββ utils.js # Shared utilities (progress cycle, preferences)
βββ routes/
β βββ +layout.svelte # Root layout (NavBar, data init)
β βββ +page.svelte # Frameworks grid (home page)
β βββ frameworks/[id]/ # Framework detail + controls list
β βββ controls/ # Cross-framework mapping table
β βββ api-docs/ # Interactive REST API docs
β βββ dashboard/ # Progress dashboard
β βββ settings/ # Account settings (profile, password, API keys)
β βββ api/ # SvelteKit server routes (REST API)
β βββ frameworks/
β βββ controls/
β βββ mappings/
β βββ auth/ # register, login, me
β βββ progress/
β βββ settings/
β βββ stats/
β βββ themes/
β βββ config/
βββ hooks.server.js # CORS headers + JSON error format for API routes
| Method | Path | Description |
|---|---|---|
GET |
/api/frameworks |
List all frameworks |
GET |
/api/frameworks/:id |
Get a single framework |
GET |
/api/frameworks/:id/controls |
List controls for a framework |
GET |
/api/controls |
List controls (optional ?framework= filter) |
GET |
/api/controls/:id |
Get a single control |
GET |
/api/mappings |
Query mappings (?from=, ?to=, ?control=, ?relationship=) |
GET |
/api/mappings/:id |
Get a single mapping |
GET |
/api/themes |
List unique themes across all controls |
GET |
/api/stats |
Get summary statistics |
GET |
/api/config |
Returns { dbEnabled: boolean } |
| Method | Path | Description |
|---|---|---|
POST |
/api/auth/register |
Create a new account ({ email, password }) |
POST |
/api/auth/login |
Sign in ({ email, password }) β returns JWT |
GET |
/api/auth/me |
Validate token and return current user |
| Method | Path | Description |
|---|---|---|
GET |
/api/progress |
List progress for all controls (?framework= filter) |
PUT |
/api/progress/:controlId |
Set status for a control ({ status, notes? }) |
DELETE |
/api/progress/:controlId |
Remove progress entry for a control |
Progress status values: not_started Β· in_progress Β· completed
| Method | Path | Description |
|---|---|---|
GET |
/api/settings/profile |
Get profile |
PATCH |
/api/settings/profile |
Update profile ({ username?, email? }) |
PATCH |
/api/settings/password |
Change password ({ currentPassword, newPassword }) |
GET |
/api/settings/apikeys |
List API keys |
POST |
/api/settings/apikeys |
Create API key ({ name? }) |
DELETE |
/api/settings/apikeys/:id |
Revoke API key |
npm testTests cover all public API endpoints using the built SvelteKit server (runs npm run build first). The test runner is Node.js built-in node:test.
This project is released under a custom Non-Commercial Use License. See the LICENSE file for the full terms.
| β Permitted | Personal use, educational & research use, open-source projects, internal business use |
| β Prohibited | Selling this software or derivatives, delivering paid services to clients, bundling in commercial products |
For commercial licensing enquiries, open an issue or contact the maintainer via the repository.
Made with β€οΈ by @veniplex
