An interactive, story-driven visualization of your Goodreads reading history, inspired by wrapped-style yearly reviews. Upload your Goodreads export and get an engaging, animated journey through your reading year.
TLDR: like Spotify Wrapped, but for GoodReads.
Live at: reading-wrapped.netlify.app
Note: If experiencing slow backend response due to cold starts, you can follow the local setup instructions below)
Your Year at a Glance | Top Books | Summary Page |
---|---|---|
A full-stack application featuring:
- Story-driven React frontend with Framer Motion animations
- Flask backend handling CSV processing and external API integration
- Concurrent image fetching for book covers
- Local data processing with no persistence
- Mobile and desktop friendly design
- Interactive Story Experience: Journey through your reading year with nice animations and transitions
- Comprehensive Statistics: Deep dive into your reading habits, patterns, and achievements
- Book Cover Integration: Automatic book cover fetching from multiple sources
- Responsive Design: Works on both mobile and desktop
- Private & Secure: All processing happens locally, no data storage
goodreads-year-in-review/
├── frontend/ # React frontend application
│ ├── src/ # Source files
│ └── README.md # Frontend documentation
└── backend/ # Flask backend service
├── app.py # Main Flask application
└── process_files.py # Data processing section
└── README.md # Backend documentation
- Frontend Documentation - React application details
- Backend Documentation - Flask service details
- Navigate to backend directory:
cd backend
- Install dependencies:
pip install -r requirements.txt
- Start the Flask server:
python app.py
The backend service will start on port 5001.
- Navigate to frontend directory:
cd frontend
- Install dependencies:
npm install
- Start the development server:
npm run dev -- --host
Visit http://localhost:5173
to see the application or the web addresses listed to view on mobile.
Frontend (.env):
VITE_API_BASE_URL=your_backend_url
Backend (.env):
FLASK_ENV=development
PORT=5001
Currently hosted on Netlify:
- Live at reading-wrapped.netlify.app
Deployed on Render's free tier:
- Initial cold starts may take up to 40 seconds
- Service spins down after periods of inactivity
- Auto-scales based on usage
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
- React with Vite
- Tailwind CSS
- Framer Motion
- shadcn/ui components
- Flask
- Pandas
- aiohttp for async operations
- External APIs: Google Books, Open Library
MIT License
- Goodreads for the export functionality
- Google Books API
- Open Library API
- All the amazing open-source libraries used in this project
This is an unofficial, fan-made project and is not affiliated with, endorsed by, or connected to Goodreads, Amazon, or Spotify in any way. This project is:
- Not an official Goodreads product
- Not associated with Goodreads or Amazon
- Not monetized or used for commercial purposes
- A personal project created for educational and entertainment purposes only
- Inspired by various year-in-review experiences but independently created
The Goodreads name and logo are trademarks of Amazon.com, Inc. or its affiliates. This project uses publicly available Goodreads export data that users choose to analyze, and does not store or collect any user data.