Skip to content

Safety limits

Meridian enforces a small set of size and count guard-rails on every project. They are not quotas — the thresholds are set far above any honest single-team workload. They exist to keep one runaway loop or buggy script from filling shared infrastructure (Postgres connections, disk, request queue) for everyone else on the same cluster.

If you ever hit one of these limits during normal use, that's a bug on our side or a sign that something legitimate has outgrown the default. Reach out at hello@usemeridian.us and we'll raise your cap.

Defaults

Limit Default What it guards
PROJECTS_PER_TENANT 1,000 Project rows in your tenant DB
SPRINT_ITEMS_PER_PROJECT 50,000 Sprint items in one project
NOTES_PER_PROJECT 100,000 Per-project wiki notes
DECISIONS_PER_PROJECT 10,000 Pinned + archived decisions
SESSIONS_PER_PROJECT 100,000 Lifetime session rows
TASKS_PER_PROJECT 1,000,000 Logged task rows
OPEN_HITL_PER_PROJECT 1,000 Pending human-in-the-loop requests
BODY_BYTES 100,000 Single request body size

What a hit looks like

When a create call would push you past a limit you get HTTP 429 with a JSON body:

{
  "detail": "Safety limit reached — protects shared infra. Legit need? hello@usemeridian.us · See docs.usemeridian.us/safety-limits (limit: notes_per_project=100000)",
  "kind": "notes_per_project",
  "limit": 100000,
  "current": 100000
}

The kind field is stable; you can match on it from your client to decide whether to retry, archive, or surface a UI message.

Overriding the limits

Every threshold is read from an environment variable at startup, so self-hosted operators can dial the cap up (or down) without a code change:

# .env or your systemd unit
MERIDIAN_LIMIT_NOTES_PER_PROJECT=500000
MERIDIAN_LIMIT_BODY_BYTES=500000

The variable names map 1:1 to the defaults table above with the MERIDIAN_LIMIT_ prefix.

On the hosted tier (usemeridian.us) the defaults are baseline. If your workload needs more headroom, email hello@usemeridian.us with a one-line description of what you're doing — raises are routine and we usually turn them around within the day.

Why these specific numbers?

They're round numbers two to three orders of magnitude above what any single team has ever come close to in production. A typical project ships with a few hundred notes, a few thousand task rows, fewer than ten thousand decisions over its entire lifetime. The limits exist to catch the pathological cases — an infinite loop appending the same note, a runaway HITL fanout — not to gate features.