case study 01 / 05 · website demos · internal design review

S01 website demos

Six design directions for the company website, generated from one bilingual content source

Each direction is a complete, navigable site in German and in a draft English translation, assembled by a Node static generator from the shared content, a component kit and one small recipe per demo. The supervisor can compare them on the real text and all eight pages instead of placeholders. The English copy still awaits the employer's review. I set the brief and released the gallery, which is public but not indexed by search engines.

Node 22JavaScriptJSONGitHub ActionsGitHub PagesPlaywright
6redesign demos, German plus a draft English translation
96pages generated: 6 demos × 2 languages × 8 pages
36layout variants in 8 kit components
119automated tests before every deploy
Role
development, as a working student at S01 Projektmanagement GmbH (brief, revisions and release)
Built for
the supervisor, who picks a direction
Platform
static site on GitHub Pages, not indexed
Status
internal design review, live since October 2026
01 / why it exists

Comparing designs on real content, and changing course cheaply

The supervisor wanted to compare design directions for the company website on the real content and all eight pages, not on placeholders: home, services, projects, company, careers, contact, legal notice and privacy. A direction therefore had to be a whole site, German by default with an English toggle and a looping video in the hero.

The brief kept changing within about two weeks, and the corporate colours reached every demo in a single commit. Changes had to be cheap. One content source, a shared component kit and a small recipe per demo turn a new direction or a global change into a small edit, and automatic checks stop a broken link or a missing translation before it goes online.

Who uses it

The supervisor, who picks a direction, and the reviewers who have the link. The gallery is public but not indexed by search engines.

What it costs to run

Nothing: static files on GitHub Pages, no backend, no cookies and no analytics, so there are no visitor figures either.

02 / how it works

How content becomes a checked, live gallery

Architecture diagram: S01 website demos The bilingual content, the demo recipes with their themes and the component kit feed the static generator. Its output goes through the quality gates and the CI and deploy workflow to the live gallery, where the motion runtime upgrades the pages in the browser. JSON Bilingual content DE and EN, identical keys JSON · CSS Recipes and themes variants, video, motion JAVASCRIPT Component kit 8 components, 36 variants NODE 22 Static generator renders 96 pages + gallery NODE:TEST Quality gates 119 tests + output checker GITHUB ACTIONS CI and deploy tests, builds, publishes GITHUB PAGES Live gallery six demos, not indexed CSS · JS Motion runtime scroll effects, transitions 96 PAGES FAILS THE BUILD ONLY IF GREEN Architecture diagram: S01 website demos The bilingual content, the demo recipes with their themes and the component kit feed the static generator. Its output goes through the quality gates and the CI and deploy workflow to the live gallery, where the motion runtime upgrades the pages in the browser. JSON Bilingual content DE and EN, identical keys JSON · CSS Recipes and themes variants, video, motion JAVASCRIPT Component kit 8 components, 36 variants NODE 22 Static generator renders 96 pages + gallery NODE:TEST Quality gates 119 tests + output checker GITHUB ACTIONS CI and deploy tests, builds, publishes GITHUB PAGES Live gallery six demos, not indexed CSS · JS Motion runtime scroll effects, transitions 96 PAGES FAILS THE BUILD ONLY IF GREEN
  1. 1Write the content onceTwo language files hold all text under the same keys, and the build stops if a key exists in only one language.
  2. 2Describe each demo as a recipeA recipe names the layout variants, fonts, video and motion level of one demo; a theme file sets its colours. Unknown names are rejected and the build lists the valid ones.
  3. 3Render every page 96 PAGESThe generator takes the chosen variants from the kit and writes 96 pages plus the gallery.
  4. 4Check the output FAILS THE BUILDA checker walks the result. A broken link or anchor, a wrong number of h1 headings, a wrong language, missing navigation or theme contrast below 4.5:1 fails the build.
  5. 5Push to deploy ONLY IF GREENOn a push to main, GitHub Actions runs the tests, the build and the checker again and publishes only if all of them pass.
  6. 6Open the galleryA reviewer opens a demo. The page is plain pre-rendered HTML that a small script upgrades with reveals, parallax, counters and page transitions.
