<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>gvme.beer</title><description>Microblogs, stack traces &amp; hops. Notes on ITSM, security, automation, leading a team and raising two kids.</description><link>https://gvme.beer</link><language>en</language><item><title>Hello, world</title><link>https://gvme.beer/p/pkgtrkuanrfc2sg</link><guid isPermaLink="true">https://gvme.beer/p/pkgtrkuanrfc2sg</guid><description>Built this site in an evening: a static-ish frontend, a small headless CMS behind it, deployed on my own Coolify. Neobrutalist on purpose – thick black borders, hard shadows, a pixel beer in the corner.

Everything you see – the posts, the stickers, the ticker, even this box – is editable in the CMS, so I&apos;ve no excuse not to write. RSS and a JSON feed are live. Because RSS is not dead, it just stopped being loud about it.

$ git log --oneline | wc -l</description><pubDate>Sun, 11 Oct 2026 20:30:00 GMT</pubDate><category>meta</category><category>homelab</category><category>go</category></item><item><title>Data Tables or a real database?</title><link>https://gvme.beer/p/smoyrd8e4vfhfmd</link><guid isPermaLink="true">https://gvme.beer/p/smoyrd8e4vfhfmd</guid><description>Recurring question with workflow tooling: use the built-in tables or a proper Postgres?

One workflow writing at a time: the built-in tables are perfectly fine, don&apos;t overthink it. Several executions touching the same rows in parallel: no real transactions, no row-level locking, last write silently wins. That&apos;s when you move to Postgres and let an atomic upsert do the arbitration instead of hoping two workflows never collide. Pick the boring database the moment concurrency enters the picture.

INSERT INTO state (key, value) VALUES ($1, $2)
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;</description><pubDate>Thu, 01 Oct 2026 04:20:00 GMT</pubDate><category>n8n</category><category>postgres</category><category>automation</category></item><item><title>Friday is family day</title><link>https://gvme.beer/p/kf5dbaotgpoxz0u</link><guid isPermaLink="true">https://gvme.beer/p/kf5dbaotgpoxz0u</guid><description>I work 80%, and Fridays belong to the kids. It&apos;s the best &quot;new work&quot; decision I&apos;ve made, and it&apos;s not really about the free day.

A hard stop on Thursday evening forces focus and forces real handovers. If a thing only works when I&apos;m reachable on a Friday, that&apos;s not dedication, that&apos;s a process bug with my name on it. The constraint makes the system around me more resilient, not less. Today&apos;s actual ticket: cheapest direct flights from Basel for two adults and two small kids. Genuinely harder than any integration I&apos;ve built.</description><pubDate>Fri, 25 Sep 2026 06:30:00 GMT</pubDate><category>family</category><category>newwork</category><category>leadership</category></item><item><title>A day in the life of a vulnerability</title><link>https://gvme.beer/p/knl3bvfurxanzrn</link><guid isPermaLink="true">https://gvme.beer/p/knl3bvfurxanzrn</guid><description>Building a talk for a Matrix42 user day. Instead of ten disconnected feature demos, one story with a red thread:

A CVE lands. The CMDB knows which configuration items are affected. A ticket gets created and prioritised. A broker hands it to the right provider. The service availability view stays truthful across all providers the whole time. Security, data protection, AI and CMDB all show up inside that single narrative – with a workflow engine quietly doing the plumbing in the middle. People remember a story; they forget a feature list by lunch.</description><pubDate>Tue, 15 Sep 2026 19:30:00 GMT</pubDate><category>matrix42</category><category>security</category><category>siam</category><category>community</category></item><item><title>The timezone bug that eats your morning report</title><link>https://gvme.beer/p/05pnkjk8jj7zr22</link><guid isPermaLink="true">https://gvme.beer/p/05pnkjk8jj7zr22</guid><description>n8n tip that cost me a confusing morning: if you compare a stored date against &quot;today&quot;, set the workflow timezone explicitly to Europe/Zurich.

Dates are stored in UTC. Without the setting, &quot;today&quot; flips at 02:00 local for half the year, so a report that runs at 07:00 quietly misses everything from the first two hours – or includes yesterday. The data was fine. The clock wasn&apos;t.

