# Justin Poehnelt > Justin Poehnelt on software development, cloud infrastructure, AI agents, and ultra running. Founder and CTO at Helen's Foundry. ## How to use this directory - Markdown URLs are compact alternate representations for retrieval. Cite the canonical HTML URL included in each file. - Browse the [complete post archive](https://justin.poehnelt.com/posts/) or [XML sitemap](https://justin.poehnelt.com/sitemap.xml) for everything published on the site. - Use the [Google Apps Script guide](https://justin.poehnelt.com/google-apps-script/) for the curated Apps Script collection. ## AI agents and developer tooling - [You Need to Rewrite Your CLI for AI Agents](https://justin.poehnelt.com/posts/rewrite-your-cli-for-ai-agents.md) — Human DX optimizes for discoverability. Agent DX optimizes for predictability. What I learned building a CLI for agents first. - [The MCP Abstraction Tax](https://justin.poehnelt.com/posts/mcp-abstraction-tax.md) — Every layer from App to API to MCP loses fidelity. An exploration of what gets lost and why it matters for enterprise APIs. - [Your App Should Ship an MCP Server](https://justin.poehnelt.com/posts/ship-mcp-server-native-app.md) — Why I embedded an MCP server in a native Rust prose editor so an AI agent can drive, inspect, rebuild, and verify the running app. - [Agent Identity for Git Commits](https://justin.poehnelt.com/posts/agent-identity-git-commits.md) — How to configure AI agents to push commits to GitHub using a separate bot identity without modifying local git configuration. - [Protect Gmail AI Agents with Model Armor](https://justin.poehnelt.com/posts/building-secure-ai-agents-mcp.md) — Use Model Armor in an MCP tool handler to block prompt injection and redact sensitive Gmail content before it reaches an AI agent. ## Google Apps Script - [UrlFetchApp: The Unofficial Documentation](https://justin.poehnelt.com/posts/definitive-guide-to-urlfetchapp.md) — The unofficial guide to Google Apps Script UrlFetchApp. Master authentication, fetchAll for parallelism, web scraping, and debugging "Address Unavailable". - [Apps Script Storage Benchmarks](https://justin.poehnelt.com/posts/apps-script-key-value-stores.md) — Benchmarks comparing CacheService, PropertiesService, and Firestore in Apps Script, including speed measurements and when each storage option fits. - [PostgreSQL from Google Apps Script](https://justin.poehnelt.com/posts/apps-script-postgresql.md) — Connect Apps Script to PostgreSQL via JDBC, including connection strings, JSONB and UUID workarounds, transactions, and PostGIS. - [Using Gemini in Apps Script](https://justin.poehnelt.com/posts/using-gemini-in-apps-script.md) — Use Apps Script's Vertex AI advanced service to call Gemini for text, images, structured output, search grounding, and multi-turn chat. - [Building a MCP Client in Google Apps Script](https://justin.poehnelt.com/posts/mcp-client-apps-script.md) — Learn how to communicate with Model Context Protocol (MCP) servers using Apps Script and UrlFetchApp. Incorporate the MCP client into Vertex AI tool calling. ## Software engineering - [Optimized Dockerfile for Rust](https://justin.poehnelt.com/posts/rust-optimized-docker-file.md) — A multi-stage Rust Dockerfile that caches dependencies with a dummy main.rs before copying source into a slim Debian runtime image. - [Cloudflare Workers: Dev, Staging, and Prod](https://justin.poehnelt.com/posts/cloudflare-workers-wrangler-dev-staging-prod.md) — Configure Wrangler environments for Cloudflare Workers, then use GitHub Actions to deploy and promote changes through dev, staging, and production. - [Caching Playwright Binaries in GitHub Actions](https://justin.poehnelt.com/posts/caching-playwright-in-github-actions.md) — A GitHub Actions caching strategy for Playwright browser binaries that reduces repeated downloads and speeds up browser-based CI runs. - [React Wrapper for Google Drive Picker](https://justin.poehnelt.com/posts/react-wrapper-google-drive-picker.md) — Announcing the new React component for the Google Drive Picker, wrapping usage of the web component for easier integration. ## Ultrarunning - [2022 Mogollon Monster 100 Mile Race Report](https://justin.poehnelt.com/posts/2022-mogollon-monster-race-report.md) — A 2022 Mogollon Monster 100 race report: I led early, battled ankle and calf injuries, exhaustion, and nausea, then finished 15th. - [Running and Chronic Exertional Compartment Syndrome](https://justin.poehnelt.com/posts/running-with-exertional-compartment-syndrome.md) — Understanding and treating a new running injury, Chronic Exertional Compartment Syndrome. Can I run? Can I race? - [2026 Crazy Mountain 100](https://justin.poehnelt.com/posts/2026-crazy-mountain-100.md) — I'm running the Crazy Mountain 100 in 2026! It's a rugged 100 miler in Montana that serves as a Hardrock qualifier.