Summarist
A book-summary app with real sign-in, search, audio and subscriptions.
Open the app Code on GitHub- ways to sign in
- 3ways to sign in
- search debounce
- 300 mssearch debounce
- Stripe plans, one with a trial
- 2Stripe plans, one with a trial
- mentor review, approved
- 1mentor review, approved
Summarist was the advanced virtual internship at Frontend Simplified: build a working subscription product from a written spec, a live API and a reference build, deploy it, and get it past a mentor’s review before the rest of the course unlocks.
The home page’s HTML and CSS came with the brief, so I ported it into components and spent the time on everything behind it — accounts, the library, the reader, the audio player and payments. A mentor reviewed it, and it was approved.


The whole product, not just the landing page.
Three ways in
Email and password, Google, or a one-click guest account, with the error messages the spec calls for and a password reset.
For You
A selected book, recommended and suggested rows, premium badges, and skeleton placeholders while each row loads.
Search as you type
Results by title or author appear in a dropdown after a 300 ms pause, so the API isn’t hit on every keystroke.
Reader and audio player
The full summary text, plus a custom player with play and pause, skip ten seconds either way and a draggable seek bar. Finishing a book marks it finished.
My Library
Saved and finished books are stored per account in Firestore, with empty states for a new reader.
Subscriptions
Monthly and yearly plans through Stripe Checkout, the yearly one with a 7-day free trial. Premium books stay locked until you subscribe.
The decisions that matter, and why.
- 01
The paywall is checked where the content is, not just on the button
Hiding the Read button isn’t enough — someone can type the player’s address. The player checks the subscription again itself, so a guessed link to a premium book lands on the plans page instead.
- 02
Payments stay on the server
Checkout runs through the app’s own server routes with the Stripe SDK, so the secret key never reaches the browser. The account ID rides along on the checkout session, which is the one thread tying a signed-in user to their subscription.
- 03
Sign-in has four states, not two
“Still checking with Firebase” and “definitely signed out” look identical if you only store the user. Tracking loading, signed out, guest and signed in separately stops the app flashing the wrong screen on every page load.
- 04
Trust the live API over its documentation
The docs say the selected-book endpoint returns one object; the live API returns an array of one. The data layer accepts either shape, so the page works against the API as it actually behaves.
- 05
Redux Toolkit, chosen on purpose
The brief allowed a lighter store. Redux Toolkit with RTK Query was the one the course had just taught and the one job codebases actually run, so the internship doubled as practice for the job.
Summarist is live and mentor-approved, which unlocked the rest of the program. Stripe runs in test mode, so nothing is really charged — card 4242 4242 4242 4242 walks through the whole checkout.
Talk about a build like this