← All work
Shipped · FES internship, mentor-approved

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
The problem

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.

Summarist For You page with a selected book card and a row of recommended book covers, some marked Premium
For You: the selected book and recommendations, with premium titles badged.
Summarist book page for The Lean Startup showing rating, length, Read and Listen buttons and a saved-to-library marker
A book page — Read and Listen check your plan before they open anything.
What it does

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.

How it’s built

The decisions that matter, and why.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Built with
Next.js 16React 19Redux Toolkit + RTK QueryFirebase AuthFirestoreStripe CheckoutTailwind CSS v4Vercel
Where it stands

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