Skip to content

Revive Bubble uploads with current Uppy and tested release candidates - #2

Merged
kvz merged 16 commits into
mainfrom
revive-bubble
Oct 30, 2026
Merged

kvz merged 16 commits into
mainfrom
revive-bubble

Conversation

@kvz

@kvz kvz commented Oct 29, 2026 •

Copy link
Copy Markdown
Member

Why

The 2019 plugin depends on deprecated Robodog and has no tests or release checks. Bubble builders need supported uploads and encoding results while existing VideoWrapper and open-action IDs keep working. This follows transloadit/zapier’s October 14–21 modernization, adapted to Bubble’s editor-owned export and manual publication.

Changes

  • TypeScript uploader with current Uppy/Transloadit: inline Dashboard or upload button, signed Template/Instructions, progress/results/error states and workflow events.
  • Preserve VideoWrapper, global open and published setting IDs. Keep the original one-file limit. Local sources only; remote-source settings remain reserved and labeled unused. The major Changeset documents the migration.
  • Yarn 4.12, Node 22.23.4/26.12.1, Biome, Vitest coverage, PR CI, grouped Dependabot and Changesets. Release checks use a separate runner with read-only repository permissions, producing a Bubble-only ZIP and SHA-256.
  • Commit generated callbacks/header in Bubble’s export layout. CONTRIBUTING covers editor synchronization, test-app checks, publication, rollback and triggering CI on bot-created version PRs. Git commits/artifacts do not publish to Bubble.
  • Document the pinned SDK’s client-error telemetry limitation; errorReporting: false does not disable plugin error reports.
  • Convert handwritten build/release scripts, browser harness/tests and test configs to TypeScript. Native Node type stripping runs scripts; strict checks cover all TypeScript and retain a separate browser-only environment. Generated Bubble JavaScript stays committed. Dependencies and lockfile are unchanged by this conversion.

Validation

Runtime/tooling/docs +1,168 / −90; tests +1,192 / −0; lockfile +3,240 / −0, in 47 files. Thirteen test fixtures/screenshots are binary and have no line counts.

  • Behavioral regressions failed before their fixes. yarn check passes lint, TypeScript, 58 unit tests, 93.65% line coverage and deterministic generation. The conversion preserves the Bubble export byte-for-byte. Its harness regression failed at desktop/390px before restoring empty output state and passed after; a compiler probe confirms browser process/Buffer are rejected. Config-only changes use the existing behavioral suites rather than artificial source-text tests.
  • 12 built-export Chromium checks pass with real API enabled and no skips: desktop/390px, defaults, repeated updates, Dashboard sizing, modal/reset/focus, changed restrictions, signing recovery, actual-library tus retry after transfer/processing failures, delayed old errors/results, and Done followed by another upload on the same client.
  • Real opentest API: signed tus upload → 16×16 resize → completed Bubble states/event → downloaded result. Recover through visible Retry on the same file, then reset and upload/process/download again. Credentials were loaded as environment from node-sdk’s existing .env; never printed or copied.
  • yarn release:prepare produces the allowlisted export ZIP/SHA-256. Export entries match the checkout; legacy VideoWrapper/API files are unchanged. Changeset status confirms a major bump and workflow YAML parses. Wording/config/metadata changes have no artificial source-text tests.

Council review

TypeScript conversion: four scoped rounds; final rounds 3 and 4 are clean on 0b27c38a433495ee315ac0a82ac3b11333d9faba. The first two reviews led to preserving unpublished harness outputs and the browser-only type boundary. Both final rounds returned “No issues found.” after those fixes.

Original revival: ten-round cap reached

Two consecutive clean rounds were not achieved before the requested maximum of ten. All accepted findings through round 10 are fixed and tested. The final fixes were not followed by an eleventh council round; this is presented for human review with that limitation explicit.

Rounds 1–3 fixed blank allowlists, cancelled/late callbacks, duplicate error events, property-error recovery, modal label/keyboard cleanup, retry completion and dismissed-picker background processing. The original single-file limit remains because partial multi-file retries lose results.

Rounds 4–6 fixed retry signing validation, Dashboard Retry controls, configuration error recovery/deduplication, stale tus URLs, selected-file revalidation and reset before Uppy exists. Round 7 resets transfer-completion flags after processing failure and isolates candidate checks from Changesets’ persisted credential.

Round 8 filters superseded Assembly errors and retires the old SDK watcher before Retry. Round 9 rejects duplicate completions from previous successful cycles and documents remaining SDK telemetry. Round 10 deduplicates legacy notifications before POST; its unit regression observed two calls before the fix and one after. Empty/null params now name the missing signed JSON rather than exposing a parser error.

