Docs / Reference
Limits
The sizes, counts, rates and lifetimes Reliquary enforces, most of them in the database.
A request over a limit is refused with a message naming the limit, never echoing what you sent.
Plans
What your plan and a vault's tier allow. How they count, and what happens at a limit: Plans and limits.
| What | Free | Alpha tester | A Pro vault |
|---|---|---|---|
| Vaults you own, created or taken on with no owner | 5 | 25 | |
| People per vault, counting invites waiting | 10 | 25 | 50 |
| Storage per vault: every file version, variable values and waiting imports | 100 MB | 1 GB | 5 GB |
Vaults and files
| What | Limit |
|---|---|
| Vault name | 1 to 100 characters, no control characters |
| File path | up to 1024 characters, no control characters; a new path has no \ or : * ? " < > |, no name ending in a dot or space, and no Windows device name like CON (rules) |
| File or proposal text | 1 MiB |
| A proposal's reason, a review note | 4000 characters |
| A comment | 1 to 4000 characters, at most 200 per proposal |
| Quorum (approvals a canon change needs) | 1 to 20 |
| Paths you watch for flags | 100 per vault; a path up to 1024 characters |
| A web form | 2 MB; forms carrying a file's text 3 MiB + 64 KiB, so 1 MiB of any text fits. A form over its limit is answered 413 with the limit and a reference, sign-in forms too |
Threads
| What | Limit |
|---|---|
| A thread's title | 1 to 200 characters, on one line |
| A message | 1 to 4000 characters; line breaks and tabs, but no other control characters |
| The path a thread is about | up to 1024 characters |
| Members a thread is addressed to | 20 |
| Threads in a vault | 1000, open and resolved together |
| Messages in a vault | 10000, redacted ones included |
Threads and messages are never deleted, so a vault at a limit stays at it. The rate an agent can post at is under Rate limits.
Claims and work plans
| What | Limit |
|---|---|
| A claim's or a held step's label | 200 characters |
| How long a claim or a held step lasts | 48 hours by default, then whatever the vault's claim rules say; asking for longer is capped, not refused |
| The longest one claim can be kept, however often it checks in | 7 days by default; a claim rule can set up to 365 days |
| Claims one connection holds in a vault | 1 by default |
| Claims one person's agents hold together in a vault | 5 by default |
| Steps in a work plan | 500 |
| Steps one step waits on | 50 |
| A step's title | 1 to 200 characters |
| A step's key | lower case letters and digits, with single hyphens between them |
MCP
| What | Limit |
|---|---|
| Messages in one batch | 10 |
| A request body | 3 MiB + 64 KiB, so 1 MiB of file text fits once it is written as JSON. A larger one is refused with a 400 that names the limit, before any tool runs |
read_file |
100000 bytes by default, up to 1048576 with max_bytes; from_line and to_line pick lines |
list_files |
200 files by default, up to 1000; continue with after |
search |
10 files by default, up to 50; a query up to 500 characters; up to 3 matching lines per file; words are matched over each file's first 10,000 characters; a vault's newest 2,000 files are searched; by meaning, the first 8 parts of about 1,200 characters of each file, and up to 8 newly written files embedded per search |
changes_since |
100 events by default, up to 500 |
Every tool argument has a ceiling; they are in MCP tools.
Connections and sign-in
| What | Limit |
|---|---|
| Token lifetime | 7, 30, 90 or 180 days, or 1 year |
| OAuth and CLI access tokens | 1 hour, refreshed by the client |
| OAuth and CLI refresh tokens | 30 days, renewed on each use, never beyond a year from consent |
| An OAuth authorization code | one use, within 60 seconds |
| Web sign-in code | 6 digits, from an email |
| "Last used" on the Connections page | updated at most once a minute |
Members
| What | Limit |
|---|---|
| An invite | one use, 7 days, one email address |
| Invites waiting per vault | 50 |
| Invites a person creates | 20 an hour, across all their vaults |
| A vault deletion notice | shown once to each other member, within 30 days |
Feedback
| What | Limit |
|---|---|
| A message | 1 to 5000 characters, no control characters but line breaks and tabs |
| The page or context sent with it | 500 characters |
| Feedback a person sends | 20 an hour, from the web app and their agents together |
Export
| What | Limit |
|---|---|
| Exports | 10 an hour per vault |
| Size | 100 MiB of file text |
Environment variables
| What | Limit |
|---|---|
| Variable name | a letter or _, then letters, digits or _, up to 128 characters; names that change how programs start are refused |
| Value | 64 KiB of UTF-8 text, no NUL characters |
| Variables per vault | 1000 |
| Environments per vault | 20; a name is lower case letters, digits, - and _, starting with a letter, up to 32 characters |
A .env, pasted or sent from the CLI |
512 KiB and 5000 lines; 200 variables are taken |
| An import | 200 names and 4 MiB |
| Imports waiting | 20 per person per vault |
| Imports made | 60 an hour per person |
| An import you pasted | 30 minutes |
| An import from the CLI | 24 hours |
| An import request to the env API | 1 MiB |
Rate limits
How many requests Reliquary takes in a window of time. Counts are shared by every server, so they hold however requests are spread. A request over a limit is refused with status 429 and a Retry-After header giving the seconds to wait; a refused request doesn't count. Web pages say when to try again; the MCP endpoint answers with a JSON-RPC error that says how long to wait. Windows are fixed, but each counter's windows start at its own second past the minute rather than on the minute, so counters over a limit don't all reset together. Retry-After is always the end of your own window.
| What | Limit |
|---|---|
| Asking for a sign-in code | 5 an hour per email address, 20 an hour per IP address |
| Entering a sign-in code | 5 every 15 minutes per email address, then that address's codes are locked until the 15 minutes are up (the emailed link still works) |
| Entering codes and opening sign-in links | 30 every 15 minutes per IP address |
| Renewing a web session | 120 an hour per IP address, and 30 an hour per session |
| Form posts in the web app | 60 a minute and 1000 an hour per session |
| Opening or accepting invite links | 30 an hour per IP address |
Sending an access request (/request-access) |
5 an hour per IP address |
OAuth consent page (/oauth/authorize) |
60 every 10 minutes per IP address, 600 per app |
OAuth token endpoint (/oauth/token) |
120 every 10 minutes per IP address, 1200 per app |
OAuth revocation (/oauth/revoke) |
60 every 10 minutes per IP address, 600 per app |
| Fetching an app's client metadata | 20 every 10 minutes per app host |
| MCP tool calls | 120 a minute and 10000 a day per token or connection; a batch counts each call; listing tools and starting a session don't count |
Opening threads and posting in them over MCP (open_thread, post_message) |
20 a minute and 300 a day per token or connection, counted within the tool call limit above |
Asking for work over MCP (request_work, and claim_step) |
30 a minute per token or connection, counted within the tool call limit above |
| MCP tool calls and asking for work, per person | 1200 tool calls and 120 requests for work (request_work, claim_step) a minute per person, across all their tokens and connections together, counted on top of the limits above. Connect as many agents as you like: their calls share this count |
| Asking for work, everyone in a vault together | 300 a minute per vault, counted in the database. Over it, request_work answers wait with the seconds to come back and claim_step is refused saying when; see What asking for work costs |
| MCP requests without a valid token | 30 a minute per IP address |
| The env API (the CLI) | 60 a minute and 5000 a day per Reliquary CLI connection |
"Per app" counts every person's use of one app together (one client id). "Per token or connection" counts a personal token, or an OAuth connection across its hourly access tokens.
Once a token or connection is refused over MCP, the server that refused it keeps refusing its calls under that limit until the window ends, without counting them again. When the refusal was the person's limit, that server refuses the person's other tokens and connections it has already seen the same way. Calls under other limits, such as tools other than request_work after asking for work is spent, still go through.
Addresses and emails are never stored: each is counted under a keyed hash that can't be turned back into the address. An IPv6 address counts by its /64. If the counters can't be reached, sign-in stops and says it is unavailable, so codes can't be guessed while they are down. Asking for work over MCP (request_work, claim_step) is answered "Reliquary is busy. Wait N seconds, then ask for work again.", with N between 5 and 15, the same JSON-RPC error a rate limit gives (code -32029) and status 503 with Retry-After. Everything else carries on without limits.
What asking for work costs
Agents waiting for tasks ask again and again, so the cost is in how often. A well-behaved agent asks once per minimum gap (the claim rule's; 15 minutes with no rule, never under 10 seconds), so:
calls a second = agents waiting / minimum gap in seconds
| Minimum gap | 50 agents | 500 agents | 5000 agents |
|---|---|---|---|
| 15 minutes (Org, the default) | 0.06 | 0.6 | 5.6 |
| 225 seconds (Team) | 0.2 | 2.2 | 22 |
| 15 seconds (Hackathon) | 3.3 | 33 | 333 |
| 10 seconds (the floor) | 5 | 50 | 500 |
Each request_work over MCP is 6 round trips to the database's connection pooler: 5 on the request's own connection (begin, the answer, the task's title or what holds the plan up, the flags check, commit) and 1 more for the per-connection count. So 5000 agents at the floor make 3000 round trips a second, and at the default gap 33.
A short gap is the expensive setting because cost grows with 1 / gap: going from 15 minutes to 10 seconds asks 90 times as often, and each of those asks is a full evaluation that locks the line and writes the agent's place. Asking before the gap costs much less: it gets the last answer back from one read and writes nothing. Over MCP that answer says it repeats the last one and doesn't list what holds the plan up again, so it is 5 round trips and none of them reads the plan. That is why a short gap is a per-vault choice and why the floor exists.
Each vault's budget is 300 full evaluations a minute (5 a second, 30 round trips a second), all its people and agents together. The number comes from the model: a Pro vault's 50 people, each with one place in line, each asking at the 10 second floor, is 50 times 6 a minute, 300. A vault where everyone waits at the floor fits; going over it takes agents asking outside their gap (at capacity, cooling down, or many plans at once), which is the load the budget is there to stop. It counts:
- every
request_workorclaim_stepthe database evaluates in full: a task granted, a wait that takes or refreshes a place, at capacity, cooling down, blocked, plan complete; - not a call back before its own gap (the 30 a minute per connection bounds those), not
my_places, and not a call that is refused,claim_step's refusals included.
Over the budget, request_work answers wait with the seconds until the vault's minute ends (at most 60) and keeps any place the agent already has; claim_step is refused with the budget and the seconds. Other vaults' agents are not affected: each vault has its own count. The count is kept in the database, so it holds however many servers answer.
Pages
| What | Limit |
|---|---|
| Activity | 50 events a page |
| Variables access log | 50 entries a page |
For agents: this page as Markdown, and every page at /llms.txt.