No updates detected yet. GitHub releases will appear here.
Next.js app deployed to Vercel
翻訳待ち
Loading the full README.
Read the full README ↗This is a Next.js project bootstrapped with create-next-app.
Live: https://hello-world-nextjs-eight-blue.vercel.app
First, run the development server:
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
Open http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying app/page.tsx. The page auto-updates as you edit the file.
This project uses next/font to automatically optimize and load Geist, a new font family for Vercel.
To learn more about Next.js, take a look at the following resources:
You can check out the Next.js GitHub repository - your feedback and contributions are welcome!
This app gates /profile behind Supabase Auth using Google as the OAuth provider. To wire it up on a fresh Supabase project:
supabase/migrations/20260928000000_profiles.sql. It creates the profiles table, a trigger that inserts a row for every new auth.users signup, and an avatars storage bucket with policies scoping uploads to each user's own folder.https://<your-project-ref>.supabase.co/auth/v1/callback
http://localhost:3000/auth/callback
https://<your-vercel-app>/auth/callback
SUPABASE_URL, SUPABASE_ANON_KEY) are already server-side only — no changes needed there.New users are redirected to /profile after their first sign-in and prompted to fill in their name if it's missing. Signed-out visitors hitting /profile are redirected to /login.
Can Columbia students be funnier than AI? Signed-in users upload a photo, pick a caption voice, and Gemini writes four captions. Anyone signed in can then add their own caption to any photo. Human and AI captions are shown together with the author hidden; vote on one and it reveals whether a classmate or Gemini wrote it. A running scoreboard tracks which side wins more photos.
/): an editorial hero with the latest posts fanned out like polaroids, the Humans vs. Gemini scoreboard, today's challenge, and the feed as a masonry of battle cards or a photo wall (newest or top this week)./create): photo (upload with drag-and-drop, or pick a library photo such as today's drop), voice, and context, with a live preview and a step-by-step "the AI is cooking" sequence. Lands on the new post with a prompt to beat Gemini./challenge): a new prompt every midnight New York time, plus a featured photo when an admin has scheduled one, live photo and caption counts, the leaderboard, and yesterday's winner with its author revealed./me): your "era" (from the voice you use most), achievements computed only from what you've actually done, your photos with every caption on them, and your own captions with score and rank.battle_result(), never while voting is open)./surprise): two modes. Fresh photo rolls an unclaimed photo from the admin-curated library and sends it to the Studio. Random battle rolls a random photo already posted in the app and opens its battle, so you can jump in and caption without a photo of your own. Nothing is copied or generated; the photo stays its original owner's, and your caption is attributed to you. "Try another" re-rolls, avoiding the last few photos you've seen and your own.ENABLE_AI_PHOTOS=true to show a "Generate with AI" option on Post, where Gemini draws a photo from a description and then captions it (5 a day per user). Needs a Gemini API project with billing enabled; the free tier has no image quota./g/<id> link with a link-preview image.Setup:
This is the beginning of the README. Read the rest at the original. Read the full README ↗