~/sang

A security gate for a personal site, built with an AI assistant

I run a personal site, and I built it as practice: a place to try the checks I would want on a real project. This post lists what runs on every change, what that does and does not prove, and what I plan to add next.

How it was built

None of this was written by hand. I built the site and its pipeline by describing what I wanted to an AI assistant, which is often called vibe coding. When tests failed, some of the fixes came the same way.

That changes how I think about the gate. I cannot vouch for code I did not write line by line, but I can vouch for a check that fails when something is wrong. So the pipeline is the evidence, not decoration.

What runs on every change

Everything below except the deployed-site scan runs on each push to main and on each pull request. The security workflow also runs every Monday.

A guard for the guard

An assistant that fixes a failing test can also “fix” it by loosening the rule. So some tests guard the configuration itself. They fail if the content security policy gains unsafe-inline or unsafe-eval, if the CodeQL job is given write permission, if the audit step disappears, if any action stops being pinned to a commit, or if the workflows gain a write permission.

That is not airtight. An assistant could edit the guard test as easily as the rule, which is why reviewing changes to tests matters as much as reviewing changes to code.

What it cannot do

What I plan to add

None of these is set up yet. OWASP ZAP is already running as a passive baseline scan; an active scan would only make sense once the site has a server to test.

I still need to find out whether the free tiers of these tools cover a private repository.

← all posts

guest@sang:~$