feat(content): add a contact page and a news section #132

Sammanfogat
supernaut sammanfogade 4 incheckningar från feat/contact-and-news in i main 2026-08-01 13:51:57 +00:00
Ägare

Stacked on #131 — please merge that first; this branches from it.

Contact page

The site had no contact page. info@gitborg.se appeared only inside legal prose, and several
surfaces said "email us" without saying what for or what would happen. The page routes by reason:
the service and your account, billing, privacy and data requests, security problems, bugs, and press.

Two deliberate choices:

  • Only info@ and finance@ are published, because those are the addresses that exist.
    Publishing an unread address is the same class of error as offering a document nobody holds. My
    suggested next aliases, in order, are security@ (with security.txt pointed at it), then
    abuse@, then privacy@ — but privacy@ only once a DSAR routine exists, or it repeats the
    mistake in a new place.
  • No contact form. It would inherit the failure mode from web#115, where a wrong-account API key
    broke all portal mail silently with nothing logged. A form built on that path means a user believes
    they contacted you when they did not, whereas a mailto: fails visibly in their own client. Worth
    revisiting once web#115 and #116 are fixed.

Two categories are routed somewhere better than email: sign-up link problems to the self-service
resend, and non-security bugs to the issue tracker where others can see and follow them.

News section

A third content collection, and the only dated one, so the index sorts newest-first rather than by an
explicit order. Four posts: a launch announcement plus three drawn from work that genuinely
shipped — open registration, Git LFS inside the shared quota, and weekly restore-verified backups.
The dates are the real shipping dates, not invented history.

The launch post is dated 2026-08-01; change it if you announce on a different day.

Sitemap — a pre-existing gap this fixes

@astrojs/sitemap cannot enumerate an SSR [slug] route, so every guide was already missing from
the sitemap
: a real build produced /docs/ but not /docs/renovate/. That predates this branch and
would have silently swallowed the two new guides in #131 too.

customPages is now derived from the content directories rather than a hardcoded list, so a new guide
or post is included the moment its markdown lands. Verified against a real build — all four guides and
all four posts now appear in both locales.

One thing I got wrong, in case it recurs

I first named the Swedish news files with Swedish slugs, which produced /en/news/bitborg-ar-oppet/.
That breaks the matching-filename pairing the collections rely on, and it breaks the language switcher,
since counterpartPath only strips and adds the /en prefix and cannot translate a path segment.
Slugs are now English and identical across locales, per the URL rule in CLAUDE.md. The build is what
surfaced it.

Checks

pnpm check clean (the only remaining errors are in the gitignored coverage/ artefact directory,
untracked and invisible to CI), mdlint 0 issues, eslint/stylelint clean, language detector clean
across all changed files, and pnpm build succeeds.

**Stacked on #131** — please merge that first; this branches from it. ## Contact page The site had no contact page. `info@gitborg.se` appeared only inside legal prose, and several surfaces said "email us" without saying what for or what would happen. The page routes by reason: the service and your account, billing, privacy and data requests, security problems, bugs, and press. Two deliberate choices: - **Only `info@` and `finance@` are published**, because those are the addresses that exist. Publishing an unread address is the same class of error as offering a document nobody holds. My suggested next aliases, in order, are `security@` (with `security.txt` pointed at it), then `abuse@`, then `privacy@` — but `privacy@` only once a DSAR routine exists, or it repeats the mistake in a new place. - **No contact form.** It would inherit the failure mode from web#115, where a wrong-account API key broke all portal mail silently with nothing logged. A form built on that path means a user believes they contacted you when they did not, whereas a `mailto:` fails visibly in their own client. Worth revisiting once web#115 and #116 are fixed. Two categories are routed somewhere better than email: sign-up link problems to the self-service resend, and non-security bugs to the issue tracker where others can see and follow them. ## News section A third content collection, and the only dated one, so the index sorts newest-first rather than by an explicit `order`. Four posts: a launch announcement plus three drawn from work that genuinely shipped — open registration, Git LFS inside the shared quota, and weekly restore-verified backups. The dates are the real shipping dates, not invented history. The launch post is dated 2026-08-01; change it if you announce on a different day. ## Sitemap — a pre-existing gap this fixes `@astrojs/sitemap` cannot enumerate an SSR `[slug]` route, so **every guide was already missing from the sitemap**: a real build produced `/docs/` but not `/docs/renovate/`. That predates this branch and would have silently swallowed the two new guides in #131 too. `customPages` is now derived from the content directories rather than a hardcoded list, so a new guide or post is included the moment its markdown lands. Verified against a real build — all four guides and all four posts now appear in both locales. ## One thing I got wrong, in case it recurs I first named the Swedish news files with Swedish slugs, which produced `/en/news/bitborg-ar-oppet/`. That breaks the matching-filename pairing the collections rely on, and it breaks the language switcher, since `counterpartPath` only strips and adds the `/en` prefix and cannot translate a path segment. Slugs are now English and identical across locales, per the URL rule in CLAUDE.md. The build is what surfaced it. ## Checks `pnpm check` clean (the only remaining errors are in the gitignored `coverage/` artefact directory, untracked and invisible to CI), `mdlint` 0 issues, eslint/stylelint clean, language detector clean across all changed files, and `pnpm build` succeeds.
supernaut lade till 1 incheckning 2026-08-01 09:01:01 +00:00
feat(content): add a contact page and a news section
En del kontroller misslyckades
ci / ci (pull_request) Failing after 42s
4a5f896163
**Contact page.** The site had no contact page — `info@gitborg.se` appeared only
inside legal prose, and several places said "email us" without saying what for
or what happens next. The page routes by reason: the service and your account,
billing, privacy and data requests, security problems, bugs, and press.