{{ $json.datum === $today.toFormat(&apos;yyyy-MM-dd&apos;) }}</description><pubDate>Fri, 11 Sep 2026 06:50:00 GMT</pubDate><category>n8n</category><category>automation</category></item><item><title>I designed a quantum layer for change scheduling</title><link>https://gvme.beer/p/hotpdr3bhn30xra</link><guid isPermaLink="true">https://gvme.beer/p/hotpdr3bhn30xra</guid><description>Briefly convinced myself an ITSM platform needed a seven-layer quantum-optimisation architecture for scheduling changes. Solver abstraction, encoder, compiler, the works. There was a diagram. It was beautiful.

Then one question popped the bubble: how many changes does a normal customer actually have per month? Classical solvers handle that in seconds. What genuinely helps is embarrassingly simple – a conflict checker (blackout windows, overlapping configuration items, who&apos;s available) plus an LLM summary for the change board. An afternoon of work, 80% of the value. Pragmatism beats architecture astronautics almost every time.</description><pubDate>Thu, 10 Sep 2026 11:40:00 GMT</pubDate><category>itsm</category><category>ai</category><category>architecture</category></item><item><title>Stop asking the servo to hold</title><link>https://gvme.beer/p/ofio5868mjr6rw5</link><guid isPermaLink="true">https://gvme.beer/p/ofio5868mjr6rw5</guid><description>Deadline project: a small servo that opens a trapdoor to drop a sheet of paper. The linkage kept collapsing through its dead point halfway through the travel, so the flap just fell instead of being held.

Hours of fiddling with rod length and horn radius didn&apos;t fix the geometry. The actual fix was conceptual: stop asking the servo to hold anything. A magnet holds the flap closed, the servo only gives it a nudge to release. Then the magnet turned out too strong for the little servo – one layer of tape as an air gap and it let go cleanly. Made the deadline. Kinematics 1, me 1.</description><pubDate>Tue, 08 Sep 2026 23:40:00 GMT</pubDate><category>maker</category><category>electronics</category></item><item><title>Rev B of the ceiling mount</title><link>https://gvme.beer/p/hl3wk7jo6h9r6zf</link><guid isPermaLink="true">https://gvme.beer/p/hl3wk7jo6h9r6zf</guid><description>Iterating a snap-fit ceiling mount for a Raspberry Pi camera. Rev B: mounting ears moved to the back so the lens faces down and the board faces the ceiling, pocket 2 mm deeper for the camera&apos;s ribbon connector, little gussets under the ears for strength, and relief slots so the snap clips can still flex after the deeper pocket stiffened the walls.

It prints lens-down with supports from the build plate only – that keeps the seating shoulder a clean top layer instead of a sad bridged surface. The design is 90% geometry, 10% remembering how the slicer will actually lay it down.

pocket_depth = 6.0;  // was 4.0 - the ribbon connector says hi</description><pubDate>Tue, 08 Sep 2026 21:50:00 GMT</pubDate><category>3dprint</category><category>maker</category><category>homelab</category></item><item><title>The tool that wants to become the hobby</title><link>https://gvme.beer/p/j0e85c7ry9gq2ze</link><guid isPermaLink="true">https://gvme.beer/p/j0e85c7ry9gq2ze</guid><description>Idea: a pipeline that learns my groove from old projects and nudges new beats toward my own timing. An Ableton set is just gzipped XML, so the micro-timing is all right there to mine.

Architecture I&apos;d actually trust: let the model handle structure, let deterministic code apply the micro-timing offsets – LLMs invent implausible number patterns if you let them near the milliseconds. Then the honest question I had to ask myself: am I building a tool to make more music, or is the tool the new hobby? Rule: one weekend for a walking skeleton, then decide. Still deciding.

gunzip -c beat.als | grep -c &apos;&lt;MidiNoteEvent&apos;</description><pubDate>Sun, 30 Aug 2026 08:15:00 GMT</pubDate><category>music</category><category>ai</category><category>maker</category></item><item><title>A skill without an offer is a hobby</title><link>https://gvme.beer/p/m5ydp9zofjq1pye</link><guid isPermaLink="true">https://gvme.beer/p/m5ydp9zofjq1pye</guid><description>Proposed adding automation and digitalisation as a real service line, not just something we happen to be good at. We&apos;d had the skill for years – but nothing a customer could actually book, with a price and a scope.

