MOONFACTORY

MFX® — WORK N°01

N°01

FerrisSmith.Art

Artist portfolio + AI attendant 2026

A ground-up Astro rebuild of a character artist's WordPress portfolio — static-first on Bun, Stripe-checkout shop, and D-6401, the artist's own mascot serving as an AI-powered attendant.

Client
Ferris Smith
Location
Georgia, US
Live since
2026
Services
Web Design, Full-stack Development, WordPress Migration, AI Integration
Stack
Astro 6, Bun, Stripe Checkout, AI Mascot

The challenge

A 2D character artist's portfolio lived on WordPress — heavy, slow, and hard to make match the artist's own visual identity. The rebuild had to preserve every existing URL and piece of content, add a print shop without taking on PCI scope, and do one thing no template offers: put the artist's own mascot character on the site as a working AI attendant, in voice, without runaway API costs.

The approach

A ground-up Astro 6 rebuild on Bun, static-first: every page prerenders, and client JavaScript exists only as small islands for the starfield, parallax, and mascot console. WordPress content came through a deterministic importer — slugs, dates, and taxonomy preserved, with a generated redirect map covering every legacy URL. The shop uses Stripe hosted Checkout with prices read from Stripe at build time. And D-6401, the artist's mascot, answers visitors via a streaming AI route hardened with same-origin checks, signed stateless history, per-IP rate limits, and a hard monthly spend cap.

The evidence

Live screenshots, not mockups.

  • Homepage hero of ferrissmith.art with animated starfield, bold display typography, and character artwork
    Homepage hero — starfield and parallax islands render over a fully static page; client JS ships only where motion lives.
  • Full-length homepage — every section prerendered at build time, fonts self-hosted, zero third-party requests.
  • Mobile viewport of ferrissmith.art at 390px
    Mobile at 390 pixels — a CSS-only menu sheet replaces the desktop nav below the breakpoint.
  • Portfolio grid of ferrissmith.art showing character art pieces with category tags
    The portfolio grid — covers use per-piece focal-point crops so faces stay in frame at every tile size.

Case study

Ferris Smith is a 2D digital artist and character designer — the characters, worlds, and marks that give a project a face. The old site was WordPress on shared hosting; the brief was a rebuild that looks like the artist’s work, keeps every URL alive, sells prints, and puts the artist’s mascot character to work as the site’s AI attendant.

What’s running

ferrissmith.art is an Astro 6 application on the Bun runtime. Output is static-first: every page prerenders at build time, and server-side rendering exists only for the API routes. Client JavaScript ships as islands — the starfield, the hero parallax, the story stage, the mascot console — and nothing else. Fonts are self-hosted WOFF2 with preloads; there are no third-party runtime requests.

The design system is token-driven: the palette, type scale, and motion timings live in a single tokens file, and a build gate fails the deploy if a component declares a custom property the token contract doesn’t name. No drift, by machine enforcement.

The migration

The WordPress content didn’t get retyped — it got piped. A deterministic importer converts the WordPress export into Astro content collections: portfolio pieces, pages, and products, with slugs, dates, and taxonomy terms preserved exactly. The same importer emits the old-to-new redirect map, so every legacy URL that ever existed still resolves. Same export in, same tree out — the whole import lands as one reviewable commit.

D-6401, the AI attendant

The site’s mascot — D-6401, an actual character from the artist’s portfolio — is also the site’s help desk. A console island streams conversations over server-sent events from an AI-backed route, in a persona grounded in the character’s own lore page.

The interesting part is the hardening. The route is same-origin locked, validates every request body by hand, signs conversation history with an HMAC so the server stays stateless, and enforces a per-IP token bucket plus a monthly spend cap in Redis — gates that fail closed. If the language-model backend is unconfigured, the console streams a deterministic mock instead of erroring. An AI feature on a public site with a bounded worst-case bill.

What was built

  • Static-first architecture. Every page is prerendered; a cold visit pays for HTML, CSS, and only the islands on screen. prefers-reduced-motion is honored in every animation.
  • A shop without PCI scope. Stripe hosted Checkout carries the transaction; prices and currency are read from Stripe at build time by price ID, never duplicated into content files.
  • Per-piece art direction. Portfolio covers use focal-point crops maintained per slug, so character faces stay in frame at every tile size — on the grid, the home page, and in every og:image.
  • Structured data for an artist. Each piece ships VisualArtwork and breadcrumb JSON-LD wired to the artist’s identity graph; covers become og:images with large-card Twitter markup.
  • Hosted and operated by MoonFactory. Built from a Dockerfile, deployed on infrastructure we own, Cloudflare-fronted. The artist sends new work; we commit it; the site redeploys.

The live site

Visit the live site at ferrissmith.art (opens in a new tab) — and say hello to D-6401 while you’re there.

Stack proof

Every claim is verifiable.

Astro 6
Static-first build — every page prerenders; SSR exists only for the API routes. Confirmed via the Astro v6.4.8 generator meta on the live site and hashed /_astro/* asset bundles.
Bun runtime
Runs on Bun with the astro-bun-adapter. One service, one process, serving prerendered pages plus the streaming API routes.
Stripe hosted Checkout
Shop prices are read from Stripe at build time by price ID — never typed into content frontmatter. Checkout hands off to Stripe's hosted flow; no card data touches the site.
AI mascot attendant
D-6401, the artist's mascot character, answers visitors over server-sent events — same-origin locked, HMAC-signed stateless history, per-IP rate limits, and a monthly spend cap enforced in Redis.
MoonFactory-hosted
Deployed from a Dockerfile on private infrastructure we own and operate, Cloudflare-fronted. We own the uptime commitment.

Infrastructure

  • App Astro on Bun
  • KV Redis
MFX-2026-WORK-001 · Georgia, US
CHAT WITH NOVA •