Only `info@` and `finance@` are published, because those are the addresses that
exist. Publishing an address nobody reads is the same failure as offering a
document nobody holds. It also sets expectations honestly — a small operation,
no promised response time — and sends two categories somewhere better than
email: sign-up link problems to the self-service resend, and non-security bugs
to the issue tracker where others can see and follow them.

The security section asks people not to open a public issue for anything
exploitable, and points at the security.txt added earlier.

**News section.** A third content collection, the only dated one, so the index
sorts newest-first rather than by an explicit `order`. Four posts: a launch
announcement, plus three drawn from work that genuinely shipped — open
registration, Git LFS inside the shared quota, and weekly restore-verified
backups. Dates are the real shipping dates.

Slugs are English and identical across locales, per the URL rule in CLAUDE.md.
Worth stating because I got this wrong first: naming the Swedish files with
Swedish slugs produced `/en/news/gitborg-ar-oppet/`, which breaks both the
matching-filename pairing and the language switcher, since `counterpartPath`
only strips and adds the `/en` prefix.

**Sitemap.** `@astrojs/sitemap` cannot enumerate an SSR `[slug]` route, so every
guide was silently missing — a built sitemap contained `/docs/` but not
`/docs/renovate/`. `customPages` is now derived from the content directories, so
a new guide or post appears the moment its markdown lands, with no list to keep
in sync. Verified against a real build: all four guides and all four posts are
present in both locales.

Navigation: News joins the main nav; a second footer group carries About, News
and Contact alongside the existing legal links.
supernaut ändrade målgrenen från feat/launch-content till main2026-08-01 11:53:49 +00:00
supernaut tvångsskickade feat/contact-and-news från 4a5f896163
En del kontroller misslyckades
ci / ci (pull_request) Failing after 42s
till 1d5be55d87
Alla kontroller lyckades
ci / ci (pull_request) Successful in 1m13s
2026-08-01 12:05:40 +00:00
Jämför
supernaut lade till 1 incheckning 2026-08-01 13:37:53 +00:00
feat: adjust language and news
Alla kontroller lyckades
ci / ci (pull_request) Successful in 1m11s
51afc7e159
supernaut lade till 1 incheckning 2026-08-01 13:48:41 +00:00
feat: centralize news slugs
Alla kontroller lyckades
ci / ci (pull_request) Successful in 1m19s
083e765df3
supernaut sammanfogade incheckning 692e18fea3 till main 2026-08-01 13:51:57 +00:00
supernaut tog bort grenen feat/contact-and-news 2026-08-01 13:51:58 +00:00
supernaut refererade denna ändringsförfrågan från en incheckning 2026-08-01 13:51:58 +00:00
supernaut refererade denna ändringsförfrågan från en incheckning 2026-08-03 09:41:50 +00:00
Logga in för att delta i denna konversation.
Inga granskare
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Förfallodatumet är ogiltigt eller utanför gränserna. Använd formatet "åååå-mm-dd".

Inget förfallodatum satt.

Beroenden

Inga beroenden satta

Referens
bitborg/bitborg-web!132
Ingen beskrivning angiven.