+1
-1
@@ -20,7 +20,7 @@
|
|||||||
hændelses- og eskaleringsprocedurer, evaluering og hændelsesregister
|
hændelses- og eskaleringsprocedurer, evaluering og hændelsesregister
|
||||||
* Selvhosting: Proxmox-homelab med ~50 LXC/VM'er bag egen SSO (Authentik)
|
* Selvhosting: Proxmox-homelab med ~50 LXC/VM'er bag egen SSO (Authentik)
|
||||||
* Fuld-stack: Java, Go, Python, TypeScript og LLM-drevne workflows
|
* Fuld-stack: Java, Go, Python, TypeScript og LLM-drevne workflows
|
||||||
* Licenseret radioamatør (B-licens, OZ0AGW).. protokoller uden kabler
|
* Licenseret radioamatør (B-licens, OZ0AGW)
|
||||||
* Jagttegn (2020) og stor naturinteresse.. fugle, planter og tidlige morgener
|
* Jagttegn (2020) og stor naturinteresse.. fugle, planter og tidlige morgener
|
||||||
|
|
||||||
ERFARING UDDANNELSE
|
ERFARING UDDANNELSE
|
||||||
|
|||||||
+1
-4
@@ -9,7 +9,4 @@
|
|||||||
Stak: Astro + Bun + Tailwind, statisk output
|
Stak: Astro + Bun + Tailwind, statisk output
|
||||||
Hosting: egen Proxmox-infrastruktur (LXC), nginx bag NPMplus
|
Hosting: egen Proxmox-infrastruktur (LXC), nginx bag NPMplus
|
||||||
CI/CD: self-hosted Gitea Actions
|
CI/CD: self-hosted Gitea Actions
|
||||||
Ingen JS-frameworks. Ingen cookies-bannere. Bare HTML der opfører sig ordentligt.
|
Ingen JS-frameworks.
|
||||||
|
|
||||||
/* TAK */
|
|
||||||
Til alle der stadig læser humans.txt. I er de ægte.
|
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ const { title, description, image, type, publishedTime, modifiedTime, tags, json
|
|||||||
/ ___ \\ ___) | |_| | |___| _ <
|
/ ___ \\ ___) | |_| | |___| _ <
|
||||||
/_/ \\_\\____/ \\____|_____|_| \\_\\
|
/_/ \\_\\____/ \\____|_____|_| \\_\\
|
||||||
|
|
||||||
Hej, kildekode-læser. Du er min slags.
|
Statisk Astro, self-hosted på Proxmox.
|
||||||
Statisk Astro, ingen frameworks, self-hosted på Proxmox.
|
|
||||||
Prøv Cmd/Ctrl+K.. eller den gamle kode: op op ned ned venstre højre venstre højre B A.
|
Prøv Cmd/Ctrl+K.. eller den gamle kode: op op ned ned venstre højre venstre højre B A.
|
||||||
-->`} />
|
-->`} />
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import Chat from '../components/Chat.astro';
|
|||||||
<p class="mt-4 max-w-2xl text-muted">
|
<p class="mt-4 max-w-2xl text-muted">
|
||||||
En lille chat med <strong class="text-text">Claude</strong> fra Anthropic, der har læst mit CV og denne
|
En lille chat med <strong class="text-text">Claude</strong> fra Anthropic, der har læst mit CV og denne
|
||||||
side og svarer på spørgsmål om mig.. fx <em>“hvad har Asger lavet med Peppol?”</em> eller
|
side og svarer på spørgsmål om mig.. fx <em>“hvad har Asger lavet med Peppol?”</em> eller
|
||||||
<em>“hvilken stack kører hans homelab?”</em>. Den ved kun noget om mig.. alt andet må du google selv.
|
<em>“hvilken stack kører hans homelab?”</em>. Den svarer kun på spørgsmål om mig.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<Chat />
|
<Chat />
|
||||||
|
|||||||
@@ -40,11 +40,10 @@ const stack = [
|
|||||||
<p class="mt-3 max-w-2xl text-sm text-muted">
|
<p class="mt-3 max-w-2xl text-sm text-muted">
|
||||||
Fundet noget der ser forkert ud? Skriv til <a class="text-accent hover:underline" href="mailto:asger@weirsoe.dk">asger@weirsoe.dk</a>.
|
Fundet noget der ser forkert ud? Skriv til <a class="text-accent hover:underline" href="mailto:asger@weirsoe.dk">asger@weirsoe.dk</a>.
|
||||||
Der ligger også en <a class="text-accent hover:underline" href="/.well-known/security.txt">security.txt</a> (RFC 9116).
|
Der ligger også en <a class="text-accent hover:underline" href="/.well-known/security.txt">security.txt</a> (RFC 9116).
|
||||||
Og ja, der er en <a class="text-accent hover:underline" href="/humans.txt">humans.txt</a> til de nysgerrige.
|
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<p class="mt-10 text-sm text-muted">
|
<p class="mt-10 text-sm text-muted">
|
||||||
Hvad der ellers kører i racket: se <a class="text-accent hover:underline" href="/uses">uses</a>.
|
Se også <a class="text-accent hover:underline" href="/uses">uses</a>.
|
||||||
</p>
|
</p>
|
||||||
</Base>
|
</Base>
|
||||||
|
|||||||
+1
-2
@@ -228,8 +228,7 @@ const sprog = ['Dansk (modersmål)', 'Engelsk (flydende i tale og skrift)'];
|
|||||||
</p>
|
</p>
|
||||||
<p class="mt-3 text-sm text-muted">
|
<p class="mt-3 text-sm text-muted">
|
||||||
Jeg er desuden licenseret radioamatør med <strong class="text-text">B-licens</strong> og kaldesignalet
|
Jeg er desuden licenseret radioamatør med <strong class="text-text">B-licens</strong> og kaldesignalet
|
||||||
<strong class="text-text">OZ0AGW</strong>.. samme fascination af protokoller, rækkevidde og
|
<strong class="text-text">OZ0AGW</strong>.
|
||||||
infrastruktur som til daglig, bare uden kabler.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import Chat from '../../components/Chat.astro';
|
|||||||
<p class="mt-4 max-w-2xl text-muted">
|
<p class="mt-4 max-w-2xl text-muted">
|
||||||
A small chat with <strong class="text-text">Claude</strong> from Anthropic. It has read my CV and this
|
A small chat with <strong class="text-text">Claude</strong> from Anthropic. It has read my CV and this
|
||||||
site and answers questions about me.. try <em>“what incident response experience does Asger have?”</em>
|
site and answers questions about me.. try <em>“what incident response experience does Asger have?”</em>
|
||||||
or <em>“what runs in his homelab?”</em>. It only knows about me, so for anything else you are on your own.
|
or <em>“what runs in his homelab?”</em>. It only answers questions about me.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<Chat lang="en" />
|
<Chat lang="en" />
|
||||||
|
|||||||
@@ -172,8 +172,8 @@ const skills = [
|
|||||||
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Projects and interests</h2>
|
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Projects and interests</h2>
|
||||||
<p class="mt-4 text-sm text-muted">
|
<p class="mt-4 text-sm text-muted">
|
||||||
I run a self-hosted Proxmox environment with around 50 containers and virtual machines,
|
I run a self-hosted Proxmox environment with around 50 containers and virtual machines,
|
||||||
single sign-on through Authentik, central logging and monitoring. My family uses it every day,
|
single sign-on through Authentik, central logging and monitoring. My family uses it every day.
|
||||||
which makes for honest incident reviews. I have contributed to qutebrowser and Stregsystemet,
|
I have contributed to qutebrowser and Stregsystemet,
|
||||||
and I am a licensed radio amateur (call sign <strong class="text-text">OZ0AGW</strong>).
|
and I am a licensed radio amateur (call sign <strong class="text-text">OZ0AGW</strong>).
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ const faqs = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
q: 'Is Asger Weirsøe a radio amateur?',
|
q: 'Is Asger Weirsøe a radio amateur?',
|
||||||
a: 'Yes. I hold a category B licence with the call sign OZ0AGW. It is the analogue version of what I do at work: protocols, range and infrastructure, just without the cables.',
|
a: 'Yes. I hold a category B licence with the call sign OZ0AGW.',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
---
|
---
|
||||||
@@ -71,8 +71,8 @@ const faqs = [
|
|||||||
<h2 class="text-2xl font-bold tracking-tight">More than a CV</h2>
|
<h2 class="text-2xl font-bold tracking-tight">More than a CV</h2>
|
||||||
<div class="mt-5 grid gap-4 sm:grid-cols-2">
|
<div class="mt-5 grid gap-4 sm:grid-cols-2">
|
||||||
{[
|
{[
|
||||||
{ href: '/en/chat', title: 'Ask my CV', desc: 'A small chat with Claude that has read my CV and answers questions about me. Try it.' },
|
{ href: '/en/chat', title: 'Ask my CV', desc: 'A small chat with Claude that has read my CV and answers questions about me.' },
|
||||||
{ href: '/status', title: 'Homelab status', desc: 'Live status for the public parts of my homelab. Self-hosted, of course.' },
|
{ href: '/status', title: 'Homelab status', desc: 'Live status for the public parts of my homelab.' },
|
||||||
{ href: '/ubl', title: 'UBL check (Danish)', desc: 'Drop in an e-invoice and get its profile, syntax and EN 16931 status decoded. It all runs in the browser, the file never leaves your machine.' },
|
{ href: '/ubl', title: 'UBL check (Danish)', desc: 'Drop in an e-invoice and get its profile, syntax and EN 16931 status decoded. It all runs in the browser, the file never leaves your machine.' },
|
||||||
{ href: '/en/projects', title: 'Projects', desc: 'Tools I maintain and publish on the AUR, Homebrew and Scoop.' },
|
{ href: '/en/projects', title: 'Projects', desc: 'Tools I maintain and publish on the AUR, Homebrew and Scoop.' },
|
||||||
].map((c) => (
|
].map((c) => (
|
||||||
@@ -82,7 +82,7 @@ const faqs = [
|
|||||||
</a>
|
</a>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p class="mt-3 text-xs text-muted/80">Pro tip: press <kbd class="wt-kbd">Ctrl/⌘ K</kbd> to jump anywhere, or run <code class="rounded bg-surface-2 px-1.5 py-0.5">curl asger.weirsøe.dk</code> in a terminal.</p>
|
<p class="mt-3 text-xs text-muted/80">Press <kbd class="wt-kbd">Ctrl/⌘ K</kbd> to jump anywhere, or run <code class="rounded bg-surface-2 px-1.5 py-0.5">curl asger.weirsøe.dk</code> in a terminal.</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="mt-16">
|
<section class="mt-16">
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ const faqs = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
q: 'Er Asger Weirsøe radioamatør?',
|
q: 'Er Asger Weirsøe radioamatør?',
|
||||||
a: 'Ja. Jeg har B-licens og kaldesignalet OZ0AGW, og jeg bestod radioamatørprøven lørdag den 18. maj 2024. Amatørradio er den analoge parallel til det jeg laver til daglig: protokoller, rækkevidde og infrastruktur, bare uden kabler.',
|
a: 'Ja. Jeg har B-licens og kaldesignalet OZ0AGW, og jeg bestod radioamatørprøven lørdag den 18. maj 2024.',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
q: 'Hvad er Asger Weirsøes baggrund?',
|
q: 'Hvad er Asger Weirsøes baggrund?',
|
||||||
@@ -83,8 +83,8 @@ const jsonLd = [profilePage, faqPage(faqs)];
|
|||||||
<div class="mt-5 grid gap-4 sm:grid-cols-2">
|
<div class="mt-5 grid gap-4 sm:grid-cols-2">
|
||||||
{[
|
{[
|
||||||
{ href: '/nemhandel', title: 'NemHandel-opslag', desc: 'Slå et CVR-nummer op og se om virksomheden er registreret i NemHandelsregisteret, og hvilke profilpakker den understøtter.' },
|
{ href: '/nemhandel', title: 'NemHandel-opslag', desc: 'Slå et CVR-nummer op og se om virksomheden er registreret i NemHandelsregisteret, og hvilke profilpakker den understøtter.' },
|
||||||
{ href: '/chat', title: 'Spørg mit CV', desc: 'En lille chat med Claude, der har læst mit CV og svarer på spørgsmål om mig. Prøv den af.' },
|
{ href: '/chat', title: 'Spørg mit CV', desc: 'En lille chat med Claude, der har læst mit CV og svarer på spørgsmål om mig.' },
|
||||||
{ href: '/status', title: 'Homelab-status', desc: 'Live driftsstatus for de offentlige dele af mit homelab. Self-hosted, selvfølgelig.' },
|
{ href: '/status', title: 'Homelab-status', desc: 'Live driftsstatus for de offentlige dele af mit homelab.' },
|
||||||
{ href: '/now', title: 'Now', desc: 'Hvad jeg roder med lige nu, plus et aktivitets-heatmap fra min egen Gitea.' },
|
{ href: '/now', title: 'Now', desc: 'Hvad jeg roder med lige nu, plus et aktivitets-heatmap fra min egen Gitea.' },
|
||||||
{ href: '/profiler', title: 'Profil-opslag', desc: 'Søgbart opslag over Nemhandel OIOUBL- og Peppol BIS/PINT-profiler: id\'er, dokumenter og typisk brug.' },
|
{ href: '/profiler', title: 'Profil-opslag', desc: 'Søgbart opslag over Nemhandel OIOUBL- og Peppol BIS/PINT-profiler: id\'er, dokumenter og typisk brug.' },
|
||||||
{ href: '/ubl', title: 'UBL-tjek', desc: 'Træk en faktura ind og få profil, syntaks og EN 16931-status afkodet. Alt sker i browseren, filen forlader aldrig din maskine.' },
|
{ href: '/ubl', title: 'UBL-tjek', desc: 'Træk en faktura ind og få profil, syntaks og EN 16931-status afkodet. Alt sker i browseren, filen forlader aldrig din maskine.' },
|
||||||
@@ -95,7 +95,7 @@ const jsonLd = [profilePage, faqPage(faqs)];
|
|||||||
</a>
|
</a>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p class="mt-3 text-xs text-muted/80">Pro-tip: tryk <kbd class="wt-kbd">Ctrl/⌘ K</kbd> og hop direkte til alt, eller <code class="rounded bg-surface-2 px-1.5 py-0.5">curl asger.weirsøe.dk</code> i en terminal.</p>
|
<p class="mt-3 text-xs text-muted/80">Tryk <kbd class="wt-kbd">Ctrl/⌘ K</kbd> og hop direkte til alt, eller <code class="rounded bg-surface-2 px-1.5 py-0.5">curl asger.weirsøe.dk</code> i en terminal.</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="mt-16">
|
<section class="mt-16">
|
||||||
|
|||||||
@@ -110,6 +110,6 @@ import Base from '../layouts/Base.astro';
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<p class="mt-10 text-xs text-muted/80">
|
<p class="mt-10 text-xs text-muted/80">
|
||||||
Til nørderne: API’et er frit tilgængeligt: <code class="rounded bg-surface-2 px-1.5 py-0.5">curl https://asger.weirsøe.dk/api/nemhandel/<cvr></code> (rate-limited).
|
API: <code class="rounded bg-surface-2 px-1.5 py-0.5">curl https://asger.weirsøe.dk/api/nemhandel/<cvr></code> (rate-limited).
|
||||||
</p>
|
</p>
|
||||||
</Base>
|
</Base>
|
||||||
|
|||||||
@@ -2,12 +2,11 @@
|
|||||||
import Base from '../layouts/Base.astro';
|
import Base from '../layouts/Base.astro';
|
||||||
const STATUS_URL = 'https://status.weircon.dk/status/weircon';
|
const STATUS_URL = 'https://status.weircon.dk/status/weircon';
|
||||||
---
|
---
|
||||||
<Base title="Status" description="Live driftsstatus for mit homelab.. self-hosted Uptime Kuma, selvfølgelig." noindex>
|
<Base title="Status" description="Live driftsstatus for mit homelab, målt med Uptime Kuma." noindex>
|
||||||
<h1 class="text-4xl font-bold tracking-tight">Status</h1>
|
<h1 class="text-4xl font-bold tracking-tight">Status</h1>
|
||||||
<p class="mt-4 max-w-2xl text-muted">
|
<p class="mt-4 max-w-2xl text-muted">
|
||||||
Live status for de offentlige dele af mit homelab, målt af en self-hosted
|
Live status for de offentlige dele af mit homelab, målt af en self-hosted
|
||||||
<a class="text-accent hover:underline" href="https://uptime.kuma.pet" target="_blank" rel="noopener">Uptime Kuma</a>.
|
<a class="text-accent hover:underline" href="https://uptime.kuma.pet" target="_blank" rel="noopener">Uptime Kuma</a>.
|
||||||
Når man drifter ~50 containere selv, er det rart at vide hvornår man har smadret noget.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="mt-8 wt-card wt-card--flush">
|
<div class="mt-8 wt-card wt-card--flush">
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ const sections = [
|
|||||||
{ name: 'NPMplus', note: 'Reverse proxy og TLS-terminering på kanten. Alt trafik ind går her igennem.' },
|
{ name: 'NPMplus', note: 'Reverse proxy og TLS-terminering på kanten. Alt trafik ind går her igennem.' },
|
||||||
{ name: 'Authentik', note: 'Self-hosted SSO (OIDC/LDAP). Én identitet til alle tjenester, bygget fra source.' },
|
{ name: 'Authentik', note: 'Self-hosted SSO (OIDC/LDAP). Én identitet til alle tjenester, bygget fra source.' },
|
||||||
{ name: 'Gitea + Gitea Actions', note: 'Egen git-hosting og CI/CD. Denne side deployes automatisk ved push.' },
|
{ name: 'Gitea + Gitea Actions', note: 'Egen git-hosting og CI/CD. Denne side deployes automatisk ved push.' },
|
||||||
{ name: 'MariaDB / Redis / PostgreSQL', note: 'Databaser som dedikerede containere, host-pinned brugere og det hele.' },
|
{ name: 'MariaDB / Redis / PostgreSQL', note: 'Databaser som dedikerede containere.' },
|
||||||
{ name: 'Matomo', note: 'Self-hosted analytics, first-party og uden tredjeparter.' },
|
{ name: 'Matomo', note: 'Self-hosted analytics, first-party og uden tredjeparter.' },
|
||||||
{ name: 'WireGuard', note: 'Tunneler og netns-baserede egress-profiler til alt der skal ud af huset på en pæn måde.' },
|
{ name: 'WireGuard', note: 'Tunneler og netns-baserede egress-profiler til alt der skal ud af huset på en pæn måde.' },
|
||||||
],
|
],
|
||||||
@@ -18,7 +18,7 @@ const sections = [
|
|||||||
title: 'Udvikling',
|
title: 'Udvikling',
|
||||||
items: [
|
items: [
|
||||||
{ name: 'Linux + code-server', note: 'Udvikling foregår i en dedikeret LXC med VS Code i browseren.' },
|
{ name: 'Linux + code-server', note: 'Udvikling foregår i en dedikeret LXC med VS Code i browseren.' },
|
||||||
{ name: 'Java · Go · Python · TypeScript', note: 'Arbejdshestene. Java til Peppol/eDelivery-verdenen, Python/TS til alt det andet.' },
|
{ name: 'Java · Go · Python · TypeScript', note: 'Java til Peppol/eDelivery-verdenen, Python/TS til alt det andet.' },
|
||||||
{ name: 'Claude Code', note: 'LLM-drevne workflows, fra blogindlæg til Proxmox-administration.' },
|
{ name: 'Claude Code', note: 'LLM-drevne workflows, fra blogindlæg til Proxmox-administration.' },
|
||||||
{ name: 'Docker', note: 'Hvor det giver mening. Ellers foretrækker jeg native installationer i LXC.' },
|
{ name: 'Docker', note: 'Hvor det giver mening. Ellers foretrækker jeg native installationer i LXC.' },
|
||||||
],
|
],
|
||||||
@@ -51,8 +51,4 @@ const sections = [
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
<p class="mt-10 text-sm text-muted">
|
|
||||||
Nysgerrig på hvordan siden selv er skruet sammen? Se <a class="text-accent hover:underline" href="/colophon">kolofonen</a>.
|
|
||||||
</p>
|
|
||||||
</Base>
|
</Base>
|
||||||
|
|||||||
Reference in New Issue
Block a user