Technical Note ยท Prepared for Averis SDN BHD

Why Sanity + Astro over WordPress & Joomla

A short rationale for migrating Averis's portfolio of brand websites from a legacy monolithic CMS to a modern headless CMS + static-frontend stack.

The short version

Legacy CMSes like WordPress and Joomla couple the content, the database, the admin UI, and the rendered HTML together inside one server-side application. That coupling made WordPress ubiquitous, but it is also what makes it slow, expensive to scale, and a near-constant security liability. Sanity and Astro separate those concerns by design.

โšก

Performance

Astro ships pre-rendered static HTML. No PHP runtime, no database query per visitor, no page caching plugins to fight with.

๐Ÿ”

Security

No public-facing admin login, no plugins to patch, no database to attack. The attack surface shrinks to near zero.

๐Ÿงฉ

Content Model

Sanity's schema is fully custom-typed per brand. Structured, queryable content โ€” not a giant `wp_posts` table.

๐Ÿข

Multi-brand

One Enterprise project, one shared schema foundation, a dedicated Studio per brand. Onboarding a brand reuses the pattern.

๐ŸŒ

Multilingual

True per-locale content trees (e.g. Aprayon's EN/ID), not a translation plugin bolted onto a monolingual core.

๐Ÿ”“

No Lock-in

Content, media, and metadata exportable at any time. The CMS is a tool you own data in, not a platform you rent.

Side-by-side comparison

What changes concretely when Averis moves a brand from WordPress/Joomla to Sanity + Astro.

CapabilityWordPress / JoomlaSanity + Astro
Architecture Monolithic: DB + PHP + theme in one server app Decoupled: Sanity (content API) + Astro (static frontend)
Page rendering Server-rendered PHP per request, relies on caching plugins Pre-rendered static HTML at build time; near-instant TTFB
Admin security surface Public /wp-admin + plugin vulnerabilities; constant patching Studio is a hosted app on Sanity's domain; no public admin on your site
Scaling under load Database & PHP-FPM must scale with traffic; caching fights Static files on a CDN edge; horizontal scaling is automatic & cheap
Content model Posts/pages + custom post types; fixed schema assumptions Fully typed, brand-specific schema; composable page-builder sections
Multilingual Plugin-based (WPML/Polylang); bolted onto a monolingual core Native per-locale content trees & routing in the frontend
SEO control Via SEO plugins (Yoast/RankMath); plugin sprawl Per-page SEO fields, JSON-LD, sitemap & robots.txt in the CMS schema
Plugin / extension model 3rd-party plugins = security & maintenance debt Integrations are code you own; no plugin marketplace to depend on
Data ownership & exit Exportable, but tightly coupled to WP schema/conventions Full dataset export at any time; clean structured JSON
Onboarding a new brand Fresh WP install per site; each is its own snowflake Same Enterprise project, shared schema foundation, new Studio workspace

How the two pieces fit together

Sanity is the content layer; Astro is the presentation layer. The brand's editors work in a Sanity Studio; visitors hit static HTML on a CDN edge.

Sanity โ€” the CMS

๐Ÿง  Content layer

  • Headless, hosted, API-first โ€” no server for you to run.
  • Custom typed schema per brand: pages, posts, profiles, resources.
  • Composable page-builder sections editable by non-developers.
  • Per-brand Studio workspace inside one shared Enterprise project.
  • Real-time, collaborative editor experience out of the box.
Astro โ€” the frontend

๐ŸŽจ Presentation layer

  • Static-site generator: builds to plain HTML/CSS/JS.
  • Ships zero JS by default; components hydrate only when needed.
  • Deploys as static files to Vercel or Netlify's global CDN edge.
  • Replicates the brand's existing look & feel (like-for-like rebuild).
  • No runtime, no database, no PHP โ€” nothing to patch at the edge.
01

Editor

Brand team edits content in their Sanity Studio

โ†’
02

Sanity API

Content stored as structured, queryable data

โ†’
03

Astro build

Pages pre-rendered to static HTML

โ†’
04

CDN edge

Visitors get cached static files, globally

How it stays fresh: as editors publish in Sanity, the site rebuilds automatically (webhook โ†’ build โ†’ redeploy). Visitors never hit a database; editors never wait on a developer for routine content changes.

What this means for Averis's portfolio

Averis manages several brand sites (e.g. Toba Pulp Lestari, Tanoto Foundation, Aprayon) currently on WordPress. The same pain points repeat across all of them.

Today (WordPress)After migration (Sanity + Astro)
Each brand is a separate WP install to maintain & secure independently. One Enterprise Sanity project; each brand gets its own Studio workspace. Onboarding a new brand reuses an already-proven schema & build pattern.
Plugin & core updates per site, per month, forever. No plugins. No public admin. No server runtime. Security surface drops to near zero.
Aprayon's bilingual EN/ID content lives in a translation plugin bolted onto a monolingual core. Genuine per-locale content trees with frontend locale routing โ€” a first-class concern, not a plugin.
Blog-heavy sites (Tanoto: 457 posts) strain WP caching & search under load. Static HTML on a CDN; Pagefind search runs client-side over the static index. Algolia available where faceted/typo-tolerant search is needed.
Moving a brand means migrating out of WordPress's schema conventions. Clean structured JSON exportable at any time โ€” Averis owns its content and can leave the platform if ever needed.

The cost story

The move away from WordPress is partly motivated by cost efficiency. The stack above shifts cost from ongoing maintenance debt toward a one-time build with thin running costs.

waterfall

One-time

Discovery, Sanity schema setup, Astro frontend build, content migration โ€” quoted per brand in the standard package.

recurring

Running

Sanity Enterprise plan + CDN hosting (Vercel/Netlify), both billed directly by the provider. No per-page view cost.

spanner

What you stop paying

Constant plugin patching, security incident response, caching plugin tuning, per-site WP maintenance hours.