FatherPhi Ideas

App spec + visual mockups for fatherphi.com

01

Overview

A simple site where viewers submit AI experiment ideas, vote on them, and FatherPhi picks from the top each week.

๐Ÿ—ณ๏ธ Submit Ideas

Logged-in users can submit ideas for AI experiments, tools to test, or skit concepts.

โฌ†๏ธ Vote

One vote per user per idea. Leaderboard shows most-wanted experiments.

๐Ÿ“ง Newsletter Opt-in

Checkbox during signup (pre-checked) to join Master of AI newsletter.

๐Ÿท๏ธ Status Tags

Mark ideas as "Planned" or "Filmed" with links to the resulting video.

02

User Flows

Flow 1: New User Submits Idea
Lands on fatherphi.com
โ†’
Clicks "Submit Idea"
โ†’
Google OAuth popup
โ†’
Newsletter checkbox (pre-checked)
โ†’
Writes idea
โ†’
Submitted + can vote
Flow 2: Returning User Votes
Lands on fatherphi.com
โ†’
Already logged in (cookie)
โ†’
Browses ideas
โ†’
Upvotes favorites
Flow 3: Admin (You) Updates Status
Log in as admin
โ†’
View all ideas
โ†’
Mark as "Planned" or "Filmed"
โ†’
Add YouTube link (optional)
03

Data Model

Three tables. Keep it simple.

Database Schema
// Users table
users {
  id: uuid // primary key
  google_id: string // from OAuth
  email: string
  name: string
  avatar_url: string // Google profile pic
  newsletter_opt_in: boolean // did they check the box?
  is_admin: boolean // default false, true for you
  created_at: timestamp
}

// Ideas table
ideas {
  id: uuid // primary key
  user_id: uuid // foreign key โ†’ users
  title: string // short headline
  description: string // optional longer explanation
  status: enum // 'open' | 'planned' | 'filmed'
  video_url: string? // YouTube link when filmed
  created_at: timestamp
}

// Votes table (join table)
votes {
  id: uuid // primary key
  user_id: uuid // foreign key โ†’ users
  idea_id: uuid // foreign key โ†’ ideas
  created_at: timestamp

  // unique constraint on (user_id, idea_id) โ€” one vote per user per idea
}
Key Queries
-- Get ideas sorted by vote count (leaderboard)
SELECT ideas.*, COUNT(votes.id) as vote_count
FROM ideas
LEFT JOIN votes ON votes.idea_id = ideas.id
GROUP BY ideas.id
ORDER BY vote_count DESC;

-- Check if user voted for an idea
SELECT * FROM votes
WHERE user_id = :current_user AND idea_id = :idea_id;

-- Get newsletter subscribers (for export)
SELECT email, name FROM users
WHERE newsletter_opt_in = true;
04

Pages

Route Page Auth Required
/ Home โ€” idea leaderboard + submit CTA No (voting requires login)
/submit Submit idea form Yes
/my-ideas User's submitted ideas + votes Yes
/admin Manage ideas, update status, export emails Yes + is_admin
05

UI Mockups

Home Page โ€” Idea Leaderboard
fatherphi.com

What should I test next?

Submit your AI experiment ideas. Vote for the ones you want to see. I'll film the top picks each week.

Top Ideas
Newest
Filmed โœ“
847
Use Claude to negotiate with Comcast customer service
Submitted by @danielkempe ยท 2 days ago
612
Have GPT-4 and Claude debate which one is better Planned
Submitted by @aiexplorer ยท 3 days ago
445
Get AI to pass a captcha using voice + vision Filmed
Submitted by @techcurious ยท 5 days ago
Sign In Modal โ€” With Newsletter Checkbox
Submit Idea Form
fatherphi.com/submit
Hey, Daniel

Submit an Idea

What AI experiment should I try? Best ideas get filmed.

Keep it short and specific
06

Recommended Tech Stack

Pick based on what you're comfortable with. Here are two options:

Option A: Fastest to Ship (Recommended)

Next.js

React framework, handles routing + API

Supabase

Postgres + Auth + Realtime, free tier generous

Vercel

Deploy with git push, free tier works

Tailwind CSS

Style quickly, use your design tokens

Why this: Supabase has built-in Google OAuth. One command to set up. Database is ready. You're building, not configuring.

Option B: Simpler, More Control

SvelteKit

Lighter than React, fast to learn

SQLite + Turso

Simple database, edge-hosted

Lucia Auth

Lightweight auth library

Fly.io

Simple hosting, free tier

07

API Endpoints

Method Endpoint Description Auth
GET /api/ideas List ideas (sortable: top, newest, filmed) No
POST /api/ideas Create new idea Yes
POST /api/ideas/:id/vote Toggle vote on idea Yes
PATCH /api/ideas/:id Update status (admin only) Admin
GET /api/auth/google Initiate Google OAuth No
GET /api/auth/callback OAuth callback, create/login user No
GET /api/admin/export-emails CSV of newsletter subscribers Admin
08

Newsletter Integration

Two options depending on how automated you want it.

Option A: Manual Export (Simplest)
  1. Admin page has "Export Subscribers" button
  2. Downloads CSV of emails where newsletter_opt_in = true
  3. Import into Beehiiv/ConvertKit/whatever you use

Good enough to start. Do this weekly.

Option B: Auto-Sync (Later)
// When user signs up with newsletter_opt_in = true
// Call your email provider's API

if (user.newsletter_opt_in) {
  await fetch('https://api.beehiiv.com/v2/subscribers', {
    method: 'POST',
    headers: { Authorization: `Bearer ${BEEHIIV_API_KEY}` },
    body: JSON.stringify({
      email: user.email,
      publication_id: 'your-publication-id'
    })
  });
}

Add this once you have volume. Not needed day one.

09

MVP Scope

What to build first vs. what to add later.

V1 โ€” Ship This Weekend
โœ… Google OAuth login
โœ… Submit idea (title only, skip description)
โœ… Vote on ideas
โœ… Leaderboard sorted by votes
โœ… Newsletter checkbox on signup
โœ… Admin: export emails as CSV
V2 โ€” Add Later
โณ Status tags (planned/filmed)
โณ Link to YouTube video when filmed
โณ Description field on ideas
โณ "My Ideas" page
โณ Auto-sync to email provider
โณ Comments on ideas
โณ Search/filter