From 5027814bb5905bc4542408ad4ff06b77be91009d Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 01:31:53 +0100 Subject: [PATCH 01/61] Document the remote cache request limits and the 100 MiB artifact cap Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 5bdc468e..3d1053d2 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -291,7 +291,7 @@ The LPM.dev Registry applies these included storage limits: | Organization | 25 GiB per seat | | Enterprise | No fixed quota in the Enterprise plan | -The CLI and LPM.dev Registry accept archives up to 500 MiB (524,288,000 bytes). +The CLI and LPM.dev Registry accept archives up to 100 MiB (104,857,600 bytes). LPM CLI skips uploading a larger archive and builds the task as usual. Restore also applies these limits to the archive contents: @@ -307,6 +307,20 @@ Default retention is 14 days, and a download refreshes the retention period. To fit new uploads within the storage limit, the Registry can evict the least recently accessed artifacts. Cache storage is temporary. +### Request limits + +The LPM.dev Registry limits the remote cache requests of each Pro account, and of each organization seat: + +| Requests | Per minute | Per day | +| --- | --- | --- | +| Uploads | 300 | 15,000 | +| Cache hits, as downloads and existence checks | 1,500 | 150,000 | +| Downloaded data | - | 50 GiB | + +An organization's daily limits grow with every seat. Its per-minute limits grow with its seats up to five, to 1,500 uploads and 7,500 cache hits a minute. A cache miss doesn't count. + +A request past a limit gets HTTP 429 with a `Retry-After` header. LPM CLI then skips that kind of request, lookups or uploads, for the rest of the run, and builds tasks as it would without a remote cache. + ### Inspect usage ```bash From 1864bbc7cfcdb6dd3a6f1705eec63650cd7d2356 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 01:31:53 +0100 Subject: [PATCH 02/61] Refresh remote cache documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 8ed26fec..f17b0328 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-09-20T10:39:34+01:00" + "modified": "2026-10-11T01:31:53+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From f88519fc2f642e58484ed2cda618f15903f3f640 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 03:39:21 +0100 Subject: [PATCH 03/61] Document every remote cache request limit and how LPM CLI waits them out The Registry now also limits requests of any kind, uploaded data and uploads at once, and gives accounts without remote cache a small allowance. LPM CLI pauses a limited kind of request until Retry-After rather than for the rest of the run, and a lookup limit pauses uploads too. Custom cache endpoints keep the 500 MiB archive limit. Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 33 +++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 3d1053d2..48d2ab97 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -291,7 +291,7 @@ The LPM.dev Registry applies these included storage limits: | Organization | 25 GiB per seat | | Enterprise | No fixed quota in the Enterprise plan | -The CLI and LPM.dev Registry accept archives up to 100 MiB (104,857,600 bytes). LPM CLI skips uploading a larger archive and builds the task as usual. +The LPM.dev Registry accepts archives up to 100 MiB (104,857,600 bytes). LPM CLI skips uploading a larger archive to it and builds the task as usual. With a [custom cache endpoint](#custom-cache-endpoints), LPM CLI uploads and restores archives up to 500 MiB. Restore also applies these limits to the archive contents: @@ -309,17 +309,27 @@ To fit new uploads within the storage limit, the Registry can evict the least re ### Request limits -The LPM.dev Registry limits the remote cache requests of each Pro account, and of each organization seat: +The LPM.dev Registry limits the remote cache requests of each Pro account, and of each organization seat, Enterprise included: -| Requests | Per minute | Per day | +| Limit | Per minute | Per day | | --- | --- | --- | +| Requests of any kind | 3,000 | 300,000 | | Uploads | 300 | 15,000 | -| Cache hits, as downloads and existence checks | 1,500 | 150,000 | +| Uploaded data | - | 50 GiB | +| Cache hits | 1,500 | 150,000 | | Downloaded data | - | 50 GiB | -An organization's daily limits grow with every seat. Its per-minute limits grow with its seats up to five, to 1,500 uploads and 7,500 cache hits a minute. A cache miss doesn't count. +- Every request counts against the request limits, including lookups that miss and status checks. +- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. +- An organization's limits grow with every seat, except its uploads a minute, which grow with up to five seats: 1,500 uploads a minute. +- An account sends at most 8 uploads at once, whatever its seats. +- An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. -A request past a limit gets HTTP 429 with a `Retry-After` header. LPM CLI then skips that kind of request, lookups or uploads, for the rest of the run, and builds tasks as it would without a remote cache. +Each window starts with the first request it counts, not at a set time of day. + +A request past a limit gets HTTP 429 with a `Retry-After` header that gives the seconds until the limit resets. LPM CLI then skips that kind of request until then, and builds tasks as it would without a remote cache. A lookup limit pauses uploads too, since a task that skipped its lookup would likely upload an artifact the cache already holds. The CLI warns once for each kind of limit. + +Turborepo receives a per-minute limit as HTTP 429, and a daily limit as HTTP 403 with the code `remote_caching_over_limit`. ### Inspect usage @@ -359,6 +369,17 @@ Make sure that the task declares `cache: true` and `outputs`. Inspect warnings f If read-only mode is enabled, uploads are skipped by design. A local hit also avoids task execution and does not upload an existing local result. +### A request limit is reached + +LPM CLI warns `Remote cache limit reached` with the limit it reached and how long it skips remote requests. Tasks still run, and the CLI uses the remote cache again once the limit resets. See [Request limits](#request-limits). + +Concurrent runs, such as parallel CI jobs, share the account's limits. To spend fewer requests: + +- Give jobs that only consume results [read-only access](#read-only-consumers), so they don't upload. +- Cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. + +The Registry can also answer an upload with HTTP 429 and `Retry-After: 1` while another upload holds the account's cache. LPM CLI then skips uploads for a second. + ### The server rejects access Make sure that the token has `cache:read`, `cache:write`, or `admin` permission. Uploads require `cache:write` or `admin`. From 2879440c6e900fe01b749393e844205a6219aa7e Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 03:39:25 +0100 Subject: [PATCH 04/61] Refresh remote cache documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index f17b0328..e00f5b9b 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T01:31:53+01:00" + "modified": "2026-10-11T03:39:21+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From 605466dd58a1b5e1bb37ed5ba8845470b4b6a691 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 03:55:59 +0100 Subject: [PATCH 05/61] List the remote cache request limits with the plans Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/lpm-dev-and-pro.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/docs/lpm-dev-and-pro.mdx b/content/docs/lpm-dev-and-pro.mdx index 225a8f92..8f34c267 100644 --- a/content/docs/lpm-dev-and-pro.mdx +++ b/content/docs/lpm-dev-and-pro.mdx @@ -48,6 +48,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p | Cloud env sync | - | Included | | Platform env push and OIDC CI pulls | - | Included | | Remote task cache | - | 25 GB | +| Remote cache uploads and cache hits | - | 15,000 and 150,000/day | | Ephemeral tunnel URLs | Included, 1-hour sessions | Included | | Concurrent tunnels | 1 | 3 | | Included tunnel requests | 20,000/UTC month | 100,000/billing period | @@ -60,7 +61,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p Pro tunnel overage is enabled by default. Turn it off from the personal tunnel dashboard when you prefer a hard stop at 100,000 requests. There is no retroactive billing; paid usage follows the active Stripe subscription period. -Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GB package storage, and 25 GB remote cache. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. +Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GB package storage, and 25 GB remote cache with 15,000 uploads and 150,000 cache hits a day. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. Each billed Stripe seat adds 100,000 included tunnel requests and 20,000 requests/minute to the organization account. The seat count is fixed when the tunnel usage period opens and applies for the rest of that period. Organization overage uses the same proportional $1/100,000 rate and default-on toggle. From 8f61a6d627d2aca68b4a4af851cfc5232a4dfc1b Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 03:55:59 +0100 Subject: [PATCH 06/61] Refresh plan documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index e00f5b9b..a1c1d3c4 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -253,7 +253,7 @@ }, "lpm-dev-and-pro.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-09-17T00:04:24+01:00" + "modified": "2026-10-11T03:55:59+01:00" }, "migrating.mdx": { "published": "2026-05-01T09:47:04+01:00", From 4e615a5bf3f1b16471db5d2726f577bbd3649371 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 05:51:30 +0100 Subject: [PATCH 07/61] Say which requests and uploads count, and that LPM CLI retries a briefly refused upload Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 48d2ab97..b79b0a7b 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -319,10 +319,10 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Cache hits | 1,500 | 150,000 | | Downloaded data | - | 50 GiB | -- Every request counts against the request limits, including lookups that miss and status checks. -- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. -- An organization's limits grow with every seat, except its uploads a minute, which grow with up to five seats: 1,500 uploads a minute. -- An account sends at most 8 uploads at once, whatever its seats. +- Every request for an account's cache counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each. +- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses, or of content the cache already holds, doesn't count as an upload. +- An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. +- An account can have 4 uploads in flight for each seat, at least 8 and at most 32. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. Each window starts with the first request it counts, not at a set time of day. @@ -378,7 +378,7 @@ Concurrent runs, such as parallel CI jobs, share the account's limits. To spend - Give jobs that only consume results [read-only access](#read-only-consumers), so they don't upload. - Cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. -The Registry can also answer an upload with HTTP 429 and `Retry-After: 1` while another upload holds the account's cache. LPM CLI then skips uploads for a second. +The Registry also answers an upload with HTTP 429 and `Retry-After: 1` when the account has as many uploads in flight as it may, or while another upload holds its cache. LPM CLI waits that second and sends the upload once more. ### The server rejects access From ff249c6eb9bafa07a42f7d1b07f049f7da769d85 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 05:51:30 +0100 Subject: [PATCH 08/61] Refresh remote cache documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index a1c1d3c4..2fdcada0 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T03:39:21+01:00" + "modified": "2026-10-11T05:51:30+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From d0dce621da3ca504c722b45494c8d1087afd982d Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 07:21:21 +0100 Subject: [PATCH 09/61] Say which requests and refused uploads count, the 16-upload cap, and LPM CLI's retry Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index b79b0a7b..e99245c5 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -319,15 +319,15 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Cache hits | 1,500 | 150,000 | | Downloaded data | - | 50 GiB | -- Every request for an account's cache counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each. -- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses, or of content the cache already holds, doesn't count as an upload. +- Every request with a token that may use the account's cache counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each. +- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. -- An account can have 4 uploads in flight for each seat, at least 8 and at most 32. +- An account can have 4 uploads in flight for each seat, at least 8 and at most 16. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. Each window starts with the first request it counts, not at a set time of day. -A request past a limit gets HTTP 429 with a `Retry-After` header that gives the seconds until the limit resets. LPM CLI then skips that kind of request until then, and builds tasks as it would without a remote cache. A lookup limit pauses uploads too, since a task that skipped its lookup would likely upload an artifact the cache already holds. The CLI warns once for each kind of limit. +A request past a limit gets HTTP 429 with a `Retry-After` header that gives the seconds until the limit resets. LPM CLI then skips that kind of request until then, and builds tasks as it would without a remote cache. An upload refused for 5 seconds or less is sent once more after the wait instead. A lookup limit pauses uploads too, since a task that skipped its lookup would likely upload an artifact the cache already holds. The CLI warns once for each kind of limit. Turborepo receives a per-minute limit as HTTP 429, and a daily limit as HTTP 403 with the code `remote_caching_over_limit`. From f47ac261221171cd2ea80977b05058dfd278a156 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 07:21:21 +0100 Subject: [PATCH 10/61] Refresh remote cache documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 2fdcada0..c5d3bd07 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T05:51:30+01:00" + "modified": "2026-10-11T07:21:21+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From 59a8996a951cb24af5b290f9525deb855ae54163 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 09:45:11 +0100 Subject: [PATCH 11/61] Document downloads in flight, the transfer floor, and the busy notice Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index e99245c5..e6a30ccb 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -319,15 +319,18 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Cache hits | 1,500 | 150,000 | | Downloaded data | - | 50 GiB | -- Every request with a token that may use the account's cache counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each. +- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact. A request the Registry refuses before it knows the account, such as an upload with a read-only token, doesn't count. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. -- An account can have 4 uploads in flight for each seat, at least 8 and at most 16. +- An account can have 4 uploads in flight for each seat, at least 8 and at most 16, and 8 downloads in flight for each seat, at least 32 and at most 64, on each Registry server. +- An upload or download must keep moving: one that takes longer than 10 seconds plus a second for every 128 KiB is cut off. An interrupted download counts as a miss. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. Each window starts with the first request it counts, not at a set time of day. -A request past a limit gets HTTP 429 with a `Retry-After` header that gives the seconds until the limit resets. LPM CLI then skips that kind of request until then, and builds tasks as it would without a remote cache. An upload refused for 5 seconds or less is sent once more after the wait instead. A lookup limit pauses uploads too, since a task that skipped its lookup would likely upload an artifact the cache already holds. The CLI warns once for each kind of limit. +A request past a limit gets HTTP 429 with a `Retry-After` header that gives the seconds until the limit resets. LPM CLI then skips that kind of request until then, and builds tasks as it would without a remote cache. A lookup limit pauses uploads too, since a task that skipped its lookup would likely upload an artifact the cache already holds. The CLI warns once a run for each kind of limit. + +A wait of 5 seconds or less means the Registry is busy for a moment rather than a limit being spent. LPM CLI sends such an upload once more after the wait, plus up to half the wait again so refused uploads don't all return together, unless uploads were paused meanwhile. It notes once a run for each kind of request that it skipped some while the cache was busy, and keeps the limit warning for a longer limit. Turborepo receives a per-minute limit as HTTP 429, and a daily limit as HTTP 403 with the code `remote_caching_over_limit`. @@ -378,7 +381,7 @@ Concurrent runs, such as parallel CI jobs, share the account's limits. To spend - Give jobs that only consume results [read-only access](#read-only-consumers), so they don't upload. - Cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. -The Registry also answers an upload with HTTP 429 and `Retry-After: 1` when the account has as many uploads in flight as it may, or while another upload holds its cache. LPM CLI waits that second and sends the upload once more. +The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, or while another upload holds its cache. LPM CLI notes `skipping some remote cache uploads while it's busy` (or lookups). It sends a refused upload once more after one to one and a half seconds, and skips lookups for that second. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. ### The server rejects access From df248121f1423b297f23a1fe9460eeaca893178a Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 09:45:12 +0100 Subject: [PATCH 12/61] Refresh remote cache documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index c5d3bd07..3fd894e9 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T07:21:21+01:00" + "modified": "2026-10-11T09:45:11+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From 1a636b6da7d6ab9172018aea779d57d9b0ec6819 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 11:15:30 +0100 Subject: [PATCH 13/61] Document transfer places, the two-minute cap, short upload leases, and lookup retries Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index e6a30ccb..79c1092f 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -322,15 +322,16 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact. A request the Registry refuses before it knows the account, such as an upload with a read-only token, doesn't count. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. -- An account can have 4 uploads in flight for each seat, at least 8 and at most 16, and 8 downloads in flight for each seat, at least 32 and at most 64, on each Registry server. -- An upload or download must keep moving: one that takes longer than 10 seconds plus a second for every 128 KiB is cut off. An interrupted download counts as a miss. +- An account can have 4 uploads in flight for each seat, at least 8 and at most 16, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server with every place taken answers for a moment as busy. +- An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. +- An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. Each window starts with the first request it counts, not at a set time of day. A request past a limit gets HTTP 429 with a `Retry-After` header that gives the seconds until the limit resets. LPM CLI then skips that kind of request until then, and builds tasks as it would without a remote cache. A lookup limit pauses uploads too, since a task that skipped its lookup would likely upload an artifact the cache already holds. The CLI warns once a run for each kind of limit. -A wait of 5 seconds or less means the Registry is busy for a moment rather than a limit being spent. LPM CLI sends such an upload once more after the wait, plus up to half the wait again so refused uploads don't all return together, unless uploads were paused meanwhile. It notes once a run for each kind of request that it skipped some while the cache was busy, and keeps the limit warning for a longer limit. +A wait of 5 seconds or less usually means the Registry is busy for a moment, or a minute's window is about to reset. LPM CLI sends such a lookup or upload once more after the wait, plus up to half the wait again so refused requests don't all return together, unless that kind was paused meanwhile. If it skips some anyway, it notes it once a run for each kind, as `remote cache is busy; skipping some uploads for a moment` (or lookups), and keeps the limit warning for a longer limit. Turborepo receives a per-minute limit as HTTP 429, and a daily limit as HTTP 403 with the code `remote_caching_over_limit`. @@ -381,7 +382,7 @@ Concurrent runs, such as parallel CI jobs, share the account's limits. To spend - Give jobs that only consume results [read-only access](#read-only-consumers), so they don't upload. - Cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. -The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, or while another upload holds its cache. LPM CLI notes `skipping some remote cache uploads while it's busy` (or lookups). It sends a refused upload once more after one to one and a half seconds, and skips lookups for that second. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. +The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, when the Registry server is busy, or while another upload holds its cache. LPM CLI sends a refused lookup or upload once more after one to one and a half seconds, and notes `remote cache is busy; skipping some uploads for a moment` (or lookups) if it skips some anyway. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. ### The server rejects access From 4d284a8b2c93677ff77c866a622a9449ca7f9251 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 11:15:30 +0100 Subject: [PATCH 14/61] Refresh remote cache documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 3fd894e9..a9eb8d1a 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T09:45:11+01:00" + "modified": "2026-10-11T11:15:30+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From db83f5e9a444e169f844e08b0c24d2a80863fe54 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 15:25:00 +0100 Subject: [PATCH 15/61] Set the remote cache request limits, and describe out-of-scope requests and a busy Registry server Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 17 +++++++++-------- content/docs/lpm-dev-and-pro.mdx | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 79c1092f..2d64e8d9 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -313,19 +313,20 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Limit | Per minute | Per day | | --- | --- | --- | -| Requests of any kind | 3,000 | 300,000 | -| Uploads | 300 | 15,000 | -| Uploaded data | - | 50 GiB | -| Cache hits | 1,500 | 150,000 | -| Downloaded data | - | 50 GiB | +| Requests of any kind | 3,000 | 120,000 | +| Uploads | 300 | 5,000 | +| Uploaded data | - | 15 GiB | +| Cache hits | 2,000 | 75,000 | +| Downloaded data | - | 40 GiB | -- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact. A request the Registry refuses before it knows the account, such as an upload with a read-only token, doesn't count. +- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact. A request the token may not make, such as an upload with a read-only token or a request for another account's cache, counts against the account the token belongs to. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. -- An account can have 4 uploads in flight for each seat, at least 8 and at most 16, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server with every place taken answers for a moment as busy. +- An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for every account. With every place taken, it answers for a moment as busy. - An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. +- After 60 requests with tokens that aren't valid in a minute, the Registry answers requests from that address with HTTP 429 for the rest of the minute, except those with a token that recently worked. Each window starts with the first request it counts, not at a set time of day. @@ -382,7 +383,7 @@ Concurrent runs, such as parallel CI jobs, share the account's limits. To spend - Give jobs that only consume results [read-only access](#read-only-consumers), so they don't upload. - Cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. -The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, when the Registry server is busy, or while another upload holds its cache. LPM CLI sends a refused lookup or upload once more after one to one and a half seconds, and notes `remote cache is busy; skipping some uploads for a moment` (or lookups) if it skips some anyway. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. +The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, or while another upload holds its cache, and with `Retry-After: 2` when the Registry server is busy. LPM CLI sends a refused lookup or upload once more after the wait, plus up to half of it again, and notes `remote cache is busy; skipping some uploads for a moment` (or lookups) if it skips some anyway. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. ### The server rejects access diff --git a/content/docs/lpm-dev-and-pro.mdx b/content/docs/lpm-dev-and-pro.mdx index 8f34c267..1f33c6ae 100644 --- a/content/docs/lpm-dev-and-pro.mdx +++ b/content/docs/lpm-dev-and-pro.mdx @@ -48,7 +48,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p | Cloud env sync | - | Included | | Platform env push and OIDC CI pulls | - | Included | | Remote task cache | - | 25 GB | -| Remote cache uploads and cache hits | - | 15,000 and 150,000/day | +| Remote cache uploads and cache hits | - | 5,000 and 75,000/day | | Ephemeral tunnel URLs | Included, 1-hour sessions | Included | | Concurrent tunnels | 1 | 3 | | Included tunnel requests | 20,000/UTC month | 100,000/billing period | @@ -61,7 +61,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p Pro tunnel overage is enabled by default. Turn it off from the personal tunnel dashboard when you prefer a hard stop at 100,000 requests. There is no retroactive billing; paid usage follows the active Stripe subscription period. -Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GB package storage, and 25 GB remote cache with 15,000 uploads and 150,000 cache hits a day. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. +Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GB package storage, and 25 GB remote cache with 5,000 uploads and 75,000 cache hits a day. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. Each billed Stripe seat adds 100,000 included tunnel requests and 20,000 requests/minute to the organization account. The seat count is fixed when the tunnel usage period opens and applies for the rest of that period. Organization overage uses the same proportional $1/100,000 rate and default-on toggle. From 81fbe32c53cafeddd8b3c9f102980a7407748799 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 15:25:00 +0100 Subject: [PATCH 16/61] Refresh remote cache documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index a9eb8d1a..43445fa1 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T11:15:30+01:00" + "modified": "2026-10-11T15:25:00+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -253,7 +253,7 @@ }, "lpm-dev-and-pro.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-11T03:55:59+01:00" + "modified": "2026-10-11T15:25:00+01:00" }, "migrating.mdx": { "published": "2026-05-01T09:47:04+01:00", From f31c8fb0dfc837d15650329aff070dccf5296856 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 15:38:16 +0100 Subject: [PATCH 17/61] Label plan sizes in binary units Storage and remote cache allowances are counted in 1024s, as the LPM.dev Registry now labels them (tolgaergin/a-package-manager#235). Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/lpm-dev-and-pro.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/docs/lpm-dev-and-pro.mdx b/content/docs/lpm-dev-and-pro.mdx index 1f33c6ae..680a93d2 100644 --- a/content/docs/lpm-dev-and-pro.mdx +++ b/content/docs/lpm-dev-and-pro.mdx @@ -41,13 +41,13 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p | --- | --- | --- | | Price | $0 | $8/mo | | Private packages | 2 | Unlimited | -| Package storage | 100 MB | 5 GB | +| Package storage | 100 MiB | 5 GiB | | Marketplace platform fee | 15% | 10% | | Firewall for public npm packages | - | Included | | Local env storage | Included | Included | | Cloud env sync | - | Included | | Platform env push and OIDC CI pulls | - | Included | -| Remote task cache | - | 25 GB | +| Remote task cache | - | 25 GiB | | Remote cache uploads and cache hits | - | 5,000 and 75,000/day | | Ephemeral tunnel URLs | Included, 1-hour sessions | Included | | Concurrent tunnels | 1 | 3 | @@ -61,7 +61,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p Pro tunnel overage is enabled by default. Turn it off from the personal tunnel dashboard when you prefer a hard stop at 100,000 requests. There is no retroactive billing; paid usage follows the active Stripe subscription period. -Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GB package storage, and 25 GB remote cache with 5,000 uploads and 75,000 cache hits a day. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. +Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GiB package storage, and 25 GiB remote cache with 5,000 uploads and 75,000 cache hits a day. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. Each billed Stripe seat adds 100,000 included tunnel requests and 20,000 requests/minute to the organization account. The seat count is fixed when the tunnel usage period opens and applies for the rest of that period. Organization overage uses the same proportional $1/100,000 rate and default-on toggle. From e889f0de61a48c0b522386d11e2e7354967ba9ba Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 15:38:16 +0100 Subject: [PATCH 18/61] Refresh plan documentation dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 43445fa1..4b9755d3 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -253,7 +253,7 @@ }, "lpm-dev-and-pro.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-11T15:25:00+01:00" + "modified": "2026-10-11T15:38:16+01:00" }, "migrating.mdx": { "published": "2026-05-01T09:47:04+01:00", From 852ab079011ee7548d7972d97fa1415611bf3149 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 17:23:55 +0100 Subject: [PATCH 19/61] docs(remote-cache): describe the refused-request limit and token gates Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 2d64e8d9..b4a891c0 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -319,14 +319,15 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Cache hits | 2,000 | 75,000 | | Downloaded data | - | 40 GiB | -- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact. A request the token may not make, such as an upload with a read-only token or a request for another account's cache, counts against the account the token belongs to. +- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for every account. With every place taken, it answers for a moment as busy. - An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. -- After 60 requests with tokens that aren't valid in a minute, the Registry answers requests from that address with HTTP 429 for the rest of the minute, except those with a token that recently worked. +- A request the Registry refuses counts against the account its token belongs to, with a limit of its own: 60 a minute and 2,000 a day, whatever the seats. That includes a request the token may not make, such as an upload with a read-only token or a request for another account's cache, and a request that isn't valid. It doesn't count against the request limits above. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens that aren't valid from one address in a minute, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token that recently worked. Each window starts with the first request it counts, not at a set time of day. From 201a7d99dba2cf04e7c5fd0fb7aa98804d545c93 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 17:23:55 +0100 Subject: [PATCH 20/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 4b9755d3..82411e7c 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T15:25:00+01:00" + "modified": "2026-10-11T17:23:55+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From 17a7f695a36f0d07489bbdbbe1df202943c7b3ad Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 18:09:04 +0100 Subject: [PATCH 21/61] docs(remote-cache): say which accounts a full server keeps places for Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index b4a891c0..ef3b8ba6 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -322,7 +322,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. -- An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for every account. With every place taken, it answers for a moment as busy. +- An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. - An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. From fb921e87fa4d74adc230c77ba5886cd25f463376 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 18:09:04 +0100 Subject: [PATCH 22/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 82411e7c..b808e83d 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T17:23:55+01:00" + "modified": "2026-10-11T18:09:04+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From 121da76973a16cdd3bee4c9dfff9f00eba22b72f Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 19:28:57 +0100 Subject: [PATCH 23/61] docs(remote-cache): refused-request limits per token and account, read-only tokens Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index ef3b8ba6..8726a4d9 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -62,7 +62,7 @@ export NODE_ENV=production The token permits cache reads and writes. Supply it through the shell or CI environment, outside committed project configuration. -For the configured Registry origin, LPM CLI can also use `LPM_TOKEN` or credentials from [`lpm login`](/docs/infra/login). Those credentials must permit cache access. +For the configured Registry origin, LPM CLI can also use `LPM_TOKEN`, when it's a token that permits cache access. Credentials from [`lpm login`](/docs/infra/login) don't permit cache access. ### 3. Run the task @@ -319,15 +319,16 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Cache hits | 2,000 | 75,000 | | Downloaded data | - | 40 GiB | -- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact. +- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one refused request instead. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. - An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. -- A request the Registry refuses counts against the account its token belongs to, with a limit of its own: 60 a minute and 2,000 a day, whatever the seats. That includes a request the token may not make, such as an upload with a read-only token or a request for another account's cache, and a request that isn't valid. It doesn't count against the request limits above. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens that aren't valid from one address in a minute, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token that recently worked. +- A request the Registry refuses counts against limits of its own instead of the request limits above, whatever the seats: 60 a minute and 2,000 a day for its token, and 600 a minute and 20,000 a day for the token's account. That includes a request the token may not make, such as an upload with a read-only token or a request for another account's cache, and a request that isn't valid. Once one of these limits is spent, the Registry answers the token's requests of the same kind, such as its uploads, with HTTP 429 for up to a minute without checking them; its other requests go on. These limits never answer as `over_limit`, so Turborepo keeps its cache on. +- With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens that aren't valid from one address in a minute, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token that worked in the last day. Each window starts with the first request it counts, not at a set time of day. From 4b2418b26055a8ea3953edd97d9c30b6799bc9e3 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 19:28:58 +0100 Subject: [PATCH 24/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index b808e83d..a6b9dffd 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T18:09:04+01:00" + "modified": "2026-10-11T19:28:57+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From bba8d62d9a708c7d74aa08bc71b1d134265e22ee Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 21:11:30 +0100 Subject: [PATCH 25/61] docs(remote-cache): login credentials read and write the personal cache Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 8726a4d9..249ea960 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -62,7 +62,7 @@ export NODE_ENV=production The token permits cache reads and writes. Supply it through the shell or CI environment, outside committed project configuration. -For the configured Registry origin, LPM CLI can also use `LPM_TOKEN`, when it's a token that permits cache access. Credentials from [`lpm login`](/docs/infra/login) don't permit cache access. +For the configured Registry origin, LPM CLI can also use `LPM_TOKEN`, when it's a token that permits cache access, or your [`lpm login`](/docs/infra/login) credentials. Login credentials read and write your personal cache. An organization's cache needs one of its tokens. ### 3. Run the task @@ -389,7 +389,7 @@ The Registry also answers with HTTP 429 and `Retry-After: 1` when the account ha ### The server rejects access -Make sure that the token has `cache:read`, `cache:write`, or `admin` permission. Uploads require `cache:write` or `admin`. +Make sure that the token has `cache:read`, `cache:write`, or `admin` permission. Uploads require `cache:write` or `admin`. Credentials from `lpm login` read and write your personal cache only. For an organization, use a token scoped to the selected organization. Inspect the account's plan and billing state with [`lpm cache status`](/docs/packages/cache#status). From c671ea1d3c0d5c774ceeecbed605f01fbb4e25ed Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 21:11:41 +0100 Subject: [PATCH 26/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index a6b9dffd..01f51636 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T19:28:57+01:00" + "modified": "2026-10-11T21:11:30+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From 32f58241d953c8767760ae64c039220d5932911e Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 22:32:42 +0100 Subject: [PATCH 27/61] docs(remote-cache): refused requests are answered as themselves; tighter refused limits Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 249ea960..19b4dc3e 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -326,9 +326,11 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. -- A request the Registry refuses counts against limits of its own instead of the request limits above, whatever the seats: 60 a minute and 2,000 a day for its token, and 600 a minute and 20,000 a day for the token's account. That includes a request the token may not make, such as an upload with a read-only token or a request for another account's cache, and a request that isn't valid. Once one of these limits is spent, the Registry answers the token's requests of the same kind, such as its uploads, with HTTP 429 for up to a minute without checking them; its other requests go on. These limits never answer as `over_limit`, so Turborepo keeps its cache on. -- With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens that aren't valid from one address in a minute, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token that worked in the last day. +- A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before, except that a token asking for an account it hasn't asked for in the last minute, with `slug` or `teamId`, gets HTTP 429 until the limit resets. +- With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. +- LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. +- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose request it served in the last 23 hours. Each window starts with the first request it counts, not at a set time of day. From 05180c19ff902f25b15b35362f4ac2e7459c530c Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Sun, 11 Oct 2026 23:11:04 +0100 Subject: [PATCH 28/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 01f51636..8cfaa5b5 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T21:11:30+01:00" + "modified": "2026-10-11T22:32:42+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From 273f141876616203439b43067edc549233865ff8 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 00:22:02 +0100 Subject: [PATCH 29/61] docs(remote-cache): an account's own team stays answered; what counts against an address Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 19b4dc3e..fbd21f10 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -319,18 +319,18 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Cache hits | 2,000 | 75,000 | | Downloaded data | - | 40 GiB | -- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one refused request instead. +- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one request. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. - An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. -- A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before, except that a token asking for an account it hasn't asked for in the last minute, with `slug` or `teamId`, gets HTTP 429 until the limit resets. +- A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before, except that it looks up at most one account a second, named with `slug` or `teamId`, that the token's account hasn't asked for in the last minute; the rest get HTTP 429 until the limit resets. An account it answered lately, such as the organization's own `team`, is answered as usual. - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. -- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose request it served in the last 23 hours. +- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's earlier access tokens stop working within five minutes. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused or over their account's limits, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't refused since. A status check serves a token only when its account's cache is enabled. Each window starts with the first request it counts, not at a set time of day. From c1dfc886153a3a8d9ac749ef9663272b474c283f Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 00:22:03 +0100 Subject: [PATCH 30/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 8cfaa5b5..cb124bf0 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-11T22:32:42+01:00" + "modified": "2026-10-12T00:22:02+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From eff4f709edfdf7b962d1a8f2e9c3337763c861f0 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 03:26:24 +0100 Subject: [PATCH 31/61] docs(remote-cache): downloads from storage, lower daily limits, and session and token limits Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/login.mdx | 2 ++ content/docs/infra/remote-cache.mdx | 18 ++++++++++-------- content/docs/infra/setup.mdx | 2 ++ content/docs/lpm-dev-and-pro.mdx | 4 ++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/content/docs/infra/login.mdx b/content/docs/infra/login.mdx index 1dc8fe0f..0f7c31b9 100644 --- a/content/docs/infra/login.mdx +++ b/content/docs/infra/login.mdx @@ -57,6 +57,8 @@ If the browser does not open, copy the displayed URL into a browser. JSON mode s LPM CLI verifies and saves the returned session. Future protected commands can refresh its access token automatically. +An account keeps up to 20 active `lpm login` sessions, one for each sign-in. Signing in past that ends the session used least recently, as `lpm logout --revoke` would. + A valid saved refresh-backed session skips browser authentication. An access token without a refresh credential does not satisfy this check. To switch accounts, clear the saved session first: diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index fbd21f10..6fadbdb0 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -313,24 +313,26 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Limit | Per minute | Per day | | --- | --- | --- | -| Requests of any kind | 3,000 | 120,000 | -| Uploads | 300 | 5,000 | -| Uploaded data | - | 15 GiB | -| Cache hits | 2,000 | 75,000 | +| Requests of any kind | 3,000 | 100,000 | +| Uploads | 300 | 4,000 | +| Uploaded data | - | 12 GiB | +| Cache hits | 2,000 | 50,000 | | Downloaded data | - | 40 GiB | +| Of which downloaded through the Registry | - | 5 GiB | - Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one request. +- LPM CLI and Turborepo download a cache hit straight from storage, through a link the Registry answers with that works for a minute. Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases; those downloads also count against the 5 GiB a day of downloads through the Registry. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. - An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. -- An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. -- A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before, except that it looks up at most one account a second, named with `slug` or `teamId`, that the token's account hasn't asked for in the last minute; the rest get HTTP 429 until the limit resets. An account it answered lately, such as the organization's own `team`, is answered as usual. +- An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day, counted apart from its requests before its plan changed. An organization whose billing lapsed gets HTTP 402 to every request except status checks, which report `paused`. +- A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before. A token reaches only its own account's cache: `slug` or `teamId` naming any other gets HTTP 403, whether or not that account exists. - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. -- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's earlier access tokens stop working within five minutes. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused or over their account's limits, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't refused since. A status check serves a token only when its account's cache is enabled. +- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused or over their account's request limits, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't refused since. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. Each window starts with the first request it counts, not at a set time of day. diff --git a/content/docs/infra/setup.mdx b/content/docs/infra/setup.mdx index f8579ba3..3b48b6de 100644 --- a/content/docs/infra/setup.mdx +++ b/content/docs/infra/setup.mdx @@ -189,6 +189,8 @@ CAUTION: The `.npmrc` file contains a token. Keep the file outside version contr Run `lpm setup local` again before the token expires. The command writes a replacement and retires the previous project token. +An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens). Expired and revoked tokens are deleted 30 days later. + The command uses the current directory. It does not configure every workspace member automatically. JSON output reports the paths, scope, and expiry. It does not include the token. diff --git a/content/docs/lpm-dev-and-pro.mdx b/content/docs/lpm-dev-and-pro.mdx index 680a93d2..b3a80d96 100644 --- a/content/docs/lpm-dev-and-pro.mdx +++ b/content/docs/lpm-dev-and-pro.mdx @@ -48,7 +48,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p | Cloud env sync | - | Included | | Platform env push and OIDC CI pulls | - | Included | | Remote task cache | - | 25 GiB | -| Remote cache uploads and cache hits | - | 5,000 and 75,000/day | +| Remote cache uploads and cache hits | - | 4,000 and 50,000/day | | Ephemeral tunnel URLs | Included, 1-hour sessions | Included | | Concurrent tunnels | 1 | 3 | | Included tunnel requests | 20,000/UTC month | 100,000/billing period | @@ -61,7 +61,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p Pro tunnel overage is enabled by default. Turn it off from the personal tunnel dashboard when you prefer a hard stop at 100,000 requests. There is no retroactive billing; paid usage follows the active Stripe subscription period. -Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GiB package storage, and 25 GiB remote cache with 5,000 uploads and 75,000 cache hits a day. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. +Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GiB package storage, and 25 GiB remote cache with 4,000 uploads and 50,000 cache hits a day. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. Each billed Stripe seat adds 100,000 included tunnel requests and 20,000 requests/minute to the organization account. The seat count is fixed when the tunnel usage period opens and applies for the rest of that period. Organization overage uses the same proportional $1/100,000 rate and default-on toggle. From 48d2c4b5c2c557c5d91f6a161fce04d24633e23f Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 03:26:24 +0100 Subject: [PATCH 32/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index cb124bf0..56d75245 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -189,7 +189,7 @@ }, "infra/login.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-09-20T00:17:59+01:00" + "modified": "2026-10-12T03:26:24+01:00" }, "infra/policy.mdx": { "published": "2026-06-28T15:54:59+01:00", @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T00:22:02+01:00" + "modified": "2026-10-12T03:26:24+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -229,7 +229,7 @@ }, "infra/setup.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-09-20T00:17:59+01:00" + "modified": "2026-10-12T03:26:24+01:00" }, "infra/store.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -253,7 +253,7 @@ }, "lpm-dev-and-pro.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-11T15:38:16+01:00" + "modified": "2026-10-12T03:26:24+01:00" }, "migrating.mdx": { "published": "2026-05-01T09:47:04+01:00", From 52a05ebe34038cb86c72e13e9f512e695d8efa15 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 09:14:31 +0100 Subject: [PATCH 33/61] docs(remote-cache): held uploads, cut-offs, mixed selectors and session tokens, as round 12 found Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 6fadbdb0..eb349f8d 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -322,16 +322,16 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one request. - LPM CLI and Turborepo download a cache hit straight from storage, through a link the Registry answers with that works for a minute. Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases; those downloads also count against the 5 GiB a day of downloads through the Registry. -- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends. +- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends; the check that storage still holds it counts as a cache hit, and content storage has lost is stored again. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. -- An upload or download that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. +- An upload, or a download through the Registry, that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. - An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day, counted apart from its requests before its plan changed. An organization whose billing lapsed gets HTTP 402 to every request except status checks, which report `paused`. -- A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before. A token reaches only its own account's cache: `slug` or `teamId` naming any other gets HTTP 403, whether or not that account exists. +- A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before. A token reaches only its own account's cache: `slug` or `teamId` naming any other gets HTTP 403, whether or not that account exists, and a `slug` and `teamId` of which only one names the token's own account get HTTP 400. - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. -- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once. +- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once, or within that minute on a server that checked it. - A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused or over their account's request limits, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't refused since. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. Each window starts with the first request it counts, not at a set time of day. From 9771e795508bf55b79695fbfe0f0ff4047a2ad93 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 09:14:32 +0100 Subject: [PATCH 34/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 56d75245..9be7a3ec 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T03:26:24+01:00" + "modified": "2026-10-12T09:14:31+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From 6a116c2f74ad2f7213789f1f7d3bd3866e5f3024 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 13:04:30 +0100 Subject: [PATCH 35/61] docs(remote-cache): the download host, hash-less artifacts, held uploads past the hit limit, and expired project tokens at the cap Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 4 ++-- content/docs/infra/setup.mdx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index eb349f8d..086b210d 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -321,8 +321,8 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Of which downloaded through the Registry | - | 5 GiB | - Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one request. -- LPM CLI and Turborepo download a cache hit straight from storage, through a link the Registry answers with that works for a minute. Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases; those downloads also count against the 5 GiB a day of downloads through the Registry. -- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends; the check that storage still holds it counts as a cache hit, and content storage has lost is stored again. +- LPM CLI and Turborepo download a cache hit from the cache's download host, `cache-dl.lpm.dev`, through a link the Registry answers with that works for a minute, so a CI firewall must allow that host too. Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases; those downloads also count against the 5 GiB a day of downloads through the Registry. LPM CLI treats an artifact uploaded without a content hash, as Turborepo uploads one, as a miss, and replaces it with its own. +- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends; the check that storage still holds it counts as a cache hit, and content storage has lost is stored again. Once the account's cache hits are spent, such an upload is stored, and counted, as any other. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. - An upload, or a download through the Registry, that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. diff --git a/content/docs/infra/setup.mdx b/content/docs/infra/setup.mdx index 3b48b6de..2b7cc448 100644 --- a/content/docs/infra/setup.mdx +++ b/content/docs/infra/setup.mdx @@ -189,7 +189,7 @@ CAUTION: The `.npmrc` file contains a token. Keep the file outside version contr Run `lpm setup local` again before the token expires. The command writes a replacement and retires the previous project token. -An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens). Expired and revoked tokens are deleted 30 days later. +An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens): for a new project, or one whose token has expired, as a new token replaces it. Replacing a project's token that's still active works at the limit. Expired and revoked tokens are deleted 30 days later. The command uses the current directory. It does not configure every workspace member automatically. From ef970da9108c370f603c3a087f348c831a9b8bb8 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 13:04:30 +0100 Subject: [PATCH 36/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 9be7a3ec..71e0e2fb 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T09:14:31+01:00" + "modified": "2026-10-12T13:04:30+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -229,7 +229,7 @@ }, "infra/setup.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-12T03:26:24+01:00" + "modified": "2026-10-12T13:04:30+01:00" }, "infra/store.mdx": { "published": "2026-05-01T09:47:04+01:00", From 97b3aac5dff92c7bf27fc9640a52e162d449224e Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 15:10:11 +0100 Subject: [PATCH 37/61] docs(remote-cache): a lapsed organization's tokens count toward an address's limit too Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 086b210d..48daaace 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -332,7 +332,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. - The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once, or within that minute on a server that checked it. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused or over their account's request limits, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't refused since. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits or answered that the organization's billing lapsed, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't refused since. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. Each window starts with the first request it counts, not at a set time of day. From bf0fe0027af1a8cf9a0a066f14487c1e947502eb Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 15:10:12 +0100 Subject: [PATCH 38/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 71e0e2fb..40c94e19 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T13:04:30+01:00" + "modified": "2026-10-12T15:10:11+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From fe4d87595f1b71327202fab3c776b7c81cd48366 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 15:37:12 +0100 Subject: [PATCH 39/61] docs(plans): say storage past the included size is billed per GiB a month Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/lpm-dev-and-pro.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/docs/lpm-dev-and-pro.mdx b/content/docs/lpm-dev-and-pro.mdx index b3a80d96..4d4d6c5c 100644 --- a/content/docs/lpm-dev-and-pro.mdx +++ b/content/docs/lpm-dev-and-pro.mdx @@ -42,6 +42,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p | Price | $0 | $8/mo | | Private packages | 2 | Unlimited | | Package storage | 100 MiB | 5 GiB | +| Package storage beyond that | Publishing stops | $0.20/GiB a month, rounded up to a whole GiB | | Marketplace platform fee | 15% | 10% | | Firewall for public npm packages | - | Included | | Local env storage | Included | Included | @@ -61,7 +62,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p Pro tunnel overage is enabled by default. Turn it off from the personal tunnel dashboard when you prefer a hard stop at 100,000 requests. There is no retroactive billing; paid usage follows the active Stripe subscription period. -Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GiB package storage, and 25 GiB remote cache with 4,000 uploads and 50,000 cache hits a day. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. +Organizations use separate org billing at $8 per seat. Each seat includes unlimited private packages, 5 GiB package storage, and 25 GiB remote cache with 4,000 uploads and 50,000 cache hits a day. Package storage past the organization's total is billed at $0.20/GiB a month, rounded up to a whole GiB. See [Remote cache](/docs/infra/remote-cache#request-limits) for every request limit. The organization shares a limit of 3 concurrent tunnels and 3 claimed tunnel domains across all members and base domains. Additional seats do not increase these two limits. Each billed Stripe seat adds 100,000 included tunnel requests and 20,000 requests/minute to the organization account. The seat count is fixed when the tunnel usage period opens and applies for the rest of that period. Organization overage uses the same proportional $1/100,000 rate and default-on toggle. From e4f357ecbaa2181a85ffb1262f2f990e977b60fe Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 15:37:12 +0100 Subject: [PATCH 40/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 40c94e19..5aa0921c 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -253,7 +253,7 @@ }, "lpm-dev-and-pro.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-12T03:26:24+01:00" + "modified": "2026-10-12T15:37:12+01:00" }, "migrating.mdx": { "published": "2026-05-01T09:47:04+01:00", From cd9ac2ca85ab576d0f3828a6c7464cdf2a4150b8 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 16:47:42 +0100 Subject: [PATCH 41/61] docs(remote-cache): the address gate is per server, unusable status checks count, and the download host refuses proxy headers Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 48daaace..7190761f 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -321,7 +321,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Of which downloaded through the Registry | - | 5 GiB | - Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one request. -- LPM CLI and Turborepo download a cache hit from the cache's download host, `cache-dl.lpm.dev`, through a link the Registry answers with that works for a minute, so a CI firewall must allow that host too. Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases; those downloads also count against the 5 GiB a day of downloads through the Registry. LPM CLI treats an artifact uploaded without a content hash, as Turborepo uploads one, as a miss, and replaces it with its own. +- LPM CLI and Turborepo download a cache hit from the cache's download host, `cache-dl.lpm.dev`, through a link the Registry answers with that works for a minute, so a CI firewall must allow that host too. The host refuses a request carrying an `Origin`, `Forwarded`, `X-Forwarded-Host` or similar header with HTTP 403, so a TLS-inspecting proxy that adds one turns every cache hit into a miss, and the task runs again. Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases; those downloads also count against the 5 GiB a day of downloads through the Registry. LPM CLI treats an artifact uploaded without a content hash, as Turborepo uploads one, as a miss, and replaces it with its own. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends; the check that storage still holds it counts as a cache hit, and content storage has lost is stored again. Once the account's cache hits are spent, such an upload is stored, and counted, as any other. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. @@ -332,7 +332,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. - The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once, or within that minute on a server that checked it. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits or answered that the organization's billing lapsed, or from one IPv6 /64, or 240 from one IPv6 /48, the Registry answers that address with HTTP 429 for the rest of the minute. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't refused since. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, or status checks of a cache that can't serve reads, from one address or one IPv6 /64, or 240 from one IPv6 /48, a Registry server answers that address with HTTP 429 for the rest of the minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't failed to serve since, for any reason. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. Each window starts with the first request it counts, not at a set time of day. From 08955cff73a019f5f6ad4b72144eeef0fa853184 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 16:47:42 +0100 Subject: [PATCH 42/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 5aa0921c..c053f888 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T15:10:11+01:00" + "modified": "2026-10-12T16:47:42+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From a96022b10684d12f9fb068e287cf1bdaaf93fa1c Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 19:33:05 +0100 Subject: [PATCH 43/61] docs(remote-cache): the brief recheck answer, unusable caches, and rotation limits Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 4 ++-- content/docs/infra/token-rotate.mdx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 7190761f..3e131dd9 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -332,7 +332,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. - The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once, or within that minute on a server that checked it. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, or status checks of a cache that can't serve reads, from one address or one IPv6 /64, or 240 from one IPv6 /48, a Registry server answers that address with HTTP 429 for the rest of the minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours and hasn't failed to serve since, for any reason. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, status checks of a cache that can't serve reads, or new tokens told to wait while the account's limits are checked, from one address or one IPv6 /64, or 240 from one IPv6 /48, a Registry server answers that address with HTTP 429 for the rest of the minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours, until the token stops being valid, or one of its requests is refused, over the account's request limits, answered that the organization's billing lapsed, or a status check that finds the cache can't serve reads. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. Each window starts with the first request it counts, not at a set time of day. @@ -389,7 +389,7 @@ Concurrent runs, such as parallel CI jobs, share the account's limits. To spend - Give jobs that only consume results [read-only access](#read-only-consumers), so they don't upload. - Cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. -The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, or while another upload holds its cache, and with `Retry-After: 2` when the Registry server is busy. LPM CLI sends a refused lookup or upload once more after the wait, plus up to half of it again, and notes `remote cache is busy; skipping some uploads for a moment` (or lookups) if it skips some anyway. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. +The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, while another upload holds its cache, or while it checks again whether the account's limits still hold, and with `Retry-After: 2` when the Registry server is busy. LPM CLI sends a refused lookup or upload once more after the wait, plus up to half of it again, and notes `remote cache is busy; skipping some uploads for a moment` (or lookups) if it skips some anyway. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. ### The server rejects access diff --git a/content/docs/infra/token-rotate.mdx b/content/docs/infra/token-rotate.mdx index aea97725..d2af605d 100644 --- a/content/docs/infra/token-rotate.mdx +++ b/content/docs/infra/token-rotate.mdx @@ -93,7 +93,7 @@ After a successful rotation: - LPM CLI stores the replacement in local secure storage. - The replacement token does not appear in terminal or JSON output. -The LPM.dev Registry can process five rotation requests per minute for one token record. +The LPM.dev Registry can process five rotation requests per minute for one token record, and 20 per minute across one account's tokens, personal or organization. In rare cases, an edge cache can accept the old value for up to 60 seconds after rotation. From c9fcdf67191cdcd97a9b70389bae073d18256950 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 19:33:05 +0100 Subject: [PATCH 44/61] chore: update content dates --- lib/generated/content-dates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index c053f888..c67b637c 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T16:47:42+01:00" + "modified": "2026-10-12T19:33:05+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -237,7 +237,7 @@ }, "infra/token-rotate.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-09-20T00:18:00+01:00" + "modified": "2026-10-12T19:33:05+01:00" }, "infra/tunnel.mdx": { "published": "2026-05-01T09:47:04+01:00", From 7891f9a705f5cf60388a5f08eb7c38f1a17bba90 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 19:37:42 +0100 Subject: [PATCH 45/61] docs(remote-cache): the brief 429 while a lapsed bill is checked again Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 3e131dd9..5edc7c94 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -327,7 +327,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. - An upload, or a download through the Registry, that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. - An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. -- An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day, counted apart from its requests before its plan changed. An organization whose billing lapsed gets HTTP 402 to every request except status checks, which report `paused`. +- An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day, counted apart from its requests before its plan changed. An organization whose billing lapsed gets HTTP 402 to every request except status checks, which report `paused`; while the Registry checks again whether that still holds, other requests get a brief HTTP 429 with `Retry-After: 1`. - A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before. A token reaches only its own account's cache: `slug` or `teamId` naming any other gets HTTP 403, whether or not that account exists, and a `slug` and `teamId` of which only one names the token's own account get HTTP 400. - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. From 5ec3ac4b032463a5648e49aedbd66debaacafb04 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 19:37:42 +0100 Subject: [PATCH 46/61] chore: update content dates --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index c67b637c..9723a86f 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T19:33:05+01:00" + "modified": "2026-10-12T19:37:42+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From d0cc784639f316ba568eba5bd9da68aba1e02d8c Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 21:46:34 +0100 Subject: [PATCH 47/61] docs(remote-cache): reads and uploads to a cache that can't serve them count against the address and end a pass Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 5edc7c94..685de057 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -332,7 +332,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. - The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once, or within that minute on a server that checked it. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, status checks of a cache that can't serve reads, or new tokens told to wait while the account's limits are checked, from one address or one IPv6 /64, or 240 from one IPv6 /48, a Registry server answers that address with HTTP 429 for the rest of the minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours, until the token stops being valid, or one of its requests is refused, over the account's request limits, answered that the organization's billing lapsed, or a status check that finds the cache can't serve reads. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, sent to a cache that can't serve them (status checks included), or new tokens told to wait while the account's limits are checked, from one address or one IPv6 /64, or 240 from one IPv6 /48, a Registry server answers that address with HTTP 429 for the rest of the minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours, until the token stops being valid, or one of its requests is refused, over the account's request limits, answered that the organization's billing lapsed, or sent to a cache that can't serve it, a status check that finds the cache can't serve reads included. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. Each window starts with the first request it counts, not at a set time of day. From d9378a3ddfe0df2012ea6574f5db75f462f53f0d Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 21:46:34 +0100 Subject: [PATCH 48/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 9723a86f..8bd0acb0 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T19:37:42+01:00" + "modified": "2026-10-12T21:46:34+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", From d4d6384d5408b5fff2484b38ffa3e63a222e79e0 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 23:27:42 +0100 Subject: [PATCH 49/61] docs(setup): the per-user token creation limit lpm setup local shares with the dashboard Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/setup.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/infra/setup.mdx b/content/docs/infra/setup.mdx index 2b7cc448..d16ce728 100644 --- a/content/docs/infra/setup.mdx +++ b/content/docs/infra/setup.mdx @@ -189,7 +189,7 @@ CAUTION: The `.npmrc` file contains a token. Keep the file outside version contr Run `lpm setup local` again before the token expires. The command writes a replacement and retires the previous project token. -An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens): for a new project, or one whose token has expired, as a new token replaces it. Replacing a project's token that's still active works at the limit. Expired and revoked tokens are deleted 30 days later. +An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens): for a new project, or one whose token has expired, as a new token replaces it. Replacing a project's token that's still active works at the limit. Expired and revoked tokens are deleted 30 days later. A user creates at most 10 tokens a minute, `lpm setup local`'s included, a limit shared with token creation on the dashboard; past it, the command fails with HTTP 429 and works again within the minute. The command uses the current directory. It does not configure every workspace member automatically. From 63f5d870e6a525eef8d6e781402d024afee67337 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Mon, 12 Oct 2026 23:27:42 +0100 Subject: [PATCH 50/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 8bd0acb0..5eb188b0 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -229,7 +229,7 @@ }, "infra/setup.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-12T13:04:30+01:00" + "modified": "2026-10-12T23:27:42+01:00" }, "infra/store.mdx": { "published": "2026-05-01T09:47:04+01:00", From 79a1aee6e0a1b691186bcec1dfde4d54645225dc Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 02:37:45 +0100 Subject: [PATCH 51/61] docs: Hobby's storage limit leaves out exempt packages, and Pro's overage waits while billing isn't active Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/lpm-dev-and-pro.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/lpm-dev-and-pro.mdx b/content/docs/lpm-dev-and-pro.mdx index 4d4d6c5c..f2a075f8 100644 --- a/content/docs/lpm-dev-and-pro.mdx +++ b/content/docs/lpm-dev-and-pro.mdx @@ -42,7 +42,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p | Price | $0 | $8/mo | | Private packages | 2 | Unlimited | | Package storage | 100 MiB | 5 GiB | -| Package storage beyond that | Publishing stops | $0.20/GiB a month, rounded up to a whole GiB | +| Package storage beyond that | Publishing stops; packages whose sales pass $50 don't count | $0.20/GiB a month, rounded up to a whole GiB; publishing past it waits while billing isn't active | | Marketplace platform fee | 15% | 10% | | Firewall for public npm packages | - | Included | | Local env storage | Included | Included | From da1ed49800f907041b298c52aa2517cb28e95a83 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 02:37:46 +0100 Subject: [PATCH 52/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 5eb188b0..8a13954b 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -253,7 +253,7 @@ }, "lpm-dev-and-pro.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-12T15:37:12+01:00" + "modified": "2026-10-13T02:37:45+01:00" }, "migrating.mdx": { "published": "2026-05-01T09:47:04+01:00", From 9bb47cd5b95b1dfd2ff0fb5698f72b4234ac5398 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 05:26:14 +0100 Subject: [PATCH 53/61] docs: the brief 429 while new tokens are checked, the shared revocation limit, and exempt tarballs Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 4 ++-- content/docs/infra/setup.mdx | 2 +- content/docs/lpm-dev-and-pro.mdx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 685de057..63fc480a 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -332,7 +332,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. - The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once, or within that minute on a server that checked it. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, sent to a cache that can't serve them (status checks included), or new tokens told to wait while the account's limits are checked, from one address or one IPv6 /64, or 240 from one IPv6 /48, a Registry server answers that address with HTTP 429 for the rest of the minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours, until the token stops being valid, or one of its requests is refused, over the account's request limits, answered that the organization's billing lapsed, or sent to a cache that can't serve it, a status check that finds the cache can't serve reads included. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, sent to a cache that can't serve them (status checks included), or new tokens told to wait while the account's limits are checked, from one address or one IPv6 /64, or 240 from one IPv6 /48, a Registry server answers that address with HTTP 429 for the rest of the minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours, until the token stops being valid, or one of its requests is refused, over the account's request limits, answered that the organization's billing lapsed, or sent to a cache that can't serve it, a status check that finds the cache can't serve reads included. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. New tokens still being checked count toward those 60 too, until their requests are answered, so while that many are in progress from one address, a further new token gets HTTP 429 with `Retry-After: 1` ("Too many new tokens from this address are being checked"); a token served lately isn't held up. Each window starts with the first request it counts, not at a set time of day. @@ -389,7 +389,7 @@ Concurrent runs, such as parallel CI jobs, share the account's limits. To spend - Give jobs that only consume results [read-only access](#read-only-consumers), so they don't upload. - Cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. -The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, while another upload holds its cache, or while it checks again whether the account's limits still hold, and with `Retry-After: 2` when the Registry server is busy. LPM CLI sends a refused lookup or upload once more after the wait, plus up to half of it again, and notes `remote cache is busy; skipping some uploads for a moment` (or lookups) if it skips some anyway. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. +The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, while another upload holds its cache, while it checks again whether the account's limits still hold, or while as many new tokens from one address are being checked as it would gate, and with `Retry-After: 2` when the Registry server is busy. LPM CLI sends a refused lookup or upload once more after the wait, plus up to half of it again, and notes `remote cache is busy; skipping some uploads for a moment` (or lookups) if it skips some anyway. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. ### The server rejects access diff --git a/content/docs/infra/setup.mdx b/content/docs/infra/setup.mdx index d16ce728..b28c57dd 100644 --- a/content/docs/infra/setup.mdx +++ b/content/docs/infra/setup.mdx @@ -189,7 +189,7 @@ CAUTION: The `.npmrc` file contains a token. Keep the file outside version contr Run `lpm setup local` again before the token expires. The command writes a replacement and retires the previous project token. -An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens): for a new project, or one whose token has expired, as a new token replaces it. Replacing a project's token that's still active works at the limit. Expired and revoked tokens are deleted 30 days later. A user creates at most 10 tokens a minute, `lpm setup local`'s included, a limit shared with token creation on the dashboard; past it, the command fails with HTTP 429 and works again within the minute. +An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens): for a new project, or one whose token has expired, as a new token replaces it. Replacing a project's token that's still active works at the limit. Expired and revoked tokens are deleted 30 days later. A user creates at most 10 tokens a minute, `lpm setup local`'s included, a limit shared with token creation on the dashboard; past it, the command fails with HTTP 429 and works again within the minute. Revoking is limited too, to 20 tokens a minute, shared by the dashboard, the API, and `lpm setup local` revoking a token it made, as after a setup that didn't finish. The command uses the current directory. It does not configure every workspace member automatically. diff --git a/content/docs/lpm-dev-and-pro.mdx b/content/docs/lpm-dev-and-pro.mdx index f2a075f8..c4ae04d0 100644 --- a/content/docs/lpm-dev-and-pro.mdx +++ b/content/docs/lpm-dev-and-pro.mdx @@ -42,7 +42,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p | Price | $0 | $8/mo | | Private packages | 2 | Unlimited | | Package storage | 100 MiB | 5 GiB | -| Package storage beyond that | Publishing stops; packages whose sales pass $50 don't count | $0.20/GiB a month, rounded up to a whole GiB; publishing past it waits while billing isn't active | +| Package storage beyond that | Publishing stops; the tarballs of packages whose sales pass $50 don't count | $0.20/GiB a month, rounded up to a whole GiB; publishing past it waits while billing isn't active | | Marketplace platform fee | 15% | 10% | | Firewall for public npm packages | - | Included | | Local env storage | Included | Included | From 94be5e52c3bea48f650db9de7c1e9071a13981de Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 05:26:14 +0100 Subject: [PATCH 54/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 8a13954b..816413d7 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-12T21:46:34+01:00" + "modified": "2026-10-13T05:26:14+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -229,7 +229,7 @@ }, "infra/setup.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-12T23:27:42+01:00" + "modified": "2026-10-13T05:26:14+01:00" }, "infra/store.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -253,7 +253,7 @@ }, "lpm-dev-and-pro.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-13T02:37:45+01:00" + "modified": "2026-10-13T05:26:14+01:00" }, "migrating.mdx": { "published": "2026-05-01T09:47:04+01:00", From ca1319f15dfc2f95b34ef417f88df3b46aea8b83 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 08:46:08 +0100 Subject: [PATCH 55/61] docs: revocations always go through, the remote cache's wider gates and trickle, and a body's 30-second deadline Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 2 +- content/docs/infra/setup.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 63fc480a..4f3f1e14 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -332,7 +332,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. - The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once, or within that minute on a server that checked it. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, sent to a cache that can't serve them (status checks included), or new tokens told to wait while the account's limits are checked, from one address or one IPv6 /64, or 240 from one IPv6 /48, a Registry server answers that address with HTTP 429 for the rest of the minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours, until the token stops being valid, or one of its requests is refused, over the account's request limits, answered that the organization's billing lapsed, or sent to a cache that can't serve it, a status check that finds the cache can't serve reads included. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. New tokens still being checked count toward those 60 too, until their requests are answered, so while that many are in progress from one address, a further new token gets HTTP 429 with `Retry-After: 1` ("Too many new tokens from this address are being checked"); a token served lately isn't held up. +- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, sent to a cache that can't serve them (status checks included), or new tokens told to wait while the account's limits are checked, from one address or one IPv6 /64, 240 from one IPv6 /48 or 960 from one /32, a Registry server answers that address with HTTP 429 for the rest of the minute, and every address once 1,200 such tokens came to it in a minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours, until the token stops being valid, or one of its requests is refused, over the account's request limits, answered that the organization's billing lapsed, or sent to a cache that can't serve it, a status check that finds the cache can't serve reads included. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. New tokens still being checked count toward those 60 too, until their requests are answered, so while that many are in progress from one address, a further new token gets HTTP 429 with `Retry-After: 1` ("Too many new tokens from this address are being checked"), though one is still checked every 2 seconds. A token served on that server in the last day isn't held up, nor one served elsewhere, while the Registry can read its pass. A lookup or event report whose small body hasn't arrived within 30 seconds gets HTTP 408. Each window starts with the first request it counts, not at a set time of day. diff --git a/content/docs/infra/setup.mdx b/content/docs/infra/setup.mdx index b28c57dd..d412be92 100644 --- a/content/docs/infra/setup.mdx +++ b/content/docs/infra/setup.mdx @@ -189,7 +189,7 @@ CAUTION: The `.npmrc` file contains a token. Keep the file outside version contr Run `lpm setup local` again before the token expires. The command writes a replacement and retires the previous project token. -An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens): for a new project, or one whose token has expired, as a new token replaces it. Replacing a project's token that's still active works at the limit. Expired and revoked tokens are deleted 30 days later. A user creates at most 10 tokens a minute, `lpm setup local`'s included, a limit shared with token creation on the dashboard; past it, the command fails with HTTP 429 and works again within the minute. Revoking is limited too, to 20 tokens a minute, shared by the dashboard, the API, and `lpm setup local` revoking a token it made, as after a setup that didn't finish. +An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens): for a new project, or one whose token has expired, as a new token replaces it. Replacing a project's token that's still active works at the limit. Expired and revoked tokens are deleted 30 days later. A user creates at most 10 tokens a minute, `lpm setup local`'s included, a limit shared with token creation on the dashboard; past it, the command fails with HTTP 429 and works again within the minute. Revoking a token always works. The Registry's caches refuse a revoked token within a minute; up to 20 revocations a minute per user, across the dashboard, the API and `lpm setup local` revoking a token it made, also clear it from the caches at once. The command uses the current directory. It does not configure every workspace member automatically. From 2f1717d8913d9fa9818d63916254410e3c11087c Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 08:46:08 +0100 Subject: [PATCH 56/61] chore: update content dates --- lib/generated/content-dates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 816413d7..501f4623 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-13T05:26:14+01:00" + "modified": "2026-10-13T08:46:08+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -229,7 +229,7 @@ }, "infra/setup.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-13T05:26:14+01:00" + "modified": "2026-10-13T08:46:08+01:00" }, "infra/store.mdx": { "published": "2026-05-01T09:47:04+01:00", From d3dbf4ec231d6d9069405e5648f4d0625d4f3421 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 16:58:59 +0100 Subject: [PATCH 57/61] docs(cache): split request limits into the download host, revoked tokens and failing tokens, and correct revocation and token limits Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/remote-cache.mdx | 30 ++++++++++++++++++++++++++--- content/docs/infra/setup.mdx | 9 ++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 4f3f1e14..738a6a15 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -321,7 +321,6 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Of which downloaded through the Registry | - | 5 GiB | - Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one request. -- LPM CLI and Turborepo download a cache hit from the cache's download host, `cache-dl.lpm.dev`, through a link the Registry answers with that works for a minute, so a CI firewall must allow that host too. The host refuses a request carrying an `Origin`, `Forwarded`, `X-Forwarded-Host` or similar header with HTTP 403, so a TLS-inspecting proxy that adds one turns every cache hit into a miss, and the task runs again. Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases; those downloads also count against the 5 GiB a day of downloads through the Registry. LPM CLI treats an artifact uploaded without a content hash, as Turborepo uploads one, as a miss, and replaces it with its own. - Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends; the check that storage still holds it counts as a cache hit, and content storage has lost is stored again. Once the account's cache hits are spent, such an upload is stored, and counted, as any other. - An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. - An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. @@ -331,8 +330,7 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o - A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before. A token reaches only its own account's cache: `slug` or `teamId` naming any other gets HTTP 403, whether or not that account exists, and a `slug` and `teamId` of which only one names the token's own account get HTTP 400. - With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. - LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. -- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes, and any older one at once, or within that minute on a server that checked it. -- A token that isn't valid gets the same HTTP 401 for a minute. After 60 tokens from one address in a minute that aren't valid, or whose requests are refused, over their account's request limits, answered that the organization's billing lapsed, sent to a cache that can't serve them (status checks included), or new tokens told to wait while the account's limits are checked, from one address or one IPv6 /64, 240 from one IPv6 /48 or 960 from one /32, a Registry server answers that address with HTTP 429 for the rest of the minute, and every address once 1,200 such tokens came to it in a minute. Each server counts on its own. It still checks one token from there every 2 seconds, and lets through a token whose requests it served in the last 23 hours, until the token stops being valid, or one of its requests is refused, over the account's request limits, answered that the organization's billing lapsed, or sent to a cache that can't serve it, a status check that finds the cache can't serve reads included. A status check serves a token only when its account's cache serves reads: `enabled` or `over_limit`. New tokens still being checked count toward those 60 too, until their requests are answered, so while that many are in progress from one address, a further new token gets HTTP 429 with `Retry-After: 1` ("Too many new tokens from this address are being checked"), though one is still checked every 2 seconds. A token served on that server in the last day isn't held up, nor one served elsewhere, while the Registry can read its pass. A lookup or event report whose small body hasn't arrived within 30 seconds gets HTTP 408. +- A lookup or event report whose small body hasn't arrived within 30 seconds gets HTTP 408. Each window starts with the first request it counts, not at a set time of day. @@ -342,6 +340,32 @@ A wait of 5 seconds or less usually means the Registry is busy for a moment, or Turborepo receives a per-minute limit as HTTP 429, and a daily limit as HTTP 403 with the code `remote_caching_over_limit`. +#### Download host + +LPM CLI and Turborepo download a cache hit from the cache's download host, `cache-dl.lpm.dev`, through a link the Registry answers with. The link works for a minute. + +> **CAUTION:** A CI firewall must allow `cache-dl.lpm.dev` as well as `lpm.dev`. Otherwise every cache hit fails to download, and the task runs again. + +- The host refuses with HTTP 403 a request that carries an `Origin`, `Forwarded`, `X-Forwarded-Host` or similar header. A TLS-inspecting proxy that adds one turns every cache hit into a miss. +- A failed download is reported without its link, which works as a credential for that minute. +- Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases. Those downloads count against the 5 GiB a day of downloads through the Registry. +- LPM CLI treats an artifact uploaded without a content hash, as Turborepo uploads one, as a miss, and replaces it with its own. + +#### Revoked tokens + +- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. +- When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes. Any older one stops at once, or within that minute on a server that checked it. + +#### Tokens that fail + +- A token that isn't valid gets the same HTTP 401 for a minute. +- Each Registry server counts, on its own, the new tokens from each address that aren't valid or whose requests it refuses. A request counts as refused when it's over its account's request limits, answered that the organization's billing lapsed, or sent to a cache that can't serve it, status checks included. So does a new token told to wait while its account's limits are checked. +- After 60 such tokens in a minute from one IPv4 address or IPv6 /64, 240 from one IPv6 /48, or 960 from one /32, the server answers that address with HTTP 429 for the rest of the minute. After 1,200 from every address together, it answers every address that way. +- The server still checks one token every 2 seconds from an address it holds. While it holds every address, that's one token every 2 seconds in all. +- It lets through a token whose requests it served in the last day, and one another server served in the last 23 hours while the Registry can read that token's pass. The pass ends when the token stops being valid, or when one of its requests is refused as above. A status check counts as served only when its account's cache serves reads: `enabled` or `over_limit`. +- New tokens still being checked count toward the 60 too, until their requests are answered. While that many are in progress from one address, a further new token gets HTTP 429 with `Retry-After: 1` ("Too many new tokens from this address are being checked"). One is still checked every 2 seconds. +- Tokens LPM.dev creates carry a mark only LPM.dev can make. They count apart from other tokens: 60 a minute from one IPv4 address or IPv6 /48. A flood of made-up tokens, which can hold up every address, doesn't hold them up. Tokens created before LPM.dev began marking them count with the others. + ### Inspect usage ```bash diff --git a/content/docs/infra/setup.mdx b/content/docs/infra/setup.mdx index d412be92..72a48777 100644 --- a/content/docs/infra/setup.mdx +++ b/content/docs/infra/setup.mdx @@ -189,7 +189,14 @@ CAUTION: The `.npmrc` file contains a token. Keep the file outside version contr Run `lpm setup local` again before the token expires. The command writes a replacement and retires the previous project token. -An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails until you revoke one in [Registry token settings](https://lpm.dev/dashboard/settings/tokens): for a new project, or one whose token has expired, as a new token replaces it. Replacing a project's token that's still active works at the limit. Expired and revoked tokens are deleted 30 days later. A user creates at most 10 tokens a minute, `lpm setup local`'s included, a limit shared with token creation on the dashboard; past it, the command fails with HTTP 429 and works again within the minute. Revoking a token always works. The Registry's caches refuse a revoked token within a minute; up to 20 revocations a minute per user, across the dashboard, the API and `lpm setup local` revoking a token it made, also clear it from the caches at once. +Token limits: + +- An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails for a new project, or one whose token has expired, until you revoke a token in [Registry token settings](https://lpm.dev/dashboard/settings/tokens). Replacing a project's token that's still active works at the limit. +- Expired and revoked tokens are deleted 30 days later. +- A user creates at most 10 tokens a minute, `lpm setup local`'s included. Token creation on the dashboard shares this limit. Past it, the command fails with HTTP 429 and works again within the minute. +- `lpm setup local` creates, replaces and revokes project tokens at most 100 times a minute each from one IPv4 address or IPv6 /64. Past that, it fails with HTTP 429 before changing any token. + +Revoking a token in [Registry token settings](https://lpm.dev/dashboard/settings/tokens) isn't limited, so no one holding a token can keep you from revoking it. A revoked token can keep working for up to a minute, until the Registry's caches drop it. The first 20 revocations a minute per user, across the dashboard, the API and `lpm setup local`, also clear it from the caches at once. The command uses the current directory. It does not configure every workspace member automatically. From 8d8520384a85c4677860c74adc54a51027e00c55 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 16:58:59 +0100 Subject: [PATCH 58/61] chore: update content dates --- lib/generated/content-dates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 501f4623..5148756f 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-13T08:46:08+01:00" + "modified": "2026-10-13T16:58:59+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -229,7 +229,7 @@ }, "infra/setup.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-13T08:46:08+01:00" + "modified": "2026-10-13T16:58:59+01:00" }, "infra/store.mdx": { "published": "2026-05-01T09:47:04+01:00", From 72b921e8647525146e18daac79443ef961edec6f Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 21:57:11 +0100 Subject: [PATCH 59/61] docs: rewrite the remote cache limits, token and login passages in plain English Shorter sentences with one fact each, no contractions or semicolons, the caution's instruction before its risk, and the reasons for a busy answer as a list. The login page now says lpm login tries again for up to 30 seconds when the Registry can't complete the sign-in at once. Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/infra/login.mdx | 4 +- content/docs/infra/remote-cache.mdx | 74 +++++++++++++++-------------- content/docs/infra/setup.mdx | 10 ++-- content/docs/infra/token-rotate.mdx | 2 +- content/docs/lpm-dev-and-pro.mdx | 2 +- 5 files changed, 49 insertions(+), 43 deletions(-) diff --git a/content/docs/infra/login.mdx b/content/docs/infra/login.mdx index 0f7c31b9..c5ba37a8 100644 --- a/content/docs/infra/login.mdx +++ b/content/docs/infra/login.mdx @@ -57,7 +57,9 @@ If the browser does not open, copy the displayed URL into a browser. JSON mode s LPM CLI verifies and saves the returned session. Future protected commands can refresh its access token automatically. -An account keeps up to 20 active `lpm login` sessions, one for each sign-in. Signing in past that ends the session used least recently, as `lpm logout --revoke` would. +An account keeps up to 20 active `lpm login` sessions, one for each sign-in. If you sign in when the account has 20, LPM.dev ends the session that was used least recently, as `lpm logout --revoke` does. + +If the LPM.dev Registry cannot complete the sign-in at once, `lpm login` tries again for up to 30 seconds. If the Registry still cannot complete it, run `lpm login` again. A valid saved refresh-backed session skips browser authentication. An access token without a refresh credential does not satisfy this check. diff --git a/content/docs/infra/remote-cache.mdx b/content/docs/infra/remote-cache.mdx index 738a6a15..c2ec84f0 100644 --- a/content/docs/infra/remote-cache.mdx +++ b/content/docs/infra/remote-cache.mdx @@ -62,7 +62,7 @@ export NODE_ENV=production The token permits cache reads and writes. Supply it through the shell or CI environment, outside committed project configuration. -For the configured Registry origin, LPM CLI can also use `LPM_TOKEN`, when it's a token that permits cache access, or your [`lpm login`](/docs/infra/login) credentials. Login credentials read and write your personal cache. An organization's cache needs one of its tokens. +For the configured Registry origin, LPM CLI can also use `LPM_TOKEN`, if that token permits cache access. It can also use your [`lpm login`](/docs/infra/login) credentials. Login credentials read and write your personal cache. The cache of an organization needs one of its tokens. ### 3. Run the task @@ -291,7 +291,7 @@ The LPM.dev Registry applies these included storage limits: | Organization | 25 GiB per seat | | Enterprise | No fixed quota in the Enterprise plan | -The LPM.dev Registry accepts archives up to 100 MiB (104,857,600 bytes). LPM CLI skips uploading a larger archive to it and builds the task as usual. With a [custom cache endpoint](#custom-cache-endpoints), LPM CLI uploads and restores archives up to 500 MiB. +The LPM.dev Registry accepts archives up to 100 MiB (104,857,600 bytes). LPM CLI does not upload a larger archive to it, and builds the task as usual. With a [custom cache endpoint](#custom-cache-endpoints), LPM CLI uploads and restores archives up to 500 MiB. Restore also applies these limits to the archive contents: @@ -320,51 +320,51 @@ The LPM.dev Registry limits the remote cache requests of each Pro account, and o | Downloaded data | - | 40 GiB | | Of which downloaded through the Registry | - | 5 GiB | -- Every request whose token may use the account's cache for it counts against its request limits, including lookups that miss and status checks. A query for several artifacts at once counts one request for each different artifact; one with more than the window has left is refused and counts as one request. -- Uploads also count against the upload limits, and cache hits against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload the Registry refuses before receiving it doesn't count as an upload, and neither does one of content the cache already holds, recognized by the checksum LPM CLI sends; the check that storage still holds it counts as a cache hit, and content storage has lost is stored again. Once the account's cache hits are spent, such an upload is stored, and counted, as any other. -- An organization's daily limits grow with every seat. Its limits a minute grow with up to ten seats, and its uploads a minute with up to five: 1,500 uploads a minute. -- An account can have 4 uploads in flight for each seat, at least 8 and at most 16, across the Registry, and 8 uploads and downloads together for each seat, at least 32 and at most 64, on each Registry server. A Registry server that is half full shares its places equally among the accounts using it, and keeps a few places for accounts using few. With every place taken, it answers as busy until a place frees. -- An upload, or a download through the Registry, that takes longer than 10 seconds plus a second for every 128 KiB, or longer than 2 minutes, is cut off. LPM CLI gives each remote cache request 30 seconds anyway. After an interrupted download the task runs as on a miss, and the hit and its bytes still count. -- An upload that stops partway, such as when its connection drops, holds its artifact for at most 5 minutes. -- An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day, counted apart from its requests before its plan changed. An organization whose billing lapsed gets HTTP 402 to every request except status checks, which report `paused`; while the Registry checks again whether that still holds, other requests get a brief HTTP 429 with `Retry-After: 1`. -- A request the Registry refuses is answered with why, such as HTTP 403 for an upload with a read-only token or a request for another account's cache, or HTTP 400 for a request that isn't valid. It counts against limits of its own instead of the request limits above, whatever the seats: 30 a minute and 1,000 a day for its token, and 120 a minute and 5,000 a day for the token's account. Once one of these limits is spent, the Registry still answers each request as before. A token reaches only its own account's cache: `slug` or `teamId` naming any other gets HTTP 403, whether or not that account exists, and a `slug` and `teamId` of which only one names the token's own account get HTTP 400. -- With a token that can only read the cache, run Turborepo with `--remote-cache-read-only`. Without it, Turborepo turns its remote cache off for the run after its first refused upload. -- LPM CLI stops uploading for the run after its first refused upload, and stops using the remote cache for the run after a refused lookup, or once the organization's billing lapses. An upload the cache has no room for is skipped on its own, as the cache makes room and a later one may fit. -- A lookup or event report whose small body hasn't arrived within 30 seconds gets HTTP 408. +- Each request whose token can use the cache of the account counts against its request limits. This includes lookups that miss, and status checks. A query for several artifacts counts one request for each different artifact. If a query asks for more than the window has left, the Registry refuses it, and it counts as one request. +- Uploads also count against the upload limits, and cache hits count against the cache-hit limits. A cache hit is a download, or an existence check, that finds the artifact. An upload that the Registry refuses before it receives the upload does not count as an upload. An upload of content that the cache already holds does not count either. The Registry knows such content from the checksum that LPM CLI sends. The Registry then makes sure that storage still holds the content, and this counts as a cache hit. If storage lost the content, the Registry stores it again. When the account has no cache hits left, the Registry stores such an upload, and counts it, as any other upload. +- The daily limits of an organization increase with each seat. Its per-minute limits increase with up to ten seats. Its uploads per minute increase with up to five seats, to 1,500 uploads a minute. +- Across the Registry, an account can have 4 uploads in progress for each seat, at least 8 and at most 16. On each Registry server, it can have 8 uploads and downloads together for each seat, at least 32 and at most 64. When a Registry server is half full, it shares its places equally among the accounts that use it. It also keeps a few places for accounts that use few. When every place is taken, the server answers that it is busy until a place becomes free. +- The Registry stops an upload, or a download through the Registry, that takes longer than 10 seconds plus one second for each 128 KiB. It also stops one that takes longer than 2 minutes. LPM CLI gives each remote cache request 30 seconds in any case. After an interrupted download, the task runs as on a miss, and the hit and its bytes still count. +- If an upload stops before it is complete, for example because its connection drops, the upload holds its artifact for 5 minutes or less. +- An account whose plan has no remote cache gets 30 requests a minute and 1,000 a day. The Registry counts these separately from its requests before its plan changed. An organization whose billing lapsed gets HTTP 402 for each request except status checks, which report `paused`. While the Registry finds out again whether the lapse continues, other requests get a short HTTP 429 with `Retry-After: 1`. +- When the Registry refuses a request, its answer gives the reason. For example, an upload with a read-only token, or a request for the cache of another account, gets HTTP 403. A request that is not valid gets HTTP 400. A refused request counts against its own limits, not the request limits above, for any number of seats. For its token, these limits are 30 a minute and 1,000 a day. For the account of the token, they are 120 a minute and 5,000 a day. When one of these limits is spent, the Registry still answers each request as before. A token reaches only the cache of its own account. If `slug` or `teamId` names any other account, the request gets HTTP 403, also if that account does not exist. If only one of `slug` and `teamId` names the account of the token, the request gets HTTP 400. +- If a token can only read the cache, run Turborepo with `--remote-cache-read-only`. Without this flag, Turborepo turns off its remote cache for the run after its first refused upload. +- After its first refused upload, LPM CLI does not upload for the rest of the run. After a refused lookup, LPM CLI does not use the remote cache for the rest of the run. The same occurs when the billing of the organization lapses. If the cache has no room for an upload, LPM CLI skips only that upload. The cache makes room, so a later upload can fit. +- If the small body of a lookup or event report does not arrive in 30 seconds, the request gets HTTP 408. Each window starts with the first request it counts, not at a set time of day. -A request past a limit gets HTTP 429 with a `Retry-After` header that gives the seconds until the limit resets. LPM CLI then skips that kind of request until then, and builds tasks as it would without a remote cache. A lookup limit pauses uploads too, since a task that skipped its lookup would likely upload an artifact the cache already holds. The CLI warns once a run for each kind of limit. +A request past a limit gets HTTP 429 with a `Retry-After` header. The header gives the seconds until the limit resets. Until then, LPM CLI skips that kind of request, and builds tasks as it does without a remote cache. A lookup limit also pauses uploads, because a task that skipped its lookup can upload an artifact that the cache already holds. The CLI warns once a run for each kind of limit. -A wait of 5 seconds or less usually means the Registry is busy for a moment, or a minute's window is about to reset. LPM CLI sends such a lookup or upload once more after the wait, plus up to half the wait again so refused requests don't all return together, unless that kind was paused meanwhile. If it skips some anyway, it notes it once a run for each kind, as `remote cache is busy; skipping some uploads for a moment` (or lookups), and keeps the limit warning for a longer limit. +A wait of 5 seconds or less usually means one of two things: the Registry is busy for a short time, or the window of a minute is about to reset. LPM CLI sends such a lookup or upload one more time after the wait. It adds up to half the wait, so that refused requests do not all return at the same time. It does not send the request again if that kind of request was paused in the meantime. If LPM CLI still skips some requests, it shows a note once a run for each kind: `remote cache is busy; skipping some uploads for a moment` (or lookups). It keeps the limit warning for a longer limit. Turborepo receives a per-minute limit as HTTP 429, and a daily limit as HTTP 403 with the code `remote_caching_over_limit`. #### Download host -LPM CLI and Turborepo download a cache hit from the cache's download host, `cache-dl.lpm.dev`, through a link the Registry answers with. The link works for a minute. +LPM CLI and Turborepo download a cache hit from the download host of the cache, `cache-dl.lpm.dev`. They use a link that the Registry gives in its answer. The link works for one minute. -> **CAUTION:** A CI firewall must allow `cache-dl.lpm.dev` as well as `lpm.dev`. Otherwise every cache hit fails to download, and the task runs again. +> **CAUTION:** Allow `cache-dl.lpm.dev` and `lpm.dev` in your CI firewall. If you do not, every cache hit fails to download, and the task runs again. -- The host refuses with HTTP 403 a request that carries an `Origin`, `Forwarded`, `X-Forwarded-Host` or similar header. A TLS-inspecting proxy that adds one turns every cache hit into a miss. -- A failed download is reported without its link, which works as a credential for that minute. -- Turborepo downloads a signed artifact through the Registry instead, as do other clients and older LPM CLI releases. Those downloads count against the 5 GiB a day of downloads through the Registry. -- LPM CLI treats an artifact uploaded without a content hash, as Turborepo uploads one, as a miss, and replaces it with its own. +- The host refuses a request with HTTP 403 if the request has an `Origin`, `Forwarded`, `X-Forwarded-Host`, or similar header. If a TLS-inspecting proxy adds such a header, every cache hit becomes a miss. +- LPM CLI reports a failed download without its link, because the link works as a credential for that minute. +- Turborepo downloads a signed artifact through the Registry instead. Other clients and older LPM CLI releases do this too. These downloads count against the 5 GiB a day of downloads through the Registry. +- Some clients, Turborepo among them, upload an artifact without a content hash. LPM CLI treats such an artifact as a miss, and replaces it with its own. #### Revoked tokens -- The Registry checks a token at most once a minute on each server, so a revoked token can keep working for up to a minute. -- When LPM CLI refreshes an `lpm login` session, the session's previous access token stops working within five minutes. Any older one stops at once, or within that minute on a server that checked it. +- The Registry examines a token at most once a minute on each server. As a result, a revoked token can continue to work for up to a minute. +- When LPM CLI refreshes an `lpm login` session, the previous access token of the session becomes invalid in five minutes or less. Any older token becomes invalid at once, or in that minute on a server that examined it. #### Tokens that fail -- A token that isn't valid gets the same HTTP 401 for a minute. -- Each Registry server counts, on its own, the new tokens from each address that aren't valid or whose requests it refuses. A request counts as refused when it's over its account's request limits, answered that the organization's billing lapsed, or sent to a cache that can't serve it, status checks included. So does a new token told to wait while its account's limits are checked. -- After 60 such tokens in a minute from one IPv4 address or IPv6 /64, 240 from one IPv6 /48, or 960 from one /32, the server answers that address with HTTP 429 for the rest of the minute. After 1,200 from every address together, it answers every address that way. -- The server still checks one token every 2 seconds from an address it holds. While it holds every address, that's one token every 2 seconds in all. -- It lets through a token whose requests it served in the last day, and one another server served in the last 23 hours while the Registry can read that token's pass. The pass ends when the token stops being valid, or when one of its requests is refused as above. A status check counts as served only when its account's cache serves reads: `enabled` or `over_limit`. -- New tokens still being checked count toward the 60 too, until their requests are answered. While that many are in progress from one address, a further new token gets HTTP 429 with `Retry-After: 1` ("Too many new tokens from this address are being checked"). One is still checked every 2 seconds. -- Tokens LPM.dev creates carry a mark only LPM.dev can make. They count apart from other tokens: 60 a minute from one IPv4 address or IPv6 /48. A flood of made-up tokens, which can hold up every address, doesn't hold them up. Tokens created before LPM.dev began marking them count with the others. +- A token that is not valid gets the same HTTP 401 for one minute. +- Each Registry server counts, on its own, the new tokens from each address that are not valid or whose requests it refuses. A request counts as refused if it is over the request limits of its account. It also counts if the answer says that the billing of the organization lapsed. It counts too if it goes to a cache that cannot serve it, status checks included. A new token counts too if the server tells it to wait while the server examines the limits of its account. +- After 60 such tokens in a minute from one IPv4 address or IPv6 /64, the server answers that address with HTTP 429. This continues for the rest of the minute. The limit is 240 from one IPv6 /48, and 960 from one /32. After 1,200 from all addresses together, the server answers every address with HTTP 429. +- The server still examines one token every 2 seconds from an address that it holds. While it holds every address, it examines one token every 2 seconds in total. +- The server lets through a token whose requests it served in the last day. It also lets through a token that another server served in the last 23 hours, while the Registry can read the pass of that token. The pass ends when the token becomes invalid, or when the server refuses one of its requests as above. A status check counts as served only if the cache of its account serves reads: `enabled` or `over_limit`. +- New tokens that the server still examines also count toward the 60, until the server answers their requests. While 60 are in progress from one address, a further new token gets HTTP 429 with `Retry-After: 1` ("Too many new tokens from this address are being checked"). The server still examines one token every 2 seconds. +- Tokens that LPM.dev creates have a mark that only LPM.dev can make. The server counts them separately from other tokens: 60 a minute from one IPv4 address or IPv6 /48. A flood of made-up tokens can hold up every address, but it does not hold up these tokens. Tokens that LPM.dev created before it started to mark them count with the others. ### Inspect usage @@ -406,14 +406,18 @@ If read-only mode is enabled, uploads are skipped by design. A local hit also av ### A request limit is reached -LPM CLI warns `Remote cache limit reached` with the limit it reached and how long it skips remote requests. Tasks still run, and the CLI uses the remote cache again once the limit resets. See [Request limits](#request-limits). +LPM CLI shows the warning `Remote cache limit reached`, with the limit and how long it skips remote requests. Tasks still run, and the CLI uses the remote cache again when the limit resets. See [Request limits](#request-limits). -Concurrent runs, such as parallel CI jobs, share the account's limits. To spend fewer requests: +Concurrent runs, for example parallel CI jobs, share the limits of the account. To use fewer requests, give [read-only access](#read-only-consumers) to jobs that only consume results, so that they do not upload. Also cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. -- Give jobs that only consume results [read-only access](#read-only-consumers), so they don't upload. -- Cache only tasks that take longer to run than to download. Each cached task costs a lookup on every run, and an upload on every miss. +The Registry also answers with HTTP 429 and `Retry-After: 1` in these cases: -The Registry also answers with HTTP 429 and `Retry-After: 1` when the account has as many uploads or downloads in flight as it may, while another upload holds its cache, while it checks again whether the account's limits still hold, or while as many new tokens from one address are being checked as it would gate, and with `Retry-After: 2` when the Registry server is busy. LPM CLI sends a refused lookup or upload once more after the wait, plus up to half of it again, and notes `remote cache is busy; skipping some uploads for a moment` (or lookups) if it skips some anyway. An upload of an artifact another upload is still storing gets HTTP 409, and LPM CLI leaves it to that upload. +- The account has as many uploads or downloads in progress as it can have. +- Another upload holds the cache of the account. +- The Registry finds out again whether the limits of the account still apply. +- From one address, as many new tokens are in progress as the server lets through. See [Tokens that fail](#tokens-that-fail). + +When a Registry server is busy, it answers with HTTP 429 and `Retry-After: 2`. LPM CLI sends a refused lookup or upload one more time after the wait, plus up to half the wait. If it still skips some requests, it shows `remote cache is busy; skipping some uploads for a moment` (or lookups). An upload of an artifact that another upload still stores gets HTTP 409, and LPM CLI leaves the artifact to that upload. ### The server rejects access diff --git a/content/docs/infra/setup.mdx b/content/docs/infra/setup.mdx index 72a48777..70397915 100644 --- a/content/docs/infra/setup.mdx +++ b/content/docs/infra/setup.mdx @@ -191,12 +191,12 @@ Run `lpm setup local` again before the token expires. The command writes a repla Token limits: -- An account holds up to 100 active tokens it created, project tokens included. Past that, `lpm setup local` fails for a new project, or one whose token has expired, until you revoke a token in [Registry token settings](https://lpm.dev/dashboard/settings/tokens). Replacing a project's token that's still active works at the limit. -- Expired and revoked tokens are deleted 30 days later. -- A user creates at most 10 tokens a minute, `lpm setup local`'s included. Token creation on the dashboard shares this limit. Past it, the command fails with HTTP 429 and works again within the minute. -- `lpm setup local` creates, replaces and revokes project tokens at most 100 times a minute each from one IPv4 address or IPv6 /64. Past that, it fails with HTTP 429 before changing any token. +- An account holds up to 100 active tokens that it created, project tokens included. At this limit, `lpm setup local` fails for a new project, or for a project whose token expired, until you revoke a token in [Registry token settings](https://lpm.dev/dashboard/settings/tokens). At the limit, you can still replace the token of a project if that token is active. +- LPM.dev deletes expired and revoked tokens 30 days later. +- A user creates 10 tokens a minute or fewer, `lpm setup local` included. Token creation on the dashboard shares this limit. Above it, the command fails with HTTP 429, and it works again when the minute ends. +- From one IPv4 address or IPv6 /64, `lpm setup local` creates, replaces, and revokes project tokens 100 times a minute or fewer for each action. Above that, it fails with HTTP 429 before it changes a token. -Revoking a token in [Registry token settings](https://lpm.dev/dashboard/settings/tokens) isn't limited, so no one holding a token can keep you from revoking it. A revoked token can keep working for up to a minute, until the Registry's caches drop it. The first 20 revocations a minute per user, across the dashboard, the API and `lpm setup local`, also clear it from the caches at once. +LPM.dev does not limit how often you revoke tokens in [Registry token settings](https://lpm.dev/dashboard/settings/tokens). As a result, no person who holds a token can stop you from revoking it. A revoked token can continue to work for up to a minute, until the caches of the Registry drop it. For each user, the first 20 revocations a minute, across the dashboard, the API, and `lpm setup local`, also remove the token from the caches at once. The command uses the current directory. It does not configure every workspace member automatically. diff --git a/content/docs/infra/token-rotate.mdx b/content/docs/infra/token-rotate.mdx index d2af605d..6a824b30 100644 --- a/content/docs/infra/token-rotate.mdx +++ b/content/docs/infra/token-rotate.mdx @@ -93,7 +93,7 @@ After a successful rotation: - LPM CLI stores the replacement in local secure storage. - The replacement token does not appear in terminal or JSON output. -The LPM.dev Registry can process five rotation requests per minute for one token record, and 20 per minute across one account's tokens, personal or organization. +The LPM.dev Registry can process five rotation requests per minute for one token record. Across the tokens of one account, personal or organization, it can process 20 per minute. In rare cases, an edge cache can accept the old value for up to 60 seconds after rotation. diff --git a/content/docs/lpm-dev-and-pro.mdx b/content/docs/lpm-dev-and-pro.mdx index c4ae04d0..fe6078aa 100644 --- a/content/docs/lpm-dev-and-pro.mdx +++ b/content/docs/lpm-dev-and-pro.mdx @@ -42,7 +42,7 @@ All LPM.dev Registry packages start private. Pool and Marketplace are explicit p | Price | $0 | $8/mo | | Private packages | 2 | Unlimited | | Package storage | 100 MiB | 5 GiB | -| Package storage beyond that | Publishing stops; the tarballs of packages whose sales pass $50 don't count | $0.20/GiB a month, rounded up to a whole GiB; publishing past it waits while billing isn't active | +| Package storage beyond that | Publishing stops. The tarballs of packages whose sales pass $50 do not count. | $0.20/GiB a month, rounded up to a whole GiB. Publishing past it waits while billing is not active. | | Marketplace platform fee | 15% | 10% | | Firewall for public npm packages | - | Included | | Local env storage | Included | Included | From fd8136f832e6969b36aad94dcba2fe89e43cb044 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Tue, 13 Oct 2026 21:57:11 +0100 Subject: [PATCH 60/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index 5148756f..d189ff50 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -189,7 +189,7 @@ }, "infra/login.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-12T03:26:24+01:00" + "modified": "2026-10-13T21:57:11+01:00" }, "infra/policy.mdx": { "published": "2026-06-28T15:54:59+01:00", @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-13T16:58:59+01:00" + "modified": "2026-10-13T21:57:11+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -229,7 +229,7 @@ }, "infra/setup.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-13T16:58:59+01:00" + "modified": "2026-10-13T21:57:11+01:00" }, "infra/store.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -237,7 +237,7 @@ }, "infra/token-rotate.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-12T19:33:05+01:00" + "modified": "2026-10-13T21:57:11+01:00" }, "infra/tunnel.mdx": { "published": "2026-05-01T09:47:04+01:00", @@ -253,7 +253,7 @@ }, "lpm-dev-and-pro.mdx": { "published": "2026-06-16T23:33:51+01:00", - "modified": "2026-10-13T05:26:14+01:00" + "modified": "2026-10-13T21:57:11+01:00" }, "migrating.mdx": { "published": "2026-05-01T09:47:04+01:00", From 48e48d40e6b675e6f5bc59a355abea1b3d5e1756 Mon Sep 17 00:00:00 2001 From: Tolga Ergin Date: Thu, 15 Oct 2026 00:20:05 +0100 Subject: [PATCH 61/61] chore: update content dates Co-Authored-By: Claude Opus 5.5 (1M context) --- lib/generated/content-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generated/content-dates.json b/lib/generated/content-dates.json index d189ff50..24d3eeb3 100644 --- a/lib/generated/content-dates.json +++ b/lib/generated/content-dates.json @@ -213,7 +213,7 @@ }, "infra/remote-cache.mdx": { "published": "2026-09-16T11:29:21+01:00", - "modified": "2026-10-13T21:57:11+01:00" + "modified": "2026-10-15T00:18:07+01:00" }, "infra/secrets-vault.mdx": { "published": "2026-05-01T09:47:04+01:00",