WebEdge public site
Our lt/en/ru site on Astro, content pulled from the WebEdge CMS.
Dev-storyChallenge
We wanted a public site in three languages that stays in sync with our own CMS but ships as plain static HTML — no heavy SPA loading data at runtime.
What we did
Astro renders every page to static HTML at build; copy and the project catalogue are fetched from the WebEdge CMS during the build, and a typed in-repo fallback keeps the build green when the CMS is unreachable.
Result
Editors change content in the CMS, a rebuild ships new static pages, and the site keeps building even when the CMS is offline.
Dev-story article
WebEdge public site: how the project was built
The showcase pulls its project copy from our CMS, but the CMS kept drifting: stale featured flags, auto-captured screenshots that were ugly, and product names we couldn't ship publicly (competitor brands, internal codenames). Editing 32 project cards by hand in the CMS wasn't the answer — we needed a source of truth that lived in code and survived review. So the build was reworked so the repo wins and the CMS only fills the gaps.
Sections
05
Modules
05
Stack
Astro + TypeScript
Why the project exists
We wanted a public site in three languages that stays in sync with our own CMS but ships as plain static HTML — no heavy SPA loading data at runtime.
The showcase pulls its project copy from our CMS, but the CMS kept drifting: stale featured flags, auto-captured screenshots that were ugly, and product names we couldn't ship publicly (competitor brands, internal codenames). Editing 32 project cards by hand in the CMS wasn't the answer — we needed a source of truth that lived in code and survived review. So the build was reworked so the repo wins and the CMS only fills the gaps.
What was built
Astro renders every page to static HTML at build; copy and the project catalogue are fetched from the WebEdge CMS during the build, and a typed in-repo fallback keeps the build green when the CMS is unreachable.
A static Astro site in Lithuanian, English and Russian — a marketing front and a portfolio catalogue of ~32 projects with per-project detail pages. Content is fetched from the CMS at build time and merged with in-repo overrides; the output is plain static HTML with no heavy client framework.
Main modules and user path
Fallback-first merge: repo content (taglines, tech tags, cover, the 'featured' flag) overrides the CMS instead of being OR'd with stale CMS values
A staticScreenshots map that serves a repo-committed cover.webp per project, replacing the CMS's auto-captured screenshots
A de-branding pass that strips external product names and internal codenames from every card while keeping legitimate own-tech names
Home grid curated to a clean 3x3 of nine featured projects, driven by the repo flag, not the CMS
Slimmed catalogue cards: one-line taglines rewritten to <=81 chars with a line-clamp-2 safety net, with the full challenge/solution/result depth moved to the detail page
Architecture and technology decisions
Built with Astro, TypeScript, Tailwind.
Built on Astro with the CMS content pulled at build time and merged behind a repo-authoritative resolver; each project carries EN/LT/RU copy that stays meaning-consistent across the three locales.
Result and lessons
Editors change content in the CMS, a rebuild ships new static pages, and the site keeps building even when the CMS is offline.
The site ships as static HTML with the repo as the reviewable source of truth, so a card's wording, cover and feature status change in a commit — no CMS round-trip and no stale data leaking to the public grid.
Related articles
Read next
Related project stories
These projects share nearby technical or product decisions, so they show how the same principle behaves in another context.
Dev-storyCMS
A dynamic headless CMS on webedge-db — content types, media, roles, and the public read API behind our sites and their articles.
Dev-storyPi local-model workflow
Pi extension: the local model does the work, GPT-5.6 only gates the plan and review.
Dev-storyWebEdge UI design system
204 Vue 3 components on Tailwind v4 — a blocks catalogue and playground shared across every interface.
Have a similar idea?
Discuss your project