Tracker maintained by @evnchn with Claude Code. Living doc — edit fates in place as items move. Swept 2026-06-14; re-verify any individual item before acting on a revive.
What this is
The cutting-room floor : every PR I opened on zauberzeug/nicegui that closed without merging — swept by closure reason, sorted by where it should go . The point is that good work I built and upstream declined (on scope/audience, not correctness) shouldn't rot as closed PRs; it should live somewhere — an extension, a fork branch, or a tracked revive.
52 closed-unmerged PRs swept. ~30 are genuinely done/dropped (no action — collapsed at the bottom). The valuable residue is below.
Scope rule: anything still targeted for upstream stays out of here — notably zauberzeug#6112 (lazy import + worker stubs) and zauberzeug#5763 (vnode cache, already merged). This is the declined pile, not in-flight work.
→ nicegui-perf extension (works; declined as niche / cursed / minority-audience)
The flagship destination. Opt-in pip install nicegui-perf, explicit activate(...).
#N
what
closure reason
extension shape
zauberzeug#5493 ⭐
per-element customizable caching policy
"niche, needs tuning, only ever opt-in"
policy layer on the merged vnode cache (zauberzeug#5763 ); seed from fork branches caching-strategy, keep-alive-cache-in-template
↳ zauberzeug#4796 / zauberzeug#5562 / zauberzeug#5728
retransmission avoidance (−40%) / element bundling (HTTP1.1) / differential outbox updates
all folded toward zauberzeug#5493 ; zauberzeug#5728 explicitly "preserved as future option"
fold into the caching feature
zauberzeug#5801
radical INP improvements
"too cursed for mainline, bad LLM-feeding material"
core monkeypatch — the hard one
zauberzeug#5843
@js_action decorator (client open/close/toggle, no round-trip)
"perf-aware audience is minority"; already on fork #166
✅ additive (decorator) — clean
zauberzeug#6055 + zauberzeug#5933
skip outbox echo / skip client-value echo (the loopback bool flag)
zauberzeug#6055 deferred (risky late in 3.13); zauberzeug#5933 reverted (broke Quasar model-value)
core monkeypatch — needs the Quasar-safe fix zauberzeug#5933 lacked
zauberzeug#5759
msgpack Socket.IO serialization
stale: long-polling test failures; "regret not cooking on fork first"
core monkeypatch (sio init)
(Dropped from the extension: zauberzeug#5827 RapidFuzz and zauberzeug#5824 mobile-effects — the website redesign zauberzeug#5910 already solved their perf concern. No longer needed.)
→ Fork features, awaiting human-review / re-upstream
Built, parked on fork branches with intent to re-open after review + squash. Not perf — just declined-for-now.
#N
what
where
zauberzeug#5776
Pyodide/PyScript — run NiceGUI in the browser
fork branch pyodide-support-v2-rebased
zauberzeug#5957
ui.lazy — defer child render past first paint
fork branch lazy-element (upstream-bound; keep OUT of extension)
zauberzeug#5958
xterm example hardening (cmd/PTY/lifecycle)
fork-review-first
zauberzeug#5956
randomize test ports/dirs for parallel pytest
fork-review-first
zauberzeug#5731
share Screen fixture across tests (CI speed)
fork #56
zauberzeug#5425
single _delete_task, drop _num_connections
closed at Falko's proposal; tracked on fork
zauberzeug#5795
accessibility on styles
re-tracked on fork, split smaller (conflicts w/ redesign zauberzeug#5910 )
→ Revive upstream (rebase-only / maintainer-praised — not extension material)
→ Non-perf declined features (fate TBD: fork-keep, separate extension, or drop)
#N
what
why it left
zauberzeug#5516
streamable pages with yield
Falko: complexity not worth it; chunked stream already possible
zauberzeug#5577
ECharts click-label events
disliked breaking existing code; wants proper label-click infra
zauberzeug#5345
basic CSP support
~5 failed Vue+Vite/Rollup attempts; reserve as alpha/behind-switch
zauberzeug#5450
warn on core.app._uuid session-affinity mismatch
"won't warn for N ways to mess up"; detection not cheap
zauberzeug#5432
version_signature instead of __version__ in URLs
cost>benefit, blocked on unowned On-Air relay work
zauberzeug#5308
SEO optimization for docs
punted as "best reserved for an AI to grind against"
Done / superseded — no action (21)
Replaced by a merge, a better PR, or a root-cause fix:
zauberzeug#6105 (→faithful native-drain replacement), zauberzeug#5933 (→reverted, see extension), zauberzeug#5757 (→zauberzeug#5761 root cause), zauberzeug#5767 (→split zauberzeug#5809 -5813), zauberzeug#5793 (→simpler lazy screenshot), zauberzeug#5825 (→JSON i18n v2), zauberzeug#5820 (→zauberzeug#5812 ), zauberzeug#5706 (→zauberzeug#6105 ), zauberzeug#5703 (→Falko's zauberzeug#5857 ), zauberzeug#5621 (→zauberzeug#5622 ), zauberzeug#5612 (→zauberzeug#5652 ), zauberzeug#5585 (→zauberzeug#5582 ), zauberzeug#5572 (→root-cause), zauberzeug#5722 (→zauberzeug#5730 ), zauberzeug#5490 (→rodja's emitEvent), zauberzeug#5492 (→setter approach), zauberzeug#5424 (→zauberzeug#5476 ), zauberzeug#5645 (→ui.keep_alive), zauberzeug#5827 (→redesign zauberzeug#5910 ), zauberzeug#5824 (→redesign zauberzeug#5910 ), zauberzeug#5728 (→zauberzeug#5933 , feature preserved for extension).
Dropped / obsolete — no action (9)
Withdrawn or self-assessed wrong approach:
zauberzeug#5735 (misplaced PR), zauberzeug#5720 (Windows symlink breakage), zauberzeug#5746 (sketchy sort + Falko concerns), zauberzeug#5742 (symptomatic, not root cause), zauberzeug#5643 (fragile, only 2 defaults need it), zauberzeug#5615 ("don't like this anymore", →issue zauberzeug#3033 ), zauberzeug#5559 (bad idea by own admission), zauberzeug#5556 (resolved as support thread), zauberzeug#5465 (PEP 604 cosmetic, 4.0 redoes it).
Extension mechanics (nicegui-perf)
✅ Additive (@js_action, opt-in CSS) — new symbols, no patching. Same pattern as nicegui-tui/nicegui-wire. Robust.
🟡 Core monkeypatch (per-element caching, loopback skip, msgpack, INP) — patch at activate(); version-coupled, needs a compat matrix vs NiceGUI releases. The Skip echoing client-originated values via bool flag on ValueElement zauberzeug/nicegui#5933 Quasar breakage is the cautionary tale.
Activation: explicit import nicegui_perf; nicegui_perf.activate(element_cache=True, loopback_skip=True, …) — per-feature flags so users take safe additive bits without the cursed monkeypatches. Ship additive-first.
Next actions
Cross-refs
Upstream in-flight (OUT of scope): zauberzeug#6112 · merged base for caching: zauberzeug#5763 · first extension item on fork: #166
Tracker maintained by @evnchn with Claude Code. Living doc — edit fates in place as items move. Swept 2026-06-14; re-verify any individual item before acting on a revive.
What this is
The cutting-room floor: every PR I opened on
zauberzeug/niceguithat closed without merging — swept by closure reason, sorted by where it should go. The point is that good work I built and upstream declined (on scope/audience, not correctness) shouldn't rot as closed PRs; it should live somewhere — an extension, a fork branch, or a tracked revive.52 closed-unmerged PRs swept. ~30 are genuinely done/dropped (no action — collapsed at the bottom). The valuable residue is below.
Scope rule: anything still targeted for upstream stays out of here — notably zauberzeug#6112 (lazy import + worker stubs) and zauberzeug#5763 (vnode cache, already merged). This is the declined pile, not in-flight work.
→
nicegui-perfextension (works; declined as niche / cursed / minority-audience)The flagship destination. Opt-in
pip install nicegui-perf, explicitactivate(...).caching-strategy,keep-alive-cache-in-template@js_actiondecorator (client open/close/toggle, no round-trip)model-value)(Dropped from the extension: zauberzeug#5827 RapidFuzz and zauberzeug#5824 mobile-effects — the website redesign zauberzeug#5910 already solved their perf concern. No longer needed.)
→ Fork features, awaiting human-review / re-upstream
Built, parked on fork branches with intent to re-open after review + squash. Not perf — just declined-for-now.
pyodide-support-v2-rebasedui.lazy— defer child render past first paintlazy-element(upstream-bound; keep OUT of extension)Screenfixture across tests (CI speed)_delete_task, drop_num_connections→ Revive upstream (rebase-only / maintainer-praised — not extension material)
→ Non-perf declined features (fate TBD: fork-keep, separate extension, or drop)
yieldcore.app._uuidsession-affinity mismatchversion_signatureinstead of__version__in URLsDone / superseded — no action (21)
Replaced by a merge, a better PR, or a root-cause fix:
zauberzeug#6105 (→faithful native-drain replacement), zauberzeug#5933 (→reverted, see extension), zauberzeug#5757 (→zauberzeug#5761 root cause), zauberzeug#5767 (→split zauberzeug#5809-5813), zauberzeug#5793 (→simpler lazy screenshot), zauberzeug#5825 (→JSON i18n v2), zauberzeug#5820 (→zauberzeug#5812), zauberzeug#5706 (→zauberzeug#6105), zauberzeug#5703 (→Falko's zauberzeug#5857), zauberzeug#5621 (→zauberzeug#5622), zauberzeug#5612 (→zauberzeug#5652), zauberzeug#5585 (→zauberzeug#5582), zauberzeug#5572 (→root-cause), zauberzeug#5722 (→zauberzeug#5730), zauberzeug#5490 (→rodja's emitEvent), zauberzeug#5492 (→setter approach), zauberzeug#5424 (→zauberzeug#5476), zauberzeug#5645 (→
ui.keep_alive), zauberzeug#5827 (→redesign zauberzeug#5910), zauberzeug#5824 (→redesign zauberzeug#5910), zauberzeug#5728 (→zauberzeug#5933, feature preserved for extension).Dropped / obsolete — no action (9)
Withdrawn or self-assessed wrong approach:
zauberzeug#5735 (misplaced PR), zauberzeug#5720 (Windows symlink breakage), zauberzeug#5746 (sketchy sort + Falko concerns), zauberzeug#5742 (symptomatic, not root cause), zauberzeug#5643 (fragile, only 2 defaults need it), zauberzeug#5615 ("don't like this anymore", →issue zauberzeug#3033), zauberzeug#5559 (bad idea by own admission), zauberzeug#5556 (resolved as support thread), zauberzeug#5465 (PEP 604 cosmetic, 4.0 redoes it).
Extension mechanics (
nicegui-perf)@js_action, opt-in CSS) — new symbols, no patching. Same pattern asnicegui-tui/nicegui-wire. Robust.activate(); version-coupled, needs a compat matrix vs NiceGUI releases. The Skip echoing client-originated values via bool flag on ValueElement zauberzeug/nicegui#5933 Quasar breakage is the cautionary tale.import nicegui_perf; nicegui_perf.activate(element_cache=True, loopback_skip=True, …)— per-feature flags so users take safe additive bits without the cursed monkeypatches. Ship additive-first.Next actions
nicegui-perfskeleton: additive-first (@js_actionAdd @js_action decorator for client-side open/close/toggle optimization (continuation of zauberzeug#5843) #166), explicitactivate()caching-strategy/keep-alive-cache-in-templateCross-refs
Upstream in-flight (OUT of scope): zauberzeug#6112 · merged base for caching: zauberzeug#5763 · first extension item on fork: #166