A swipe-based mobile app that helps users discover AI news, generate LinkedIn carousels, and interact with content through voice AI.
Live Demo: ai-radar-mobile.vercel.app
- Discover - Swipe through AI news cards from multiple sources
- Generate - Create professional LinkedIn carousels with one swipe
- Listen - Get AI-generated audio summaries of articles
- Chat - Ask follow-up questions using voice
┌─────────────────────────────────────────────────────────────┐
│ FRONTEND │
│ (Vercel - Static) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Swipe │ │ Audio │ │ Voice Chat │ │
│ │ Cards │ │ Player │ │ (MediaRecorder) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└────────────────────────────┬────────────────────────────────┘
│ HTTPS
▼
┌─────────────────────────────────────────────────────────────┐
│ BACKEND │
│ (Railway - Python) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Generation │ │ Audio │ │ Voice Chat │ │
│ │ Pipeline │ │ Summary │ │ (Whisper + TTS) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└────────────────────────────┬────────────────────────────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ OpenAI │ │ Gamma │ │ Google │
│ APIs │ │ API │ │ Sheets │
└──────────┘ └──────────┘ └──────────┘
The app uses touch gestures for intuitive mobile interaction:
| Gesture | Action | What Happens |
|---|---|---|
| Swipe Right | Create | Starts carousel generation |
| Swipe Left | Skip | Moves to next article |
| Swipe Up | Not Interested | Trains the learning system |
| Swipe Down | Back | Returns to source list |
How it works:
- Touch events track finger position
- Calculate direction based on X/Y delta
- Animate card off-screen in swipe direction
- Trigger appropriate action
When generating content, users hear a structured audio briefing:
1. Inspiring Quote → "Einstein said..."
2. Preview → "Here's what's next..."
3. Summary → Key points from article
4. Call to Action → "Want to know more? Just ask!"
Tech: OpenAI GPT-4o-mini generates the script, TTS-1 converts to speech.
After the summary, users can ask questions about the article:
User speaks → Whisper transcribes → GPT answers → TTS responds
Tech: MediaRecorder API captures audio, sends base64 to backend.
The app learns user preferences over time:
- Tracks liked/disliked topics and sources
- Adjusts article scoring based on history
- Syncs feedback to Google Sheets for analysis
| Layer | Technology | Why |
|---|---|---|
| Frontend | Vanilla JS + CSS | Fast, no build step, mobile-optimized |
| Backend | Python Flask | Simple API, easy OpenAI integration |
| Hosting | Vercel + Railway | Free tier, auto-deploy from GitHub |
| AI | OpenAI APIs | GPT-4o-mini, Whisper, TTS-1 |
| Data | Google Sheets | Simple storage, easy to view/edit |
ai-radar-mobile/
├── index.html # Main app (single-page application)
├── vercel.json # Vercel deployment config
├── assets/ # Images and icons
└── logos/ # Source logos (TechCrunch, etc.)
ai-radar-backend/
├── simple_server.py # Flask API server
├── requirements.txt # Python dependencies
├── Procfile # Railway start command
└── nixpacks.toml # Railway build config
Starts carousel generation job.
Request:
{
"title": "Article Title",
"summary": "Article summary...",
"preview_only": true
}Response:
{
"job_id": "abc123",
"status": "queued"
}Check generation progress.
Response:
{
"status": "running",
"percent": 45,
"message": "Building slides...",
"slides": [{"name": "Title Card", "status": "complete"}]
}Generate audio briefing for an article.
Request:
{
"title": "Article Title",
"summary": "Article content...",
"quote": "Inspiring quote..."
}Response: Audio file (audio/mpeg)
Interactive Q&A about an article.
Request:
{
"audio": "base64-encoded-audio",
"title": "Article Title",
"summary": "Article content..."
}Response:
{
"question": "What the user asked",
"answer": "AI response text",
"audio": "base64-encoded-response-audio"
}- Push to GitHub
- Connect repo to Vercel
- Auto-deploys on every push
- Push to GitHub
- Connect repo to Railway
- Set
OPENAI_API_KEYenvironment variable - Auto-deploys on every push
- Real Gamma API integration for actual slides
- LinkedIn OAuth for direct posting
- User accounts with saved preferences
- Push notifications for trending topics
- Offline mode with service worker
Built by JJ Shay as a demonstration of mobile-first design, AI integration, and full-stack development.