Delivered Evidence level: Verified result

A trilingual school website rebuilt for speed, search, and safe handoff

A California contractor-license school's site was rebuilt from a React single-page app into a fast static Astro site in English, Spanish, and Korean — then prepared for safe client editing.

Client
Contractor license school (California)
Sector
Education / local services
Role
Designer-developer and technical operator
Period
2026
Services
React/Vite → Astro migration · Multilingual implementation (EN/ES/KO) · Cloudflare deployment · DNS coordination · Safe-editing preparation
Tools
Astro · Cloudflare Pages · GitHub · GoDaddy DNS

The business

A school preparing students for the California contractor license exam, serving English-, Spanish-, and Korean-speaking trades communities. The business runs on phone calls: the website's one job is to explain the offer in the visitor's language and get them to call.

The real problem

The original site was built as a client-side React app. The server sent a nearly empty HTML shell — about 2 KB — and JavaScript assembled the page in the browser. That meant search engines and any content-editing tooling saw essentially nothing, and every visitor paid the cost of downloading and executing the app before reading a word.

My responsibility

Full rebuild and delivery: migrating the site to a static architecture, preserving the trilingual content and phone-first design, deploying it, and preparing it for safe ongoing content editing.

  • Keep all three languages — English, Spanish (localized to Mexican Spanish), and Korean — as first-class pages, not an afterthought toggle.
  • The phone call is the conversion event; the call CTA had to stay visible and protected on every page.
  • The live site could not be disrupted; the rebuild was verified on separate URLs before any cutover.

What was built

The solution, in modules

01

Static rebuild in Astro

The React/Vite single-page app was rebuilt as a static Astro site. Every page now ships real HTML — headings, paragraphs, links, and images exist in the served document instead of being assembled by JavaScript in the browser.

02

Three languages, three real pages

English, Spanish, and Korean each get their own page (/, /es, /ko) with a scroll-anchor navigation. Spanish copy was localized to Mexican Spanish for the actual audience rather than machine-translated.

03

Phone-first conversion path

A persistent call button and sticky call bar keep the school's number one tap away. These elements are structural — locked so later content edits can't remove or break them.

04

Cloudflare delivery, GoDaddy domain

The static build deploys via Cloudflare's global network from a connected GitHub repository, with the client's domain remaining registered at GoDaddy and pointing its DNS at Cloudflare.

05

Safe-editing preparation

The rebuilt site was used to validate the Safe-Editing CMS workflow: all three pages were ingested, navigation, footer, branding, and the phone CTA were locked as structural chrome, and marketing copy was exposed as editable slots — 112 editable and 55 locked per page.

System view

What the migration changed

  1. 01

    Before — React single-page app

    Server sends a ~2 KB empty shell; the browser downloads and runs JavaScript to build the page. Search engines and editing tools see a blank document.

  2. 02

    After — static Astro pages

    Server sends the full page as HTML (~28 KB of real content per language). Content is readable by people, search engines, and the safe-editing system alike.

  3. 03

    Result — one decision per visitor

    Pick your language, read the offer, tap to call.

Conceptual before/after of what the server actually sends — the root cause behind search and editing problems.

Inspectable proof

Proof you can inspect

Sanitized artifacts show the underlying work without exposing client identities, credentials, private dashboards, or customer data.

  • Diagram comparing a two-kilobyte JavaScript shell with three complete static Astro pages in English, Spanish, and Korean

    Static migration: what the server sends

    A sanitized comparison of the original JavaScript shell and the rebuilt pages that ship complete HTML in three languages.

    Build and served-HTML verification · verified June 13, 2026

  • Delivery verification

    Fresh build evidence plus the dated safe-editing pilot record.

    Static build
    3 pages generated: English, Spanish, Korean
    Editing boundary
    112 editable / 55 locked slots per page
    Protected chrome
    Navigation, branding, footer, and phone CTA
    Public claim
    Delivery verified; ranking improvement not claimed

    Local build and sanitized pilot record · verified June 13, 2026

Evidence

What backs this up

  • Astro project repository

    Verified

    Full source with EN/ES/KO pages, locked-chrome annotations, and component structure.

  • Live deployment verification (June 10, 2026)

    Verified

    All three language pages confirmed serving complete HTML on Cloudflare infrastructure — correct headings, body content, styles, and assets, with internal data files correctly inaccessible.

  • Safe-editing pilot record

    Verified

    Documented ingest of all 3 pages, 112 editable / 55 locked slots per page, rejection of edits to locked navigation, and a self-contained export deployed to an isolated pilot project.

  • Migration record

    Project record

    Project record of the Vite → Astro conversion and the Mexican-Spanish localization pass.

Results & current state

What's true today

  • The site went from an empty HTML shell to fully readable static pages in three languages.

    Verified by inspection of the served HTML before and after: ~2 KB empty shell versus ~28 KB of real content per language page.

  • Delivery is verified, repeatable, and version-controlled.

    Static build deploys from GitHub via Cloudflare; the June 10, 2026 verification confirmed pages, styles, and assets resolve correctly.

  • The site is ready for safe client editing without layout risk.

    Safe-editing pilot validated end-to-end: structural chrome locked, marketing copy editable, bad edits rejected with reasons.

Running a multilingual or call-first business on a site that search engines can't read?

Describe your setup in a few sentences — you'll get a plain answer about whether and how I can help.