- Replace email-only capture with full AEC membership modal (name, DOB,
address, suburb, state, postcode, email, phone, electoral roll consent)
- Trigger modal on first upvote (petition signature) OR after 3rd vote
- Modal posts to /api/join and emails details to party contact
- localStorage 'radical_member_joined' tracks completion/dismiss per device
- Shrink .login-link to match other footer links (was pink button, now text)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Upload all 23 images to remote Cloudflare R2 (previous upload was local-only)
- Add 'How it works' panel at top of login page explaining 3-step flow
- Rename button to 'Login / Sign Up →' to make dual purpose obvious
- Label emoji/dictator/target sections as Step 1/2/3 of the key
- New users automatically get an account on first use of any unique combination
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Upload 23 person images to R2 memes bucket (all from Wikimedia Commons)
- Replace all imgur/old-worker URLs with theradicalparty.com/memes/*.jpg
- Fix login redirect: stores session in localStorage, redirects to / after 2.5s
- Add 'Continue anonymously' option explaining anon vs AEC-linked login
- Tighten success screen: shows emoji key, enemy, target then redirects
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces dead 'About Us' footer link with a real section explaining RADICAL's
single goal: pass one law so 100k signatures forces a binding referendum.
Includes Switzerland comparison (working since 1891), four-step plan, and
styled to match the rest of the site.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add /api/join worker endpoint that emails membership details to party contact
- Register /api/login route (was missing — emoji login was broken)
- Add full AEC-compliant member registration form in index.html (#join section)
- Update copyright year to 2026 in index.html and login.html
- Fix dictator/target image URLs: radical.omar-c29.workers.dev → theradicalparty.com
- Add onerror handlers to all login page images for graceful degradation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
safeFetch already returns parsed JSON and throws on non-2xx — callers were
treating the result as a Response object and checking .ok / .json(), which
made votes, comment votes, and comment posts silently fail every time.
Also: fetchProposals was missing cache:'no-store' so newly posted proposals
were invisible until the 24hr browser cache expired; getProposals was sending
24hr Cache-Control so Cloudflare CDN served stale data; getShareableImageUrl
had a double slash (/api//petition-svg); wrangler.toml had an invalid [pages]
stanza that caused a warning on every deploy.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>