andweg.dev

Andrzej Węgłowski

I build things.

Things that make it easy for non-specialists to do specialist work, and for specialists to do their work better.

Systems

Serious projects.

SmartKSeF

Period
2022 – 2025 · Exorigo-Upos S.A.
Role
Backend dev from day one, team lead from 2024.
Stack
Kotlin, Spring Boot, PostgreSQL, Liquibase, Azure Entra ID, Terraform, GitLab CI

Poland is making e-invoicing mandatory: from 2026 every invoice has to go through a government gateway (KSeF). SmartKSeF is the thing that sits between a company’s ERP and that gateway. Roughly 300 organisations run on it (Empik, Auchan, LuxMed and Crédit Agricole among them) and it was sized for 20+ million invoices a year. I was on the backend from the very first commit and ran the team from 2024 onwards.

The law kept changing under us. Deadlines got pushed, requirements got rewritten more than once, and every time that happened the Ministry of Finance put out a fresh XML schema for the invoice. So we were implementing a spec that refused to sit still. At some point we stopped treating each new schema like a fire drill and made it boring instead: versions live side by side in the system, and adding another one is a maintenance ticket, not a migration.

Most of the engineering is there because the gateway isn’t dependable. Invoices get checked against the schema before anything is sent, so a structural error comes back as something the client can actually fix (rather than a rejection they find out about later). When KSeF or the network goes down, documents wait in a queue and go out once things recover. Delivery confirmations (the UPO) are pulled back and the status gets written into whatever system the invoice originally came from. We also watch the gateway around the clock, and the system tells us, and the customers, when it starts acting up.

Three hundred companies, and every one of them has its own rules. Validation for sales and purchase invoices is configured per client, same with the rules that classify a document and decide which internal system it belongs to. A single company often means several legal entities, each with its own idea of who is allowed to see what. Active Directory integration let clients keep their own security policy instead of learning ours. Recipients get notified as well (including foreign counterparties who have no KSeF access whatsoever), and the whole processing history goes into an archive.

I came in as a junior when the project kicked off, got promoted twice over three years, and took over the five-person team in 2024. Mostly backend, with the occasional detour into the frontend when someone needed a hand.

E-PARAGON+

Period
2023 – 2025 · Exorigo-Upos S.A.
Role
Backend developer; from 2024 the product belonged to my team.
Stack
Java, Azure Functions, Azure Service Bus, SQL Server

Electronic receipts for retail: the digital version of the slip you get at the till, plus all the non-fiscal paperwork that tags along with it. Millions of them a week. I worked on the backend, and from 2024 it was my team’s product to look after.

Polish law leaves the choice to the customer (paper or electronic). That single sentence dictates the whole design, because the electronic path can never be the only path, and it isn’t allowed to fail either. The shop has to hand over a document one way or another. Receipts go out via the retailer’s own app, by email or by SMS, and the system keeps going when the things around it don’t.

It talks to tills and fiscal printers from a handful of different manufacturers. Documents are kept for two years (the government’s own app keeps them for about a month), with the shop’s branding and loyalty links on them instead of a generic state template. The same data also feeds the consumption reporting retailers need for ESG.

Under the hood it’s a bunch of small services, some of them web apps, some Azure Functions, handing work to each other through queues rather than calling one another directly. If one of them slows down, its queue gets longer and nobody at the checkout is any the wiser.

The argument that actually sells it is time, oddly enough. Printing a paper receipt takes three to five seconds; at a million transactions a year that works out to something like 1,400 hours of someone standing at a till, waiting.

Independent

Things I started myself.

Bezpieczeństwo AI

The Bezpieczeństwo AI home page
Period
2026 – present
Role
Author and developer (there is nobody else)

An introduction to AI safety, written in Polish: articles, reading paths depending on where you’re starting from, a glossary, and a list of things worth reading. As far as I can tell nobody had done one before.

Most of the vocabulary has no agreed Polish equivalent yet, so the glossary was less a matter of looking terms up and more of deciding what they ought to be. Forty million people speak Polish and there was next to nothing written for them on this.

Seven articles so far and twenty glossary entries, with a fair bit of the rest still marked as coming. Every term shows its English original on hover, since that’s where most readers will have run into it first — and often the English is still the only version there is.

Stack
Astro 5, MDX, Preact, Tailwind CSS, Pagefind, Cloudflare Pages

Side projects

For fun, mostly.

Uczta dla Wron

The Uczta dla Wron rules reference

The rulebook for a play-by-Discord game set in the world of A Song of Ice and Fire. A friend runs the game and writes the rules; I made the site they live on.

He writes them as Obsidian notes and the site rebuilds itself from those. Most of the actual work went into making Polish behave.

How it works — Uczta dla Wron

Stack
Quartz v5, TypeScript, Preact, SCSS, Custom Quartz plugins, Obsidian, Cloudflare Pages

Inner Circle Seoul

The Inner Circle Seoul game library

A website for a friend’s board game café in Seoul. Two questions, basically: what’s on the shelf, and what should we play tonight.

He keeps the shelf as a list on BoardGameGeek. The site reads that list twice a day and rebuilds itself from it.

How it works — Inner Circle Seoul

Stack
SvelteKit, Svelte 5, TypeScript, Vite, Node, sharp, BoardGameGeek XML API, GitHub Actions, Cloudflare Pages

Hegemony Tax

The Hegemony tax calculator

A tax calculator for the board game Hegemony: Lead Your Class to Victory. Four policy tracks feed into a multiplier, and how much you owe depends on which class you happen to be playing.

One hand-written index.html. No framework, no build step, shipped to GitHub Pages by Actions. Works in English and Polish.

Stack
HTML, CSS, JavaScript, GitHub Pages

Contact

Email
andweg@andweg.com
GitHub
github.com/andweg
Personal site
andweg.com