Skip to content
Anahê ecosystem · 01/05anahe.com.br

Anahê · Escritora

A novel's website that opens like a book.

Role
Design System & Full-stack
Year
2026
Status
Live

— Ecosystem

Four apps, one API

Anahê Canavezzi is a writer and a designer. She needed three public sites (the book, the studio and the blog) and a dashboard to manage all of it without depending on me. I built the four Next.js apps in a Turborepo and pnpm monorepo, served by a single NestJS API and a single database.

Architecture decision

I considered micro-frontends and dropped the idea: there are no multiple teams and no runtime composition. These are four sites sharing a design system, types and schemas, which is exactly what Turborepo is for.

PostgreSQL · Redis · R2Railway · Cloudflare

One dashboard and one API manage the content of all three public sites.

— The story

How I built each part

Chapter 01Home

Opening the book

The Home starts with the book closed, and the pages turn to reveal the site. Each page is cut into vertical slices that bend as it turns, animated with the Web Animations API. The opening waits for the fonts and the images above the fold (4 s at most) so it never opens half-rendered, shows only on the first visit and is skipped with prefers-reduced-motion.

anahe.com.br
  • Web Animations API, no library
  • First visit only

Chapter 02The book

The novel's page

Synopsis, book details, where to buy, the first chapter as a PDF and reviews. The chapter excerpt opens with a wine drop cap, and behind the book mockup a pattern slowly drifts diagonally.

anahe.com.br
  • Stores, chapter and reviews come from the dashboard
  • Data cached by tag, revalidated on publish

Chapter 03Writings

Writings without a second CMS

Short stories and chronicles use the blog's Post model with publishTo = WRITINGS. Anahê writes in the same editor and picks where to publish. The writer site just filters.

anahe.com.br
  • One model, two destinations
  • Filter by kind of text

Chapter 04About · Contact

About and contact

The bio and timeline come from the dashboard. The contact form asks for the reason (event, press, book club, school or other) and goes through Turnstile, a honeypot and rate limiting before becoming a lead in the dashboard.

anahe.com.br
  • Three-layer anti-spam
  • Cookie notice with necessary cookies only

— Technologies

Front

  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind CSS v4
  • next-intl

Monorepo

  • Turborepo
  • pnpm workspaces

API

  • NestJS 11
  • Prisma 7
  • PostgreSQL 18
  • Redis 7 · BullMQ

Infra

  • Vercel
  • Railway
  • Cloudflare
  • R2