Projects

Systems in production, browser experiments, and the small utilities I use every day.

Selected

MCP Server

Connect your own AI assistant to the retirement simulator, the Buffett letters, and every post on this site.

A stateless MCP server on AWS Lambda. The MCP page’s inspector sends the same requests the server’s automated tests use.

Model Context Protocol, TypeScript, AWS Lambda, Rust/WASM

One call to the server

api.mays.co/mcp

simulate_retirement: 4% for 30 years, 60% stocks

92.71%

of 100,000 simulated retirements lasted 30 years. 7.29% ran out of money, half of them by year 26.

Computed when this site was built

Ask the live server which tools it serves, timed from your browser.

tools/list

Exactly Once

Run one $80 checkout through 10,000 failure scenarios and see which retry strategy never charges twice or loses an order.

The safe strategy uses idempotency keys, a progress log, compensation, and a dead-letter queue. The engine is Rust compiled to WebAssembly.

Rust, WebAssembly

Same checkout, same failures

Rust engine, run at build

Retries blindly sends at least once 2,932 of 10,000 wrong
Retries safely exactly-once effect 0 of 10,000 wrong
  • 51 waiting for a person
  • 3 refunded or cancelled

Each grid holds the same 10,000 checkouts, one square each. A red square failed one of the lab’s checks, such as charging the card twice. A grey square passed.

Fault rates, the lab’s defaults

503, nothing commits
5%
key store loses a key
0%
timeout after commit
4%
duplicate delivery
2%
lost before commit
0%
crash after commit
2%

Ask Warren Buffett

Ask a question and get an answer drawn from 25 Berkshire Hathaway shareholder letters, 1998–2023, with the passages it used.

Retrieval over 673 embedded passages. Every answer shows its sources.

Claude Opus 5.5, OpenAI embeddings, AWS Lambda

A recorded answer

Recorded 2026-10-31

“What does Warren think about complex financial products?”

Each bar is one shareholder letter, sized by its passages: 673 from 25 letters. A dot is a passage this answer used, from the 2002 (2 passages), 2003, 2005, 2008 letters.
retrieval
681 ms
answer
11,382 ms
model
claude-opus-5-5

Retirement Simulator

Change a withdrawal rate and 100,000 simulated retirements rerun in your browser.

Rust compiled to WebAssembly. The same engine answers the MCP server’s simulate_retirement tool.

Rust, WebAssembly

Percent that ran out of money, by withdrawal rate

Rust engine, run at build

Percent of 100,000 simulated retirements that ran out of money within 30 years, with 60% in stocks. The 4% bar is the question the MCP panel opens on.

Rust compiled to WebAssembly

Lab

Smaller builds. All but the Startup Idea Generator run in your browser.

  • Startup Idea Generator

    claude-sonnet-5-5, on request

    Paste a resume and get startup ideas with a business plan, market analysis, and technical recommendations.

    Claude Sonnet 5.5, AWS Lambda, TypeScript

    Read the write-up
  • Falling Sand

    rust/wasm

    Pour sand, water, fire, and stone into a pixel sandbox and watch simple rules take over.

  • Image Cleaner

    rust/wasm

    Strip GPS and other metadata from a photo, turn it upright, and resize it without uploading it.

  • A new puzzle every day. Reverse runs of tiles to sort 1 to 8 in as few flips as you can, then share your score.

Utilities

Small tools I use every day. Nothing you paste leaves your browser.

The MCP server, Ask Warren Buffett, and the Startup Idea Generator run as AWS Lambda functions behind API Gateway. The Retirement Simulator’s Rust engine runs in your browser and inside the MCP server. The site itself is static Astro on S3 and CloudFront.