Two rules I set for it, because I&apos;ve watched a service die for lack of them: anchor the competence in more than one person&apos;s head, and show the economics up front instead of hoping they work out later. An offering that depends on one hero, or on optimism, doesn&apos;t survive the first quiet quarter.</description><pubDate>Wed, 26 Aug 2026 08:50:00 GMT</pubDate><category>leadership</category><category>automation</category><category>newwork</category></item><item><title>90,000 workflows walk into a test system</title><link>https://gvme.beer/p/1yuo6dazb6ox2wt</link><guid isPermaLink="true">https://gvme.beer/p/1yuo6dazb6ox2wt</guid><description>A worker service had been off for weeks on a test environment. It came back to 90,000 queued workflow instances. The goal wasn&apos;t to process them – it was to make them go away.

Batched SQL delete, child tables before parents, small batches. It kept deadlocking until I accepted the obvious: something was still writing. Stop the worker service AND the app pool first, then delete. Most of those instances had never actually run – queued, never executed, no step data. A monument to a service nobody was watching.

WHILE 1 = 1
BEGIN
  DELETE TOP (5000) FROM dbo.SomeFragmentTable WHERE ...;
  IF @@ROWCOUNT = 0 BREAK;
END</description><pubDate>Mon, 10 Aug 2026 14:50:00 GMT</pubDate><category>matrix42</category><category>itsm</category><category>sql</category></item><item><title>A security newsletter people actually open</title><link>https://gvme.beer/p/ahcermbew50b6u5</link><guid isPermaLink="true">https://gvme.beer/p/ahcermbew50b6u5</guid><description>Started a monthly security briefing for the team. The first draft read like a government circular – correct, complete, and dead on arrival. Nobody opens that twice.

Reworked it into a &quot;case of the month&quot;: one real incident told as a short story, why it matters for us specifically, the current phishing waves, three golden rules, sources linked. Short enough to read standing at the coffee machine. Built as a table-based HTML layout, because the one law of corporate email is: it has to survive Outlook.</description><pubDate>Mon, 10 Aug 2026 07:30:00 GMT</pubDate><category>security</category><category>awareness</category><category>leadership</category></item><item><title>Vibe-coded is fine. Not for IAM.</title><link>https://gvme.beer/p/1o1erwgpng3u0yj</link><guid isPermaLink="true">https://gvme.beer/p/1o1erwgpng3u0yj</guid><description>Seeing more AI-generated extensions dropped straight into production ITSM systems. For a demo or a throwaway: great, go fast. For identity provisioning – joiner, mover, leaver, permissions, audit trail – absolutely not.

Critical processes need real error handling, idempotency, clean credential handling, an audit trail, and someone who still supports it in three years. My evaluation order is boring on purpose: can the source system do it itself? Then the platform&apos;s own tools. Only then an integration layer, chosen by what fits the customer – not by whichever tool I happen to love. Yes, that rule applies to my favourite tool too.</description><pubDate>Wed, 22 Jul 2026 21:00:00 GMT</pubDate><category>architecture</category><category>itsm</category><category>ai</category></item><item><title>Tiny vineyard, oversized spreadsheet</title><link>https://gvme.beer/p/p02oorht2p0rrfa</link><guid isPermaLink="true">https://gvme.beer/p/p02oorht2p0rrfa</guid><description>Planning a hobby vineyard: 20 to 40 vines on a limestone slope in the Baselbiet. Deliberately staying well under the area that would trigger official registration.

