Building systems with AI Marc at a dual-panel workstation: an AI assistant drafts automation while infrastructure nodes connect across cloud and identity systems. A cat watches from the desk. log analysis infra automation runbook draft AI assistant generating… AI automating the boring parts
AI-generated illustration

Marc Shaw

I work in IT systems — and I use AI where it actually helps. Watch a short intro, then look at the projects. Contact details stay on the CV.

View technical projects

Quick introductions

About a minute each. Same person, two languages — useful if you are hiring in Switzerland or an English-speaking team.

English

Video coming soon — drop assets/intro-en.mp4 into this project.

Deutsch

Video folgt — Datei assets/intro-de.mp4 hier ablegen.

Projects & technical portfolio

A few things I’ve built — systems work, cloud, security, and places where I used AI because it genuinely helped.

Professional case study

SentinelHub

I designed and built this from scratch for my former employer: a platform that watches internet-facing systems and shows brokers clear cyber evidence — without pretending to make underwriting decisions for them.

Why I built it
Brokers needed ongoing proof of a company’s security posture, not a one-off spreadsheet. I wanted checks that run the same way every time, plus a place to see findings and history.
What I made
The full product: Angular UI, Go API, MongoDB, Auth0 login, a scheduler for passive checks (TLS, DNS, headers, health, and similar), plus controls, benchmarks, findings and reports. They kept it for further development after I left.
Where I used AI — and where I didn’t
I used AI tools heavily while coding and designing, because that let me move faster on a large build. The monitoring itself is normal code: predictable checks, not a model guessing. For broker assessment write-ups I did add a constrained LLM step — the facts stay structured and verified in code; the model only helps turn them into a readable report, which is something prompts are better at than hand-writing templates for every case.
  • Angular
  • TypeScript
  • Go / Gin
  • MongoDB
  • Auth0 / JWT
  • Docker Compose
  • Passive monitoring
  • LLM-assisted reporting
SentinelHub architecture overview Angular frontend to Go API with Auth0, MongoDB storage, and an in-process scheduler running passive internet checks. Angular UI Go / Gin API MongoDB Scheduler Passive checks Auth0
Rough layout of the stack. Source stays private — former employer IP.
A bit more detail
  • Evidence first, then humans decide risk appetite — SentinelHub doesn’t try to be the underwriter.
  • Core pieces: assets, targets, checks, results, companies, controls, benchmarks, findings and reports.
  • Runs as Docker Compose; the scheduler lives in the API process (no Kubernetes).

Personal · privacy-focused

Home ETL — personal finance assistant

I built this for our household so bank PDFs stay on our own server. It reads statements, keeps letters separate, and shows me honestly where months of history are missing.

Why I built it
I didn’t want our finances living only in someone else’s cloud. I also got tired of guessing whether I’d actually uploaded every statement.
What I made
A small self-hosted stack: upload PDFs, extract what I can, let me approve anything before it counts as truth, then analyse spending. It currently understands Yuh, UBS (including scanned pages via OCR), and Santander UK.
Where I used AI — and where I didn’t
Bank statement layouts are predictable, so I wrote normal parsers in code for those. Scanned UBS PDFs need OCR (Tesseract) — that’s a tool, not a chat prompt. I don’t use an LLM to invent balances: numbers only become “real” after I review them. AI helped me build and iterate the app itself; it doesn’t get to rewrite our ledger.

Spending analytics

I wanted charts I could trust. If a month has no statement, I leave it blank instead of drawing a fake zero — otherwise averages lie. The table says “no statement covers this month” when that’s the case.

ETL Analytics Trends view showing spending chart with blank months where statements are missing
Trends: in and out by month, gaps left blank on purpose

Letters vs statements

Banks also send rate-change letters and product notices. Those aren’t transactions, so I route them to Mail instead of the ledger. Code classifies the PDF type; I keep the summary and the original file, but nothing here changes balances.

ETL Mail view listing bank letters with dates, extracted summaries, and source PDF filenames
Mail: useful to read, kept off the spending totals

Missing statement coverage

This grid answers a simple question: which months am I missing? Green means I have a statement; red means there’s a gap between uploads I already made. If OCR couldn’t read a file cleanly, I flag it for review — having the PDF is not the same as trusting the numbers.

ETL Document library statement coverage grid with green covered months and red missing months
Coverage grid plus review warnings for unclear reads
  • Docker Compose
  • Next.js
  • FastAPI
  • PostgreSQL
  • MinIO
  • Tesseract OCR
  • JWT auth / roles
A bit more detail
Home ETL architecture overview Browser to Next.js web app, FastAPI and worker services, PostgreSQL for trusted data, MinIO for documents, with OCR and parsers on the worker path. Web UI API Worker PostgreSQL MinIO OCR / parsers
Runs at home via Docker Compose. Private repo — no public demo link.
  • Postgres stores what I’ve approved; original PDFs stay in MinIO as evidence.
  • Flow: upload → extract → classify → parse → I review → promote.
  • Partner vs accountant roles so access stays limited.

Planned

Next: a smaller AI ops project

I still want a compact public project that shows AI helping with day-to-day IT work — not another big private app.

What I’m thinking about
Something practical: maybe log triage, drafting runbooks, or automating a boring admin task. I’ll pick one, build it, and replace this card when it’s real.
  • IT automation
  • AI-assisted ops
  • Documentation
  • Security analysis
A bit more detail

TODO for me: choose the project, decide if the repo will be public, then rewrite this card.