I'm Andrew (@andrewwilkinson). Product engineer in London, eight years deep in crypto, founded Galleon, and keeper of a GitHub that is mostly a graveyard of side projects I'm proud of.
These are the skills I use every day, with Claude and Codex doing most of the typing: at work on Peer, on USDCtoFiat and Peerlytics, across my open source repos, and in the agents I run myself, from self-hosted agent infrastructure to an agentic Slack bot. Cleaned up so anyone can use them.
Agents are very good at saying "done". They're less good at checking the mobile layout, noticing the event never fired, or spotting that production is still serving yesterday's build. And left alone, everything they design ends up purple, glassy and three cards wide.
I got tired of typing the same follow-ups, so I wrote them down once and gave the agent the tools to check its own work. astack makes done mean live, measured and not slop.
npx astack-skills@latest install --agent allThat puts the skills in your project for Claude Code and Codex. --scope global installs them for every project, in your home directory, and --skill ship,deslop picks a few. An unchanged folder is skipped. If a selected folder differs, nothing is written until you pass --force, which replaces that folder.
As a plugin:
/plugin marketplace add ADWilkinson/astack
/plugin install astack@adwilkinson
codex plugin marketplace add ADWilkinson/astack
codex plugin add astack@adwilkinsonWith the skills CLI, which also covers Cursor, Gemini CLI and other agents:
npx skills@latest add ADWilkinson/astack
npx skills@latest add ADWilkinson/astack --skill web-designBrowse every skill, with example prompts and what it pairs with, at andrewwilkinson.io/skills.
Or do what I do and paste this repo's link to your agent with "install this". It reads the same instructions you just did.
Two ways in, depending on whether you're watching.
astack this: add annual pricing to the billing page. phones matter most
astack takes it to a PR you'd be happy to merge. It reads the context, plans, builds, uses the thing like a customer, adds relevant tracking, cleans up the diff, and verifies the result. A separate reviewer joins when the risk or judgment calls for one.
oneshot this: add annual pricing and get it live
oneshot is for when you're not watching. Same work, then it merges, deploys, proves production is serving it and sends any authorized update. It only runs when you ask for it by name.
Both keep one working context and load other skills only when their procedure helps the next step. Required repository checks and delivery proof still apply.
| Skill | Say | What it does |
|---|---|---|
| astack | "astack this" | Takes a task from idea to a proven, review-ready PR, with a done-check at every stage. |
| oneshot | "oneshot this" | The same, all the way: merged, deployed, verified live and announced. You call it by name. |
| context | "read the thread first" | Pulls the Slack thread, issue, PRs, git history and analytics that actually change the task into a short brief. |
| web-design | "this looks AI-generated" | Gives the UI a real direction, keeps a DESIGN.md so it sticks, animates with purpose, stress-tests it with worst-case data, and checks it on a phone in light and dark. |
| modern-web-guidance | "use current web guidance" | Searches pinned browser guides before frontend work and checks scoped legacy-pattern findings during review, with telemetry disabled. |
| web-graphics | "make a hero graphic" | Isometric scenes, animated sticker icons, flat illustrations, ASCII art, icons and share cards, built in code. |
| deslop | "this sounds like AI" | Finds the tells in copy, UI and code, fixes them, and can learn your voice from your own writing. |
| instrument | "can we measure this" | Tracking that fires once, on real success, and a query you can actually trust. |
| discoverability | "why doesn't ChatGPT mention us" | Checks what Google and AI crawlers really see, fixes it, measures before and after. |
| dogfood | "use it like a customer" | Walks the real journeys signed in, fixes what breaks and goes round again. |
| ship | "ship it" | Clears CI and review comments, verifies the affected behavior, deploys, and proves production is serving it. Also checks other people's "it's shipped". |
| launch | "we launch tomorrow" | Share cards, page checks, posts for X and Show HN, a tracker and how you'll read the results. |
Each one has a short guide in docs/skills.
Most skill packs tell the model to be thorough. These come with small scripts so it can actually check. The scripts use Node 22, and every skill carries its own copy. The Modern Web Guidance adapter also needs npm; its first use downloads the pinned upstream tool with telemetry disabled. Installing astack does not run it.
shoot.mjsscreenshots a page on a phone and on desktop, light and dark, and flags stranded words, tiny tap targets, anything spilling sideways, inputs that will zoom the page, hover that is not gated to a real pointer, and (with--shift) a loading state whose boxes do not match the loaded page.pr-state.mjsreads every check on the current commit and every unresolved review thread.--watchsits in the background and pings you when something changes.verify-live.mjsconfirms the URL is serving the commit you shipped, not a cached copy of the last one.slop-scan.mjsfinds the usual suspects, from "seamless" to gradient headlines to emoji bullets, and explains why each one reads as generated.page-audit.mjsshows what crawlers and link previews see, like a forgotten noindex or a broken share card.modern-web.mjssearches browser guides and scans affected local frontend paths for legacy-pattern candidates. It pins the upstream version, disables telemetry and refuses installation, mutation commands and scans outside the checkout. Findings still need source and browser-policy checks.iso.mjsturns a small scene description into clean isometric SVG with the geometry right, because nobody should hand-roll isometric maths.render-gate.mjsrenders a card, slide or page at each size and fails it when the brand font quietly fell back, the copy drifted from what was asked, text got clipped, or a colour isn't one of your tokens.film.mjsturns an HTML page with CSS animations into an MP4, frame by frame, so a demo clip is code you can fix and re-render. It refuses films that open on black, never move, or come out different each take.
I gave the same model the same six tasks twice, once with astack and once without, and had a separate agent score both blind.
| Task | With astack | Without |
|---|---|---|
| Rebrand a generic landing page | 20 | 14 |
| Add checkout analytics | 19 | 14 |
| Get a site ready to launch | 20 | 16 |
| QA and fix a signup flow | 20 | 17 |
| Deslop a landing page | 20 | 18 |
| Check an "it's shipped" claim | 18 | 18 |
Without it, the agent kept an unverified "Trusted by 10,000+ freelancers" on the page, let checkout count an order twice and launched with no idea where the traffic would come from. One run each and a same-family judge, so it's a strong signal rather than a benchmark. It also missed something: both brand results landed on the warm cream, serif and terracotta look that's everywhere right now, so 0.5 now catches that too. The case study shows both. Full setup and raw scores are in evals.
Fork it, change it, send PRs. Keep your own preferences outside the skills so updates don't wipe them: house rules in CLAUDE.md or AGENTS.md, your design direction in DESIGN.md, your writing voice in VOICE.md. The skills read those first.
Nothing here posts, messages, deploys to production or spends money unless you've said so for that exact thing. No background services, no telemetry. When it can't check something, it tells you.
Working on astack itself: bun run metadata syncs shared scripts and picker metadata, bun run check validates everything and runs the tests. See CONTRIBUTING and SCOPE.
MIT 🏴☠️