Skip to content

feat(home): state the five pillars, and put shared subscriptions with evig ai - #381

Merged
github-actions[bot] merged 1 commit into
mainfrom
feat/pillars
Aug 25, 2026
Merged

feat(home): state the five pillars, and put shared subscriptions with evig ai#381
github-actions[bot] merged 1 commit into
mainfrom
feat/pillars

Conversation

@catomean

Copy link
Copy Markdown
Collaborator

Replaces #380, which branched off the pre-squash history of #379 and so showed every one of those changes a second time (mergeStateStatus: DIRTY, and consequently no CI ran on it at all beyond Snyk). Same commit, cut fresh from origin/main.

The hero already said the right thing — "Zugang zu Intelligenz. Für alle bezahlbar." Everything under it was still the story of the organisation evig came from.

The homepage

Two bands are gone: a "zweites Leben / weitergeben" ribbon, and a "Drei Schritte. Ein Kreislauf." funnel that opened by asking the reader to donate their old kit. That story is true, but it's the consequence, not the reason — and it answered a question nobody arriving here is asking.

In their place, one section driven by a new SSOT (src/config/pillars.ts):

pillar goes to claim
hardware /marketplace machines good enough for real work, at a price people can pay
technicians /it-hilfe finding someone to fix it, as easily as booking a ride
software /services/linux-open-source Linux and open source, because the machine gets faster
training /workshops retraining for a labour market AI is rewriting
adoption /contact helping organisations actually put AI and robotics to work

adoption points at a conversation, not a service page — writing a consulting page for work nobody has scoped yet is exactly the claim the honesty rule exists to prevent.

Pillars are deliberately not derived from EVIG_DIVISIONS. Divisions are how the org is named; pillars are what it does. training and adoption have no division and shouldn't get one — inventing "evig academy" to make the lists match is the brand proliferation that got architecture and health deleted.

The stale subtitle, caught on the live site

The divisions subtitle hand-wrote "Vom Gerät bis zum Gebäude — und bis zum Menschen, der beides benutzt" and kept promising a building division after that division was deleted — sitting directly under a heading that correctly read "3 Bereiche", because that number is ICU-driven. A count follows the config; a sentence cannot. Fixed, along with two nav description keys for the removed divisions still being serialised into every page payload. The new pillars heading uses the same ICU count for the same reason.

Subscription pools moved

They sat under Mitmachen → Mitgliedschaft as a generic Netflix/Spotify swap board. The /ai page states the exact problem they solve — "Wer ein teures Abo bezahlen kann, lernt schneller, arbeitet besser und kommt an Chancen, die anderen verschlossen bleiben" — and then never said how.

So: ai is the first pool category and the default, the page leads with the real number (CHF 22 alone, CHF 5.50 split four ways), the nav entry sits beside evig ai, and /ai gains a fourth strand linking to it. Strand links are a new optional config field implementing the contextual-links rule — a paragraph naming an offer with no way to reach it is a dead end.

/vision is now in the nav. It's the clearest statement of what evig is for, and it was reachable only from the footer.

Metadata that never caught up

The JSON-LD told search engines evig does "Reparatur und Aufbau von Vintage-Computern" — a term for the opposite of what evig sells. And the SEO keywords were a German array frozen into the component, so seven locales were served German keywords. Keywords now come from the messages, split from one comma-separated string per locale — the shape jsonld.areaServed already uses, which avoids the array-in-messages fragility (the DE fallback replaces arrays wholesale, with no per-element merge).

Chrome drift on the pools page

CreatePoolModal was a hand-rolled fixed inset-0 overlay with its own useFocusTrap and its own surface — a second encoding of the centered-dialog shape. It uses <Modal> now. PoolCard used card-shell rounded-2xl, overriding the shared radius, so pool cards were visibly rounder than every other card on the site. The loading skeleton hand-rolled the shell in a way the ratchet grep could not seerounded-2xl slips past a pattern matching rounded-(lg|xl).

One baseline moved, deliberately

The i18n gate flagged 8 new "wrong language" findings on my Spanish and Italian strings. All 8 are correct in their own language ("Trova un tecnico", "LO QUE HACEMOS"). The detector scored them own 0 — those words are absent from its Italian/Spanish word lists entirely, which is the sibling-language limit rather than a translation error. Accepted into the baseline, and net it fell (48 insertions vs 53 deletions) rather than rose.

Verification

npm run verify green on this exact tree: lint, umlauts, chrome, docs, compliance, typecheck, 7746 tests, production build.

🤖 Generated with Claude Code

… evig ai

The hero already said the right thing — "Zugang zu Intelligenz. Für alle
bezahlbar." Everything under it was still the story of the organisation evig
came from.

## The homepage

Two bands are gone: a "zweites Leben / weitergeben" ribbon, and a "Drei
Schritte. Ein Kreislauf." funnel that opened by asking the reader to donate
their old kit. That story is true, but it is the consequence, not the reason,
and it answered a question nobody arriving here is asking. In their place, one
section driven by a new SSOT (`src/config/pillars.ts`):

  hardware    → machines good enough for real work, at a price people can pay
  technicians → finding someone to fix it, as easily as booking a ride
  software    → Linux and open source, because the machine gets faster
  training    → retraining for a labour market that AI is rewriting
  adoption    → helping organisations actually put AI and robotics to work

`adoption` points at a conversation, not a service page. Writing a consulting
page for work nobody has scoped yet is exactly the claim the honesty rule
exists to prevent. The section count is ICU-driven from the array — the
divisions subtitle taught us why: it hand-wrote "vom Gerät bis zum Gebäude"
and kept promising a building division for hours after that division was
deleted, sitting directly under a heading that correctly read "3 Bereiche".
That subtitle is fixed here too, along with two nav keys for the removed
divisions that were still being serialised into every page payload.

Pillars are deliberately NOT derived from EVIG_DIVISIONS. Divisions are how the
org is named; pillars are what it does. `training` and `adoption` have no
division and should not get one — inventing "evig academy" to make the lists
match is the brand proliferation that got architecture and health deleted.

## Subscription pools moved

They sat under "Mitmachen → Mitgliedschaft" as a generic Netflix/Spotify swap
board. The /ai page states the exact problem they solve — "Wer ein teures Abo
bezahlen kann, lernt schneller, arbeitet besser und kommt an Chancen, die
anderen verschlossen bleiben" — and then never said how. So: `ai` is now the
first pool category and the default, the page leads with the real number
(CHF 22 alone, CHF 5.50 split four ways), the nav entry sits beside evig ai,
and /ai gains a fourth strand that links to it. Strand links are a new optional
config field implementing the contextual-links rule: a paragraph naming an
offer with no way to reach it is a dead end.

## Metadata that had not caught up

The JSON-LD told search engines evig does "Reparatur und Aufbau von
Vintage-Computern" — a term for the opposite of what evig sells. And the SEO
keywords were a German array frozen into the component, so seven locales were
served German keywords. Keywords now come from the messages like every other
sentence, split from one comma-separated string per locale (the shape
`jsonld.areaServed` already uses — avoids the array-in-messages fragility,
since the DE fallback replaces arrays wholesale with no per-element merge).

## Chrome drift on the pools page

CreatePoolModal was a hand-rolled `fixed inset-0` overlay with its own
useFocusTrap and its own rounded-2xl surface — a second encoding of the
centered-dialog shape. It uses <Modal> now. PoolCard used `card-shell
rounded-2xl`, overriding the shared radius, so pool cards were visibly rounder
than every other card on the site; it uses <Card>. The loading skeleton
hand-rolled the shell in a way the ratchet grep could not even see
(`rounded-2xl` slips past a pattern matching `rounded-(lg|xl)`).

## One baseline moved, deliberately

The i18n gate flagged 8 new "wrong language" findings on the Spanish and
Italian strings. All 8 are correct in their own language ("Trova un tecnico",
"LO QUE HACEMOS"). The detector scored them "own 0" — the words are absent
from its Italian/Spanish word lists entirely, which is the sibling-language
limit, not a translation error. Accepted into the baseline; net it FELL
(48 insertions vs 53 deletions), it did not rise.

npm run verify green: lint, umlauts, chrome, docs, compliance, typecheck,
7746 tests, production build.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant