LiveSince 2025

Web · CMS

Architecture, Go backend, CMS and site

Solovit CMS

The brand's official site and the visual builder behind it: the owner edits pages from blocks, presses Publish, and a fast static site rebuilds itself in about a minute.

  • Block types, each with variants

  • Go tests

  • Container: site, API and admin

  • From Publish to live

The page builder: blocks, live preview and inspector

01/Problem

The site started as static pages with a small PHP and MySQL API for prices. Each product page was added in code, so changing a sentence meant a code change and a redeploy.

The goal: the owner builds and edits product pages directly, in Arabic and English, without making the site slower or breaking any link that already works.

02/Constraints

  • 01Keep the speed of a static site; visitors never wait on a database.
  • 02Old /api/*.php URLs keep answering after the move off PHP.
  • 03Every block works in RTL and LTR, light and dark, with long or empty content.
  • 04Runs as one small service on a shared server.

03/Architecture

Visitors

  • Static site · Next.js 14 export
  • ar / en · light / dark

Owner

  • Visual builder
  • pages · media · analytics
  • Publish

Go service

  • static server
  • API + legacy .php aliases
  • rebuild queue
  • sessions · CSRF

Data

  • SQLite
  • uploads volume
  • built site
One Go binary serves the built site, the API and the admin from one container. Publish queues a rebuild of the static export from the database and swaps it in when done.

04/Decisions

  1. Rebuild on publish, serve static

    Content lives in SQLite, but visitors get prebuilt HTML. The admin shows Building, then Your changes are now live, and HTML is served no-cache so nobody needs a hard refresh.

    Trade-off: A change takes about a minute to appear, not a second. Turning a page off is instant: it returns 404 without a rebuild.

  2. Replace PHP without breaking a link

    The PHP + MySQL API was rewritten in Go on SQLite endpoint by endpoint, and the Go service still answers the old .php paths. A migrate command loads the old MySQL dump, so prices, content and admin users moved over intact.

  3. One block system, many products

    Twenty-one block types (hero, benefits, supplement facts, FAQ...) with variants, entrance motion and per-product accent colours. A product page is data, so a new product is built in the admin, not in code.

05/Screens

Pages: every page and product, live or off
Pages: every page and product, live or off
A product page built from blocks, live on the site
A product page built from blocks, live on the site

06/Stack

GoSQLiteNext.js 14ReactTypeScriptTailwind CSSDockerCaddyCloudflare

Next systemJoTV
Mohammed Yousef Ali | Systems Architect for real businesses