The pinned official CDN is an explicitly trusted runtime dependency. Generic CDN-compromise/SRI hardening is outside this revival.

CI prerequisites and Bubble handoff

The opentest credentials are configured as both Actions and Dependabot secrets: BUBBLE_E2E_TRANSLOADIT_KEY and BUBBLE_E2E_TRANSLOADIT_SECRET. CI maps them to TRANSLOADIT_KEY/TRANSLOADIT_SECRET; no Template secret is needed. Run 41109506352 is green on 0b27c38a433495ee315ac0a82ac3b11333d9faba: Node 22.23.4 and 26.12.1 check/browser jobs and the real-API e2e job all pass. The e2e log confirms all 12 tests passed with no skips, including signed upload, processing and result verification. One blocking gh-run-watch completed successfully. The credential prerequisite #3 is resolved. Fork PRs skip only real-API e2e.

Refs #1. Installing in a real Bubble test app, marketplace publication and verifying the listing URL require Kevin’s Bubble login and remain unexecuted. Follow the exact editor handoff; close #1 only after those acceptance steps pass.

User test

Independent UX reviews passed desktop/390px modal and inline flows, selection, error/reset recovery, processing/results and reopened modals. The review exposed collapsed inline height, fixed with a resize regression, and confirmed the restored Retry control. Final capture has no console/page errors, failed requests or horizontal overflow and real results at both widths. All twelve screenshots are byte-identical to the prior approved capture. Final narrow UX confirmation passed: active Assembly filtering, legacy notification deduplication and the clearer missing-params message. The subsequent test-only readiness change leaves source/export/screenshots unchanged and both Node CI jobs pass. Stock Uppy styling remains. Actual Bubble acceptance is the separate login-dependent handoff above.

Evidence: test/evidence/ and local /tmp/bubble-usertest-20261029/, including the direct final Playwright stdout final-api-run.log. Transport-failure responses are fixtures using the actual Uppy CDN; the signed upload/resize/download test uses the real API.

Before / After

Same empty picker state, 800px viewport height, light theme (no theme setting is exposed):

Viewport main (Robodog) This PR (Uppy)
1280px Before desktop After desktop
390px Before mobile After mobile

New inline element: desktop, 390px. Selection, error and completed states are captured at both widths in the same directory.

🤖 Claimed by kvz on framework1/bubble-plugin since 2026-10-30 · resume: codex resume 01a18956-04ed-7730-8e93-34911ec3771e

@kvz
kvz marked this pull request as ready for review October 29, 2026 23:06
@kvz
kvz requested a review from tim-kos October 29, 2026 23:06
@kvz

kvz commented Oct 29, 2026

Copy link
Copy Markdown
Member Author

Implementation and validation are ready for human review in #2 at fda7414164fd467266d3c2733defa1e00d433106.

  • Runtime/tooling/docs: +1,152 / −90; tests: +1,097 / −0; lockfile: +3,240 / −0 (45 files).
  • yarn check: 58 unit tests, 93.65% line coverage, lint/types/build pass. Twelve built-export Chromium checks pass with the real API enabled, including signed upload/resize/download and recovery. Independent final UX review passed the unchanged product export; desktop and 390px captures have no console errors, failed requests or overflow.
  • Council stopped at 10 rounds. All accepted findings are fixed, including late old errors/results and duplicate legacy notifications. Two consecutive clean rounds were not achieved; the final fixes have behavioral red-to-green coverage but were not followed by an eleventh round.
  • One blocking gh-run-watch caught a restriction-test request abort; the check now waits for its preview and reports failures more precisely. Both Node jobs pass on the final commit (run). The only red is real-API CI: its log confirms missing credentials before any upload, tracked in #3.
  • Kevin: add BUBBLE_E2E_TRANSLOADIT_KEY and BUBBLE_E2E_TRANSLOADIT_SECRET as both Actions and Dependabot secrets, using the existing opentest credentials, then rerun the failed e2e job. No Template secret is required.
  • Installing the development plugin in a Bubble test app, publishing and checking the marketplace URL still require Kevin’s login. Follow the exact editor handoff. Keep Revive the Bubble plugin on current Uppy and Transloadit #1 open until these acceptance steps pass; the PR uses Refs Revive the Bubble plugin on current Uppy and Transloadit #1.

The local Bubble-only ZIP and SHA-256 are in build/; all 15 export entries match the final checkout. Evidence and the UX PASS are in test/evidence/ and /tmp/bubble-usertest-20261029/.

Revive Bubble uploads with current Uppy and tested release candidates — open

@kvz
kvz merged commit 343ea39 into main Oct 30, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Revive the Bubble plugin on current Uppy and Transloadit

1 participant