Contents

The Legal Shield: Setting Up Imprint and Privacy for a Multilingual Hugo Blog

How I conquered the German 'Impressumspflicht' without exposing my home address.

This post may contain affiliate links. If you click and make a purchase, I may receive a small commission at no extra cost to you.

Starting a blog is exciting, but if you are hosting from Germany or targeting European readers, you’ll hit a legal roadblock before your first “Hello World”: the Impressumspflicht (Imprint) and the DSGVO (GDPR).

Here is how I navigated the legal requirements, secured a privacy-friendly address, and implemented a multilingual setup in Hugo.

Why Do You Need This?

In Germany, § 5 DDG (formerly TMG) requires almost every website to have an “Impressum” (Legal Notice). It’s not just for businesses; even a hobby blog can be considered “business-like” if you have affiliate links or just a general “permanence.”

The catch: You have to provide a physical address where you can be reached. For many (including me), putting a private home address on the public internet is a huge “no-go.”

Step 1: Getting a c/o Address

You have a few options to avoid using your home address:

  1. Friends/Family: The “0€” route. You use their address with a c/o addition.
  2. Business Centers: Professional but usually expensive (30€+ / month).
  3. Dedicated Imprint Services: This is the sweet spot for bloggers.

I chose ihr-impressum.de. It’s affordable, provides a legally “ladungsfähige Anschrift” (a summons-ready address), and they handle the mail for you. But there are many others offering same/similar service to comparable prices.

Ready to Use
A major benefit of these services is that they usually provide a template or example legal notice. You can use these immediately with minimal tweaks, as the address and required legal disclosures are already perfectly aligned with their service.

Step 1.5: Phone and Email (The Digital Side)

Legal compliance doesn’t stop at a physical address. According to § 5 DDG, you also need to provide a way for “fast electronic contact” and “direct communication.” This means:

  1. A Phone Number: To avoid giving out my private mobile number, I reactivated my old Sipgate VoIP account. It’s perfect because it’s not tied to a physical landline, and people can leave a message on the voicemail which then gets forwarded to my email.
  2. A Dedicated Email: I created a clean, professional address: webmaster@reitenba.ch. This keeps my personal inbox separate from any legal or administrative inquiries.

Note: If you use a VoIP service or a redirect, make sure the “direct communication” aspect is still somewhat given (e.g., check your voicemails regularly!).

A note on Bot-Protection: In my public imprint page, I display the address as webmaster [at] reitenba.ch. While humans understand this immediately, it makes it significantly harder for simple scraper bots to harvest the address for spam lists.

Step 2: Generating the Privacy Policy

Privacy policies are a moving target. Instead of writing one yourself, use a generator. I used the free version of e-recht24.de.

Pro-tip: Even if you think you don’t track anything, remember that:

  • GitHub Pages logs IP addresses.
  • GoatCounter (if you use it) needs a mention.
  • Google Fonts/CDNs often leak data to third parties (try to host them locally, or disable those).

Step 3: Implementing Multilingual Support in Hugo

If your blog is bilingual (like mine), you need these pages in both languages. Here is the technical setup I used.

The File Structure

Hugo uses a suffix system for languages. For my setup, I created:

  • content/impressum.md (German)
  • content/imprint.en.md (English)
  • content/datenschutz.md (German)
  • content/privacy.en.md (English)
Konfiguration der Standardsprache
In meiner Hugo-Instanz ist Deutsch als Standardsprache festgelegt. Daher benötigen die deutschen Dateien kein sprachabhängiges Suffix (wie .de.md), während die englischen Versionen zwingend das Suffix .en.md benötigen, um korrekt zugeordnet zu werden.

I wanted the footer to automatically link to the correct language version, therfore I built a “Partial Fallback” system.

In layouts/partials/footer.html, I added a call to a custom legal partial:

<div class="footer-line">
    {{- $legalPath := printf "custom/legal-%s.html" .Lang -}}
    {{- if templates.Exists (printf "_partials/%s" $legalPath) -}}
        {{- partial $legalPath . -}}
    {{- else -}}
        {{- /* Fallback to German */ -}}
        {{- partial "custom/legal-de.html" . -}}
    {{- end -}}
</div>

Then, I created two small HTML snippets in layouts/_partials/custom/:

legal-de.html

<span><a href="/impressum/">Impressum</a></span>
&nbsp;|&nbsp;
<span><a href="/datenschutz/">Datenschutz</a></span>

legal-en.html

<span><a href="/en/imprint/">Imprint</a></span>
&nbsp;|&nbsp;
<span><a href="/en/privacy/">Privacy Policy</a></span>

Step 4: Stripping Third-Party CDNs

To stay GDPR-compliant “by design,” I disabled jsDeliver in the hugo.toml. This ensures that assets like Font Awesome are loaded directly from my GitHub Pages server, meaning no user IPs are leaked to other external networks.

  # CDN config for third-party library files
  [params.cdn]
    data = "my_local.yml"

And create an empty: assets/data/cdn/my_local.yml to override the default.

Connection Test
Web developers should always use their browser’s Network Analysis Tools (F12) after making such changes. Check exactly where the browser connects when loading your pages to ensure that no CDNs or other external sources are being loaded.

Conclusion

Disclaimer
I am not a lawyer, and this post does not constitute legal advice. The legal requirements for websites (especially in Germany) are complex and subject to change. The information provided here reflects my personal experience and recommendations at the time of writing. For legally binding information, please consult a qualified legal professional.

Legal compliance doesn’t have to be expensive or ugly. With a service like ihr-impressum.de, a generator like e-recht24.de, and some Hugo logic, you can protect your privacy and your readers’ data while looking professional.

Now, back to actual blogging!