From f9f26dc58480bf887e5a29eeadfc60c079442589 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sat, 16 May 2026 13:59:48 +0200 Subject: [PATCH] docs: add dual-domain design spec --- .../specs/2026-05-16-dual-domain-design.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-16-dual-domain-design.md diff --git a/docs/superpowers/specs/2026-05-16-dual-domain-design.md b/docs/superpowers/specs/2026-05-16-dual-domain-design.md new file mode 100644 index 0000000..19d2df7 --- /dev/null +++ b/docs/superpowers/specs/2026-05-16-dual-domain-design.md @@ -0,0 +1,38 @@ +# Dual-Domain Support + +**Date:** 2026-05-16 +**Status:** Approved + +## Goal + +Serve the portfolio under both `gabrielkaszewski.dev` and `gabrielkaszewski.pl` with identical content. The `.dev` domain is canonical for SEO. + +## Changes + +### 1. `compose.yml` — Traefik router rule + +Extend the `Host()` rule to accept both domains and cover both with TLS: + +```yaml +- "traefik.http.routers.gabrielkaszewski.rule=Host(`gabrielkaszewski.dev`) || Host(`gabrielkaszewski.pl`)" +- "traefik.http.routers.gabrielkaszewski.entrypoints=websecure" +- "traefik.http.routers.gabrielkaszewski.tls.certresolver=letsencrypt" +``` + +### 2. `app/layout.tsx` — canonical metadata + +Add `alternates.canonical` to the exported `metadata` object: + +```ts +alternates: { + canonical: "https://gabrielkaszewski.dev", +}, +``` + +This injects `` into every page's ``, telling search engines the `.dev` domain is authoritative. + +## Out of scope + +- No redirects — `.pl` serves content directly. +- No per-domain content differences. +- No changes to OpenGraph or JSON-LD (already hardcoded to `.dev`).