Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
51 changes: 51 additions & 0 deletions .github/workflows/link-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Check internal links

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

permissions:
contents: read

concurrency:
group: "link-check-${{ github.ref }}"
cancel-in-progress: true

defaults:
run:
shell: bash

jobs:
link-check:
runs-on: ubuntu-latest
env:
HUGO_VERSION: 0.161.1
HTMLTEST_VERSION: 0.17.0
steps:
- name: Install Hugo CLI
run: |
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
- name: Checkout
uses: actions/checkout@v7
with:
submodules: recursive
- name: Install Node.js dependencies
run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true"
# Build with a root-relative baseURL so every in-site link resolves against
# ./public and can be checked on disk, with no server or network needed.
- name: Build with Hugo
env:
HUGO_CACHEDIR: ${{ runner.temp }}/hugo_cache
HUGO_ENVIRONMENT: production
run: hugo --minify --gc --baseURL "/"
- name: Install htmltest
run: |
wget -O ${{ runner.temp }}/htmltest.tar.gz \
"https://github.com/wjdp/htmltest/releases/download/v${HTMLTEST_VERSION}/htmltest_${HTMLTEST_VERSION}_linux_amd64.tar.gz"
tar -xzf ${{ runner.temp }}/htmltest.tar.gz -C ${{ runner.temp }} htmltest
sudo install ${{ runner.temp }}/htmltest /usr/local/bin/htmltest
- name: Check internal links
run: htmltest
20 changes: 20 additions & 0 deletions .htmltest.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Config for htmltest — checks that internal links resolve to real pages/assets.
# Run via .github/workflows/link-check.yml, or locally:
# hugo --minify --gc --baseURL "/" && htmltest
DirectoryPath: "public"

# Only internal links: no network calls, so the check is fast and never flaky.
CheckExternal: false

CheckLinks: true
CheckImages: true
CheckScripts: true
CheckAnchors: true

# Not link correctness — accessibility/markup lint we are deliberately not gating on here.
IgnoreAltMissing: true
IgnoreInternalEmptyHash: true
IgnoreEmptyHref: true

# Hugo emits pretty URLs (/foo/); don't complain about the missing trailing slash form.
IgnoreDirectoryMissingTrailingSlash: true
4 changes: 2 additions & 2 deletions content/case-studies/avif-vs-png.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ In this detailed article we will look at the potential backlash when using polyf
</div>
<div class="ui segment" id="calculating-savings">
<div class="header">
<a class="ui orange ribbon label" href="#calculating savings">
<a class="ui orange ribbon label" href="#calculating-savings">
<h3 style="color: #fff;">Calculating savings</h3>
</a>
</div>
Expand Down Expand Up @@ -221,7 +221,7 @@ In this detailed article we will look at the potential backlash when using polyf
</div>
</div>
<h3>Calculate CO2 savings</h3>
<p>Since every network transmission has an energy and CO2 budget attached to it we no use our formulas from <a href="#TODO">TODO:_ CO2 formulas for software engineering</a> and then we plug in to calculate the savings per day. We also use the <a href="https://app.electricitymaps.com/zone/DE">avg. grid intensity in Germany</a> for today (280g / kWh).</p>
<p>Since every network transmission has an energy and CO2 budget attached to it we no use our formulas from <a href="/blog/co2-formulas-and-case-studies">CO2 formulas for software engineering</a> and then we plug in to calculate the savings per day. We also use the <a href="https://app.electricitymaps.com/zone/DE">avg. grid intensity in Germany</a> for today (280g / kWh).</p>
<div class="ui ten mini statistics">
<div class="statistic">
<div class="value">135</div>
Expand Down
16 changes: 4 additions & 12 deletions content/case-studies/cpu-power-capping.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,7 @@ Agenda
<i class="right triangle icon"></i>
<div class="content">
<div class="header">
<a href="#energy-for-compression">Measurements</a>
</div>
</div>
</div>
<div class="item">
<i class="right triangle icon"></i>
<div class="content">
<div class="header">
<a href="#summary">Evaluation of possible drawbacks</a>
<a href="#measurements">Measurements</a>
</div>
</div>
</div>
Expand All @@ -97,7 +89,7 @@ What do we want to find out?
How much energy can we save through CPU power capping on a workload and what are the drawbacks of using it?
{{< /research_question >}}

{{< greenblock >}}
{{< greenblock id="setup" >}}
Setting up power capping on Linux
{{< /greenblock >}}

