# 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 `<link rel="canonical" href="https://gabrielkaszewski.dev">` into every page's `<head>`, 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`).
