A Netflix-style book reading platform that combines smooth UI, fast performance, and deep personalization into a cohesive reading ecosystem.
Demo Link https://bookverse-read.vercel.app/
BookVerse isn't just another book readerโit's a full-featured reading ecosystem designed with performance and user experience at its core. Every technical decision was made to eliminate loading screens, reduce user friction, and create a Netflix-quality experience for book lovers.
- Performance First: Data preloaded on sign-in, instant navigation
- User-Centric: Personalized experiences without compromising speed
- Mobile-Native: Responsive design that works flawlessly on any device
- Accessibility: Clean typography, customizable reading preferences
- Smart Highlighting: Select and save text highlights with persistent storage
- Customizable Typography: Font size, family, line spacing, and background themes
- Distraction-Free Mode: Clean, focused reading interface
- Smooth Navigation: Mobile-optimized page transitions
- Infinite Scroll: Lazy-loaded book grids for smooth browsing
- Smart Categories: Free and Premium book tiers
- Reliable API Integration: Proxy and caching layer for Gutendex API
- Search & Filter: Find books by genre, author, or title
- Wishlist System: Save books for later with duplicate prevention
- Reading Progress: Track completed books and current reads
- Preference Sync: Reading settings synced across devices
- Subscription Tracking: Premium membership and billing history
- Framer Motion: Smooth micro-interactions throughout the app
- Smart Loading States: Context-aware skeleton loaders
- Responsive Design: Optimized for mobile, tablet, and desktop
- Error Handling: Animated error states with clear feedback
Frontend: React 19 + TypeScript + Vite
Styling: Tailwind CSS + Custom Components
State: Redux Toolkit + RTK Query
Animation: Framer Motion
Backend: Supabase (Auth + Database + Realtime)
API: Gutendex (Project Gutenberg wrapper)
Deploy: Vercel
The Problem: Traditional apps show loading spinners everywhere, creating a fragmented UX.
Our Solution: Aggressive data preloading with intelligent state management.
// On sign-in, we fetch everything at once
const initializeUserData = async () => {
const [profile, wishlist, completed, subscriptions] = await Promise.all([
fetchUserProfile(),
fetchWishlist(),
fetchCompletedBooks(),
fetchSubscriptionHistory()
]);
// Dispatch everything to Redux in one shot
dispatch(setUserProfile(profile));
dispatch(setWishlist(wishlist));
dispatch(setCompletedBooks(completed));
dispatch(setSubscriptions(subscriptions));
};Result: Navigate anywhere in the app instantlyโno loading screens.
Deduplication Logic: Prevent duplicate books in user lists using Map-based merging:
const booksReducer = (state, action) => {
case 'SET_COMPLETED_BOOKS':
const combined = [...state.completedBooks, ...action.payload];
state.completedBooks = Array.from(
new Map(combined.map(book => [book.bookId, book])).values()
);Why This Works: Map automatically handles duplicates by bookId, ensuring data integrity without manual loops.
Responsive Loading Skeletons:
// Desktop: Grid layout
<div className="grid grid-cols-4 gap-6">
{Array(8).fill(0).map((_, i) => <BookSkeleton key={i} />)}
</div>
// Mobile: Horizontal scroll to prevent overlap
<div className="flex gap-4 overflow-x-auto">
{Array(6).fill(0).map((_, i) => <BookSkeleton key={i} />)}
</div>Micro-Interactions:
<motion.div
whileHover={{ y: -6, transition: { duration: 0.2 } }}
className="book-card"
>
{/* Book content */}
</motion.div>API Proxy Layer: Gutendex API can be unreliable, so we implemented:
- Automatic retries with exponential backoff
- Local caching for frequently accessed books
- Graceful fallbacks for failed requests
const fetchWithRetry = async (url: string, retries = 3) => {
for (let i = 0; i < retries; i++) {
try {
const response = await fetch(url);
if (response.ok) return response;
} catch (error) {
if (i === retries - 1) throw error;
await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
}
}
};- Node.js 18+
- npm or yarn
- Supabase account
- Clone the repository
https://github.com/BabarAli08/BookVerse.git
cd bookverse- Install dependencies
npm install- Environment setup
cp .env.example .env.localAdd your Supabase credentials:
VITE_SUPABASE_URL=your_supabase_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key- Database setup
# Run the provided SQL migrations in your Supabase dashboard
# Located in /database/migrations/- Start development server
npm run devVisit http://localhost:5173 to see BookVerse in action!
src/
โโโ components/ # Reusable UI components
โ โโโ ui/ # Basic components (Button, Card, etc.)
โ โโโ book/ # Book-specific components
โ โโโ layout/ # Layout components
โโโ features/ # Feature-based modules
โ โโโ auth/ # Authentication logic
โ โโโ books/ # Book management
โ โโโ reading/ # Reading experience
โ โโโ user/ # User profile & preferences
โโโ hooks/ # Custom React hooks
โโโ store/ # Redux store configuration
โโโ types/ # TypeScript type definitions
โโโ utils/ # Helper functions
โโโ styles/ # Global styles and Tailwind config
- Predictable State: Complex user data relationships need centralized management
- DevTools: Excellent debugging experience during development
- Performance: Normalized state prevents unnecessary re-renders
- Declarative Animations: Easy to maintain and modify
- Performance: Hardware-accelerated animations
- Gesture Support: Touch interactions for mobile users
- Real-time: Instant sync across devices
- Type Safety: Generated TypeScript types
- Scalability: Handles auth, database, and real-time subscriptions
- Text highlighting system
- Reading preferences
- Progress tracking
- Share highlights and notes
- Reading groups and discussions
- Social reading challenges
- AI-powered book recommendations
- Smart reading insights
- Personalized reading goals
- Stripe subscription integration
- Premium book catalog
- Offline reading mode
We love contributions! See our Contributing Guide for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Project Gutenberg for providing free books
- Gutendex API for the excellent API wrapper
- The React and TypeScript communities for amazing tools
Built with โค๏ธ by Babar Ali
โญ Star this repo if you found it helpful!