Skip to main content

Developer Limits

Admins can configure per-developer and per-extension limits to control resource usage on the extension platform.

Sound limits​

Each extension has three configurable sound limits. Each limit resolves in priority order:

PrioritySourceWhere to set
1 (highest)Per-extension overrideAdmin → Hub → Extensions → the extension's row
2Per-developer overrideAdmin → Hub → Developers → developer detail → "Limit Overrides"
3 (lowest)Platform defaultSee defaults below
Limit keyDefaultDescription
max_sounds_per_extension50Maximum bundled sounds per extension
max_sound_file_size10 MB (10 485 760 bytes)Maximum size per individual sound file
max_sound_storage_bytes200 MB (209 715 200 bytes)Total sound storage across all sounds in an extension

The two size limits are stored in bytes; the admin forms take and display MB and convert on save. Every resolved limit is returned with a source marker of extension, developer, or default.

System extensions install with limit checks skipped - they are trusted and bypass sound-limit enforcement at install time.

Setting developer limits​

  1. Navigate to Admin → Hub → Developers
  2. Click a developer to open their detail page
  3. In the Limit Overrides section, set values for the three sound limits. Max Sounds per Extension accepts 0–500; the two size fields take MB.
  4. Each field has its own Save button, and a Reset button appears once the field has a value - Reset clears the override back to the platform default.

The Limit Overrides section is rendered only for admins holding developer-limits:edit.

The override applies to all extensions owned by this developer (unless an extension has its own override).

Setting per-extension limits​

  1. Navigate to Admin → Hub → Extensions
  2. Find the extension in the list
  3. Edit the limit cells inline - max sounds, file size, and storage each have their own editable cell, gated on developer-limits:edit

Leave a field empty to use the developer's limit or the platform default.

How limits are enforced​

  • CLI (lumio deploy) - fetches the resolved limits from the API and pre-flights count, per-file size, and total storage before uploading. Blocks the deploy with a descriptive error if exceeded. It falls back to the platform defaults (50 / 10 MB / 200 MB) when the limits call fails.
  • Server (upload endpoint) - validates the sound count, file sizes, and total storage in the manifest against the resolved limits. Returns a PlanLimitReached error if exceeded.
  • Server (install) - defence-in-depth check at install time. A sound count over the resolved limit logs a warning and truncates; total storage over the resolved limit fails the whole install. Neither should trigger if upload validation ran. Skipped entirely for system extensions.

Limit Requests​

Developers can request limit increases from their own developer limits page at /account/developer/limits. Admins review them on the global Limit Requests page at /developers/limit-requests, which has no sidebar entry - navigate to it directly. A per-developer Limit Requests section also appears on each developer's detail page.

Review workflow​

  1. Open /developers/limit-requests (or the Limit Requests section on a developer's detail page)
  2. Pick a status tab and open a request to see its details, including the requested value, the current value, and the developer's reason
  3. Approve - the requested value is applied automatically. Extension-scoped requests write the matching per-extension limit column; developer-scoped requests write a developer-level override.
  4. Reject - opens a dialog for review notes. The notes are optional at the API level but the reject dialog asks for them.

Every status change is written to a timeline of events and broadcast to the developer over a WebSocket channel, so the developer sees the decision without reloading.

Request statuses​

StatusMeaning
openSubmitted, waiting for admin review
in_reviewAn admin is reviewing the request
approvedApproved - the limit is applied automatically
rejectedRejected - review notes explain the reason

open is the submitted state. The review endpoint accepts only in_review, approved, or rejected - a request cannot be moved back to open.

The rest of the Developers area​

The sidebar's Hub → Developers sub-group carries four entries. Limit work happens on the developer detail page reached from the first one.

PageRoutePage gate
All Developers/developersdeveloper-verification:read
Developer Teams/developers/teamsdeveloper-limits:read
Developer Verifications/developers/verificationsdeveloper-verification:read
Developer Applications/developers/applicationsdeveloper-verification:read

Two more routes exist without a sidebar entry - navigate to them directly:

PageRoutePage gate
Limit Requests (global)/developers/limit-requestsdeveloper-limits:read
Developer Team detail/developers/teams/\{id\}developer-limits:read

The developer detail page at /developers/\{id\} also carries a revenue-split control (50–100% developer share) and a delete action, next to the Limit Overrides and Limit Requests sections.

Per-extension limits are edited on the Hub → Extensions pages (/extensions and /extensions/reviews), both gated on extension-review:read, with the limit cells themselves gated on developer-limits:edit.

API endpoints​

MethodPathPermissionDescription
GET/v1/admin/developers/\{id\}/limitsdeveloper-limits:readList developer limit overrides
PUT/v1/admin/developers/\{id\}/limitsdeveloper-limits:editSet/remove a developer limit override
PATCH/v1/admin/extensions/\{id\}/limitsdeveloper-limits:editSet/clear per-extension limit overrides
GET/v1/admin/limit-requestsdeveloper-limits:readList all limit requests
GET/v1/admin/developers/\{id\}/limit-requestsdeveloper-limits:readList limit requests for a developer
PUT/v1/admin/limit-requests/\{id\}developer-limits:editReview (approve/reject) a limit request
GET/v1/admin/limit-requests/\{id\}/eventsdeveloper-limits:readGet timeline events for a limit request

GraphQL: adminDeveloperLimits, adminSetDeveloperLimit, adminSetExtensionLimits, adminAllLimitRequests, adminDeveloperLimitRequests, adminLimitRequestEvents, adminReviewLimitRequest - see GraphQL reference.

The admin app calls these through its own proxy routes: /api/developers/\{id\}/limits, /api/extensions/\{id\}/limits, /api/limit-requests, /api/limit-requests/\{requestId\}, and /api/limit-requests/\{requestId\}/events.