Rocky is part of the openKAT project, made with Django. To comply to government standards, Manon is used for style and accessibility. Yarn is used as package manager and ParcelJS is used as bundler to compile the frontend (CSS and Javascript). You can find the Manon repository here.



To run rocky from using Docker, run this from the parent directory nl-kat-coordination:

$ make kat

and continue reading this document at “First run”.


For a local set up, you need to start the Django app and compile the frontend.

Django App

This requires a working Python (>3.10) environment. One example of how to create, activate and initialize a development environment is:

$ python3 -m venv $PWD/.venv
$ source .venv/bin/activate
$ python3 -m pip install -r requirements-dev.txt

Copy the .env-dist to a .env and configure the hosts and credentials to PostgreSQL, RabbitMQ and the other services.

$ cp .env-dist .env

For instance, to configure the PostgreSQL database set the following variables:


Here, ROCKY_DB_DSN is optional (e.g. postgresql://username:password@hostname:port/database_name) and if not set, the other DB variables will be used.

Once your environment variables are set up (see .env-dist, you can initialize Rocky using:

$ make build-rocky-native

To start the Django server, run:

$ make run


Yarn is used to bundle CSS and Javascript.

To compile the frontend using yarn locally, run:

$ yarn --ignore-engine
$ yarn build

To compile the frontend using Docker, run:

$ make build-rocky-frontend

The app should be running at localhost:8000.


Given a proper .env file, run:

$ python3 -m venv $PWD/.venv
$ source .venv/bin/activate
$ python3 -m pip install -r requirements-dev.txt
$ make build-rocky-native
$ & make run
$ make build-rocky-frontend



To run all unit tests, run:

$ make utest


A local Python environment is useful for unit testing even when using Docker. Follow the first instructions in the local setup to create a Python environment. Then create a rocky/.env from the template rocky/.env-dist and set ROCKY_DB_HOST=localhost. Now for the unit tests you should be able to just run

$ pytest

to run them locally.

You can easily parallelize the tests can be parallelized using pytest-xdist:

$ python -m pip install pytest-xdist
$ time pytest  # 1:08,92 on 13-02-2024
$ time pytest -n 8  # 21,749 on 13-02-2024


Fonts license

All fonts used within Rocky remain under their own license. For example: Fredoka, Open Sans & Tabler icons.

For more information check their respective folders for extra/ more specific license (if available) or visit:


Open Sans

Tabler icons

Technical Design

Running a boefje

The following diagram shows the triggered flows when running a Boefje from Rocky.

sequenceDiagram participant Rocky participant Scheduler participant Boefje participant Bytes participant Normalizer participant Octopoes Rocky->>+Scheduler: Push Boefje Task Boefje->>Scheduler: Pull Boefje Task Scheduler-->>Rocky: boefje_task.status = dispatched Boefje->>Bytes: Save Raw Boefje->>Scheduler: boefje_task.status = completed Scheduler->>-Rocky: boefje_task.status = completed Bytes-->>Scheduler: Raw File Received Scheduler->>+Scheduler: Push Normalizer Task Normalizer->>Scheduler: Pull Normalizer Task Normalizer->>Bytes: Get Raw Scheduler-->>Rocky: normalizer_task.status = dispatched Normalizer->>Octopoes: Add object(s) Normalizer->>Scheduler: normalizer_task.status = completed Scheduler->>-Rocky: normalizer_task.status = completed

Rocky View Structure

Rocky has a hierarchical set of views that are not easy to capture in a single diagram. We therefore made several diagrams to show the most coherent components.

Overview of child Views of the OrganizationViews

classDiagram direction RL class OrganizationView OrganizationView : organization OrganizationView : octopoes_api_connector OrganizationView : organization_member OrganizationView : indemnification_present OrganizationView <|-- View SinglePluginView <|-- OrganizationView BytesRawView <|-- OrganizationView Health <|-- OrganizationView HealthChecks <|-- OrganizationView IndemnificationAddView <|-- OrganizationView OctopoesView <|-- OrganizationView OOIAddTypeSelectView <|-- OrganizationView Report <|-- OrganizationView OrganizationDetailView <|-- OrganizationView OrganizationMemberEditView <|-- OrganizationView DownloadTaskDetail <|-- OrganizationView TaskListView <|-- OrganizationView UploadCSV <|-- OrganizationView UploadRaw <|-- OrganizationView ObjectsBreadcrumbsMixin <|-- OrganizationView OrganizationMemberBreadcrumbsMixin <|-- OrganizationView FindingTypeAddView <|-- OrganizationView

Exhaustive overview of OctopoesViews

classDiagram direction RL class OrganizationView class OctopoesView class BoefjeMixin OctopoesView <|-- OrganizationView BoefjeMixin <|-- OctopoesView BoefjeDetailView <|-- BoefjeMixin OOIDetailView <|-- BoefjeMixin OOIDetailView <|-- OOIRelatedObjectAddView OOIDetailView <|-- OOIFindingManager ChangeClearanceLevel <|-- BoefjeMixin SingleOOIMixin <|-- OctopoesView SingleOOITreeMixin <|-- SingleOOIMixin BaseOOIDetailView <|-- SingleOOITreeMixin BaseOOIDetailView <|-- ConnectorFormMixin OOIDetailView <|-- BaseOOIDetailView OOIFindingListView <|-- OOIFindingManager OOIFindingListView <|-- BaseOOIDetailView MuteFindingView <|-- BaseOOIDetailView BaseReportView <|-- BaseOOIDetailView OOIReportView <|-- BaseOOIDetailView OOITreeView <|-- BaseOOIDetailView OOISummaryView <|-- OOITreeView OOIGraphView <|-- OOITreeView OOIRelatedObjectManager <|-- SingleOOITreeMixin OOIFindingManager <|-- SingleOOITreeMixin OOIRelatedObjectAddView <|-- OOIRelatedObjectManager OOIReportPDFView <|-- SingleOOITreeMixin OnboardingSetupScanOOIDetailView <|-- SingleOOITreeMixin BaseOOIFormView <|-- SingleOOIMixin OOIDeleteView <|-- SingleOOIMixin OnboardingSetupScanOOIAddView <|-- BaseOOIFormView OOIEditView <|-- BaseOOIFormView OOIAddView <|-- BaseOOIFormView FindingAddView <|-- BaseOOIFormView BaseOOIListView <|-- ConnectorFormMixin OOIListView <|-- BaseOOIListView FindingListView <|-- BaseOOIListView OOIListExportView <|-- BaseOOIListView ScanProfileDetailView <|-- OOIDetailView ScanProfileResetView <|-- OOIDetailView

KATalogus Views

This diagram shows the current view structure and what properties are set in each class for the KATalogus.

classDiagram direction RL class FormView class OrganizationView class SinglePluginView class KATalogusView class PluginSettingsAddView class PluginEnableDisableView class SingleSettingView class PluginSettingsListView OrganizationView : organization OrganizationView : octopoes_api_connector OrganizationView : organization_member OrganizationView : indemnification_present SinglePluginView : katalogus_client SinglePluginView : plugin SinglePluginView : plugin_schema SingleSettingView : setting_name class PluginSettingsDeleteView class BoefjeDetailView KATalogusView <|-- OrganizationView KATalogusView <|-- FormView SinglePluginView <|-- OrganizationView SingleSettingView <|-- SinglePluginView BoefjeDetailView <|-- PluginSettingsListView BoefjeDetailView <|-- BoefjeMixin PluginEnableDisableView <|-- SinglePluginView PluginSettingsAddView <|-- FormView PluginSettingsAddView <|-- SinglePluginView PluginSettingsDeleteView <|-- SingleSettingView PluginSettingsListView <|-- SinglePluginView