Back to all work
WebsiteClient work
Kształcenie Słuchu eBook Store
A shop that sells and delivers a music theory e-book directly, with no marketplace in between.
- Year
- 2026
- Status
- Live
- Role
- Solo: design, front end, back end, deployment.

Danuta Kaszuba wrote a 404-page book, Kształcenie słuchu z elementami teorii muzyki, and wanted to sell it herself instead of through a marketplace. Visitors can look inside, buy it and download the PDF. Orders are handled from a private admin panel, so the whole process stays in one place.
Stack
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS 4
- SQLite
- Nodemailer
- Playwright
- Docker
- Traefik
- Cloudflare Tunnel
- Proxmox
In practice
- An interactive piano you can play with the mouse or the computer keyboard, and a reader with 20 sample pages and the full table of contents, so the book can be judged before it is bought.
- Checkout as a guest or with an account, paying by bank transfer or BLIK to a phone number, with the payment instructions sent by email automatically.
- A private admin panel to confirm payments and send the e-book. The send button stays locked until the legally required waiting period has passed.
- The PDF reaches the buyer through a single-use download link valid for 7 days, and it stays available in a library in their account.
- Customer accounts with email verification, password reset, data export and account deletion.
- Terms of sale and a privacy policy built into the checkout. The site records which version each customer accepted and whether they agreed to early delivery.
- The author sells directly, with no payment-provider fees and no marketplace commission. The site uses no analytics and no third-party cookies, so there is no cookie consent banner.
- Light and dark theme, a contact form, and a layout that works on phones.
How it is built
- Next.js 16 on the App Router with React 19 and TypeScript, styled with Tailwind 4.
- Orders, accounts and delivery records live in SQLite (the built-in node:sqlite) on a persistent Docker volume. For one book and a modest number of orders a single file is enough, and there is no database server to look after.
- The PDF is kept outside the public folder, so it can only be reached through a download link the app has issued. Those tokens are single-use and expire after 7 days.
- Download tokens and passwords are stored only as hashes. A leaked database therefore contains no working links and no passwords.
- Payment is a bank transfer or BLIK to a phone number, not a card gateway. That is what removes the provider fees, and it is also why confirmation is a manual step in the admin panel, with the email sent by Nodemailer.
- Polish consumer law on digital content shaped the order flow. The right of withdrawal is handled in code: the send button stays locked for the waiting period, and each order stores the accepted version of the terms and whether early delivery was agreed to.
- The app runs as a standalone Docker image on a self-hosted Proxmox server, behind Traefik and a Cloudflare Tunnel, and is deployed with Prox Hub, the deployment panel I built myself.
- Playwright browser tests cover the account, order and delivery flows, which are the parts where a regression would mean a customer who paid and received nothing.