Expand Down Expand Up @@ -154,7 +146,7 @@ $ echo "10000000" | sudo tee /sys/class/powercap/intel-rapl/intel-rapl:0/constr

We recommend to always set both limits unless you have specific reason not to. The rationale is to even catch power spikes which are not untypical in transacational workloads. The values `constraint_1_time_window_us` and `constraint_1_time_window_us` that govern this usually do not need to be touched.

{{< whiteblock >}}
{{< whiteblock id="measurements" >}}
Measurements
{{< /whiteblock >}}

Expand Down Expand Up @@ -288,7 +280,7 @@ The optimal operating point here shifts from **40%** to **60%**.

When we look even further and factor in the embodied carbon (through the [Green Software Foundation's SCI](https://sci-guide.greensoftware.foundation/)) we see that the operating point of the machine shifts again, now to **80%**.

{{< greenblock >}}
{{< greenblock id="summary" >}}
Summary and further considerations
{{< /greenblock >}}

Expand Down
18 changes: 5 additions & 13 deletions content/case-studies/energy-efficiency-python.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,23 +58,15 @@ Agenda
<i class="right triangle icon"></i>
<div class="content">
<div class="header">
<a href="#setup">Setting up power capping on Linux</a>
<a href="#benchmarking">Benchmarking with the Green Metrics Tool</a>
</div>
</div>
</div>
<div class="item">
<i class="right triangle icon"></i>
<div class="content">
<div class="header">
<a href="#energy-for-compression">Measurements</a>
</div>
</div>
</div>
<div class="item">
<i class="right triangle icon"></i>
<div class="content">
<div class="header">
<a href="#summary">Evaluation of possible drawbacks</a>
<a href="#results">Results</a>
</div>
</div>
</div>
Expand All @@ -98,7 +90,7 @@ What do we want to find out?
How has the energy efficiency changed with Python 3.9 and Python 3.12 and how does PyPy and Mojo compare to C?
{{< /research_question >}}

{{< greenblock >}}
{{< greenblock id="benchmarking" >}}
Benchmarking with the Green Metrics Tool
{{< /greenblock >}}

Expand All @@ -122,7 +114,7 @@ During the run we are mainly looking at the CPU energy and the total machine ene

**Pro Tip**: If you do not know what the Green Metrics Tool is: It is our all-in-one open source professional software benchmarking and optimization solution. [Find infos here]({{< relref path="products/green-metrics-tool" >}})

{{< whiteblock >}}
{{< whiteblock id="results" >}}
Results
{{< /whiteblock >}}

Expand Down Expand Up @@ -251,7 +243,7 @@ Mojo showed no relevant improvements which is mostly due to the fact that it can
It will just wrap the Python code and import it as a module and then run it with the native Python interpreter (`libpython`). See our [discussion on their Github](https://github.com/modularml/mojo/discussions/1983)


{{< greenblock >}}
{{< greenblock id="summary" >}}
Summary and further considerations
{{< /greenblock >}}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: "Sustainable Software: Ansätze zum Messen der Energieeffizienz von Software"
picture: "/img/newsroom/news/gsd-frankfurt.webp"
link: "/talks-and-events/green-software-development-frankfurt-2023-01-18/"
link: "/talks-and-events/green-software-development-frankfurt-2024-01-18/"
date: 2024-01-18
draft: false
type: "news"
Expand Down
2 changes: 1 addition & 1 deletion content/products/power-hog.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ Eine vollständige Readme und Dokumentation finden Sie im GitHub Repo.
{{< rawhtml >}}
<img class="ui rounded bordered image" src="/img/products/hog-power-logger.avif" alt="HOG Screenshot" loading="lazy" style="margin:auto;">
<br>
<img class="ui rounded bordered image" src="/img/products/hog-mac-app.avif" alt="HOG Screenshot" loading="lazy" style="margin:auto;">
<img class="ui rounded bordered image" src="/img/products/hog-mac-app.webp" alt="HOG Screenshot" loading="lazy" style="margin:auto;">
<br>
<img class="ui rounded bordered image" src="/img/products/hog-website.avif" alt="HOG Screenshot" loading="lazy" style="margin:auto;">
<br>
Expand Down
38 changes: 38 additions & 0 deletions content/products/webnrg.de.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
title: "webNRG"
date: 2026-03-10 10:00:00
publishDate: 2026-03-10
draft: false
icon: "lightning"
desc: "webNRG misst den Energieverbrauch und die CO2-Emissionen von Webseiten, indem es die Analyse des Netzwerkverkehrs mit der tatsächlichen Leistungsaufnahme des Geräts während des Renderings kombiniert"
ordering: 9
---

webNRG ist ein kostenloses Open-Source-Tool, das den Energieverbrauch und die CO2-Emissionen von Webseiten misst. Anders als Tools, die nur grünes Hosting und Netzwerkdaten betrachten, konzentriert sich webNRG auf die zwei Faktoren, die häufig übersehen werden: **die Energie des Netzwerkverkehrs** und **die Rendering-Leistung auf der Nutzerseite**.

Das Tool führt beides zu einem einzigen Wert zusammen, der nach dem Vorbild des Nutri-Score von **A+ bis F** bewertet wird. So sind die Ergebnisse für Entwicklerinnen und Nicht-Techniker gleichermaßen sofort verständlich.

{{< rawhtml >}}
<figure>
<img class="ui centered huge image" src="/img/products/webNRG-sample-site.webp" alt="Green-Coding.io webNRG Zusammenfassung" loading="lazy">
<figcaption><a href="https://website-tester.green-coding.io/details.html?page=https%3A%2F%2Fwww.green-coding.io">green-coding.io webNRG⚡️ Zusammenfassung</a></figcaption>
</figure>
{{< /rawhtml >}}

Eine der zentralen Erkenntnisse aus der Entwicklung von webNRG: Eine Seite, die 35× mehr Daten überträgt als eine andere, kann trotzdem gleich viel Rendering-Energie verbrauchen. Datenmenge und Leistungsaufnahme korrelieren nur schwach (0,49) — genau deshalb ist es wichtig, beides getrennt zu messen.

### Wie es funktioniert

- Reichen Sie Ihre Webseiten-URL für einen einmaligen Test ein oder melden Sie sich für ein **wöchentliches Monitoring** an
- webNRG misst die Energie über ein Zeitfenster von 5 Sekunden nach dem initialen Laden der Seite
- Netzwerkverkehr und CPU-/Rendering-Energie werden unabhängig voneinander erfasst
- Die Ergebnisse werden gegen den Leerlaufverbrauch verglichen, mit Schwellenwerten von jeweils 25 % pro Bewertungsstufe
- Die Emissionen werden auf Basis eines typischen Szenarios von 10.000 Nutzern pro Monat berechnet

### Links

{{< button "lightning" "webNRG ausprobieren" "https://website-tester.green-coding.io/" >}}

{{< button "book" "Blogartikel zur Veröffentlichung" "/blog/webnrg-released" >}}

<div class="clear"></div>
2 changes: 1 addition & 1 deletion content/services/_index.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ authorlink: "https://de.linkedin.com/in/arne-tarara"

Wir helfen Ihnen bei der Transformation Ihrer Software zu einem nachhaltigen Produkt.

Wir sind [regelmäßige Sprecher auf Konferenzen und Branchensymposien]({{< relref path="#nav-meetups" >}}), entwickeln
Wir sind [regelmäßige Sprecher auf Konferenzen und Branchensymposien]({{< relref path="/#nav-conference" >}}), entwickeln
[Projekte]({{< relref path="products" >}}) sowie [Open-Source-Tools zur Messung von CO2 in Containern]({{< relref path="products/green-metrics-tool" >}}) und aktive Befürworter und Berater für Energie- und CO2 transparenz [State of the art carbon pipeline tooling]({{< relref path="products/eco-ci" >}})
durch Zertifizierungen wie den [Blauen Engel für Software](https://www.blauer-engel.de/de/produktwelt/ressourcen-und-energieeffiziente-softwareprodukte) oder unser Projekt [Energy-ID]({{< relref path="products/energy-id" >}}).

Expand Down
2 changes: 1 addition & 1 deletion content/services/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ We help you to transform your software to a sustainable product.

Scroll down and see how we work with companies in our 5 stage approach.

We are [regular speaker at conferences and industry symposiums]({{< relref path="/#nav-meetups" >}}), developing
We are [regular speaker at conferences and industry symposiums]({{< relref path="/#nav-conference" >}}), developing
[open source industry advancing container native carbon measurement tools]({{< relref path="products/green-metrics-tool" >}}) as well as
[state of the art carbon pipeline tooling]({{< relref path="products/eco-ci" >}}), active advocates and consultants for energy and carbon transparency
through certifications like the [Blauer Engel für Software](https://www.blauer-engel.de/de/produktwelt/ressourcen-und-energieeffiziente-softwareprodukte) or our [Energy-ID]({{< relref path="products/energy-id" >}}) project.
Expand Down
2 changes: 1 addition & 1 deletion content/talks-and-events/fosdem-2023.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ We present the roadmap for this tool over the next year, which will result in a

### Slide-Deck PDF

[Download Slides](/static/slides/FOSDEM_23.pdf)
[Download Slides](/slides/FOSDEM_23.pdf)



8 changes: 6 additions & 2 deletions layouts/newsroom/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@ <h2 class="ui top attached block header">
{{ range $news.ByDate.Reverse }}

<div class="item">
{{ with .Params.picture }}
<div class="ui tiny image">
<img src="{{.Params.picture}}" loading="lazy">
<img src="{{ . }}" loading="lazy">
</div>
{{ end }}
<div class="content">
<a class="header" href="{{.Params.link}}">{{.Title}}</a>
<div class="meta">
Expand Down Expand Up @@ -49,9 +51,11 @@ <h2 class="ui top attached block header">
{{ $media := first 6 (where .Site.RegularPages "Type" "media") }}
{{ range $media.ByDate.Reverse }}
<div class="item">
{{ with .Params.picture }}
<div class="ui tiny image">
<img src="{{.Params.picture}}" loading="lazy">
<img src="{{ . }}" loading="lazy">
</div>
{{ end }}
<div class="content">
<a class="header" href="{{.Params.link}}">{{.Title}}</a>
<p>{{.Params.Magazine}}</p>
Expand Down
4 changes: 3 additions & 1 deletion layouts/newsroom/media/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ <h2 class="ui top attached block header">
{{ range $media.ByDate.Reverse }}

<div class="item">
{{ with .Params.picture }}
<div class="ui tiny image">
<img src="{{.Params.picture}}" loading="lazy">

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is needed as some pictures are empty

<img src="{{ . }}" loading="lazy">
</div>
{{ end }}
<div class="content">
<a class="header" href="{{.Params.link}}">{{.Title}}</a>
<div class="meta">
Expand Down
4 changes: 3 additions & 1 deletion layouts/newsroom/news/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ <h2 class="ui top attached block header">
{{ range $news.ByDate.Reverse }}

<div class="item">
{{ with .Params.picture }}
<div class="ui tiny image">
<img src="{{.Params.picture}}" loading="lazy">
<img src="{{ . }}" loading="lazy">
</div>
{{ end }}
<div class="content">
<a class="header" href="{{.Params.link}}">{{.Title}}</a>
<div class="meta">
Expand Down
7 changes: 5 additions & 2 deletions layouts/shortcodes/greenblock.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
</div>
</div>
</section>
{{ with .Get 0 }}
{{/* Positional arg 0 = header image; named arg `id` = anchor target for in-page TOC links. */}}
{{ $img := "" }}{{ $id := "" }}
{{ if reflect.IsMap .Params }}{{ $id = .Get "id" }}{{ else }}{{ $img = .Get 0 }}{{ end }}
{{ with $img }}
<img src="{{ . }}" class="ui image full-width-image" alt="Green Coding Header">
{{ end }}
<section class="bg-two">
<section class="bg-two"{{ with $id }} id="{{ . }}"{{ end }}>
<div class="single-page section-two">
<div class="title-two">{{.Inner}}</div>
<div class="separator">
Expand Down
7 changes: 5 additions & 2 deletions layouts/shortcodes/whiteblock.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
</div>
</div>
</section>
{{ with .Get 0 }}
{{/* Positional arg 0 = header image; named arg `id` = anchor target for in-page TOC links. */}}
{{ $img := "" }}{{ $id := "" }}
{{ if reflect.IsMap .Params }}{{ $id = .Get "id" }}{{ else }}{{ $img = .Get 0 }}{{ end }}
{{ with $img }}
<img src="{{ . }}" class="ui image full-width-image" alt="Green Coding Header">
{{ end }}
<section class="bg-one">
<section class="bg-one"{{ with $id }} id="{{ . }}"{{ end }}>
<div ></div>
<div class="single-page section-one">
<div class="title-one">{{.Inner}}</div>
Expand Down