Skip to content

fix(pro): rebuild /pro bundle so PR #3115 ungate actually ships#3148

Merged
koala73 merged 1 commit into
mainfrom
fix/pro-page-rebuild-stale-gate
Apr 17, 2026
Merged

fix(pro): rebuild /pro bundle so PR #3115 ungate actually ships#3148
koala73 merged 1 commit into
mainfrom
fix/pro-page-rebuild-stale-gate

Conversation

@koala73

@koala73 koala73 commented Apr 17, 2026

Copy link
Copy Markdown
Owner

The problem

Visitors to https://worldmonitor.app/pro still don't see the pricing tiers or the normal Clerk sign-in path — prices and `PricingSection` are hidden unless the visitor has `wm-widget-key` or `wm-pro-key` in localStorage.

Root cause

PR #3115 removed the `isProUser()` gate from `pro-test/src/App.tsx`:

```diff
-{(localStorage.getItem('wm-widget-key') || localStorage.getItem('wm-pro-key')) && (

  • <>
  • </>
    -)}
    +
    +
    ```

…but the compiled bundle committed under `public/pro/assets/` is what Vercel serves at `/pro`, and it was never rebuilt. Grep for `wm-widget-key` in the old bundle:

```
public/pro/assets/index-c_645qQx.js:1:...||localStorage.getItem("wm-pro-key"))&&g.jsxs(...)
```

So the gate is alive in production even though the source is fixed.

Fix

Ran `npm run build` in `pro-test/` (vite build + prerender). New bundle hashes:

  • JS: `index-c_645qQx.js` → `index-9CL2yigL.js`
  • CSS: `index-BGcnYE-e.css` → `index-Hjw0KDC9.css`
  • `public/pro/index.html` updated to reference the new asset hashes.

Verified the gate is gone:

```
$ grep -c 'wm-widget-key\|wm-pro-key' public/pro/assets/index-*.js
0
```

Test plan

  • Rebuild `pro-test` cleanly (`vite build && node prerender.mjs`)
  • `grep 'wm-widget-key' public/pro/assets/index-*.js` → 0 matches
  • Manual smoke on Vercel preview: `worldmonitor.app/pro` now shows the `PricingSection` (Free / Pro / API / Enterprise tiers) and clicking a paid "Get Started" opens Clerk sign-in normally.

Follow-up (out of scope)

The `public/pro/` bundle being a committed artifact is the root fragility here — we should either move it to a CI-built step or delete the committed bundle and serve from a build step so this class of stale-bundle regression can't recur. Tracked as a followup.

PR #3115 removed the isProUser() localStorage gate from pro-test/src/App.tsx
that hid PricingSection + PricingTable behind `wm-widget-key` / `wm-pro-key`,
but the compiled bundle under public/pro/assets/ (the static bundle served
at worldmonitor.app/pro) was never rebuilt. Visitors without legacy API
keys in localStorage therefore still see no prices and no path into the
normal Clerk sign-in that the PricingSection CTAs trigger.

Rebuilding the bundle drops the gate check (grep count goes from 1 to 0)
and rewires the index.html asset hashes.
@vercel

vercel Bot commented Apr 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
worldmonitor Ignored Ignored Apr 17, 2026 3:33pm

Request Review

@greptile-apps

greptile-apps Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR rebuilds the committed public/pro/ bundle so the localStorage gate removal landed in PR #3115 (which patched pro-test/src/App.tsx) actually reaches production. The old bundle (index-c_645qQx.js) still contained the localStorage.getItem("wm-widget-key") conditional that hid PricingSection and PricingTable; the new bundle has zero occurrences of those strings and renders the pricing components unconditionally.

Confidence Score: 5/5

Safe to merge — the gate strings are verifiably absent from the new bundle and all asset references are consistent.

Grep confirms 0 occurrences of wm-widget-key/wm-pro-key in the new bundle. index.html correctly points to the new JS and CSS hashes. Old assets are cleanly removed. No logic changes are introduced — this is a pure rebuild of existing source. No P0/P1 findings.