Decisions so far: PIWI varieties (Divico, Souvignier Gris) so I&apos;m not spraying every second weekend, grafted onto a chalk-tolerant rootstock because limestone causes chlorosis, and side nets from véraison against birds and wasps. Expected yield in year four or five: maybe 35 bottles. Return on investment: purely emotional, and that&apos;s fine.</description><pubDate>Wed, 15 Jul 2026 11:40:00 GMT</pubDate><category>vineyard</category><category>offtopic</category></item><item><title>Let the DNS server do the chores</title><link>https://gvme.beer/p/e75nmfvy9266fi2</link><guid isPermaLink="true">https://gvme.beer/p/e75nmfvy9266fi2</guid><description>My self-hosted DNS can pull blocklists on its own – point it at the raw list URLs, set an update interval, done. No cron job, no little sync script to forget about and find broken in a year.

Running a couple of well-maintained lists together and letting it deduplicate. The nice side effect of self-hosting DNS: when something on the network phones home too much, you see it, and you can cut it off at the name-resolution layer instead of chasing it per device.

https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts</description><pubDate>Tue, 07 Jul 2026 06:55:00 GMT</pubDate><category>homelab</category><category>dns</category><category>smarthome</category></item><item><title>Best user story of the summer</title><link>https://gvme.beer/p/064g34oouppgvsa</link><guid isPermaLink="true">https://gvme.beer/p/064g34oouppgvsa</guid><description>Found the perfect weekend trail: a path along a little stream where kids launch a wooden boat upstream, then chase it to the next crossing and launch it again. There&apos;s a trail in the mountains built exactly around this.

&quot;As a small human, I want my boat to come back to me, so that I can set it off one more time.&quot; Acceptance criteria: boat floats, child laughs, repeat until snack. Shipped.</description><pubDate>Thu, 02 Jul 2026 05:30:00 GMT</pubDate><category>family</category><category>offtopic</category></item><item><title>The basement has a purpose now</title><link>https://gvme.beer/p/d5gh6770y49mzik</link><guid isPermaLink="true">https://gvme.beer/p/d5gh6770y49mzik</guid><description>Turned the basement room into one half home office, one half maker space. Height-adjustable desk standing free in the room, back to the wall, facing the door – you don&apos;t want your back to the entrance even in your own cellar. Workbench along the long wall, 3D printer with its enclosure in the corner.

The old studio monitors are comically oversized for a nearfield desk. They&apos;re staying. A bit of distance to the wall and the bass trim on the back, and a concrete-walled basement becomes almost listenable.</description><pubDate>Wed, 01 Jul 2026 21:20:00 GMT</pubDate><category>maker</category><category>home</category><category>music</category></item><item><title>Not every decision needs enthusiasm</title><link>https://gvme.beer/p/grtaxqbb122nraw</link><guid isPermaLink="true">https://gvme.beer/p/grtaxqbb122nraw</guid><description>We had to name a new product. Three candidates, a survey, and no clear love for any of them. The temptation was to restart the whole naming process.

Instead we split it: take the name from one option, the visual design from another, and ship. Starting over would have cost months for a marginally better outcome. Decisions don&apos;t need everyone excited – they need a clear reason, and the honesty to say out loud why the reasonable-sounding alternative isn&apos;t happening right now.</description><pubDate>Tue, 30 Jun 2026 07:35:00 GMT</pubDate><category>leadership</category></item><item><title>n8n Ambassador</title><link>https://gvme.beer/p/orbimeegvikyl6k</link><guid isPermaLink="true">https://gvme.beer/p/orbimeegvikyl6k</guid><description>Official n8n Ambassador now. The plan for the first Basel meetup is deliberately silly: we build a Tamagotchi in n8n, together, live.

A schedule trigger makes it hungry, webhooks feed it, workflow static data keeps its state between runs. If it starves, congratulations, you&apos;ve got an incident. It&apos;s a joke demo that secretly teaches triggers, state and idempotency – which is most of what automation actually is.

const pet = $getWorkflowStaticData(&apos;global&apos;);
pet.hunger = Math.min(10, (pet.hunger ?? 0) + 1);
if (pet.hunger &gt;= 10) pet.alive = false; // incident!</description><pubDate>Mon, 29 Jun 2026 19:45:00 GMT</pubDate><category>n8n</category><category>community</category><category>automation</category></item><item><title>Five-minute fairy tale, shipped</title><link>https://gvme.beer/p/jabaahjocpnjxvk</link><guid isPermaLink="true">https://gvme.beer/p/jabaahjocpnjxvk</guid><description>Co-wrote a bedtime story: a star fairy, a big sister, a baby, a cat, a dog and two rabbits. Target runtime five minutes, which it turns out is the real spec.

