RFC-0005: Perfetto UI Server Extensions #3227
Replies: 3 comments
-
The name is very mysterious TBH. I'd call it something like Perfetto UI Server Extensions or similar. Also in the Decision part, i'd make it clear the server is optional for extra feature, and will never be load bearing.
Imho the name is a big confusing, not a big fan. provider is too generic.
This one I would call it "Site configured (or Installation configured)". The deal is that the Site points to a default server (or list of servers). but people creating a fork of perfetto can have their own dedault server ui.perfetto.dev is the Google-managed, and points to a default Google server (+ a second one for internal users)
I honestly couldn't make sense of this sentence About the endpoint: /teams has a semantic that is unnecessarily narrow. What if you don't have "teams" but want to break down things? Also note that regardless of how you call them, there is a fallacy in your naming scheme: you can't have both /teams (As a file) and /teams/foo. teams either is a directory or a file. they need to be named differently. My take is that there must be a central manifest like /manifest.json because at very least you need something like "a friendly human readable name". So I'd make it more like I'd honestly question whether we should have two different layers on the API level, rather than just /modules/default /modules/foo /modules/bar to keep everything flat and consistent
Why. This statement is confusing. You are suggesting that "perfetto" is special as name.
Are you going to mangle also the ID of the commands?
Wait what is an "extension" now? You never introduced this concept
** I claim the installation ones should always go first, and the setting ones after**
You forgot about the offline case. I question whether we should (in a V2) make these cached by the serviceworker or not. It might be worth it TBH.
It's not that easy. I'd move authentication to a different RFC as it's a bit of a beast.
I'd deal with versioning differently. You don't want to have "monolithic" versions oteherwise we'll increment stuff all the time. It needs to work like proto:
Let's move this to a different RFC |
Beta Was this translation helpful? Give feedback.
-
|
📝 RFC Document Updated View changes: Commit History |
Beta Was this translation helpful? Give feedback.
-
Naming & Clarity
Fixed: → "Perfetto UI Server Extensions"
Fixed: Added explicit statement that servers are optional and never load-bearing. UI works fully without them.
Fixed: "Provider" → "Extension Server" throughout. Added Terminology section defining Extension Server, Extension, and Module.
Fixed: → "Installation-configured"
Fixed: Rewrote to clearly explain UI deployments can package default servers but can't remotely provision into existing profiles. API Structure
Fixed:
Fixed: Flattened entirely. Now:
Fixed: {
"name": "Google Internal Extensions",
"modules": ["default", "android", "chrome"],
"csp_allow": ["https://symbolserver.corp.google.com"]
}
Fixed: → "default module" Load Order & Other
Fixed: Load order now: 1) Installation-configured servers first, 2) User-configured alphabetically
Fixed: Added note about service worker caching for V2 Auth & Versioning
Fixed: Created RFC-0006: Extension Server Authentication with full spec. RFC-0005 just references it.
Fixed: Proto-style versioning: Add fields freely, version individual features only when semantics change. No monolithic |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
📄 RFC Doc: 0005-provider-endpoint-system.md
Perfetto UI Server Extensions
Authors: @LalitMaganti
Status: In Review - Addressing Feedback
Summary
This RFC proposes a system for distributing Perfetto UI extensions (macros, SQL
modules, proto descriptors) and integrating with external services via standard
HTTP(S) endpoints. Extension servers are optional and never load-bearing - the
UI remains fully functional without them for local trace analysis.
Problem
Perfetto has several pain points around extensibility:
UI Extensions are hardcoded: The
is_internal_user_script_loader.tsfilecontains hardcoded URLs to internal Google resources. There's no standard way
for companies or individuals to distribute UI extensions.
No sharing mechanism: Users want to share custom macros and SQL modules
within their team without everyone manually copy-pasting JSON
(#3085).
Symbolization is complex: Requires magic environment variables, manual
symbol paths, etc. No unified way to query symbol servers.
No ACL story: We don't want to build and maintain our own
authentication/authorization system.
Local filesystem access problem: Browser-based UI cannot directly access
local filesystem for symbols, mappings, or extensions.
Terminology
Can be a static file host (GitHub, GCS, S3) or a dynamic server (corporate
infrastructure).
execution. Three types:
android,chrome,default). Allows users to selectively load relevant extension sets.Decision
Users can optionally configure HTTP(S) endpoints (extension servers) that serve
Perfetto UI extensions. The browser UI queries configured servers and aggregates
extensions from all enabled servers/modules.
Extension servers are optional and never load-bearing. The UI remains fully
functional without any servers configured - users can always perform local trace
analysis. Servers only provide optional enhancements like team-shared macros or
symbol resolution.
Scope
In Scope:
install are post-MVP followups)
Out of Scope (Separate RFCs):
browser integration, caching, mode selection, etc.)
traceconv, standalone scripts)trace_processor --httpdNote: Symbolization and deobfuscation endpoints are mentioned for
completeness and to establish the overall server architecture, but all
implementation details are deferred to a separate RFC.
Key Principles
corporate SSO), not custom Perfetto ACL
manifest.json) providesserver metadata and module list
descriptors), no JavaScript code execution
Architecture
Extension Server Configuration
Users configure extension servers in Settings → Extension Servers. Configuration
stored in localStorage using existing Perfetto settings system. Credentials
stored separately in localStorage.
Two ways to add servers in MVP:
internal server auto-added for Googlers)
Extension Server Store entries and URL-parameter-based one-click install remain
goals for a V1 followup (separate RFC covering catalog UX + distribution) and
are tracked in Phase 2 future work.
Installation-configured servers (like Google's internal server) are added on
first load with the
defaultmodule selected. Other modules remain opt-in viaSettings so users explicitly choose which content sets to enable.
Important: The Perfetto UI is a static client with no backend. Each UI
deployment (e.g., ui.perfetto.dev) can package default servers into the client
bundle, but cannot remotely provision servers or credentials into existing user
profiles. This is intentional - it follows from the "static client + no backend"
architecture. Organizations needing centralized provisioning must fork/deploy
their own UI bundle with the desired servers pre-configured.
Extension servers are configured with HTTPS URLs. For convenience, the UI also
supports shorthand aliases that resolve to standard HTTPS endpoints:
github://owner/repo/refresolves to GitHub raw.githubusercontent.comgs://bucket/pathresolves to GCS public HTTPS APIs3://bucket/pathresolves to S3 HTTPS APINormalization rules, alias expansion details, and deterministic ordering live in
Appendix A (Endpoint Specification).
Standard Endpoints
Extension servers implement these HTTP(S) endpoints:
Manifest File:
The
manifest.jsonfile contains server metadata and module list:{ "name": "Google Internal Extensions", "modules": ["default", "android", "chrome"], "csp_allow": ["https://symbolserver.corp.google.com"] }Fields:
name(required): Human-readable server name shown in Settingsmodules(required): List of available modules. Use["default"]forsingle-module servers.
csp_allow(optional): URLs to add to Content Security Policy forsymbolization/deobfuscation endpoints
Request Strategy
The UI uses different request patterns for different endpoint types:
enabled server/module combinations and aggregates responses. Partial failures
are acceptable - failed servers are skipped and logged.
response ends the search).
Detailed orchestration behavior (ordering, timeouts, rate limiting, retry logic)
is specified in Appendix A.
What These Endpoints Provide
UI Extensions:
Macros (
/macros) - Named sequences of UI commands that users invoke viacommand palette. Example: "Android Startup Analysis" macro that pins specific
tracks and runs startup queries.
SQL Modules (
/sql_modules) - Reusable SQL code that creates tables,views, or functions. Example:
android.startupmodule with common startupanalysis queries.
Proto Descriptors (
/proto_descriptors) - Type definitions for customprotobuf messages in traces. Example: Android system_server proto definitions.
All extensions are declarative and execute locally - no trace data sent to
extension servers.
Symbolization & Deobfuscation:
/symbolize/*) - Convert addresses to function names,files, line numbers
/deobfuscate/*) - Convert obfuscated names to originalnames
Details for these endpoints deferred to separate RFC.
Module-Based Organization
Why modules exist:
In large organizations, different teams build different extensions:
Without modules, all extensions from a server would load for everyone, creating
noise. Modules let users choose which sets of extensions they want.
How modules work:
manifest.jsonlists available modules:{"name": "...", "modules": ["default", "android", "chrome"]}Settings
for installation-configured servers)
/modules/android/macros,/modules/chrome/macros, etc.Default bootstrap behavior: when an installation-configured server (like
Google's internal server) is auto-added, the UI selects the
defaultmoduleautomatically. Other modules remain unchecked so users can opt in explicitly.
Implementation notes:
android-frameworks)permissions, GCS IAM, etc.)
Resource Naming and Conflicts
Macros: Automatic Namespacing
Macros are automatically namespaced to prevent conflicts.
Format:
[server_key module] macro_nameExamples:
[google-internal default] Startup Analysis[acme-corp android] Memory Snapshotserver_keyreferences the normalized slug defined in Appendix A. Duplicatehandling specifics are documented in Appendix B.
Note: Macros are registered with their full namespaced name. When invoking
macros programmatically with
RunCommand, use the full namespaced name (e.g.,RunCommand("[google-internal default] Startup Analysis")).SQL Modules & Proto Descriptors: Conflict Handling
Not automatically namespaced. Deterministic ordering and conflict logging rules
are covered in Appendix A and Appendix B. Future enhancement: Settings UI for
conflict resolution.
Extension Lifecycle
Extensions loaded ONCE on UI startup. Configuration changes require page
reload.
Load flow:
(installation-configured servers first, then user-configured servers
alphabetically)
Configuration changes:
apply changes"
Caching:
Cache-Control,ETag, etc.)This would allow extensions to work offline after initial load. Requires
separate design for cache invalidation and version management.
Failure handling:
initializes successfully with an empty extension set
Authentication
Note: Authentication implementation is covered in RFC-0006: Extension
Server Authentication. This section provides a high-level overview for context.
Extension servers support standard authentication mechanisms:
Authentication flow:
Full specification: See RFC-0006 for storage schemas, credential management
UI, OAuth flows, token refresh logic, and security considerations. Appendix C
below provides minimal context for understanding this RFC.
Examples
GitHub Static Hosting
Repo structure:
File:
manifest.json{ "name": "Acme Corp Extensions", "modules": ["default", "android", "chrome"] }Configuration:
Corporate Server
Configuration:
See Appendix D for complete implementation examples.
Security Considerations
Extension Safety
All extensions are declarative and safe - no code execution:
JavaScript plugins are NOT supported. Future executable plugins would require
separate RFC with sandboxing.
Server Integrity Expectations
Perfetto does not attempt to verify that server-hosted JSON or descriptor
payloads are trusted. Server operators are solely responsible for reviewing,
signing, or gating their own content before distribution to guard against
compromised repos or buckets. Each organization can apply its own signing or
review pipeline (e.g., proxy servers, checksum validation, internal CI) without
upstream coordination, and this RFC does not prescribe a canonical integrity
mechanism.
Data Sensitivity
For UI extensions: NO trace data sent to extension servers. Extensions
downloaded once and executed locally.
Consent model: Adding an extension server = implicit consent to load
extensions from it.
For symbolization (future RFC): Will send trace data (addresses, build IDs).
Future RFC will specify consent flow and warnings.
Credential Storage
leveraging the browser's same-origin protections for credentials is an
intentional design choice rather than a placeholder for future keychain work.
CORS Requirements
All HTTPS extension servers MUST set CORS headers:
CORS failure handling:
errors in the console)
Request orchestration details (timeouts, rate limiting, ordering) are specified
in Appendix A.
Alternatives Considered
Custom
perfetto://URI SchemeRejected - Adds parsing complexity for minimal benefit. Standard HTTP(S)
URLs work fine.
Service Discovery via Manifest File
Adopted - Manifest file (
manifest.json) is required and serves multiplepurposes: friendly server name, module list, and CSP configuration for optional
endpoints like symbolization.
Perfetto-Hosted Registry
Rejected - Single point of failure, doesn't solve private/corporate use
case. Decentralized model is better.
Build Custom ACL System
Hard Rejected - Huge implementation burden, users need another account.
Leverage existing systems (GitHub, GCS, corporate SSO).
Implementation
Phase 1: Core Extension Server Infrastructure
servers/modules)
Phase 2: UI Extensions
/manifest.json)is_internal_user_script_loader.tsdefaultmoduleselected)
Phase 2.5: Authentication (RFC-0006)
Phase 3: Post-MVP Enhancements
dedicated RFC)
?add_server=...)Phase 4: Local HTTP Accelerator (Future)
trace_processor --httpdto serve extension server endpointsPhase 5: Symbolization & Deobfuscation (Separate RFC)
Migration Strategy
is_internal_user_script_loader.tsassets with extensionservers happens centrally: hosted Perfetto deployments will update their
installation-configured server list and the UI automatically begins fetching
from the new endpoints on reload without user action.
ready, so the switch is transparent to users aside from the new Settings
surface.
to update the packaged server defaults before rolling the refreshed UI bundle.
Prerequisites
Design Decisions & Non-Goals
This section documents intentional scope boundaries and architectural choices to
prevent future confusion about what is explicitly out of scope.
SQL Module Safety:
resource limits and protections. No additional sandboxing is introduced by
this system. This matches how SQL modules work today.
Extension Versioning:
Extensions are always fetched fresh on reload. This matches how normal
websites work - users get the latest version on page load. Extension servers
are responsible for ensuring extensions remain compatible or coordinating
updates with users. Version pinning, rollback switches, or multi-version
compatibility matrices would require backend orchestration and are
intentionally excluded.
Proto Descriptor Validation:
parsing. Malformed descriptors are rejected and logged. No additional
validation layer is introduced.
Extension Update Notifications:
get latest extensions. Providers should ensure extensions are rolled out
safely, same as any distributed system. This is not different from how web
applications handle updates.
Resource Quotas:
The user explicitly adds servers, establishing an implicit trust relationship -
malicious or misconfigured servers are not an expected attack vector. In
practice, these limits are not expected to be reached. If performance issues
arise, limits can be added later.
Namespace Protection:
undefined behavior. Extension servers should use domain-specific names to
avoid conflicts with current or future built-in features.
Macro Validation:
fail at runtime when invoked. No upfront validation is performed. This matches
how ad-hoc macros work today - the macro simply fails to execute correctly if
it's malformed or incompatible with the UI version.
Cross-Server Dependencies:
servers. Loading order is deterministic but dependencies are not enforced. If
an extension relies on another extension being present, this is undefined
behavior and will fail at runtime. Users should configure extensions from a
single server if dependencies are required.
Extension Server Deployment Ownership:
each organization. The RFC does not prescribe SLAs, scaling rules, or shared
infrastructure so that internal and external deployments can evolve
independently.
Offline Distribution:
design. Teams that require offline readiness can fork or self-host the
Perfetto UI and manage their own distribution channel without upstream
protocol changes.
Telemetry Scope:
can add aggregate reporting once core plumbing is proven, but client behavior
today is limited to console logging.
defines event schemas, privacy review, and rollout expectations before any
data collection is enabled. Until that happens, console logging remains the
only supported observability surface.
Appendices
Appendix A: Complete Endpoint Specification
HTTP Status Codes
Request-level status:
Item-level status:
For endpoints processing multiple items, use 200 OK with per-item status in
response. Partial success is acceptable.
{ "symbols": [ { "address": "0x1000", "function": "Foo()", "file": "foo.cc", "line": 42 }, { "address": "0x2000", "status": "not_found", "message": "Build ID abc123 not found" } ] }Error responses (4xx/5xx):
{ "error": { "message": "Human-readable error description", "code": "internal_error" } }JSON Naming Convention
All JSON fields use snake_case (following GitHub, Stripe):
build_id,user_code,frame_address,team_nameCompression
Error Reporting
provider/endpoint/error details, then that provider/team combination is
skipped for that resource type
Endpoint Versioning
Proto-style versioning: Avoid monolithic version increments. Instead:
new optional endpoints, which is handled gracefully.
example, if symbolization behavior changes fundamentally, the manifest can
specify:
{ "symbolizers": [ { "type": "on_demand_symbolizer_v2", "path": "/symbolize/v2/frames" } ] }on_demand_symbolizercontinues working at its original path. UIsupports both, preferring newer versions when available.
No monolithic
/v2/prefixes - These force unnecessary version bumps.Version individual features only when semantics change, not when adding new
capabilities.
Endpoint Aliases & Server Keys
requests:
github://owner/repo/ref[/optional/path]→https://raw.githubusercontent.com/owner/repo/ref[/optional/path]. When nooptional path is supplied the repo root is used and Perfetto appends the
standard endpoint suffix (for example
/modules/android/macros).gs://bucket/path→https://storage.googleapis.com/bucket/paths3://bucket/path→https://bucket.s3.amazonaws.com/pathhttps://prefix./ . _ :) with-.-and trim leading/trailing-.https://perfetto.acme.com→perfetto-acme-comhttps://corp.example.com:8443/modules→corp-example-com-8443-modulesgithub://acme/perfetto-ext/main→raw-githubusercontent-com-acme-perfetto-ext-mainremain stable and are used for deduplication, ordering, and credential
lookups.
Ordering Algorithm
Extension loading follows a deterministic ordering to ensure consistent behavior
across sessions and predictable conflict resolution:
the UI bundle)
defined above)
descriptors), iterate resource keys in lexicographical order
Example: Given installation-configured server
google-internal(modules:default) and user-configured serverscorp-example-com(modules:chrome,android) andraw-githubusercontent-com-acme-ext-main(modules:default),the load order is:
google-internal/default/ macros (keys sorted)google-internal/default/ sql_modules (keys sorted)google-internal/default/ proto_descriptors (keys sorted)corp-example-com/android/ macros (keys sorted)corp-example-com/android/ sql_modules (keys sorted)corp-example-com/android/ proto_descriptors (keys sorted)corp-example-com/chrome/ macros (keys sorted)corp-example-com/chrome/ sql_modules (keys sorted)corp-example-com/chrome/ proto_descriptors (keys sorted)raw-githubusercontent-com-acme-ext-main/default/ macros (keys sorted)raw-githubusercontent-com-acme-ext-main/default/ sql_modules (keys sorted)raw-githubusercontent-com-acme-ext-main/default/ proto_descriptors (keys sorted)This ordering determines which resource wins in case of conflicts (first
registration wins).
Request Orchestration & Rate Limiting
Request ordering:
"Ordering Algorithm" subsection above (server key → module → resource type →
resource key).
remains interactive and surfaces loading spinners plus console logs while
servers load.
server returning success ends the iteration).
Timeouts (fail-fast):
Per-endpoint timeout values:
Timeout handling:
server/module combination and continues with others. Partial data still loads.
server (try-until-success pattern).
Rate limiting:
Retry-Afterheader is present, further requests to that server/moduleare deferred until the header expires.
Retry-After, the server/module is skipped for the remainder of thesession and retried on next reload.
Appendix B: Resource Format Specifications
Macros Format
Macros are named sequences of UI commands following
UI Automation format.
Endpoints:
GET /modules/{module}/macrosAll servers use the same response format regardless of how many modules they
have.
Response:
{ "Android Startup Analysis": [ { "id": "dev.perfetto.CreateWorkspace", "args": ["Startup Analysis"] }, { "id": "dev.perfetto.PinTracksByRegex", "args": [".*ActivityStart.*", "name"] }, { "id": "dev.perfetto.RunQueryAndShowTab", "args": [ "SELECT ts, dur, name FROM slice WHERE name LIKE '%ActivityStart%' ORDER BY ts" ] } ], "Memory Snapshot": [ { "id": "dev.perfetto.AddDebugSliceTrack", "args": [ "SELECT ts, dur, CAST(size AS text) as name FROM heap_profile_allocation WHERE size > 1000000 ORDER BY size DESC LIMIT 100", "Large Allocations (>1MB)" ] } ] }Schema:
Common command IDs:
dev.perfetto.RunQueryAndShowTabdev.perfetto.CreateWorkspacedev.perfetto.PinTracksByRegexdev.perfetto.AddDebugSliceTrackSee
Commands Reference
for complete list.
Namespacing & duplicates:
[server_key module] macro_name, whereserver_keyuses the normalization rules in Appendix A.additional deduplication is performed within a single server/module payload.
SQL Modules Format
Endpoints:
GET /modules/{module}/sql_modulesAll servers use the same response format regardless of how many modules they
have.
Response:
{ "android.startup": "CREATE PERFETTO TABLE android_startup_events AS\nSELECT ts, dur, name FROM slice WHERE name GLOB 'Startup*';", "android.memory": "CREATE PERFETTO VIEW android_memory_stats AS\nSELECT ts, SUM(size) as total_bytes FROM heap_profile_allocation GROUP BY ts;", "common.helpers": "CREATE PERFETTO FUNCTION format_bytes(bytes LONG) RETURNS STRING AS\n SELECT CASE\n WHEN $bytes < 1024 THEN $bytes || ' B'\n WHEN $bytes < 1048576 THEN ($bytes / 1024) || ' KB'\n ELSE ($bytes / 1048576) || ' MB'\n END;" }Schema:
Module path format:
category.subcategory.module_name[a-zA-Z0-9.]+Conflict handling:
module_path). "Successfully registered" means the module was registered in the
trace processor engine. The first successfully registered definition stays
active; subsequent duplicates are skipped and logged, including both servers
and the conflicting module path.
Proto Descriptors Format
Endpoints:
GET /modules/{module}/proto_descriptorsAll servers use the same response format regardless of how many modules they
have.
Response:
{ "android-system-protos": { "name": "Android System Server Protos", "description": "Protos for Android system_server traces", "descriptor": "CpcBChd0cmFjZV9wcm90by9hbmRyb2lkLnByb3RvEhBwZXJmZXR0by5wcm90..." }, "chrome-browser-protos": { "name": "Chrome Browser Protos", "descriptor": "CpQCChZjaHJvbWVfYnJvd3Nlci5wcm90bxIQcGVyZmV0dG8ucHJvdG9zGg9..." } }Schema:
Creating a FileDescriptorSet:
Conflict handling:
semantics as SQL modules. Duplicate IDs yield console warnings listing the
server/module/id that was retained vs dropped.
Appendix C: Authentication Details
Note: Authentication implementation is fully specified in RFC-0006:
Extension Server Authentication. This appendix provides minimal context for
understanding the overall system architecture of RFC-0005.
High-Level Overview
Extension servers support standard authentication methods:
Storage
perfetto_server_credentials(localStorage)Key Flows
displayed → user selects modules
Full authentication specification: See RFC-0006 for storage schemas,
credential management UI, OAuth flows, token refresh logic, security
considerations, and implementation details.
Appendix D: Extension Server Implementation Examples
GitHub Static Hosting
Repository structure:
File:
manifest.json{ "name": "Acme Corp Extensions", "modules": ["default", "android", "chrome"] }File:
modules/android/macros{ "Startup Analysis": [ {"id": "dev.perfetto.CreateWorkspace", "args": ["Startup"]}, { "id": "dev.perfetto.PinTracksByRegex", "args": [".*ActivityStart.*", "name"] } ], "Memory Snapshot": [ { "id": "dev.perfetto.AddDebugSliceTrack", "args": ["SELECT ...", "Allocations"] } ] }URL Resolution:
github://acme-corp/perfetto-resources/main/modules/android/macros→
https://raw.githubusercontent.com/acme-corp/perfetto-resources/main/modules/android/macrosAuthentication: Automatic via GitHub OAuth if repo is private.
Corporate Extension Server (Flask)
Authentication: Corporate SSO/OAuth2/OIDC. Extension server handles auth,
Perfetto sends tokens in
Authorizationheader.UI Integration Example
Appendix E: Context for LLM Recovery
This section contains implementation details, resolved questions, and context
for resuming work. Human readers can stop here.
Background
Problem we're solving:
Key design decision:
servers
Related GitHub issues: #3085
All Open Questions - RESOLVED ✅
RFC Status: Complete, all questions resolved, ready for implementation.
Architecture & Scope:
& URL params followup)
Endpoint Specification: 5. ✅ Versioning: Proto-style (field additions ok,
semantic changes = new types) 6. ✅ Partial success: UI extensions aggregate
across all selected servers; symbolization/deobfuscation fall back to
first-success semantics in the followup RFC 7. ✅ JSON format: snake_case 8. ✅
Compression: Optional, browser-handled
Symbolization & Deobfuscation: 9. ✅ All deferred to separate RFC
Performance & Reliability: 13. ✅ Timeouts: Fixed (5s/10s/15s/30s),
fail-fast 14. ✅ Retry: No retry, try next server immediately 15. ✅ Server
queries: Serial (one at a time) 16. ✅ Rate limiting: Respect Retry-After
headers
Security & Privacy: 17. ✅ Token storage: Plaintext in localStorage
(separate from settings) 18. ✅ Data sensitivity: Implicit consent for
extensions (no trace data sent) 19. ✅ Code execution: No JavaScript plugins,
only declarative
User Experience: 20. ✅ Error reporting: Console logging only for MVP 21. ✅
Health monitoring: No monitoring for MVP 22. ✅ Migration: One-shot when
extension server ready 23. ✅ Discovery: Settings instructions (Extension Server
Store catalog deferred)
Modules & Filtering: 24. ✅ Module discovery: Via manifest.json when adding
server 25. ✅ Module hierarchy: Flat only (use dashes for organization) 26. ✅
Module permissions: No module-level ACL (server-level only) 27. ✅ Module
wildcards: No wildcards
GitHub App OAuth: 29. ✅ Scopes: Repository Contents (read-only) only 30. ✅
Token refresh: Use refresh tokens, auto-refresh 31. ✅ Hosting: Client-side only
(Device Flow) 32. ✅ Multiple accounts: Per-server auth (natural support)
Implementation Checklist
Phase 1: Core Extension Server Infrastructure
servers/modules)
Phase 2: UI Extensions
/manifest.json)is_internal_user_script_loader.tsselection)
Phase 2.5: Authentication (Separate RFC)
Phase 3: Post-MVP Enhancements
?add_server=...)Phase 4: Local HTTP Accelerator (Future)
trace_processor --httpdPhase 5: Symbolization & Deobfuscation (Separate RFC)
Prerequisites
Before Phase 1:
Before Phase 2: 3. Create example GitHub repo with test extensions 4.
Finalize localStorage settings schema
Files to Modify/Create
New files:
ui/src/core/servers/server_service.ts- Core server logicui/src/core/servers/server_config.ts- Config schemaFiles to modify:
ui/src/frontend/is_internal_user_script_loader.ts- Remove/replaceDeferred new files (post-MVP):
ui/src/core/servers/store.ts- Extension Server Store (curated list +shortcuts)
Testing Strategy
Unit tests:
Integration tests:
E2E tests:
Key Technical Challenges
selection
Success Criteria
MVP (Phase 1-2):
is_internal_user_script_loader.tsFuture (Phase 3-5):
Important Constraints
💬 Discussion Guidelines:
Beta Was this translation helpful? Give feedback.
All reactions