No files require special attention.

Important Files Changed

Filename Overview
public/pro/assets/index-9CL2yigL.js New 248-line minified bundle; wm-widget-key / wm-pro-key grep count is 0, confirming the gate is gone. Replaces deleted index-c_645qQx.js.
public/pro/index.html Asset references updated from old hash suffixes to new ones (index-9CL2yigL.js, index-Hjw0KDC9.css); all other content unchanged.
public/pro/assets/index-Hjw0KDC9.css New CSS bundle (Tailwind v4 + Google Fonts import); replaces deleted index-BGcnYE-e.css.
public/pro/assets/index-BGcnYE-e.css Old CSS bundle removed as part of the rebuild; superseded by index-Hjw0KDC9.css.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["Visitor loads /pro"] --> B["index.html serves index-9CL2yigL.js"]
    B --> C{"Old gate check\nwm-widget-key / wm-pro-key"}
    C -->|"Removed in PR #3115\nConfirmed absent in new bundle"| D["PricingSection rendered unconditionally"]
    C -->|"Was present in\nindex-c_645qQx.js"| E["❌ Old: PricingSection hidden\nfor non-internal users"]
    D --> F["PricingTable rendered unconditionally"]
    D --> G["Clerk sign-in path accessible"]
Loading

Reviews (1): Last reviewed commit: "fix(pro): rebuild /pro bundle so ungated..." | Re-trigger Greptile

koala73 added a commit that referenced this pull request Apr 17, 2026
Pro is live. The landing page and the dashboard's header banner still
treated it as a coming-soon waitlist — hero was an email capture form
behind Turnstile, nav CTA said "Reserve Your Early Access", and the
dashboard banner said "Pro is coming / Reserve your spot". All of that
funneled traffic into a waitlist instead of the now-working pricing +
checkout + Clerk sign-in flow.