User acceptance test with the actual users passed. The only feedback from the target audience was &quot;again&quot;. I&apos;ll take a repeat request as the highest rating there is.</description><pubDate>Mon, 29 Jun 2026 17:20:00 GMT</pubDate><category>family</category><category>ai</category></item><item><title>Home Assistant + Matter/Thread: field notes</title><link>https://gvme.beer/p/scrqepq43l4wltd</link><guid isPermaLink="true">https://gvme.beer/p/scrqepq43l4wltd</guid><description>Finally got the smart lock onto Home Assistant over Matter/Thread with a ZBT-2 stick, fully local, no cloud. Things I know now that I didn&apos;t before:

- the Thread border router only appears after a reboot, not when you add the add-on
- iOS caches old Thread credentials and fails with a gloriously unhelpful &quot;no matching network&quot; – clear them in the Companion app debug menu, then send credentials again
- tagged VLANs on the little gateway only ride the main LAN port

Every one of those cost an hour. Writing them down so future-me doesn&apos;t pay twice.</description><pubDate>Tue, 23 Jun 2026 09:40:00 GMT</pubDate><category>homelab</category><category>smarthome</category></item><item><title>Locked out by my own front door</title><link>https://gvme.beer/p/671xi2e1mcyez4k</link><guid isPermaLink="true">https://gvme.beer/p/671xi2e1mcyez4k</guid><description>Door fell shut. Key on the inside, still in the lock, which means my key from the outside won&apos;t go in. Classic.

Upside: it was only latched, not bolted – the cheaper of the two problems. Pushed the inside key out onto a sheet of paper slid under the door and fished it back. The smart lock just moved from &quot;nice gadget&quot; straight to the top of the backlog.</description><pubDate>Wed, 17 Jun 2026 07:55:00 GMT</pubDate><category>home</category><category>smarthome</category></item><item><title>Welcome committee</title><link>https://gvme.beer/p/ughoogtkn0uq17q</link><guid isPermaLink="true">https://gvme.beer/p/ughoogtkn0uq17q</guid><description>First night in the new house. Just past midnight. Three martens having what sounded like a rave in the engine bay of the car.

Turns out the car still carries the scent of the marten from our old place, and the locals take that as a territorial insult. One marten is normal; three is a scent-marked rival plus, apparently, backup. Engine wash booked, hood left open overnight as a deterrent. Welcome to the neighbourhood.</description><pubDate>Mon, 15 Jun 2026 21:50:00 GMT</pubDate><category>home</category><category>offtopic</category></item><item><title>MFA is not the finish line</title><link>https://gvme.beer/p/xdswtg7ldpj54ku</link><guid isPermaLink="true">https://gvme.beer/p/xdswtg7ldpj54ku</guid><description>Adversary-in-the-middle phishing doesn&apos;t steal your password, it steals your session. The MFA prompt gets satisfied – by the attacker, live, through a proxy. The token is what gets replayed.

If you ever clean up an account like this, hunt for persistence, not just the password: new MFA methods, freshly registered devices, inbox rules that hide or forward mail. Remove all of it, then revoke sessions – then revoke again. And the best detector I know isn&apos;t a tool, it&apos;s a colleague who says &quot;this email feels off&quot;. Awareness training quietly paid for itself.</description><pubDate>Fri, 12 Jun 2026 13:00:00 GMT</pubDate><category>security</category><category>m365</category><category>awareness</category></item><item><title>Owners are not members</title><link>https://gvme.beer/p/5p6e8dxb22p6rki</link><guid isPermaLink="true">https://gvme.beer/p/5p6e8dxb22p6rki</guid><description>TIL the hard way, via a broken Planner: when you create a Team through Microsoft Graph and add people as owners, they are not automatically members. Half the Teams experience then silently doesn&apos;t work for them.

Fix is one extra call to members/$ref right after owners/$ref. Treat a 400 &quot;already exists&quot; as success so the whole thing stays idempotent – you will run it twice.

