I'm a software engineer building infrastructure for AI research. My focus is the layer under the experiments: environments that rebuild the same way every time, dependencies that are pinned and scanned, and CI that fails for the right reasons, so a result can be trusted and repeated.
Most of my public work is one connected system.
standards holds the engineering
rules and the reusable workflows that enforce them, called by link so a fix
lands once and reaches every repository.
path is the template new
repositories start from, and
markdown draws READMEs like this
one from data measured on a schedule.
- Working on: reproducible environments, supply-chain hygiene (pinned dependencies, secret scanning, CodeQL and SBOMs), and CI that fails for the right reasons.
- Building with: Python (standard library first), GitHub Actions, Bash and Make, plus dev containers and Codespaces so a Mac and a fresh container start from the same shell.
- How I work: standards a machine enforces, small reviewable changes, Conventional Commits, and signed commits on protected branches.
- Ask me about: reusable workflows, dependency pinning, release automation, and automating the chores nobody should do by hand.
Four games, Chess, Checkers, Pentago and Tic-Tac, with me on one side and everyone else on GitHub on the other. I always play White, and X in Tic-Tac.
- Pick a move from the list under a board. Chess is always in view, and the other three open with a click.
- Submit the issue its link opens, unchanged. The first move to reach the game is the one played.
- The Official Arbiter rules on it within a few minutes: it answers on
your issue, closes it as
playedorturned away, and redraws the board.
Each side has a week to move, or the Arbiter moves for it at random. A win counts for the player who makes the winning move, and the most wins top the Hall of Fame below.
📖 The rules and everything else are in Games and each game's guide: Chess, Checkers, Pentago and Tic-Tac.
♚ GitHub's Turn · 20 legal moves · open to choose one
♞ Knights · 4 moves
| Move | In words | Play | |
|---|---|---|---|
| 🐴 | Knight Move Na6 |
Knight from b8 to a6 | Play ↗ |
| 🐴 | Knight Move Nc6 |
Knight from b8 to c6 | Play ↗ |
| 🐴 | Knight Move Nf6 |
Knight from g8 to f6 | Play ↗ |
| 🐴 | Knight Move Nh6 |
Knight from g8 to h6 | Play ↗ |
♟ Pawns · 16 moves
| Move | In words | Play | |
|---|---|---|---|
| ♟️ | Pawn Push a6 |
Pawn from a7 to a6 | Play ↗ |
| ♟️ | Double Pawn Push a5 |
Pawn from a7 to a5, two squares | Play ↗ |
| ♟️ | Pawn Push b6 |
Pawn from b7 to b6 | Play ↗ |
| ♟️ | Double Pawn Push b5 |
Pawn from b7 to b5, two squares | Play ↗ |
| ♟️ | Pawn Push c6 |
Pawn from c7 to c6 | Play ↗ |
| ♟️ | Double Pawn Push c5 |
Pawn from c7 to c5, two squares | Play ↗ |
| ♟️ | Pawn Push d6 |
Pawn from d7 to d6 | Play ↗ |
| ♟️ | Double Pawn Push d5 |
Pawn from d7 to d5, two squares | Play ↗ |
| ♟️ | Pawn Push e6 |
Pawn from e7 to e6 | Play ↗ |
| ♟️ | Double Pawn Push e5 |
Pawn from e7 to e5, two squares | Play ↗ |
| ♟️ | Pawn Push f6 |
Pawn from f7 to f6 | Play ↗ |
| ♟️ | Double Pawn Push f5 |
Pawn from f7 to f5, two squares | Play ↗ |
| ♟️ | Pawn Push g6 |
Pawn from g7 to g6 | Play ↗ |
| ♟️ | Double Pawn Push g5 |
Pawn from g7 to g5, two squares | Play ↗ |
| ♟️ | Pawn Push h6 |
Pawn from h7 to h6 | Play ↗ |
| ♟️ | Double Pawn Push h5 |
Pawn from h7 to h5, two squares | Play ↗ |
Anyone but @tannergolden can play on this turn, and the first pick in is played. The move is due by 24 Oct, 05:55 EST, or the Arbiter plays a random legal move.
🏁 Checkers
⛀ @tannergolden's Turn · 7 legal moves · only @tannergolden can play these
| Move | In words | Play | |
|---|---|---|---|
| 👣 | Man Move 21-17 |
Man from 21 to 17 | Play ↗ |
| 👣 | Man Move 22-17 |
Man from 22 to 17 | Play ↗ |
| 👣 | Man Move 22-18 |
Man from 22 to 18 | Play ↗ |
| 👣 | Man Move 23-18 |
Man from 23 to 18 | Play ↗ |
| 👣 | Man Move 23-19 |
Man from 23 to 19 | Play ↗ |
| 👣 | Man Move 24-19 |
Man from 24 to 19 | Play ↗ |
| 👣 | Man Move 24-20 |
Man from 24 to 20 | Play ↗ |
Only @tannergolden can play on this turn: a pick from anyone else is turned away with a comment on its issue. The move is due by 26 Oct, 06:16 EST, or the Arbiter plays a random legal move. A jump must be taken whenever there is one, and a man that reaches the far row is crowned.
🌀 Pentago
⚫ GitHub's Turn · 36 holes for a ghost · open to choose one
⚫ Upper Left Quarter · 9 moves
| Hole | In words | Then turn | |
|---|---|---|---|
| 👻 | Corner Ghost a6 |
A ghost on a6, the upper left corner of the upper left quarter | Play ↗ |
| 👻 | Edge Ghost b6 |
A ghost on b6, the top edge of the upper left quarter | Play ↗ |
| 👻 | Corner Ghost c6 |
A ghost on c6, the upper right corner of the upper left quarter | Play ↗ |
| 👻 | Edge Ghost a5 |
A ghost on a5, the left edge of the upper left quarter | Play ↗ |
| 👻 | Centre Ghost b5 |
A ghost on b5, the centre of the upper left quarter | Play ↗ |
| 👻 | Edge Ghost c5 |
A ghost on c5, the right edge of the upper left quarter | Play ↗ |
| 👻 | Corner Ghost a4 |
A ghost on a4, the lower left corner of the upper left quarter | Play ↗ |
| 👻 | Edge Ghost b4 |
A ghost on b4, the bottom edge of the upper left quarter | Play ↗ |
| 👻 | Corner Ghost c4 |
A ghost on c4, the lower right corner of the upper left quarter | Play ↗ |
⚫ Upper Right Quarter · 9 moves
| Hole | In words | Then turn | |
|---|---|---|---|
| 👻 | Corner Ghost d6 |
A ghost on d6, the upper left corner of the upper right quarter | Play ↗ |
| 👻 | Edge Ghost e6 |
A ghost on e6, the top edge of the upper right quarter | Play ↗ |
| 👻 | Corner Ghost f6 |
A ghost on f6, the upper right corner of the upper right quarter | Play ↗ |
| 👻 | Edge Ghost d5 |
A ghost on d5, the left edge of the upper right quarter | Play ↗ |
| 👻 | Centre Ghost e5 |
A ghost on e5, the centre of the upper right quarter | Play ↗ |
| 👻 | Edge Ghost f5 |
A ghost on f5, the right edge of the upper right quarter | Play ↗ |
| 👻 | Corner Ghost d4 |
A ghost on d4, the lower left corner of the upper right quarter | Play ↗ |
| 👻 | Edge Ghost e4 |
A ghost on e4, the bottom edge of the upper right quarter | Play ↗ |
| 👻 | Corner Ghost f4 |
A ghost on f4, the lower right corner of the upper right quarter | Play ↗ |
⚫ Lower Left Quarter · 9 moves
| Hole | In words | Then turn | |
|---|---|---|---|
| 👻 | Corner Ghost a3 |
A ghost on a3, the upper left corner of the lower left quarter | Play ↗ |
| 👻 | Edge Ghost b3 |
A ghost on b3, the top edge of the lower left quarter | Play ↗ |
| 👻 | Corner Ghost c3 |
A ghost on c3, the upper right corner of the lower left quarter | Play ↗ |
| 👻 | Edge Ghost a2 |
A ghost on a2, the left edge of the lower left quarter | Play ↗ |
| 👻 | Centre Ghost b2 |
A ghost on b2, the centre of the lower left quarter | Play ↗ |
| 👻 | Edge Ghost c2 |
A ghost on c2, the right edge of the lower left quarter | Play ↗ |
| 👻 | Corner Ghost a1 |
A ghost on a1, the lower left corner of the lower left quarter | Play ↗ |
| 👻 | Edge Ghost b1 |
A ghost on b1, the bottom edge of the lower left quarter | Play ↗ |
| 👻 | Corner Ghost c1 |
A ghost on c1, the lower right corner of the lower left quarter | Play ↗ |
⚫ Lower Right Quarter · 9 moves
| Hole | In words | Then turn | |
|---|---|---|---|
| 👻 | Corner Ghost d3 |
A ghost on d3, the upper left corner of the lower right quarter | Play ↗ |
| 👻 | Edge Ghost e3 |
A ghost on e3, the top edge of the lower right quarter | Play ↗ |
| 👻 | Corner Ghost f3 |
A ghost on f3, the upper right corner of the lower right quarter | Play ↗ |
| 👻 | Edge Ghost d2 |
A ghost on d2, the left edge of the lower right quarter | Play ↗ |
| 👻 | Centre Ghost e2 |
A ghost on e2, the centre of the lower right quarter | Play ↗ |
| 👻 | Edge Ghost f2 |
A ghost on f2, the right edge of the lower right quarter | Play ↗ |
| 👻 | Corner Ghost d1 |
A ghost on d1, the lower left corner of the lower right quarter | Play ↗ |
| 👻 | Edge Ghost e1 |
A ghost on e1, the bottom edge of the lower right quarter | Play ↗ |
| 👻 | Corner Ghost f1 |
A ghost on f1, the lower right corner of the lower right quarter | Play ↗ |
@tannergolden always plays White and GitHub Black. Under the Ghost Rule each side first sets a ghost, a marble that is nobody's, and then the Arbiter draws who sets the first marble. Anyone but @tannergolden can play on this turn, and the first pick in is played. The ghost is due by 20 Oct, 04:25 EST, or the Arbiter sets one at random.
❌ Tic-Tac
⭕ GitHub's Turn · 80 squares to lock · open to choose one
⭕ Upper Left Board · 9 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost a9 |
A ghost locks the upper left corner of the upper left board | Play ↗ |
| 👻 | Edge Ghost b9 |
A ghost locks the top edge of the upper left board | Play ↗ |
| 👻 | Corner Ghost c9 |
A ghost locks the upper right corner of the upper left board | Play ↗ |
| 👻 | Edge Ghost a8 |
A ghost locks the left edge of the upper left board | Play ↗ |
| 👻 | Centre Ghost b8 |
A ghost locks the centre of the upper left board | Play ↗ |
| 👻 | Edge Ghost c8 |
A ghost locks the right edge of the upper left board | Play ↗ |
| 👻 | Corner Ghost a7 |
A ghost locks the lower left corner of the upper left board | Play ↗ |
| 👻 | Edge Ghost b7 |
A ghost locks the bottom edge of the upper left board | Play ↗ |
| 👻 | Corner Ghost c7 |
A ghost locks the lower right corner of the upper left board | Play ↗ |
⭕ Top Board · 9 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost d9 |
A ghost locks the upper left corner of the top board | Play ↗ |
| 👻 | Edge Ghost e9 |
A ghost locks the top edge of the top board | Play ↗ |
| 👻 | Corner Ghost f9 |
A ghost locks the upper right corner of the top board | Play ↗ |
| 👻 | Edge Ghost d8 |
A ghost locks the left edge of the top board | Play ↗ |
| 👻 | Centre Ghost e8 |
A ghost locks the centre of the top board | Play ↗ |
| 👻 | Edge Ghost f8 |
A ghost locks the right edge of the top board | Play ↗ |
| 👻 | Corner Ghost d7 |
A ghost locks the lower left corner of the top board | Play ↗ |
| 👻 | Edge Ghost e7 |
A ghost locks the bottom edge of the top board | Play ↗ |
| 👻 | Corner Ghost f7 |
A ghost locks the lower right corner of the top board | Play ↗ |
⭕ Upper Right Board · 9 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost g9 |
A ghost locks the upper left corner of the upper right board | Play ↗ |
| 👻 | Edge Ghost h9 |
A ghost locks the top edge of the upper right board | Play ↗ |
| 👻 | Corner Ghost i9 |
A ghost locks the upper right corner of the upper right board | Play ↗ |
| 👻 | Edge Ghost g8 |
A ghost locks the left edge of the upper right board | Play ↗ |
| 👻 | Centre Ghost h8 |
A ghost locks the centre of the upper right board | Play ↗ |
| 👻 | Edge Ghost i8 |
A ghost locks the right edge of the upper right board | Play ↗ |
| 👻 | Corner Ghost g7 |
A ghost locks the lower left corner of the upper right board | Play ↗ |
| 👻 | Edge Ghost h7 |
A ghost locks the bottom edge of the upper right board | Play ↗ |
| 👻 | Corner Ghost i7 |
A ghost locks the lower right corner of the upper right board | Play ↗ |
⭕ Left Board · 9 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost a6 |
A ghost locks the upper left corner of the left board | Play ↗ |
| 👻 | Edge Ghost b6 |
A ghost locks the top edge of the left board | Play ↗ |
| 👻 | Corner Ghost c6 |
A ghost locks the upper right corner of the left board | Play ↗ |
| 👻 | Edge Ghost a5 |
A ghost locks the left edge of the left board | Play ↗ |
| 👻 | Centre Ghost b5 |
A ghost locks the centre of the left board | Play ↗ |
| 👻 | Edge Ghost c5 |
A ghost locks the right edge of the left board | Play ↗ |
| 👻 | Corner Ghost a4 |
A ghost locks the lower left corner of the left board | Play ↗ |
| 👻 | Edge Ghost b4 |
A ghost locks the bottom edge of the left board | Play ↗ |
| 👻 | Corner Ghost c4 |
A ghost locks the lower right corner of the left board | Play ↗ |
⭕ Centre Board · 8 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost d6 |
A ghost locks the upper left corner of the centre board | Play ↗ |
| 👻 | Edge Ghost e6 |
A ghost locks the top edge of the centre board | Play ↗ |
| 👻 | Corner Ghost f6 |
A ghost locks the upper right corner of the centre board | Play ↗ |
| 👻 | Edge Ghost d5 |
A ghost locks the left edge of the centre board | Play ↗ |
| 👻 | Edge Ghost f5 |
A ghost locks the right edge of the centre board | Play ↗ |
| 👻 | Corner Ghost d4 |
A ghost locks the lower left corner of the centre board | Play ↗ |
| 👻 | Edge Ghost e4 |
A ghost locks the bottom edge of the centre board | Play ↗ |
| 👻 | Corner Ghost f4 |
A ghost locks the lower right corner of the centre board | Play ↗ |
⭕ Right Board · 9 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost g6 |
A ghost locks the upper left corner of the right board | Play ↗ |
| 👻 | Edge Ghost h6 |
A ghost locks the top edge of the right board | Play ↗ |
| 👻 | Corner Ghost i6 |
A ghost locks the upper right corner of the right board | Play ↗ |
| 👻 | Edge Ghost g5 |
A ghost locks the left edge of the right board | Play ↗ |
| 👻 | Centre Ghost h5 |
A ghost locks the centre of the right board | Play ↗ |
| 👻 | Edge Ghost i5 |
A ghost locks the right edge of the right board | Play ↗ |
| 👻 | Corner Ghost g4 |
A ghost locks the lower left corner of the right board | Play ↗ |
| 👻 | Edge Ghost h4 |
A ghost locks the bottom edge of the right board | Play ↗ |
| 👻 | Corner Ghost i4 |
A ghost locks the lower right corner of the right board | Play ↗ |
⭕ Lower Left Board · 9 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost a3 |
A ghost locks the upper left corner of the lower left board | Play ↗ |
| 👻 | Edge Ghost b3 |
A ghost locks the top edge of the lower left board | Play ↗ |
| 👻 | Corner Ghost c3 |
A ghost locks the upper right corner of the lower left board | Play ↗ |
| 👻 | Edge Ghost a2 |
A ghost locks the left edge of the lower left board | Play ↗ |
| 👻 | Centre Ghost b2 |
A ghost locks the centre of the lower left board | Play ↗ |
| 👻 | Edge Ghost c2 |
A ghost locks the right edge of the lower left board | Play ↗ |
| 👻 | Corner Ghost a1 |
A ghost locks the lower left corner of the lower left board | Play ↗ |
| 👻 | Edge Ghost b1 |
A ghost locks the bottom edge of the lower left board | Play ↗ |
| 👻 | Corner Ghost c1 |
A ghost locks the lower right corner of the lower left board | Play ↗ |
⭕ Bottom Board · 9 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost d3 |
A ghost locks the upper left corner of the bottom board | Play ↗ |
| 👻 | Edge Ghost e3 |
A ghost locks the top edge of the bottom board | Play ↗ |
| 👻 | Corner Ghost f3 |
A ghost locks the upper right corner of the bottom board | Play ↗ |
| 👻 | Edge Ghost d2 |
A ghost locks the left edge of the bottom board | Play ↗ |
| 👻 | Centre Ghost e2 |
A ghost locks the centre of the bottom board | Play ↗ |
| 👻 | Edge Ghost f2 |
A ghost locks the right edge of the bottom board | Play ↗ |
| 👻 | Corner Ghost d1 |
A ghost locks the lower left corner of the bottom board | Play ↗ |
| 👻 | Edge Ghost e1 |
A ghost locks the bottom edge of the bottom board | Play ↗ |
| 👻 | Corner Ghost f1 |
A ghost locks the lower right corner of the bottom board | Play ↗ |
⭕ Lower Right Board · 9 moves
| Move | In words | Play | |
|---|---|---|---|
| 👻 | Corner Ghost g3 |
A ghost locks the upper left corner of the lower right board | Play ↗ |
| 👻 | Edge Ghost h3 |
A ghost locks the top edge of the lower right board | Play ↗ |
| 👻 | Corner Ghost i3 |
A ghost locks the upper right corner of the lower right board | Play ↗ |
| 👻 | Edge Ghost g2 |
A ghost locks the left edge of the lower right board | Play ↗ |
| 👻 | Centre Ghost h2 |
A ghost locks the centre of the lower right board | Play ↗ |
| 👻 | Edge Ghost i2 |
A ghost locks the right edge of the lower right board | Play ↗ |
| 👻 | Corner Ghost g1 |
A ghost locks the lower left corner of the lower right board | Play ↗ |
| 👻 | Edge Ghost h1 |
A ghost locks the bottom edge of the lower right board | Play ↗ |
| 👻 | Corner Ghost i1 |
A ghost locks the lower right corner of the lower right board | Play ↗ |
@tannergolden always plays X and GitHub O. Under the Ghost Rule each side first locks a square with a ghost, and then the Arbiter draws who makes the first mark. Anyone but @tannergolden can play on this turn, and the first pick in is played. The ghost is due by 24 Oct, 05:31 EST, or the Arbiter places one at random.
🏆 Leaderboard · @tannergolden · GitHub's players join with their first move
| Player | ♔♚ | ⛀⛂ | ⚪⚫ | ❌⭕ | Moves | Wins | |
|---|---|---|---|---|---|---|---|
| 🏠 | @tannergolden | 0 | 0 | 0 | 0 | 2 | 0 |
A win counts only for the player who makes the winning move: the checkmate in Chess, the move that leaves the other side no move in Checkers, the move that makes five in a row for its side in Pentago and the mark that wins a third board in a row in Tic-Tac. A move the Arbiter plays, for either side, counts for nobody, and a draw is nobody's win.
Follow the arrows from the rules to this page.
standards holds the rules and
the reusable workflows that enforce them, called by link and never copied, so
a fix lands once and reaches every repository pinned to it.
path is the template every new
repository starts from, already wired to those workflows. A repository that
wants a drawn README adds one
markdown stub. Once a day the kit
it calls measures the repository, or here the account, redraws what moved and
commits it as SVGs, header to footer in one commit, so nothing on this page
depends on a third-party service.
Achievements · 43 of 104 earned · next: Green Machine II, 98%
Milestones
Craft
Rhythm
Community
Housekeeping
Secret
Maker
Refreshed daily by tannergolden/markdown · Every trophy and achievement, what it is for and how to earn it: the catalogue. Click any card for its entry.
The two repositories on this account that shipped most recently, each with its version, the day it went out and the major tag a stub pins to follow it. Superseded releases are pruned, so each one shown is its repository's current release. Redrawn every Wednesday.
Note
GitHub changelog · 19 Oct. CodeQL changes for macOS 27, Xcode 27, and Swift 6.4
Tip
tldr-pages · openssl. Generate a self-signed certificate valid for a specified number of days (365): openssl req -new -x509 -key <path/to/private.key> -out <path/to/certificate.crt> -days 365
Important
Professional · Accessibility. Build accessibility into your shared component library, so every team gets labeled controls, focus handling and sufficient contrast by default. Fixing one component fixes every screen that uses it; fixing screens one by one never finishes.
Warning
Advisory · GHSA-mc4q-93x5-f6hj · nuget. Microsoft.NETCore.App.Runtime.linux-arm (>= 9.0.0, <= 9.0.20): Microsoft Security Advisory CVE-2026-58280 - .NET and Visual Studio Denial of Service Vulnerability. Update to 9.0.21 or later.
Caution
Intermediate · Git. A leading + in a push refspec, as in git push origin +main, forces that update exactly like --force, overwriting whatever the remote branch held. Read refspecs in scripts and aliases carefully before running them.
Redrawn every Monday, at random, from 5,000 curated notes and five open data sources. Week 43 of 2026. Open data this week: GitHub changelog, tldr-pages (CC BY 4.0), GitHub Advisory Database (CC BY 4.0).
The newest good first issue from each of the two most-starred projects that opened one lately, still open and unclaimed. Redrawn every Friday.



