# Forevermore

URL: https://redonemini.com/projects/forevermore

> A platform for personalized animated gift worlds. Pick a scene, fill it with photos and a song, and send it like a message.

- Type: Personal project
- Period: 2026 — Present
- Stack: Nuxt 4, Tailwind CSS v4, Supabase, Cloudflare Workers, Three.js, Paddle
- Website: https://getforevermore.co

Forevermore lets you send someone a small animated world. You pick a scene from a catalog (a fairground at night, a manor seen in cross-section, a coral reef), fill it with your own photos, a short letter and a song, and send it the way you'd send any message. The person on the other end opens a link on their phone. There's no account to create and nothing to install.

I design, build and ship it on my own, from the illustrations on the catalog cards to the Postgres migrations underneath.

![Hand-illustrated poster art for a ferris wheel world at night](https://redonemini.com/projects/forevermore/fairground.webp)
*The Fairground*

![Hand-illustrated poster art of a cross-section dollhouse-style manor at night](https://redonemini.com/projects/forevermore/manor.webp)
*The Manor*

![Hand-illustrated poster art of an underwater reef scene with a glowing pearl](https://redonemini.com/projects/forevermore/deep-reef-dive.webp)
*Deep Reef Dive*

![Hand-illustrated poster art of a paper airplane flying past planets toward a heart-shaped constellation](https://redonemini.com/projects/forevermore/starlit-letter.webp)
*Starlit Letter*

## How it's built

It's a pnpm monorepo with five apps and two shared packages. The apps are split by who's looking at the screen:

- a **marketing site**,
- an **editor**, where someone builds a gift and pays for it,
- a small **viewer** that shows the finished gift to the person receiving it,
- and two **internal tools** that no customer ever sees.

The customer-facing apps are Nuxt 4 on Cloudflare, with Supabase for Postgres, auth and file storage, and Paddle for payments. The worlds themselves are either Three.js scenes or 2D scenes built with SVG, CSS and GSAP. Both kinds read the same data contract, which is a big part of why a new editor feature doesn't mean updating dozens of worlds one by one.

## What the write-ups cover

When I started, I assumed the hard part would be the animation. It turned out to be the plumbing: giving every gift its own subdomain, making sure the browser can never mark a gift as paid, and building worlds in a way that doesn't turn each new one into a from-scratch project.

[Subdomains and permissions](https://redonemini.com/projects/forevermore/architecture): A subdomain for every gift, and a Postgres permission model that keeps payment state out of the browser's reach.

[One payload, many worlds](https://redonemini.com/projects/forevermore/rendering-pipeline): One data contract for every world, videos that pretend to be photos, and 3D assets written as code.

[A marketing pipeline built as a state machine](https://redonemini.com/projects/forevermore/autopilot): A separate content pipeline with compare-and-swap updates and every expensive dependency behind a seam.

## Pages in this write-up

- [Overview](https://redonemini.com/projects/forevermore) (this page)
- [Architecture](https://redonemini.com/projects/forevermore/architecture): How every gift gets its own address on a host that doesn't support wildcard domains, and how Postgres grants keep payment state out of the browser's reach.
- [Rendering pipeline](https://redonemini.com/projects/forevermore/rendering-pipeline): How dozens of very different worlds read one data contract, why a video is secretly a photo, and why most of the 3D assets are code instead of files.
- [Autopilot](https://redonemini.com/projects/forevermore/autopilot): Autopilot plans, writes, renders and checks a week of social posts on its own. How a state machine, compare-and-swap updates and injected dependencies make it safe to run unattended.
