Skip to content

Cutting-room floor: my closed-unmerged NiceGUI PRs — keep / extension / revive / drop #180

Description

@evnchn

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)

#N what status
zauberzeug#5848 i18n for the website Falko praised the architecture; needs rebase vs redesign zauberzeug#5910
zauberzeug#5813 comprehensive docs SEO (core) needs rebase vs zauberzeug#5910
zauberzeug#5769 three-level docs nav tree redesign reshaped docs — needs re-eval, not just rebase

→ 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions