Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
6c6284d
feat: Add new KERN landing page and references section
eckelj Apr 11, 2026
a6b8e83
feat: Add workflows for link checking and QA, update HTML files for e…
eckelj Apr 11, 2026
c0b6b83
fix: Update typo check action reference in QA workflow
eckelj Apr 11, 2026
e121a5f
feat: Update primary color to a new accent shade across multiple files
eckelj Apr 11, 2026
f3001ac
feat: Revamp About Us page and update footer and navigation links for…
eckelj Apr 12, 2026
1df6110
feat: Update page titles and add branding elements for KERN by Riddle…
eckelj Apr 12, 2026
7c7d6ba
feat: Add KERN product bar component and integrate it into multiple p…
eckelj Apr 12, 2026
e8c77ca
feat: Revise hero section layout and styling for improved responsiven…
eckelj Apr 12, 2026
7698d42
Refactor styles across multiple files to enhance visual consistency a…
eckelj Apr 12, 2026
4bd4d17
feat: Remove unused CSS files and clean up stylesheet references
eckelj Apr 12, 2026
9ab54e9
feat: Update utility references for clarity and consistency across mu…
eckelj Apr 12, 2026
8b9d7e1
Add new HTML templates for KERN product pages, references, and techno…
eckelj Apr 12, 2026
01a9a7a
Fix HTML entity encoding for Riddle&Code in various pages and update …
eckelj Apr 12, 2026
1b9ea68
Add new images and tracking script for team members and wallets
eckelj Apr 12, 2026
2b3a396
feat: Revise headings and descriptions for KERN references to enhance…
eckelj Apr 12, 2026
63d9b1e
feat: Add new HTML templates for Industry Showcase and Sustainability…
eckelj Apr 12, 2026
b166456
Add new navigation and footer components with localization support
eckelj Apr 13, 2026
b195f6f
feat: Update localization strings for references and improve clarity …
eckelj Apr 13, 2026
67b65ba
feat: Enhance clarity and detail in German and English content across…
eckelj Apr 13, 2026
c8ce345
feat: Revise German content for clarity in technology section, updati…
eckelj Apr 13, 2026
607c8d1
feat: Add German and English spelling check configurations to QA work…
eckelj Apr 13, 2026
435d007
feat: Update cspell configuration to include German localization file…
eckelj Apr 13, 2026
f29c7f2
feat: Add new German terms to cspell configuration for improved spell…
eckelj Apr 13, 2026
f8c6b6a
feat: Enhance styling and responsiveness of news and embed cards in m…
eckelj Apr 13, 2026
1e6c1ed
feat: Refactor language URL handling for improved path management
eckelj Apr 13, 2026
d569e3f
Refactor pain points presentation across multiple templates
eckelj Apr 13, 2026
672b67f
feat: Update references to use plural form for utilities across multi…
eckelj Apr 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/links.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Dead links

on:
push:
branches: [main]
schedule:
- cron: '0 8 * * 1' # every Monday 08:00 UTC

jobs:
lychee:
name: Link check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Check links
uses: lycheeverse/lychee-action@v2
with:
args: >
--config .lychee.toml
'**/*.html'
fail: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Create issue on scheduled failure
if: failure() && github.event_name == 'schedule'
uses: peter-evans/create-issue-from-file@v5
with:
title: 'Dead links detected'
content-filepath: ./lychee/out.md
labels: bug, content
130 changes: 130 additions & 0 deletions .github/workflows/qa.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
name: QA

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:

# ── 0. Build freshness ──────────────────────────────────────────────────────
build-fresh:
name: Build freshness check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: pip install -r requirements.txt
- name: Check generated files match templates
run: python3 build.py --check

# ── 1. Typos ────────────────────────────────────────────────────────────────
typos:
name: Typo check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: crate-ci/typos@v1

# ── 2. German spelling ─────────────────────────────────────────────────────
cspell-de:
name: German pages spelling
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Spell-check German pages
run: |
npx --yes \
-p cspell \
-p @cspell/dict-de-de \
-p @cspell/dict-de-at \
cspell lint --config cspell.de.json

# ── 3. English spelling ────────────────────────────────────────────────────
cspell-en:
name: English pages spelling
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Spell-check English pages
run: |
npx --yes \
-p cspell \
cspell lint --config cspell.en.json

# ── 4. HTML validity ────────────────────────────────────────────────────────
html:
name: HTML validation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install -g html-validate
- name: Validate HTML
run: |
html-validate \
index.html \
kern/ \
technology/ \
references/ \
includes/nav.html \
includes/footer.html

# ── 5. Meta descriptions ────────────────────────────────────────────────────
meta:
name: Meta descriptions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Every KERN page must have a meta description
run: |
missing=0
while IFS= read -r file; do
if ! grep -qi '<meta name="description"' "$file"; then
echo "::error file=$file::Missing meta description"
missing=$((missing + 1))
fi
done < <(find index.html kern/ technology/ references/ -name "*.html")

