This is a terrible UX experience created for Bad UI Battle, simulating the worst possible flow to show your ticket to a ticket inspector. Based on the Ruter → Retur rebrand scenario from Norway.
Experience 7 intentionally frustrating steps:
- Old Ruter App - Told you need to download new app
- Download Retur - Slow, annoying download with fake errors
- New Retur App - Unnecessary loading delays
- Reauthentication - Digipost code you can't paste, hard to read
- Human Verification - Click crickets that appear for less than a second
- Birthday Verification - Re-enter info because "we can't store it longer than 2 hours"
- Show Ticket - Finally see your ticket (which expires in 30 seconds)
First, run the development server:
npm run devOpen http://localhost:3000 with your browser to experience the horror.
app/page.tsx- Main flow controllerapp/components/Step1OldRuter.tsx- Old app warningapp/components/Step2Download.tsx- App store downloadapp/components/Step3NewRetur.tsx- New app welcomeapp/components/Step4Reauth.tsx- Digipost authenticationapp/components/Step5Cricket.tsx- Human verification gameapp/components/Step6Birthday.tsx- Birthday verification (placeholder for custom component)app/components/Step7Ticket.tsx- Final ticket display
- ✅ Annoying delays and loading screens
- ✅ Confusing navigation
- ✅ Hard-to-read text and codes
- ✅ No paste functionality
- ✅ Frustrating mini-games
- ✅ Expiring tickets
- ✅ Poor visual design
- ✅ Unhelpful error messages
This app is configured for GitHub Pages deployment:
- Push to GitHub: Push your code to a GitHub repository
- Enable GitHub Pages:
- Go to your repository Settings → Pages
- Under "Source", select "GitHub Actions"
- Automatic Deployment:
- The GitHub Actions workflow (
.github/workflows/deploy.yml) will automatically build and deploy on every push tomain - The app will be available at
https://yourusername.github.io/repository-name
- The GitHub Actions workflow (
Note: If your repository name is username.github.io, update next.config.ts to use an empty basePath. Otherwise, the basePath is automatically set to /repository-name.
- Step 6 (Birthday) uses a custom horrible flow component that requires users to calculate their age in days
- Each step is intentionally designed to be frustrating
- The ticket expires quickly to add extra pressure
Good luck showing your ticket to the inspector! 🚌