← Documentation home

1. Introduction

Kingdom Management Portal (KMP) is a membership and administration system for Society for Creative Anachronism kingdoms. It combines a CakePHP application, first-party domain plugins, and a managed platform layer so multiple kingdoms can use the same deployed application without sharing application data.

What KMP manages

The core application provides:

First-party plugins add Activities, Officers, Awards, and Waivers. The Queue plugin supplies asynchronous job infrastructure. Template is a development skeleton and is not enabled as a product feature.

Current platform model

Hosted KMP is a database-per-tenant system:

  1. A central PostgreSQL platform database stores the tenant and host registry, central operator identities and sessions, encrypted secret records, platform jobs and schedules, backup metadata, audit records, and operational telemetry.
  2. Every kingdom has a separate PostgreSQL tenant database containing its members and all other application and plugin data.
  3. The request host selects a tenant before authentication and authorization. Unknown, inactive, unavailable, or schema-incompatible tenants fail closed.
  4. Background work explicitly enters the target tenant context before touching tenant tables.

There is no shared tenant_id discriminator in business tables. Code must not infer tenant identity from user-controlled request data. See Multi-tenant architecture for the complete isolation contract.

Technology baseline

Check app/composer.json, app/package.json, the Dockerfiles, and deployment templates before relying on an exact patch version.

Who these guides are for

These guides support application developers, plugin authors, reviewers, test authors, and platform operators. Start with:

Product behavior is ultimately defined by source code, migrations, tests, and runtime configuration. These pages explain durable contracts and workflows; they intentionally avoid exhaustive snapshots of every class or database column because generated references and migrations serve that purpose better.

Design principles

Next: Getting started →