Dashboard (/) — src/components/ProBanner.ts:
- "Pro is coming" → "Pro is launched"
- "Reserve your spot →" (href /pro) → "Upgrade to Pro →" (href /pro#pricing)
- Re-enable dismiss button (commented out during launch-promotion period)

Landing page (/pro) — pro-test/src/App.tsx + main.tsx + index.html:
- Navbar: single "Reserve Your Early Access" → two CTAs: "Sign In"
  (opens Clerk) + "Upgrade to Pro" (anchors #pricing)
- Hero: drop the email + Turnstile + Mailcheck waitlist form, the
  "Launching March 2026" line, and the referral-invite banner.
  Replace with "Choose Your Plan" (→ #pricing) + "Sign In" buttons.
- Two-path split Pro card: "Reserve Your Early Access" → "Choose Your Plan"
  (already anchors #pricing)
- Footer: drop the second waitlist form + finalCta block + #waitlist
  anchor. Keep the nav/legal strip only.
- Rip dead code: submitWaitlist, showReferralSuccess, Mailcheck import
  and React hook state. Keep Turnstile infrastructure because the
  enterprise contact form (#enterprise-contact) still uses it.
- JSON-LD Offer: "Pro (Waitlist)" @ $0 → "Pro" @ $39.99.

Rebuild the /pro bundle (same committed-artifact dance as PR #3148):
grep for the old gate + waitlist strings in the new bundle returns 0.

i18n: added nav.signIn, nav.upgradeToPro, hero.choosePlan, hero.signIn,
twoPath.choosePlan. Stale waitlist keys left in place — other locales
fall back to English until the full sweep.
@koala73
koala73 merged commit 05b8f66 into main Apr 17, 2026
11 checks passed
@koala73
koala73 deleted the fix/pro-page-rebuild-stale-gate branch April 17, 2026 16:36
koala73 added a commit that referenced this pull request Apr 17, 2026
* feat(pro): cut over /pro from waitlist mode to Pro-launched messaging

Pro is live. The landing page and the dashboard's header banner still
treated it as a coming-soon waitlist — hero was an email capture form
behind Turnstile, nav CTA said "Reserve Your Early Access", and the
dashboard banner said "Pro is coming / Reserve your spot". All of that
funneled traffic into a waitlist instead of the now-working pricing +
checkout + Clerk sign-in flow.

Dashboard (/) — src/components/ProBanner.ts:
- "Pro is coming" → "Pro is launched"
- "Reserve your spot →" (href /pro) → "Upgrade to Pro →" (href /pro#pricing)
- Re-enable dismiss button (commented out during launch-promotion period)

Landing page (/pro) — pro-test/src/App.tsx + main.tsx + index.html:
- Navbar: single "Reserve Your Early Access" → two CTAs: "Sign In"
  (opens Clerk) + "Upgrade to Pro" (anchors #pricing)
- Hero: drop the email + Turnstile + Mailcheck waitlist form, the
  "Launching March 2026" line, and the referral-invite banner.
  Replace with "Choose Your Plan" (→ #pricing) + "Sign In" buttons.
- Two-path split Pro card: "Reserve Your Early Access" → "Choose Your Plan"
  (already anchors #pricing)
- Footer: drop the second waitlist form + finalCta block + #waitlist
  anchor. Keep the nav/legal strip only.
- Rip dead code: submitWaitlist, showReferralSuccess, Mailcheck import
  and React hook state. Keep Turnstile infrastructure because the
  enterprise contact form (#enterprise-contact) still uses it.
- JSON-LD Offer: "Pro (Waitlist)" @ $0 → "Pro" @ $39.99.

Rebuild the /pro bundle (same committed-artifact dance as PR #3148):
grep for the old gate + waitlist strings in the new bundle returns 0.

i18n: added nav.signIn, nav.upgradeToPro, hero.choosePlan, hero.signIn,
twoPath.choosePlan. Stale waitlist keys left in place — other locales
fall back to English until the full sweep.

* i18n(pro): translate 5 new Pro-launched keys across all 20 locales

Resolves the followup from the previous cutover commit: no more silent
English fallback for signIn / upgradeToPro / choosePlan strings in
non-English /pro pages.

Touched keys per locale:
  nav.signIn, nav.upgradeToPro  (both added — nav block existed)
  hero.signIn, hero.choosePlan  (both added — hero block existed)
  twoPath.choosePlan            (added — most locales had no twoPath
                                 block at all, so it's created with
                                 just this one key; remaining twoPath
                                 strings still fall back to English,
                                 which is the pre-existing state)

Covers: ar, bg, cs, de, el, es, fr, it, ja, ko, nl, pl, pt, ro, ru,
sv, th, tr, vi, zh.

Rebuilt the /pro bundle so the per-locale lazy chunks under
public/pro/assets/{lang}-*.js ship the new strings. Verified via grep
for translated strings (e.g. "升级到 Pro", "Passer à Pro",
"الترقية إلى") in the rebuilt locale chunks.

* fix(pro-banner): version the dismiss key so launch banner isn't pre-suppressed

Reviewer on #3149 flagged that re-enabling dismissal with the same
wm-pro-banner-dismissed key carries forward any dismissal from the
pre-launch "Pro is coming / Reserve your spot" banner. Anyone whose
localStorage still holds that key (e.g. dismissed during the brief
March 9 to March 11 window before #1422 disabled dismissal) would
silently suppress the new "Pro is launched / Upgrade to Pro" banner
and never see the launch CTA.

Rename DISMISS_KEY to wm-pro-banner-launched-dismissed (semantically
scoped to the launched-state variant) and clear the legacy key on
every isDismissed() call so stale entries don't accumulate.

Dark / light rendering and the 7-day TTL behavior are unchanged.

* fix(pro): remove stale 96px footer padding + redundant inner border

Greptile on #3149 flagged that dropping the finalCta block left the
footer with pt-24 (96px) top padding above the legal strip, rendering
a large blank band. Pare the outer padding down to pt-8 and drop the
inner pt-8 + border-wm-border/50 divider (which only existed to
separate the legal strip from the removed finalCta content above).

Rebuilt /pro bundle accordingly.
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.

1 participant