POST /v1.0/groups/{groupId}/members/$ref
{ &quot;@odata.id&quot;: &quot;https://graph.microsoft.com/v1.0/directoryObjects/{userId}&quot; }</description><pubDate>Wed, 10 Jun 2026 20:30:00 GMT</pubDate><category>m365</category><category>automation</category></item><item><title>One canonical ticket, many providers</title><link>https://gvme.beer/p/6rg0liptrlw4ct6</link><guid isPermaLink="true">https://gvme.beer/p/6rg0liptrlw4ct6</guid><description>SIAM multi-provider sync: the wrong instinct is one integration node per tool. You end up maintaining five dialects forever.

Build one canonical ticket model and describe every provider as a JSON profile – endpoints, auth, field map, status map, priority map. Adding a provider is then a new profile, not new code. And you need a correlation store (source id ↔ target id, last sync hash) or you&apos;ll sync the same comment back and forth until the heat death of the universe. Hash the payload, drop the echo.

{
  &quot;provider&quot;: &quot;xurrent&quot;,
  &quot;statusMap&quot;: { &quot;in_progress&quot;: &quot;In Progress&quot;, &quot;resolved&quot;: &quot;Completed&quot; },
  &quot;fields&quot;: { &quot;summary&quot;: &quot;subject&quot;, &quot;description&quot;: &quot;note&quot; }
}</description><pubDate>Wed, 10 Jun 2026 16:20:00 GMT</pubDate><category>n8n</category><category>siam</category><category>itsm</category></item><item><title>An unplanned change is just a diff</title><link>https://gvme.beer/p/5ffvghgprgqdbyb</link><guid isPermaLink="true">https://gvme.beer/p/5ffvghgprgqdbyb</guid><description>Spent a while on &quot;how do we even see unplanned changes?&quot; and the answer is a comparison, not a product. Declared state is what the change record says happened. Observed state is what the systems report – audit logs, file integrity, inventory diffs, transport logs.

Match the two on configuration item plus a time window with a buffer. Matched events become evidence on the existing change. Unmatched ones open an unplanned-change record. No single tool does the correlation for you; start with the telemetry you already collect and buy later, if at all.</description><pubDate>Wed, 10 Jun 2026 09:00:00 GMT</pubDate><category>itsm</category><category>changemanagement</category></item><item><title>AI rollout: three layers, not one document</title><link>https://gvme.beer/p/n6rba5e4ybrunfy</link><guid isPermaLink="true">https://gvme.beer/p/n6rba5e4ybrunfy</guid><description>Rolled out an AI assistant for the team. Writing the rules was the easy hour. The thing that makes it actually work is keeping three things in three places:

1. the acceptable-use policy – what&apos;s allowed
2. a short mandatory training – why, and how to be careful
3. an enablement space with prompts and real use cases – how to get value

Rules, learning and inspiration don&apos;t belong in the same page. Split like this, the ISMS stays audit-clean and people read the part that helps them. And: no seat before the training is done.</description><pubDate>Tue, 09 Jun 2026 17:40:00 GMT</pubDate><category>ai</category><category>security</category><category>leadership</category></item><item><title>Backups you can&apos;t delete, even by accident</title><link>https://gvme.beer/p/hu6tbthth0xeuae</link><guid isPermaLink="true">https://gvme.beer/p/hu6tbthth0xeuae</guid><description>Reworked the backup for my self-hosted stack: restic snapshots of the Docker volumes to object storage, with Object Lock in compliance mode. Compliance, not governance – governance can be bypassed by anyone holding a key, and these keys can&apos;t be permission-scoped. If I can delete the backup in anger, so can ransomware.

Then the part people skip: an actual restore test. A backup you&apos;ve never restored is a hope, not a control. Restored a volume end to end today. Now it&apos;s evidence.

restic -r s3:... snapshots
keep-daily 7 / keep-weekly 4 / keep-monthly 2</description><pubDate>Wed, 03 Jun 2026 20:10:00 GMT</pubDate><category>homelab</category><category>infosec</category><category>iso27001</category></item><item><title>The lightest possible MCP</title><link>https://gvme.beer/p/0qbyeb41w8s84ag</link><guid isPermaLink="true">https://gvme.beer/p/0qbyeb41w8s84ag</guid><description>Been circling the idea of a proper API server so an LLM can drive our ITSM platform with real tools. Then I realised I&apos;d already built the useful 80%: a chat widget that talks to an LLM via a workflow, the LLM returns a structured command, the widget runs it against the platform.

So the plan is n8n first – publish the workflow, document it, show it at the meetup – and only build the &quot;serious&quot; server later if ISMS or scale actually demand it. Reach beats architecture. My audience are admins, not Python developers.</description><pubDate>Wed, 20 May 2026 17:30:00 GMT</pubDate><category>ai</category><category>matrix42</category><category>n8n</category><category>itsm</category></item><item><title>AI governance is just asset management with teeth</title><link>https://gvme.beer/p/5d5uxkyqqdrt6au</link><guid isPermaLink="true">https://gvme.beer/p/5d5uxkyqqdrt6au</guid><description>Everyone wants an &quot;AI strategy&quot;. What actually holds up in an audit is boring: an AI asset register, an acceptable-use policy, a procurement gate, human oversight, an incident path, and awareness training. Six things, not a manifesto.

The nice realisation: the CMDB can already carry this. Add a handful of attributes to configuration items – AI component yes/no, risk class, provider, purpose – and you get one inventory instead of a parallel spreadsheet that&apos;s stale by Friday.</description><pubDate>Thu, 14 May 2026 19:50:00 GMT</pubDate><category>itsm</category><category>ai</category><category>security</category></item><item><title>The meeting that runs without me</title><link>https://gvme.beer/p/x9x3cjgxkxxbhmp</link><guid isPermaLink="true">https://gvme.beer/p/x9x3cjgxkxxbhmp</guid><description>I kept preparing and leading every bi-weekly team meeting. Then I noticed I was the note-taker in basically every protocol, and the same action items had been rolling over for months.

That&apos;s not a people problem, it&apos;s an ownership problem I created by never letting go. New format: a rotating moderator and note-taker, a decisions table separate from action items, and a hard rule – no action item without an owner and a date. My slot is five minutes of input at the end. First facilitator starts next session.</description><pubDate>Mon, 04 May 2026 08:20:00 GMT</pubDate><category>leadership</category><category>newwork</category></item><item><title>IAM for 2,000 people, built on n8n</title><link>https://gvme.beer/p/x7u98svjyy9uxtm</link><guid isPermaLink="true">https://gvme.beer/p/x7u98svjyy9uxtm</guid><description>The project I&apos;m proudest of this year: joiner/mover/leaver automation for a ~2,000-person organisation, built entirely on a workflow engine. HR event in, Active Directory account out – with org-unit mapping, role-based group assignment and a queue you can actually inspect when something looks off.

People hear &quot;n8n&quot; and think toy automations. This is queues, error handling, idempotency and audit logs. The enterprise parts are exactly the parts the demos skip. That&apos;s the bit I care about.</description><pubDate>Thu, 30 Apr 2026 09:00:00 GMT</pubDate><category>n8n</category><category>automation</category><category>community</category></item><item><title>Rewriting my own tool, with a constitution</title><link>https://gvme.beer/p/ivmgotuu2e07rvs</link><guid isPermaLink="true">https://gvme.beer/p/ivmgotuu2e07rvs</guid><description>Rebuilding the capacity planner from scratch – Go backend, clean single-tenant deploy, OIDC instead of the home-grown auth that bit me last time.

What changed how I work: giving the AI coding assistant a short written &quot;constitution&quot; (design principles, naming, a verify step) and letting it work slug by slug, with a read-only reviewer pass before each build. The discipline isn&apos;t the AI – it&apos;s writing down what &quot;done&quot; means so a machine and I agree on it.</description><pubDate>Mon, 20 Apr 2026 11:10:00 GMT</pubDate><category>go</category><category>automation</category><category>ai</category></item><item><title>A SOC process before a SOC product</title><link>https://gvme.beer/p/6nx3m7uvswybhf9</link><guid isPermaLink="true">https://gvme.beer/p/6nx3m7uvswybhf9</guid><description>Wired up a little security pipeline: endpoint protection raises an alert, a workflow picks it up, enriches every CVE with CVSS and KEV status from the NVD, and opens a ticket plus a Teams message. A weekly job groups open vulnerabilities by product so you see &quot;patch this one thing&quot; instead of a wall of CVE IDs.

Biggest trap was state. Looking up &quot;did we already report this?&quot; per item breaks the loop context – the whole batch then routes on the first item&apos;s answer. Fix: fetch all processed records once, do the set-difference in code, then act per item.

const seen = new Set(processed.map(r =&gt; r.productId));
return incoming.filter(p =&gt; !seen.has(p.productId));</description><pubDate>Wed, 15 Apr 2026 15:30:00 GMT</pubDate><category>security</category><category>automation</category><category>n8n</category><category>infosec</category></item><item><title>Never hand-edit what the generator owns</title><link>https://gvme.beer/p/pmk1cd8sfgn9ww2</link><guid isPermaLink="true">https://gvme.beer/p/pmk1cd8sfgn9ww2</guid><description>Spent an evening debugging a reverse proxy that wouldn&apos;t start. Root cause: I had dropped a config file into a folder that the tool regenerates on every restart. Two `location /` blocks, nginx refuses to boot.

Same night: every Let&apos;s Encrypt cert had quietly expired because a renewal hook never fired. The lesson I keep relearning with self-hosted infra – if a tool manages a file, configure it through the tool, not by sneaking files in behind it. The shortcut always costs more than it saves.

nginx: [emerg] duplicate location &quot;/&quot; in ...</description><pubDate>Wed, 08 Apr 2026 13:20:00 GMT</pubDate><category>homelab</category><category>infosec</category></item><item><title>Player-coach is a scheduling lie</title><link>https://gvme.beer/p/7suhjmnjzv59wwo</link><guid isPermaLink="true">https://gvme.beer/p/7suhjmnjzv59wwo</guid><description>Became CTO of a small consultancy. The honest math: a quarter of my time for the role, the rest billable, minus Fridays for family. That leaves maybe ten hours a week to actually be CTO.

So the role can&apos;t be &quot;do all the strategy myself&quot;. It has to be: set the guardrails, hand real ownership to the team, and resist the urge to take tasks back the second they wobble. The hardest part of leading isn&apos;t deciding – it&apos;s not deciding things that aren&apos;t mine to decide anymore.</description><pubDate>Wed, 18 Mar 2026 18:40:00 GMT</pubDate><category>leadership</category><category>newwork</category></item><item><title>Capacity planning that survives contact with reality</title><link>https://gvme.beer/p/oehe5iz6ne3xvhu</link><guid isPermaLink="true">https://gvme.beer/p/oehe5iz6ne3xvhu</guid><description>A consulting team is a scheduling problem: fixed mandates, variable on-call, projects, internal work – all competing for the same people. Spreadsheets break the moment plans change, which is always.

Building a small planning tool for us. Lesson from the first version: don&apos;t ship a report builder with forty filters nobody opens. Ship three views – four weeks, three months, twelve months – and let overbooking warn, not block. People book themselves over 100% anyway; the tool&apos;s job is to make that visible, not to argue.</description><pubDate>Mon, 09 Mar 2026 19:15:00 GMT</pubDate><category>automation</category><category>leadership</category><category>newwork</category></item><item><title>ISO 27001 Lead Implementer, done</title><link>https://gvme.beer/p/ccajvlvnv0eh4dh</link><guid isPermaLink="true">https://gvme.beer/p/ccajvlvnv0eh4dh</guid><description>Passed the ISO 27001 Lead Implementer exam (PECB). The most useful part wasn&apos;t the control list – it was learning to tell apart what an ISMS requires on paper and what actually makes an organisation safer.

For a nine-person shop the trap is building a management system sized for a corporation. The real skill is keeping it lean enough that people still use it, and audit-ready enough that it survives a Stage 2. Those two pull in opposite directions constantly.</description><pubDate>Fri, 20 Feb 2026 20:30:00 GMT</pubDate><category>iso27001</category><category>security</category><category>leadership</category></item></channel></rss>