Skip to main content

Versions & rate limits

After an ingest run, the corpus holds a new active source_version. The mnm versions commands let you inspect the version history, roll back to a prior revision, and retire stale versions. The mnm ratelimits commands let you add and manage per-CIDR rate-limit overrides.

Admin commands are hidden by default. Reveal them with:

export MIDNIGHT_MANUAL_SHOW_ADMIN_CMDS=1

Version management​

Every ingest run produces a new source_version for a source slug. Versions have a lifecycle:

StatusDescription
buildingIn progress; invisible to search.
activeThe single live version for this slug; served to all search queries.
inactiveA prior version; retained per the source's retention_count.
abortedAn ingest that failed before it was finalized to active; a partial version that was never promoted and is never served. It does not block the next run, so it is safe to re-run the ingest. The background sweep hard-deletes it automatically once it passes the abort grace window (default: 1 hour) — you normally need do nothing.
retiredMarked for cleanup by the background sweep job.

Only one version per slug can be active at a time. Promoting a new revision demotes the current active to inactive automatically.

Listing versions​

mnm versions list midnight-docs

Prints each revision with its status and whether it is active:

rev 1 inactive
rev 2 inactive
rev 3 active (active)

mnm versions list is an anonymous read and needs no login token.

Showing one version​

mnm versions show midnight-docs 2

Prints the revision, status, is_active, and whether it has been retired.

Rolling back​

rollback promotes the most recent inactive version back to active, demoting the current active. It is a convenience that calls list then promote internally:

mnm versions rollback midnight-docs

Requires an admin token (mnm login first).

If no prior inactive version exists (the slug has only one active source_version), the command exits with an error rather than attempting a no-op.

Promoting a specific revision​

To promote a specific historical revision:

mnm versions promote midnight-docs --revision 2

The named revision must currently be in inactive state. Requires an admin token.

Retiring a version​

retire marks a version for cleanup by the background sweep job. The active revision cannot be retired; promote another version first:

mnm versions retire old-source --revision 3

A background sweep job hard-deletes stale versions that have aged out of their source's retention_count window, and separately hard-deletes aborted versions, each after its own grace window. Retirement is a one-way operation.

Rate-limit overrides​

The server applies tiered rate limiting: anonymous traffic is limited per IP; signing in via GitHub OAuth (a 30-day read-uplift token) raises the limit; admins have a much higher ceiling. Per-CIDR overrides raise or lower limits for specific network blocks: a hackathon, a CI cluster, or a misbehaving client.

All ratelimits subcommands require an admin token.

Adding an override​

mnm ratelimits add \
--cidr 203.0.113.0/24 \
--limit 20 \
--ttl 90d

# With a note
mnm ratelimits add \
--cidr 203.0.113.0/24 \
--limit 200 \
--ttl 30d \
--note "launch event"

--limit accepts 200 or 200/s. --ttl accepts single-unit durations: 90s, 30m, 48h, 7d.

Listing active overrides​

mnm ratelimits list

Prints each active override with its UUID, CIDR, limit, and optional note. Overrides whose TTL has passed are not shown.

Extending an override's TTL​

mnm ratelimits extend <uuid> --ttl 30d

Sets a new expiry from now, based on the supplied TTL.

Removing an override​

mnm ratelimits remove <uuid>
# → prompts: Remove rate-limit override `<uuid>`? [y/N]

mnm ratelimits remove <uuid> --yes # skip the confirmation

Removal is interactive by default. Pass --yes for scripts and non-interactive environments (the command refuses without it when stdin is not a terminal).

Tuning the limits​

The per-tier refill rates, and the subsystem itself, are set by environment variable on the server. Rate limiting is on by default; the refill defaults match the tiers the hosted instance serves: 10 req/s anonymous, 60 req/s read-uplift, 1000 req/s admin.

VariableControls
MIDNIGHT_MANUAL_RATE_LIMIT_ANONYMOUS_RPSAnonymous tier refill rate
MIDNIGHT_MANUAL_RATE_LIMIT_UPLIFT_RPSRead-uplift tier refill rate
MIDNIGHT_MANUAL_RATE_LIMIT_ADMIN_RPSAdmin tier refill rate
MIDNIGHT_MANUAL_RATE_LIMIT_ENABLEDToggle the whole subsystem — on unless set to false (or 0/no/off); a server running without it warns at boot

Token-limit knobs​

Per-tier token budgets (hourly and daily) are configured via environment variables on the server, not the CLI. See the token-limit table in Cloud server & deploy for the full list of variables and their defaults.