Mobile · 2025 · 05 / 10
ReadWise+.
A reading companion for Android. Your library, your quotes, and AI recommendations that actually know what you have read.
- Context
ReadWise+ is a React Native and Expo mobile app that lets a reader track the books they own, organise them across Want-to-Read, Reading and Finished shelves, collect memorable quotes with tags, and ask Gemini for recommendations based on the books they have actually finished. Covers and metadata come from the Google Books API, the library lives on the device via AsyncStorage, and the whole app ships as a signed Android APK built through EAS. There is no backend, no account flow and no onboarding wall; the reader installs it, searches for a title, and the library starts filling itself.
- Approach
I wanted a small, honest mobile app that earns the "AI-powered" label without becoming a chat window. The architecture is deliberately flat: App.tsx owns every piece of state, a ViewType enum routes between four screens, and each component receives the live Theme object as a prop so dark mode is a single object swap. The Gemini integration uses structured output with a strict response schema, so the model returns typed JSON the UI can render as cards instead of free-form text the client has to parse. The Google Books call is wrapped in a safe-getter helper that never lets a missing field crash the screen, and every cover URL is force-upgraded to HTTPS. Offline-first is not a feature, it is the default; the network is optional, not required.
- Outcome
Version one shipped through EAS as a production Android APK and published to the Expo account for distribution. The loop closes end to end: search a title, add it to a shelf, move it through Reading to Finished, save quotes as you go, then ask the app for two new books based on what you have actually finished. The codebase is eight screens and three services wide, small enough to hold in your head, typed end to end, and structured so the next feature, whether that is a second AI provider, a sync layer or an iOS build, drops in without a rewrite.
- Process
- 01
Offline-first by default
Every book, quote and setting lives on the device via AsyncStorage. No account, no sign-up, no server to babysit. The app opens and the library is already there, with or without a network.
- 02
AI as a side dish, not the main course
Recommendations route through Gemini 2.5 Flash with a strict JSON response schema, so the model returns title, author and reason as typed data the UI can render straight into cards. The key stays on the user's device and the feature degrades gracefully when it is missing.
- 03
One state tree, four views
App.tsx owns books, quotes, theme and the current view; every screen is a pure projection of that state. No routing library, no Redux, no context gymnastics. The whole app is a switch statement over a ViewType enum.
- 04
Themed from the ground up
A single Theme object flows from App down through every component as a prop. Dark mode is a swap of one object, not a rewrite of a stylesheet, and the color tokens stay consistent across the bookshelf, detail, settings and modal surfaces.
- 05
Shipped, not scaffolded
EAS Build produces a real signed APK, published through the Expo dashboard. The v1 release closed the loop from search to shelf to AI suggestion to quote capture, so the app earns its place on a phone instead of a screenshot.
- Credits
- Design & build
- Salah Boussettah
- Next
→ 1899RP Scripts Store
Product · 2025