03 / data model

One content model, six recipes, 36 variants

Data model: S01 website demos A language edition has many pages, a page has many sections and a section has many items. A demo recipe has one theme and picks one variant for each of the eight slots of the component kit. Language edition one file per language PK Language: de or en Site meta Pages Page 8 per edition PK Page key FK Language edition Title Description Hero Section 36 per edition PK Key path FK Page Eyebrow Title Text Item repeated entries PK Id or position FK Section Title Text Question and answer Theme one CSS file per demo PK Demo id Background and text colours Accent colour Fonts Corner radius Demo recipe 6, one per direction PK Demo id Description (de, en) One variant per slot Video clip Motion level Variant 36 in 8 slots PK Slot PK Name Render function
  • Language edition object

    one file per language

    • PKLanguage: de or en
    • Site meta
    • Pages
    • 1 edition → 8 pages
  • Page object

    8 per edition

    • PKPage key
    • FKLanguage edition
    • Title
    • Description
    • Hero
    • 1 page → many sections
  • Section object

    36 per edition

    • PKKey path
    • FKPage
    • Eyebrow
    • Title
    • Text
    • 1 section → many items
  • Item object

    repeated entries

    • PKId or position
    • FKSection
    • Title
    • Text
    • Question and answer
  • Theme object

    one CSS file per demo

    • PKDemo id
    • Background and text colours
    • Accent colour
    • Fonts
    • Corner radius
  • Demo recipe object

    6, one per direction

    • PKDemo id
    • Description (de, en)
    • One variant per slot
    • Video clip
    • Motion level
    • 1 recipe → 1 theme
    • 1 recipe → 8 variants, one per slot
  • Variant object

    36 in 8 slots

    • PKSlot
    • PKName
    • Render function

Simplified: 7 of 12 entities. Left out: site meta, page slugs, video clips, photos and the slot registry. The 96 output pages (6 recipes × 2 editions × 8 pages) are built, not stored.

German and English cannot drift apart

The build fails when a key exists in only one language: 424 keys each.

A new direction is a small file

A recipe in JSON and a theme file with colours and fonts are enough; the content and the kit stay as they are.

Every output page is checked

The 96 pages are built, not stored, and each one passes the output checker before it is published.

04 / decisions

Trade-offs that shaped the build

One content source, the same structure everywhere

All text lives in two language files with identical keys, and the page set and section order are fixed in code. Reviewers compare design, not copy, and the two files cannot drift apart. Trade-off: every demo has the same pages in the same order.

Recipes, a kit and theme tokens

A demo is a small recipe plus a theme file; the kit holds eight swappable components as plain functions that return HTML. New directions and global changes become small edits. Trade-off: the demos share one markup skeleton, so they differ only as far as the variants and styles allow.

Pre-rendered pages behind a gate

Node writes plain HTML for every demo, language and page, with relative links, so the site works under a GitHub Pages sub-path and locally. GitHub Actions runs the tests, the build and the checker before it publishes. Trade-off: no CMS and no backend, so the demo forms send nothing, and the Playwright layout checks run only locally.

Motion as an enhancement

Reveals, parallax and page transitions are switched on only for visitors who have not asked for reduced motion, and one demo opts in to a cinematic level. Content is never hidden from visitors without scripts, with reduced motion or when printing. Trade-off: more runtime code to maintain, and page transitions only in newer Chrome and Safari.

05 / my part

What I did

  • Set the brief and made the main choices: a bilingual site, all eight pages, a video hero, a generator with a shared component kit and public links.
  • Decided every later revision, from the corporate colours in every demo to the motion system.
  • Owned the repository, GitHub Pages and the deploy workflow, and released every update to the public gallery.
  • Brought the supervisor's choice of reference designs into the project.
  • Delivered the six directions as public links for the supervisor's review.
06 / result

Six design directions online, in internal design review

Six design directions are online for the supervisor's review, in a public gallery that has been live since October 2026. They were built in October 2026, in 109 commits over 15 days, and a deploy only goes out when all 119 tests and the output checker pass. Status: internal design review.

Open the live demo