The 15-minute French method built for real life. Audio-first, driving-safe, ADHD-friendly learning.
- ✅ 30-Day Curriculum: Structured daily lessons with audio, recap, and micro-challenges
- ✅ OpenAI TTS Integration: High-quality French text-to-speech for all lessons
- ✅ Driving-Safe Mode: Recap hidden until user confirms they're parked
- ✅ AI Practice: Guided conversation practice with roleplay and recall modes
- ✅ Zero Zero Design: Pure black/white, minimal, distraction-free interface
- ✅ Mobile-First: Responsive design optimized for all devices
- Framework: Next.js 14 (App Router)
- Styling: Tailwind CSS + Custom Zero Zero Design System
- State Management: Zustand with localStorage persistence
- Database: PostgreSQL (Neon) with Prisma ORM
- TTS: OpenAI TTS API
- TypeScript: Full type safety
- Node.js 18+ and npm/pnpm/yarn
- OpenAI API key
- Neon PostgreSQL database (or any PostgreSQL database)
npm install
# or
pnpm install
# or
yarn installCreate a .env file in the root directory:
cp .env.example .envFill in your environment variables:
OPENAI_API_KEY=your_openai_api_key_here
DATABASE_URL=postgresql://user:password@host:5432/database?sslmode=require
DEFAULT_VOICE=camilleGetting your OpenAI API Key:
- Go to https://platform.openai.com/api-keys
- Create a new API key
- Copy it to your
.envfile
Setting up Neon Database:
- Go to https://neon.tech
- Create a new project
- Copy the connection string to
DATABASE_URLin your.env
Generate Prisma client and push schema:
npm run db:generate
npm run db:pushOr with pnpm:
pnpm db:generate
pnpm db:pushnpm run dev
# or
pnpm dev
# or
yarn devOpen http://localhost:3000 in your browser.
00-FR/
├── src/
│ ├── app/
│ │ ├── api/
│ │ │ └── tts/ # TTS API route
│ │ ├── components/ # React components
│ │ ├── data/ # Curriculum data
│ │ ├── day/[id]/ # Dynamic day pages
│ │ ├── practice/ # Practice page
│ │ ├── settings/ # Settings page
│ │ ├── store/ # Zustand state store
│ │ ├── layout.tsx # Root layout
│ │ └── page.tsx # Home page
│ └── styles/ # Global styles
├── prisma/
│ └── schema.prisma # Database schema
├── next.config.js # Next.js config
├── tailwind.config.ts # Tailwind config
└── package.json
- Push your code to GitHub
- Import project in Vercel
- Add environment variables in Vercel dashboard
- Deploy!
Vercel will automatically:
- Detect Next.js
- Run build commands
- Deploy your app
The app can be deployed to any platform that supports Next.js:
- Netlify
- Railway
- Render
- AWS Amplify
Make sure to:
- Set all environment variables
- Run
npm run buildsuccessfully - Configure database connection
npm run dev- Start development servernpm run build- Build for productionnpm run start- Start production servernpm run lint- Run ESLintnpm run db:generate- Generate Prisma clientnpm run db:push- Push schema to databasenpm run db:studio- Open Prisma Studio
Edit src/app/data/curriculum.ts to add or modify lesson content.
The TTS API route is at src/app/api/tts/route.ts. You can:
- Change voice mapping
- Adjust script format
- Add caching logic
The Zero Zero design system is defined in src/styles/theme.css:
- Pure black background (
#000000) - Pure white text (
#FFFFFF) - Roboto Condensed (headings)
- Roboto Light (body)
- Max-width: 760px
- Padding: 32px
- Section spacing: 100px
When driving-safe mode is enabled, the recap card is hidden until the user clicks "I am parked". This prevents distracted driving.
Settings are persisted to localStorage using Zustand's persist middleware. This includes:
- Driving-safe mode toggle
- Voice preferences
- Mini-mode toggle
- Parked status
Audio is generated on-demand using OpenAI's TTS API. Each day's script is converted to MP3 format and streamed to the client.
- Check your
OPENAI_API_KEYis set correctly - Verify you have credits in your OpenAI account
- Check browser console for errors
- Verify
DATABASE_URLis correct - Check database is accessible from your network
- Run
npm run db:pushto sync schema
- Clear
.nextfolder:rm -rf .next - Reinstall dependencies:
rm -rf node_modules && npm install - Check TypeScript errors:
npm run lint
Private project - All rights reserved
For issues or questions, please open an issue on the repository.
00 → FR — A Zero Zero learning method — 2025