if [ "$missing" -gt 0 ]; then
echo "::error::$missing page(s) missing <meta name=\"description\">"
exit 1
fi
echo "All KERN pages have meta descriptions ✓"

# ── 6. Image size budget ────────────────────────────────────────────────────
images:
name: Image size budget
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Warn on images > 500 KB
run: |
limit=$((500 * 1024))
oversized=0
while IFS= read -r img; do
size=$(stat -c%s "$img")
if [ "$size" -gt "$limit" ]; then
kb=$((size / 1024))
echo "::warning file=$img::${kb} KB — consider compressing (budget: 500 KB)"
oversized=$((oversized + 1))
fi
done < <(find images/ -type f \( \
-iname "*.jpg" -o -iname "*.jpeg" \
-o -iname "*.png" -o -iname "*.gif" \
-o -iname "*.webp" \))

if [ "$oversized" -gt 0 ]; then
echo "$oversized image(s) over budget — see warnings above"
else
echo "All images within 500 KB budget ✓"
fi
25 changes: 24 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,24 @@
new/node_modules
new/node_modules
.venv
__pycache__
*.pyc
*.pyo
*.pyd
*.db
*.sqlite3
*.log
*.env
*.DS_Store
.idea
.vscode
*.swp
*.swo
*.bak
*.tmp
*.egg-info
dist
build
*.egg
*.egg-info
*.egg-info/
*.egg-info/*
19 changes: 19 additions & 0 deletions .htmlvalidate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"extends": ["html-validate:recommended"],
"rules": {
"attr-quotes": "error",
"no-dup-attr": "error",
"no-dup-id": "error",

"no-inline-style": "off",
"require-sri": "off",
"void-style": "off",
"no-trailing-whitespace": "off",
"long-title": "off",
"tel-non-breaking": "off",
"script-type": "off",
"no-unknown-elements": "off"
},
"elements": ["html5"],
"transform": {}
}
39 changes: 39 additions & 0 deletions .lychee.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Lychee link checker configuration
# Docs: https://lychee.cli.rs/usage/configuration/

timeout = 20
max_retries = 3
retry_wait_time = 3
threads = 8

# 429 = Too Many Requests (rate-limited, not a dead link)
accept = ["200..=299", "429"]

exclude_loopback = true
include_mail = false

exclude = [
# JavaScript pseudo-links
"^javascript:",
"^#$",

# Google services — blocked in CI environments
"googletagmanager\\.com",
"googleapis\\.com",
"google\\.com/maps",
"google\\.com/recaptcha",

# Social platforms — aggressively rate-limit CI IPs
"linkedin\\.com",
"twitter\\.com",
"x\\.com",
"instagram\\.com",
"facebook\\.com",

# Localhost and staging
"localhost",
"127\\.0\\.0\\.1",
]

# Output dead links to a file so the scheduled issue workflow can attach it
output = "lychee/out.md"
55 changes: 55 additions & 0 deletions .typos.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
[files]
extend-exclude = [
# Binary / generated / legacy directories
"images/**",
"archive/**",
"slides/**",
"ttf/**",
"csv/**",
"data/**",
"showcase/**",
"media/**",
"news/**",
# German content pages are checked by cspell-de
"de/**/*.html",
"locales/de.yaml",
# Old Webflow CSS/JS
"company/css/**",
"company/js/**",
# Backup files
"*.bak",
"*.min.js",
]

[default.extend-words]
# Energy sector protocols and standards
MIOTY = "MIOTY"
EEBUS = "EEBUS"
SunSpec = "SunSpec"
aFRR = "aFRR"
FCR = "FCR"
SCADA = "SCADA"
OCPP = "OCPP"
BESS = "BESS"
HEMS = "HEMS"

# Austrian / German regulatory terms
EnFG = "EnFG"
EAG = "EAG"

# Brands and product names
KERN = "KERN"
Lumenaza = "Lumenaza"
cybergrid = "cybergrid"
VERBUND = "VERBUND"
TTTech = "TTTech"
joulie = "joulie"
egon = "egon"

# Place names
Heiligenkreuz = "Heiligenkreuz"
Wetzlas = "Wetzlas"
Steiermark = "Steiermark"

# German words used in content
Stadtwerke = "Stadtwerke"
8 changes: 4 additions & 4 deletions 404.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
}

:root {
--primary-green: #00ff88;
--dark-bg: #0a0a0a;
--primary-green: #F59E0B;
--dark-bg: #1C2333;
--text-primary: #ffffff;
--text-secondary: #e0e0e0;
--text-muted: #999999;
Expand Down Expand Up @@ -49,10 +49,10 @@

@keyframes glow {
0%, 100% {
text-shadow: 0 0 20px rgba(0, 255, 136, 0.5);
text-shadow: 0 0 20px rgba(245, 158, 11, 0.5);
}
50% {
text-shadow: 0 0 40px rgba(0, 255, 136, 0.8);
text-shadow: 0 0 40px rgba(245, 158, 11, 0.8);
}
}

Expand Down
Loading
Loading