Skip to main content
This guide takes you from a fresh clone to a working local deployment with real cost figures on screen — seeded with eight fictional employees and a handful of completed meetings so the reports have something in them from the first load. There are two paths: Docker (fewest prerequisites) and plain Python with a virtual environment. Pick the one that matches your setup; both land at the same place.
The local quickstart uses MEETCOST_ENVIRONMENT=development and MEETCOST_AUTH_MODE=dev, which enables the meetcost token command and relaxes some production checks. These modes are explicitly refused when MEETCOST_ENVIRONMENT=production. See Deployment for the production setup with Postgres and OIDC.

Prerequisites

  • Docker Desktop or Docker Engine with Compose v2
  • Git
  • jq (optional, for pretty-printing the API response)

Setup

1

Clone the repository

2

Create your environment file

Copy the example env file. You will fill in the encryption key in the next step.
3

Generate an encryption key

Pay values are stored encrypted with AES-256-GCM under a key you supply. Generate one now and paste it into .env as MEETCOST_ENCRYPTION_KEY.
Open .env in your editor and set:
4

Start the service

The service will be available at http://localhost:8000.
5

Seed demo data

The seed-demo command creates eight fictional employees with pay records, assigns roles, and injects a few completed meetings so the reports pages are not empty.
Expected output:
6

Open the admin UI

Visit http://localhost:8000/admin, click Get a development token, and enter ada@example.com. Ada is the seeded admin user.

Get a development token

The meetcost token command mints a short-lived JWT signed with your MEETCOST_SECRET_KEY. It works only when MEETCOST_ENVIRONMENT is not production.
This prints the token to stdout. The curl example below captures it into a shell variable in one step.
Development tokens are signed with a local secret and are not verified against an identity provider. They are refused entirely in production. Use MEETCOST_AUTH_MODE=oidc with your own OIDC issuer for any non-local deployment.

Call the estimate endpoint

With the service running and demo data seeded, ask for the cost of a one-hour weekly sync with all eight demo employees:
The response includes the per-occurrence cost, the annualised total for the given cadence, and any configured nudges:
The annualised figure — USD 33,768 in this example — is the number the product exists to surface. It is computed from per_occurrence_cost × occurrences_per_year for the given cadence. For weekly that is 52 occurrences. For a one_off cadence, annualised_total is omitted because an annual figure would be meaningless.

Understanding the response

Cadence values

The cadence field accepts: one_off, daily, weekdaily, weekly, biweekly, monthly, quarterly.

What the demo data looks like

seed-demo creates the following people and roles: It also injects three weekly all-hands meetings (from the past three weeks) and one monthly roadmap review, so the digests and reports endpoints return real data.

Assigning roles from the CLI

You can grant roles without going through the admin UI:
Valid roles are participant, organiser, team_lead, finance, and admin.

Running the tests

The test suite runs with no network access and completes in a few seconds:
The most important test is server/tests/test_no_egress.py, which asserts that the service makes no outbound connections to any host that is not in the configured egress allowlist — this is the test that keeps the data-residency claim honest.

Next steps

Production Deployment

Switch to Postgres, configure OIDC against your identity provider, supply an encryption key from your secret manager, and deploy with the provided Helm chart.

Architecture

Understand the four-layer code structure, storage schema, boot sequence, and extension points.

Permissions

Full detail on the role model, salary-inference protections, and the small-meeting rounding rules.

Adapters

Connect a directory provider (Google, Microsoft), an attendance collector, or an HRIS for automated pay data sync.