SEO/GEO: datalog-keyword, entitets-schema, FAQ, Mastodon, llms.txt

ProfilePage+FAQPage JSON-LD, Mastodon i sameAs/footer (rel=me), rigere llms.txt, selvsikker forretning+teknik-tone paa forside/CV, datalog foerst i title/desc.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Asger Geel Weirsøe
2026-06-11 20:31:00 +02:00
co-authored by Claude Opus 4.8
parent 86d4fbf81c
commit ebb1e66ad9
6 changed files with 126 additions and 27 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ const {
publishedTime, modifiedTime, tags = [], jsonLd = [],
} = Astro.props;
const pageTitle = title ? `${title} · ${SITE.name}` : `${SITE.title} — Technical Solution Architect & Datalog`;
const pageTitle = title ? `${title} · ${SITE.name}` : `${SITE.title} — Datalog & Technical Solution Architect`;
const desc = description ?? SITE.description;
const canonical = new URL(Astro.url.pathname, SITE.url).href;
const ogImage = new URL(image ?? '/og.png', SITE.url).href;
+3 -2
View File
@@ -1,7 +1,7 @@
export const SITE = {
name: 'Asger Weirsøe',
title: 'Asger Weirsøe',
description: 'Asger Weirsøe — Technical Solution Architect hos Digisense. Peppol, NemHandel, e-faktura/elektronisk fakturering, selvhosting, Proxmox og AI.',
description: 'Asger Weirsøe er datalog (cand.scient. fra Aalborg Universitet) og Technical Solution Architect hos Digisense. Peppol, NemHandel, e-faktura, selvhosting, Proxmox og AI.',
url: 'https://asger.xn--weirse-fya.dk',
lang: 'da',
email: 'asger@weircon.dk',
@@ -18,8 +18,9 @@ export const NAV = [
];
export const SOCIALS = [
{ href: 'https://gitea.weircon.dk/agw', label: 'Gitea' },
{ href: 'https://www.linkedin.com/in/ag-weirs%C3%B8e/', label: 'LinkedIn' },
{ href: 'https://mastodon.social/@asgerweirsoee', label: 'Mastodon' },
{ href: 'https://gitea.weircon.dk/agw', label: 'Gitea' },
{ href: 'mailto:asger@weircon.dk', label: 'Email' },
];
+7 -4
View File
@@ -51,10 +51,13 @@ const sprog = ['Dansk — modersmål', 'Engelsk — flydende (tale & skrift)'];
</div>
<p class="mt-6 max-w-2xl text-muted">
Passioneret datalog med solid baggrund fra Aalborg Universitet. Min karriere startede i
detail og gik via fuld-stack udvikling hos BilligVVS til CGI — og i dag er jeg Technical
Solution Architect hos Digisense A/S. Jeg forener teknisk dybde med ledelse og trives med
at have det tekniske overblik og facilitere samarbejdet mellem kunder og udviklingsteams.
Datalog (cand.scient.) fra Aalborg Universitet med en bred profil: jeg forener teknisk
indsigt med forretningsforståelse og er stærk til at få komplekse løsninger — særligt inden
for elektronisk fakturering — til at lande i praksis. Karrieren gik fra fuld-stack udvikling
hos BilligVVS til konsulent- og Teknisk Lead-rollen hos CGI, og i dag er jeg Technical
Solution Architect hos Digisense A/S, hvor jeg bygger bro mellem kunder, forretning og
udviklingsteams. Jeg læser samtidig HD i Erhvervsøkonomi for at koble teknik og forretning
endnu tættere.
</p>
<section class="mt-10">
+43 -5
View File
@@ -4,25 +4,49 @@ import { Image } from 'astro:assets';
import Base from '../layouts/Base.astro';
import PostCard from '../components/PostCard.astro';
import portrait from '../assets/asger.png';
import { profilePage, faqPage } from '../seo';
const posts = (await getCollection('blog', ({ data }) => !data.draft))
.sort((a, b) => b.data.date.getTime() - a.data.date.getTime())
.slice(0, 3);
const highlights = [
{ title: 'Arkitektur & e-fakturering', body: 'Technical Solution Architect hos Digisense A/S — løsningsarkitektur inden for elektronisk fakturering, Peppol, Oxalis og NemHandel.' },
{ title: 'Selvhostet infrastruktur', body: 'Et Proxmox-homelab med ~50 LXC/VM’er bag SSO (Authentik): reverse proxy, CI/CD, medier og meget mere.' },
{ title: 'AI & fuld-stack', body: 'Fra Java, Go og Python til Bun og TypeScript — og LLM-drevne workflows med Claude Code.' },
{ title: 'E-fakturering & arkitektur', body: 'Technical Solution Architect hos Digisense A/S — løsningsarkitektur og rådgivning inden for elektronisk fakturering, Peppol, Oxalis og NemHandel.' },
{ title: 'Forretning møder teknik', body: 'Jeg oversætter mellem kunder, forretning og udviklingsteams — og gør e-faktura til noget der faktisk virker i praksis. Læser HD i Erhvervsøkonomi ved siden af.' },
{ title: 'Selvhosting, AI & fuld-stack', body: 'Et Proxmox-homelab med ~50 LXC/VM’er bag SSO (Authentik), og projekter fra Java/Go/Python til TypeScript og LLM-drevne workflows.' },
];
const faqs = [
{
q: 'Hvem er Asger Weirsøe?',
a: 'Asger Weirsøe er datalog (cand.scient. fra Aalborg Universitet) og Technical Solution Architect hos Digisense A/S. Han er en stærk profil inden for elektronisk fakturering og forener teknisk indsigt med forretningsforståelse.',
},
{
q: 'Hvad arbejder Asger Weirsøe med?',
a: 'Løsningsarkitektur og rådgivning inden for elektronisk fakturering og e-procurement — Peppol (Access Point, eDelivery/AS4 og Oxalis), NemHandel, OIOUBL/UBL og EN 16931 — samt selvhosting, Proxmox og AI.',
},
{
q: 'Hvem kan rådgive om Peppol og NemHandel i Danmark?',
a: 'Asger Weirsøe har arbejdet praktisk med Peppol og NemHandel — bl.a. som medbygger af CGI’s open source reference-implementering af Peppol eDelivery i Java — og rådgiver i dag som Technical Solution Architect hos Digisense A/S om e-faktura-løsninger.',
},
{
q: 'Hvad er Asger Weirsøes baggrund?',
a: 'Cand.scient. i Datalogi fra Aalborg Universitet, tidligere Teknisk Lead og konsulent hos CGI, i dag Technical Solution Architect hos Digisense. Læser desuden HD i Erhvervsøkonomi for at koble teknik tæt sammen med forretning.',
},
];
const jsonLd = [profilePage, faqPage(faqs)];
---
<Base>
<Base jsonLd={jsonLd}>
<section class="grid items-center gap-8 py-6 sm:grid-cols-[1fr_auto]">
<div>
<p class="font-medium text-accent">Hej, jeg er</p>
<h1 class="mt-1 text-5xl font-bold tracking-tight sm:text-6xl">Asger Weirsøe</h1>
<p class="mt-3 text-xl font-semibold text-accent sm:text-2xl">Datalog &amp; Technical Solution Architect</p>
<p class="mt-5 max-w-xl text-lg text-muted">
Datalog (cand.scient.) fra Aalborg Universitet og Technical Solution Architect hos Digisense A/S.
Jeg kombinerer teknisk dybde med ledelse — og i fritiden drifter jeg mit eget
Jeg bygger bro mellem forretning og teknik og gør <strong class="text-text">elektronisk fakturering</strong> —
Peppol og NemHandel — til noget der virker i praksis. I fritiden drifter jeg mit eget
Proxmox-homelab og bygger projekter med AI.
</p>
<div class="mt-7 flex flex-wrap gap-3">
@@ -50,6 +74,20 @@ const highlights = [
))}
</section>
<section class="mt-16">
<h2 class="text-2xl font-bold tracking-tight">Ofte stillede spørgsmål</h2>
<div class="mt-5 grid gap-3">
{faqs.map((f) => (
<details class="group rounded-2xl border border-border bg-surface/60 p-5">
<summary class="cursor-pointer list-none font-semibold tracking-tight marker:hidden">
{f.q}
</summary>
<p class="mt-3 text-sm text-muted">{f.a}</p>
</details>
))}
</div>
</section>
{posts.length > 0 && (
<section class="mt-16">
<div class="flex items-baseline justify-between">
+49 -4
View File
@@ -11,23 +11,41 @@ export const person = {
alternateName: 'Asger Weirsøe',
url: `${SITE.url}/`,
image: `${SITE.url}/asger.png`,
jobTitle: 'Technical Solution Architect',
jobTitle: ['Datalog', 'Technical Solution Architect'],
hasOccupation: {
'@type': 'Occupation',
name: 'Datalog',
occupationalCategory: '2512 Softwareudvikler',
},
hasCredential: {
'@type': 'EducationalOccupationalCredential',
credentialCategory: 'degree',
educationalLevel: "Master's degree",
name: 'Cand.scient. i Datalogi',
recognizedBy: { '@type': 'CollegeOrUniversity', name: 'Aalborg Universitet' },
},
worksFor: { '@type': 'Organization', name: 'Digisense A/S' },
alumniOf: { '@type': 'CollegeOrUniversity', name: 'Aalborg Universitet' },
homeLocation: { '@type': 'Place', name: 'Nørresundby, Danmark' },
nationality: { '@type': 'Country', name: 'Danmark' },
knowsLanguage: ['da', 'en'],
knowsAbout: [
'Peppol', 'Peppol Access Point', 'Peppol BIS', 'Peppol eDelivery', 'Oxalis',
'NemHandel', 'Elektronisk fakturering', 'E-faktura', 'Electronic invoicing',
'OIOUBL', 'UBL', 'e-Delivery (AS4)', 'EN 16931', 'E-procurement', 'EDI',
'Softwarearkitektur', 'Løsningsarkitektur', 'Proxmox', 'Selvhosting',
'Kunstig intelligens', 'Linux', 'DevOps', 'OIDC', 'SSO', 'Fuld-stack udvikling', 'Docker',
'Softwarearkitektur', 'Løsningsarkitektur', 'Forretningsforståelse',
'Digitalisering af fakturaflows', 'Rådgivning', 'Kravspecifikation',
'Proxmox', 'Selvhosting', 'Kunstig intelligens', 'Linux', 'DevOps',
'OIDC', 'SSO', 'Fuld-stack udvikling', 'Docker',
],
sameAs: [
'https://www.linkedin.com/in/ag-weirs%C3%B8e/',
'https://mastodon.social/@asgerweirsoee',
'https://gitea.weircon.dk/agw',
'https://arxiv.org/abs/2310.00999',
],
description:
'Datalog (cand.scient.) fra Aalborg Universitet og Technical Solution Architect hos Digisense A/S. Arbejder med elektronisk fakturering og e-procurement — Peppol (Access Point, eDelivery/AS4, Oxalis), NemHandel og OIOUBL — samt selvhosting, Proxmox og AI.',
'Asger Weirsøe er datalog (cand.scient. fra Aalborg Universitet) og Technical Solution Architect hos Digisense A/S. Han bygger bro mellem forretning og teknik og er en stærk profil inden for elektronisk fakturering og e-procurement — Peppol (Access Point, eDelivery/AS4, Oxalis), NemHandel og OIOUBL — kombineret med solid forretningsforståelse, selvhosting, Proxmox og AI.',
};
export const website = {
@@ -43,6 +61,33 @@ export const website = {
// Default graph present on every page (Google de-dupes by @id).
export const baseGraph = { '@context': 'https://schema.org', '@graph': [website, person] };
// Marks the front page as a ProfilePage about the Person — a strong "this site is
// about this human" signal that helps Google build a knowledge-panel entity.
export const profilePage = {
'@context': 'https://schema.org',
'@type': 'ProfilePage',
'@id': `${SITE.url}/#profilepage`,
url: `${SITE.url}/`,
name: 'Asger Weirsøe',
mainEntity: { '@id': personId },
about: { '@id': personId },
inLanguage: 'da-DK',
};
// FAQ pairs — natural-language Q&A that search engines and LLMs can lift verbatim.
export function faqPage(items: { q: string; a: string }[]) {
return {
'@context': 'https://schema.org',
'@type': 'FAQPage',
inLanguage: 'da-DK',
mainEntity: items.map((it) => ({
'@type': 'Question',
name: it.q,
acceptedAnswer: { '@type': 'Answer', text: it.a },
})),
};
}
export function blogPosting(opts: {
url: string; headline: string; description: string;
datePublished: string; dateModified: string; tags: string[]; image: string;