Replies: 4 comments 8 replies
|
Thank you for the thorough proposal. VEE brings structure to a set of questions we've been working through in ADR-034, ADR-036, and the extensibility research. This response is our analysis and open questions — not final decisions. We want the community to weigh in before anything is locked.
What we've studiedWe've accumulated significant research on extensibility: ADR-034 (Painter/behavior separation, partially implemented), ADR-036 (SceneCache — done, module extraction and plugin interfaces — open), three dedicated research reports (15 frameworks analyzed, 4 WASM runtimes evaluated), and now VEE. The consolidation report identified where proposals agree, where they conflict, and what gaps remain. The core extensibility mechanisms (Painter pattern, LayoutMetrics, ThemeBundle interface, registry, plugin manager, CDK) are implemented and shipping. What's missing is the product around these mechanisms: documentation, examples, ThemeBundle implementations, and a clear path for community widget authors. Topics that need discussion1. Single module vs extraction — conflicting evidence, open questionOur own documents disagree on this:
SceneCache reduced What we need to figure out:
This is one of the most consequential pre-v1.0 decisions. Community input is valuable here. 2. Where does the "kernel" live and what exactly is it?VEE proposes L0 (kernel) =
These are architectural questions that benefit from community input before we commit. 3. sdk/ — what, where, and howAll proposals agree an authoring experience improvement is needed. The questions: What goes in it?
Where does it live?
How do we validate the design?
4. ThemeBundle — interface exists, implementations needed
The wiring question is non-trivial: how does 5. Catalog — interesting model, needs validationThe L2 index-only catalog (Obsidian parallel) is an interesting model. CI attestation with trust tiers is well-thought-out. The catalog infrastructure, trust tiers, and CI attestation should all be in place before v1.0 — so the ecosystem launches with a complete contribution path, not a "coming soon" placeholder. Open questions on design:
6. WASM/RPC — analysis shows existing interfaces are sufficientWe analyzed whether existing interfaces need modification to support WASM/RPC plugins:
Finding: all plugin-specific types are purely additive — new types in a new module ( VEE's position ("contracts earlier if cheap; runtime later") aligns with this analysis. Plugin type vocabulary (DrawCommand, PluginSession, etc.) should be defined before v1.0 as part of the stable contract surface. The WASM/RPC runtime implementation ( 7. Extended registry metadataAdditional fields on What's clear vs what's openClear (consensus across all proposals):
Open (needs discussion and/or validation):
Next steps we're considering
We'd value community input on
@lkmavi your Obsidian parallel is a strong mental model — the "curated index + trust gate, not a code warehouse" framing clarifies L2 well. The Go module proxy as artifact store (with sumdb integrity) is strictly better than zip-based plugin stores. We'd like to hear from community members who've built on or evaluated gogpu/ui:
If you know anyone building on gogpu or evaluating Go GUI frameworks — please share this discussion. The more perspectives we get before v1.0, the better the architecture. We'd also appreciate if community members could bring this topic to broader Go forums — Reddit (r/golang), Hacker News, Go Discord, or any other channels where Go developers discuss GUI frameworks. The extensibility architecture affects everyone who will build on gogpu, and we want input from beyond our immediate community. If you have access and think this is worth discussing — please post and link back here. gogpu/ui — enterprise GUI toolkit for Pure Go. We're laying the extensibility architecture before v1.0 — all of it. Every perspective helps us get it right. |
|
@kolkov I set an agent attempting to port the quake UI as I currently have it implemented to use gogpu/ui. I've posted what it found here: darkliquid/ironwail-go#17 if you are interested in taking a look. |
|
Thank you for compiling this into a clear RFC — I strongly support the lean kernel + Obsidian-style catalog direction. In my view, this is not just a convenient distribution scheme, but a solid architectural plan for how the Pure Go GUI ecosystem should grow post-v1.0. Why the Obsidian model fits GoGPU so wellObsidian's community plugins have demonstrated a sound product principle: the platform owns the contracts and trust, authors own source code and release cycles, and the catalog is an index with gates, not a monorepo that sucks in every popular extension. Mapping to VEE:
Aspect | Obsidian | GoGPU VEE
-- | -- | --
Stable platform | App + plugin API | L0 gogpu/ui (kernel + contracts + SDK facade)
Extension ownership | Author's own GitHub repo | L1 independent Go modules
Discoverability | Community plugins browser | L2 gogpu/widgets index
Quality / trust | Review + listing rules | Submit-gate CI + verified badges
Artifacts | Plugin releases | Go module proxy (proxy.golang.org) + integrity via sumdb
This separation directly addresses the risks outlined in the RFC:
This is exactly the model I had in mind when comparing to Obsidian: curated discoverability without the pressure of "everything in one tree" and without an untrusted zip-store. Distribution via Go proxy — a key enhancement to the schemeWhat makes this stronger than a typical plugin marketplace is that installation and integrity are already solved by Go's module system:
Therefore, L2 should remain index-only: YAML entries, docs, schemas, badges, CI matrix. No vendoring of widget sources into The compile-time model is also better than runtime plugin downloading as the default for desktop GUI:
Why this is a good architectural plan (not just packaging)The three layers correctly define boundaries of dependencies and trust:
This aligns well with GoGPU's existing ecosystem pattern ( I also agree with the order of work in the RFC:
On the open questions, my lean:
SummaryLean kernel + independent Go modules + Obsidian-style index where proxy.golang.org / sumdb are the artifact and integrity layer — this is the right architecture for a trusted Pure Go widget ecosystem. It keeps I'm +1 to treat this as the north star for extensibility up to v1.0 and validate it through Why the Obsidian model fits GoGPU so well Mapping to VEE: Aspect Obsidian GoGPU VEE The kernel does not become a warehouse. Charts, Markdown, CodeEditor, calendars, domain-specific kits, enterprise ThemeBundles stay outside ui. The kernel remains maintainable "forever." Applications stay opt-in. The consumer pays only for what they explicitly require / import. Dead-code elimination stays honest — no fake "disable stock UI" toggle. Maintenance scales. The organization reviews index entries and CI attestations, not every line of every community widget. Authors move at their own pace. Semver tags, breaking changes, and experimental APIs live in L1 and do not block kernel releases. This is exactly the model I had in mind when comparing to Obsidian: curated discoverability without the pressure of "everything in one tree" and without an untrusted zip-store. Distribution via Go proxy — a key enhancement to the scheme The catalog entry points to a module@version (the author's module). The consumer installs with the standard toolchain: go get github.com/alice/ui-rating@v0.3.1. Bytes come from proxy.golang.org (or from a private proxy in enterprise). Integrity is pinned by sum.golang.org — retags / rewritten history do not pass silently. The dependency graph is auditable: go list -m all, SBOM, reproducible builds. Therefore, L2 should remain index-only: YAML entries, docs, schemas, badges, CI matrix. No vendoring of widget sources into gogpu/widgets. The catalog stays small and reviewable, and "verified" means attestation of compatibility with specific ui versions and platforms, not popularity. The compile-time model is also better than runtime plugin downloading as the default for desktop GUI: predictable binary contents; no unexpected network fetches on startup; clear license / supply-chain surface at build time; WASM/RPC can be added later as a separate path (uiplugin), without breaking the main L1 scenario. Why this is a good architectural plan (not just packaging) L0 Kernel — primitives, stable contracts (widget, layout, theme, registry, plugin/cdk), reference ThemeBundle, TestKit/SDK facade. The inclusion criterion (≥70% of apps + perpetual support + not domain-specific) is a good heuristic, even if the threshold is refined later. L1 Modules — the real extension surface. Same Widget type, no second API. ThemeBundles / painters / custom kits are published as ordinary modules. L2 Catalog — the product-level wrapper for trust and discoverability without owning the code. This aligns well with GoGPU's existing ecosystem pattern (gpucontext / gputypes as contracts, implementations separate): contracts and lean core first, then optional modules, then a curated index. I also agree with the order of work in the RFC: Lock down contracts / SDK golden path before v1.0 Polish ThemeBundle wiring so community themes become real Stand up catalog CI and 2–3 reference L1 modules end-to-end Keep WASM/RPC vocabulary additive; runtime — when concrete editor/IDE requirements emerge Postpone extracting uicore until there is measurable pain — SceneCache has already reduced compile surface; don't over-split prematurely On the open questions, my lean: Where the kernel lives: start with gogpu/ui as L0; extract uicore only if download/compile cost for third-party authors genuinely hurts. sdk/: a thin facade inside ui is fine if examples/custom_widget/ shows helpers are needed; docs-first is also OK — validate with a Tier-2 example. Imports: prefer explicit registration APIs in docs for auditability; blank import as opt-in for discovery. BYO-kit: document app + widget + contracts without core/* as a first-class path — especially for games / custom shells. Summary I'm +1 to treat this as the north star for extensibility up to v1.0 and validate it through examples/custom_widget/, ThemeBundle implementations, and 2–3 reference modules in the catalog. |
|
@kolkov @darkliquid I have carefully studied the investigations darkliquid/ironwail-go#17 and put together a preliminary ADR, I'm interested in your opinion (and the rest @zloymelnik , @AgentNemo00 ) ADR-070: Engine UI Embedding and VEE Validation (ironwail-go RESEARCH-0008)
ContextThe GoGPU org proposed Verified Extension Ecosystem (VEE) in discussion #468: a lean darkliquid (ironwail-go — pure-Go Quake on gogpu/WebGPU) ran four experimental branches (v1–v4) porting hand-rolled menu/console/HUD UI onto Approaches tested
Root finding (four data points)
Each branch hand-built that seam. Failures included: framework fights (v1), Vulkan presentation crashes from texture/encoder lifetime (v2), reflection/ DecisionWe accept VEE as the north star for widget distribution and kernel boundaries, and add a parallel P0 track for engine/game embedding in 1. Adopt from VEE (confirmed by ironwail)
2. Add to roadmap (gaps VEE does not address)
3. Reject or defer
Enterprise referencesHow mature stacks solve the same problem:
ConsequencesPositive
Negative / costs
Risks if deferred
Validation matrix (ironwail vs VEE claims)
Recommended next steps
Open questions
References
|
Uh oh!
There was an error while loading. Please reload this page.
Status: open for feedback — ecosystem architecture (not
ui-repo-only)Scope: GoGPU org · kernel
gogpu/ui· cataloggogpu/widgets· optionaluicore/uipluginLabels: architecture, extensibility, supply-chain, module design
Related: gogpu/ui#65 (widget collection), prior threads on third-party extensibility / custom widgets / UI RFC
Builds on: ADR-034 (Painter/behavior), ADR-036 (extensibility), SceneCache (gogpu/ui#210), ADR-057 (Widget Authoring SDK, proposed)
Moved from: gogpu/ui#229 (body + catalog clarification merged here)
TL;DR
We agree with the Widget Ecosystem RFC direction: SDK, Tier-2 golden path, ThemeBundle, and a catalog are the right pre-v1.0 bets.
We propose a sharper distribution model:
Goal: extensibility without core bloat, predictable binary size, and enterprise-grade trust for third-party packages.
Context (what the RFC already got right)
Extension mechanisms in
gogpu/uialready work:widget,registry,theme,layout,plugin,cdk, painters / LayoutMetrics. SceneCache cut thewidget/compile surface (124 → 70 packages).What’s missing is not API surface — it’s the product around the API:
ui/ final binaries / download surface forever.go get github.com/gogpu/uistill downloads the entire module. Community code insideuigrows download size, review surface, and permanent core maintenance pressure.Principles
require/import.Widget—sdk/never introduces a second widget API; façade only over existing packages.Architecture: three layers
uiCore inclusion criterion
A widget/package lands in
uionly if:widget,registry,theme,layout,plugin,cdk,uitest,a11ysdk/façadeAny “please merge X into core” request goes through an RFC + the criterion above.
Stock widgets are optional — bring-your-own kit
The desire to “skip the stock UI and ship my own kit for binary size” is valid. A “turn off the original UI” switch (build tags / runtime flag) is not.
Stock widgets already live in separate packages (
core/button,core/textfield, …). Theapp/desktopruntime path depends onwidget(contracts), not on the wholecore/*tree. In Go, unimported packages stay out of the binary — savings come from not importing, not from a kill switch.Supported composition path (document in the SDK):
app+widget+ layout/theme contracts + your L1 modules; nocore/*, no reference ThemeBundlewidget.Widget; publish as a normal L1 moduleuicore(types without the stock kit)Analogy: Angular CDK without Material — not “Material with an off toggle.”
Honest binary-budget note: GPU stack weight (
gg/wgpu/ fonts) often dominates a single Button. Skipping stock widgets is a useful opt-in, not a silver bullet. Catalog CI binary budgets catch extension Δ size surprises; they do not invent a magical disable.Explicitly out of scope for A–C: build tags on the stock kit, a runtime “disable default UI” flag, or a single “all widgets” package with opt-out (that would fight dead-code elimination).
Extension contracts (lock before v1.0)
1. SDK (
sdk/)Thin surface: re-export stable types, registration helpers, testing helpers.
Success metric: empty module → themeable + tested + registered widget in < 1 hour (Tier 2).
Accompanied by
examples/custom_widget/anddocs/sdk/(including publishing).2. Registry metadata (backward compatible)
Optional fields on
registry.WidgetInfo:Author,Module,License,Tags,Homepage,Themes.3.
widget.yaml(out-of-band)For catalog tooling and CI — not part of the Go runtime. Describes module,
ui_compat, entrypoints, tests, tags.4. ThemeBundle
One call:
app.New(app.WithThemeBundle(nordicui.NewTheme())). Community themes live in L1.5. Consumer UX
Recommendation: prefer an explicit API over blank import (auditability, fewer surprises). Blank import remains an opt-in for discovery/registry.
Catalog
gogpu/widgets(L2)At launch: no ratings, reviews, or payments. Selection = quality + CI. Artifacts = Go module proxy.
Mental model: Obsidian-style catalog (index only)
A useful mental model for L2 (
gogpu/widgets) is Obsidian community plugins:github.com/alice/ui-rating)v0.3.1)obsidian-releases)gogpu/widgets(entries/*.yaml)go get module@version+ importWhat we do: discoverability, review, CI attestation, catalog links.
What we do not do: host widget source/binaries. Artifacts come from the author’s module via proxy.golang.org; integrity from sum.golang.org.
Where Go is stronger than a typical plugin zip store:
module@version; retagged history does not silently win.go list -m all), reproducible builds (vs downloading plugins at runtime).ui_compat+ CI matrix, not “latest zip from GitHub”.So the org is a curated index + trust gate, not a code warehouse — same spirit as Obsidian’s registry, with Go’s module proxy as the artifact store. A future catalog website can sit on the same
index.yamlwithout changing this model.communityverifieduiorggogpu/*or signed MoUHonest docs wording:
CI as the trust product
Submit gate: resolve → static checks (
go vet/staticcheck, no CGO, OSI-compatible license) → compat matrix (recentuiminors + tip) → platform smoke → (recommended) binary budget → attestation written into the entry.Nightly re-verify: failure →
status: broken+ author notification. Green badge only while the suite stays green.Example attestation fields:
Answers to the RFC open questions
sdk/. Extractgithub.com/gogpu/uicoreonly if measurable download/CI pain remains.uicorefor minimal types;sdk/stays a package inside the kernel;widgets= catalog only;uipluginfor WASM/RPC later. Avoiduisdkas a module name (collides with packagesdk/).go get→ predictable binary, SBOM, audit, reproducible builds.gogpu/uiplugin. Do not pull wazero / RPC hosts into every app that draws a Button.sdk/+ Tier-2 example + docs. P0/P1: index-onlywidgets+ submit CI. P1: ThemeBundle + registry metadata. P2: nightly re-verify + binary budget. P3: optionaluicore; WASM/RPC runtime (contracts earlier if cheap).Explicitly out of scope for phases A–C
ui/contribas a community widget dumpwidgetsmonorepo with dozens of Go packages (bloat under another name)core/*insteadPhased plan (refinement of the RFC timeline)
sdk/+examples/custom_widget/+docs/sdk/gogpu/widgets(index-only) +widget.yaml+ submit-gate CIWidgetInfo+ compat badgesuiplugin)Delta vs the original RFC phasing: pull the catalog earlier (alongside SDK); push WASM runtime lower (contracts can still land early if cheap).
Governance (short)
status: brokenon failed nightly; README/badge reflect reality.go list -m all; the catalog helps pin known-good versions.Why this is enterprise-grade
database/sqldriver modelsdkconstraintsui_compatinwidget.yaml+ CI matrixworkflow_run_id/ commit /verified_atin entriesConsumer outcome:
go get github.com/alice/ui-rating@v0.3.1 # catalog link + badge: verified against gogpu/ui@v0.4.2Kernel outcome:
uisize and surface grow only from org decisions — not from community activity.Proposed decision
uiplugin.uicore— non-blocking; only on measurable need.How to participate
We need feedback on:
ui?community/verified/orgenough?app+widgetonly, zerocore/*”, or is an SDK mention enough?Comment below. Every perspective helps us lock the right extensibility story before v1.0.
GoGPU ecosystem — Pure Go, zero CGO. Extensions opt in explicitly; kernels stay lean. This is an org-level architecture discussion.
All reactions