| 1 | # Limits and getting help |
| 2 | |
| 3 | The numbers on this page exist to make a stolen token boring, not to ration |
| 4 | ordinary work. You are unlikely to meet any of them by hand. An automated |
| 5 | loop is another matter, so here they are, along with what the refusal looks |
| 6 | like when one does bite. |
| 7 | |
| 8 | ## Shipping |
| 9 | |
| 10 | Two uploads a minute, counted per terminal token. That is past what an honest |
| 11 | build-test-ship loop can produce, since a build worth shipping takes longer |
| 12 | than half a minute to make. |
| 13 | |
| 14 | A refusal is a 429 that names the wait in seconds and repeats it in a |
| 15 | `Retry-After` header, so a script has a number to sleep on instead of a |
| 16 | guess. The window is a minute for exactly that reason: the worst a refused |
| 17 | caller is ever asked for is sixty seconds. Sleep, retry, carry on. |
| 18 | |
| 19 | Size is the other ship limit. One request carries 256 MiB across everything |
| 20 | in it. A static release is a single archive; a binary release can carry up to |
| 21 | eight targets at once, which is well past what a normal build produces. |
| 22 | |
| 23 | ## Everything else you type |
| 24 | |
| 25 | Ordinary mutations — env, secrets, promotes, rollbacks, restarts, |
| 26 | schedules — get thirty a minute, counted against your address and not your |
| 27 | terminal, so opening a second shell does not double it. The instance verbs |
| 28 | get sixty a minute on their own budget, because a burst of signups creating |
| 29 | instances is the workload that API exists for. |
| 30 | |
| 31 | Claiming an app name is the tight one: ten attempts a day per address, and |
| 32 | a try that gets refused still spends one of them. A claimed name persists |
| 33 | whether or not you ever use it, which is why this ceiling runs over a day and |
| 34 | the others run over a minute. When you hit it, the message points at the |
| 35 | console's Create app form, which has no limit of its own. That is the |
| 36 | intended way through. |
| 37 | |
| 38 | ## Credentials a server holds |
| 39 | |
| 40 | A credential minted with `carlos services` draws on its own budgets, larger |
| 41 | than a person's and entirely separate: ten ships a minute, a hundred and |
| 42 | twenty other writes a minute, a hundred app claims a day. A CI fleet cutting |
| 43 | releases back to back therefore cannot starve the person who minted it, and |
| 44 | the person's noisy afternoon cannot stop CI. |
| 45 | |
| 46 | The counters key on the credential's name, so rotating its secret does not |
| 47 | hand it a fresh budget. [Members and service |
| 48 | credentials](/docs/members/) covers the rest of how they work. |
| 49 | |
| 50 | ## Things that expire |
| 51 | |
| 52 | Logs go back seven days, with a size ceiling per app that drops the oldest |
| 53 | hour first — [Logs](/docs/logs/) has the detail. A deleted app sits in Trash |
| 54 | for thirty days before the platform destroys it. A terminal you have signed |
| 55 | in stays valid for ninety days, and you can revoke it sooner from your own |
| 56 | settings page. An invitation to join an account lasts seven days and works |
| 57 | once. |
| 58 | |
| 59 | ## When something is refused |
| 60 | |
| 61 | Read the message before anything else. The platform's refusals are written to |
| 62 | be acted on: a rate limit names the seconds to wait, an app you cannot claim |
| 63 | today names the console form that will let you, an attached domain that is |
| 64 | not resolving prints the DNS record it wants. Very few need interpreting. |
| 65 | |
| 66 | After that, in rough order of how often it helps: `carlos <verb> -h` for the |
| 67 | flags, [the CLI reference](https://carlosframework.com/docs/cli/) for the |
| 68 | full page, and `carlos logs -app <app> -since 1h` for anything where your app |
| 69 | started and then misbehaved. If a deploy looks stuck, check |
| 70 | `X-Carlos-Version` on the live hostname, not the page in your browser — |
| 71 | [Deploying](/docs/deploying/) explains why the header is the honest answer. |
| 72 | |
| 73 | If none of that gets you there, open an issue on |
| 74 | [the carloku repo](https://github.com/carlosframework/carloku/issues). These |
| 75 | pages are written and kept there, so a question worth asking is usually a |
| 76 | page worth fixing, and both happen in the same place. |
| 77 | |