Skip to content
KB4IT Help

How KB4IT is built

Explanation Development advanced
On this page

KB4IT is a Python package (kb4it/) built around a small controller and a set of services. AGENTS.md at the root of the repository is the full reference; this page is the map.

The controller and the services

KB4IT in kb4it/core/main.py reads the command line, takes the process lock, sets up logging and registers the services. Each service asks the controller for the others by name.

Service File Job
Workflow services/workflow.py Runs a command: build, create, verify, info, the lists
Backend services/backend.py Loads repo.json, resolves the folders, owns the build state
Database services/database.py Documents and their properties, in memory
Processor services/processor.py Reads the properties and decides what to compile
Compiler services/compiler.py Markdown to HTML, in parallel
Builder services/builder.py Base class of every theme: templates and pages
Frontend services/frontend.py Finds, checks and loads the theme
Deployer services/deployer.py Copies the result to target/

The terminal interface (kb4it/tui/app.py) is a Textual application. It creates the same controller for each build and runs it on a separate thread of its own process.

A build, stage by stage

kb4it build repo.json
  Workflow.build_website()
    1  Backend.stage_01_check_environment   folders, theme load, required templates
       Theme.generate_sources()
    2  Backend.stage_02_get_source_documents
    3  Backend.stage_03_process_sources     Processor: properties, hashes, BuildPlan
    4  Backend.stage_04_process_theme       Theme.build()
    5  Backend.stage_05_compilation         Compiler, then Theme.build_page() per page
    6  Theme.post_activities()
    7  Backend.stage_06_deploy              Deployer
    8  Theme.post_deploy_activities()

Each stage logs [WORKFLOW] STAGE n=..., and its time shows as [PERFORMANCE] at DEBUG level. Errors are typed (ConfigError, ThemeError, CompilationError, KB4ITError) and caught once in KB4IT.run(), which turns them into exit status 1.

Incremental builds

The cache is var/db/kbdict.json in each knowledge base. For every document it stores two blake2b hashes: one of the body without the title, one of the properties.

  • A changed body recompiles the document.
  • Changed properties recompile the document and every property and value page it appears on.
  • A new or removed document refreshes the pages of its properties.
  • A theme whose site_signature() changes, or a new KB4IT version, recompiles everything.

The Processor turns this into a BuildPlan: the documents to compile and the property pages to refresh. Compiled HTML is kept in var/cache/, so unchanged pages are copied instead of rebuilt.

Themes

A theme's logic/theme.py subclasses Builder. The core calls its hooks at the stages above and renders its Mako templates. Template lookup tries the theme's templates/ first, then kb4it/resources/common/templates/. See Create your own theme.

Where things are

Path Holds
kb4it/core/ Controller, environment, logging, helpers, version checks
kb4it/services/ The services above
kb4it/resources/themes/ The bundled themes
kb4it/resources/common/ Shared templates and images
kb4it/tui/ The terminal interface
tests/ The test suite
help/ This help