Flutter Web landing page for CITRIS Quest celebrating 25 years of CITRIS innovation.
- Retro pixel-art aesthetic with animated starfield background
- Responsive design (mobile, tablet, desktop)
- Single-page scroll layout with sections:
- Hero with TestFlight download CTA
- About CITRIS (25th anniversary)
- How to Play (4-step guide)
- Download (iOS TestFlight)
- Contribute (form submission to Supabase)
- Credits
- Footer with legal links
- Framework: Flutter Web
- Hosting: GitHub Pages
- Form Backend: Supabase
- Fonts: Google Fonts (Tiny5, Silkscreen)
- Flutter SDK 3.24.0 or higher
- Dart 3.9.2 or higher
- Install dependencies:
flutter pub get- Run locally (with Supabase so "By the numbers" and forms work):
flutter run -d chrome \
--dart-define=SUPABASE_URL=https://YOUR_PROJECT.supabase.co \
--dart-define=SUPABASE_ANON_KEY=your_anon_keyFlutter web only reads these via --dart-define at build/run time.
- Build for production:
flutter build web --release \
--base-href /citris-quest-landing/ \
--dart-define=SUPABASE_URL=https://YOUR_PROJECT.supabase.co \
--dart-define=SUPABASE_ANON_KEY=your_anon_keySupabase URL and anon key are injected at build time via GitHub Actions secrets and --dart-define. The built JS gets those values baked in; nothing is read at runtime from env files.
-
Enable GitHub Pages
- Repo Settings → Pages
- Source: GitHub Actions (not “Deploy from a branch”)
- After the first successful deploy, the site will be at
https://[username].github.io/citris-quest-landing/(or your repo name if different).
-
Configure build: add Supabase secrets
- Repo Settings → Secrets and variables → Actions
- Add Repository secrets:
- Name:
SUPABASE_URL
Value:https://YOUR_PROJECT_REF.supabase.co - Name:
SUPABASE_ANON_KEY
Value: your project’s anon/public key from Supabase Dashboard → Project Settings → API
- Name:
If these are missing, the workflow builds with empty values and the site won’t talk to Supabase (e.g. “By the numbers” stays at 0, forms won’t submit).
-
Deploy
- Push to
main. The workflow in.github/workflows/deploy.ymlbuilds and deploys. - Check the Actions tab to confirm “Deploy to GitHub Pages” succeeds.
- Push to
- Add CNAME file in
web/with your domain (e.g.,citrisquest.org) - Configure DNS: CNAME record pointing to
[username].github.io - Enable HTTPS in repo settings (automatic after DNS propagation)
lib/
├── main.dart # Entry point
├── core/
│ ├── theme.dart # Color palette, gradients
│ ├── typography.dart # Font definitions
│ └── breakpoints.dart # Responsive breakpoints
├── painters/
│ ├── starfield_painter.dart # Animated starfield background
│ ├── pixelated_border_painter.dart # Retro border effect
│ ├── space_invader_painter.dart # Space Invader sprite
│ ├── corner_brackets_painter.dart # Button decorations
│ └── pixelated_circle_painter.dart # Anniversary badge
├── widgets/
│ ├── common/
│ │ ├── animated_starfield.dart # Full-page starfield wrapper
│ │ └── primary_button.dart # CTA button with hover effects
│ └── sections/
│ ├── hero_section.dart
│ ├── about_section.dart
│ ├── how_to_play_section.dart
│ ├── download_section.dart
│ ├── contribute_section.dart
│ ├── credits_section.dart
│ └── footer_section.dart
├── screens/
│ └── landing_page.dart # Main single-page scroll layout
└── services/
└── form_service.dart # Supabase form submission
- Background:
#0A0E27(navy) - Primary Blue:
#1295D8 - Cyan Accent:
#00E5FF - Magenta:
#FF00B8 - Green:
#00FF88 - Yellow:
#FFD700
- Mobile: < 600px
- Tablet: 600-1200px
- Desktop: > 1200px
- Body: Tiny5 (Google Fonts)
- Headlines: Silkscreen (Google Fonts)
- TestFlight: https://testflight.apple.com/join/QSQXHdqH
- Support: https://citris-quest.notion.site/support?source=copy_link
- Privacy Policy: https://citris-quest.notion.site/privacy-policy?source=copy_link
- Terms & Conditions: https://citris-quest.notion.site/terms-and-conditions?source=copy_link
Before deploying, ensure your Supabase project has the tables and policies the landing app needs:
- contributions table and RLS allowing anonymous inserts (for the Contribute form)
- scans and user_profiles with RLS policies allowing anonymous count (for “By the numbers”)
If you manage Supabase from another repo (e.g. the main app), run that project’s migrations (supabase db push) so these exist.
© 2025 CITRIS Quest. All rights reserved.