
verrere
Tinder for books — swipe through titles, build your shelf, discover what to read next
activefeatured
Next.jsTypeScriptTailwind CSSFramer MotionPrismaClerk
verrere is a full-stack web app that lets you discover books through a swipe-based interface. Pick your genres, swipe right on books you want to read, and build a personal shelf over time. Built with a modern TypeScript stack and deployed on Vercel.
Features
- Swipe interface — drag cards left to pass, right to save, with animated LIKE/PASS indicators as you drag
- Genre-based feed — pick genres during onboarding, and the feed rotates through them automatically
- Personal shelf — all your saved books in one place, with the ability to remove any title
- Duplicate prevention — books you've already swiped never appear again
- Auth — sign up and sign in via Clerk with email or Google
Tech Stack
| Layer | Technology | |---|---| | Frontend | Next.js 15, TypeScript, Tailwind CSS | | Animation | Framer Motion | | Auth | Clerk | | Database | Neon (Postgres) | | ORM | Prisma 7 | | Books Data | Google Books API | | Deployment | Vercel |
Getting Started
Prerequisites
- Node.js 18+
- A Neon account
- A Clerk account
- A Google Books API key
Installation
git clone https://github.com/bhavv04/verrere.git
cd verrere
npm install
Environment Variables
Create a .env file in the project root:
# Clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/app
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/app
# Neon
DATABASE_URL=""
# Google Books
GOOGLE_BOOKS_API_KEY=
# Hardcover API
HARDCOVER_API_KEY=
# no need for `bearer` for hardcover api key
Database Setup
npx prisma db push
npx prisma generate
Run Locally
npm run dev
Open http://localhost:3000.
Project Structure
src/
├── app/
│ ├── (auth)/
│ │ ├── sign-in/[[...sign-in]]/page.tsx
│ │ └── sign-up/[[...sign-up]]/page.tsx
│ ├── api/
│ │ ├── books/route.ts # Google Books API proxy + swipe filtering
│ │ ├── shelf/route.ts # GET and DELETE shelf books
│ │ ├── swipe/route.ts # Record swipes, save liked books
│ │ ├── user/route.ts # Upsert user on login
│ │ └── onboarding/route.ts # Save genre preferences
│ ├── onboarding/page.tsx
│ ├── shelf/page.tsx
│ └── page.tsx # Main swipe UI
├── components/
│ ├── BookCard.tsx # Draggable card with LIKE/PASS overlay
│ ├── SwipeStack.tsx # Animated card stack
│ └── GenrePicker.tsx # Genre selection pills
└── lib/
├── prisma.ts # Prisma client singleton
└── books.ts # Google Books API helper
Roadmap
In Progress
- [x] Deploy to Vercel
Planned
- [ ] AI recommendations — Claude API generates a personalized "why you'd like this" blurb based on swipe history
- [ ] Shelf filters — filter saved books by genre, rating, or date added
- [ ] Onboarding redirect — detect new users and route them to onboarding before the feed
- [ ] Reading status — mark books as "want to read", "reading", or "finished"
- [x] Book detail modal — tap a card to expand full description, page count, and publication info
Future Ideas
- [ ] Friends & social — follow friends, see what they're reading
- [ ] Weekly picks — curated stack of 10 books refreshed every Monday
- [ ] Export shelf — download your shelf as a CSV or sync to Goodreads
- [ ] PWA support — install as a mobile app
Acknowledgments
Background photo by Peter Herrmann on Unsplash.