An AI-powered date picker that makes entering your date of birth unnecessarily difficult. 🤖
Date Slop was built as an entry for the Bad UX World Cup. I had the idea to parody how the modern web is littered with AI chat assistants which insist on making tasks more difficult. Instead of letting you simply enter your date of birth, the date field is hijacked by an AI assistant that insists on working it out for you, only it's not very good at it.
The challenge was finding the balance between bad UX and unusable UX. I wanted the AI to be bad enough to frustrate the user in an amusing way, without having that user give up completely and abandon the game.
The AI needed to:
- ask questions that could genuinely narrow down a date,
- understand indirect clues based on history, culture, technology and personal context,
- reject attempts to simply provide the date directly,
- make enough mistakes to support the joke without becoming completely incoherent,
- recognise when it had enough information to make a final guess,
- return control to the conventional form once it had decided on a date.
The original competition website is no longer online, but the judging session is still available on YouTube; you can see there was some tough competition.
Date Slop didn’t make the finals, apparently the UX wasn’t bad enough!
This was my first AI-powered application and my first time using the OpenAI API. The main lessons were:
- Give the model actions to follow. Repeated prompt refinement helped, especially specifying how to respond when users break the rules instead of only telling it what not to do.
- Prepare for cold starts. Fetching the opening question in the background helps the conversation start sooner, with loading feedback when it takes longer.
- Don't rely on server memory for conversation history. Serverless instances can disappear mid-conversation. Moving the transcript to client-side state and sending it with each request solved this, while trusted instructions stayed on the server.
- Bound costs and handle failures. Rate limiting, billing controls, conversation limits and response token limits help contain abuse and unexpected costs. The UI also needs to explain when those protections interrupt a conversation.
The main takeaway: calling an AI API is only one part of building a usable feature. State management, reliability and failure handling still need ordinary software engineering, even when the UX is deliberately bad!
Read the full story: Date Slop: building a deliberately bad UX with AI.
- Open the live demo.
- Fill in your name and location.
- Click the date-of-birth field.
- Answer the assistant's questions using clues rather than explicit dates.
- Keep going until it guesses your date of birth, then confirm the answer to fill in the field.
Trying to give it your date of birth directly won’t help — the assistant will reject it and keep asking questions.
- Next.js 16
- React 19
- TypeScript
- OpenAI API
- React Hook Form
- Tailwind CSS
This project uses pnpm.
pnpm installCreate a .env.local file in the project root:
OPENAI_API_KEY=your_openai_api_key_hereKeep this key private and do not commit it to source control.
pnpm devThen open http://localhost:3000.
Build and run the application with:
pnpm build
pnpm startWhen deploying, supply OPENAI_API_KEY as a server-side environment variable.
Install the Playwright Chromium binary once, then run the smoke tests:
pnpm exec playwright install chromium
pnpm test:e2eThe E2E tests mock the guess API and do not require an OpenAI API key.
Install the Playwright Chromium binary once, then run the smoke tests:
pnpm exec playwright install chromium
pnpm test:e2eThe E2E tests mock the guess API and do not require an OpenAI API key.
