# Steve Kinney > Software engineer, educator, and engineering leader based in Denver, Colorado. Steve Kinney builds AI systems, developer tools, and courses on software engineering, including agentic workflows, durable execution, TypeScript, React, and modern web development. ## Blog Posts - [Thoughts on AI Safety](https://stevekinney.com/writing/thoughts-on-ai-safety): A cautious, nuanced case for AI optimism: why safety, interpretability, bias, and alignment matter as much as raw capability. ([llms.txt](https://stevekinney.com/writing/thoughts-on-ai-safety/llms.txt)) - [Using Codex from Claude: Getting a Second Opinion from a Different Model Family](https://stevekinney.com/writing/codex-as-a-second-opinion): I wired OpenAI's Codex into Claude Code as a consulting subagent—a different training lineage I can tap for architecture calls, stuck bugs, and security reviews. Here's how the `codex-advisor` agent works and why it isn't actually an MCP server anymore. ([llms.txt](https://stevekinney.com/writing/codex-as-a-second-opinion/llms.txt)) - [Multi-Model Agentic Coding: Letting the Other Model Do the Typing](https://stevekinney.com/writing/codex-as-a-worker): The follow-up to my Codex-as-advisor setup. Same second model family, opposite stance: instead of asking Codex for an opinion, I hand it the implementation, let it work in an isolated worktree, and run an approval loop where I own the diff and Codex never gets to commit. ([llms.txt](https://stevekinney.com/writing/codex-as-a-worker/llms.txt)) - [Sentinels: The Quiet Power of a Touched File](https://stevekinney.com/writing/sentinels-for-agent-gates): How I use sentinel files to gate the risky moves my coding agents make—exiting plan mode, opening a pull request, addressing review feedback, backing off a rate-limited model. The whole mechanism is a file on disk and a hook that checks for it. ([llms.txt](https://stevekinney.com/writing/sentinels-for-agent-gates/llms.txt)) - [Claude Ultraplan: Planning in the Cloud, Executing Wherever](https://stevekinney.com/writing/claude-ultraplan): Ultraplan hands the planning phase of a coding task off to a Claude Code on the web session running in plan mode, then lets you review it in the browser and decide where to execute. Here's what it actually changes about your workflow, what it costs, and where the sharp edges are. ([llms.txt](https://stevekinney.com/writing/claude-ultraplan/llms.txt)) - [Playwright vs. Chrome DevTools MCP: Driving vs. Debugging](https://stevekinney.com/writing/driving-vs-debugging-the-browser): Playwright and Chrome DevTools both ship official tools for letting AI agents drive a browser, but they're optimized for different jobs. Here's how Playwright CLI, Playwright MCP, and Chrome DevTools MCP actually fit together, and how to pick between them without guessing. ([llms.txt](https://stevekinney.com/writing/driving-vs-debugging-the-browser/llms.txt)) - [Entering the Mind of Ralph Wiggum](https://stevekinney.com/writing/the-ralph-loop): A while-true loop, a prompt file, and a clean context window on every iteration. The Ralph Loop is the dumbest-sounding technique that actually works—and the reason it works will change how you think about programming LLMs. ([llms.txt](https://stevekinney.com/writing/the-ralph-loop/llms.txt)) - [Memory Systems for AI Agents: What the Research Says and What You Can Actually Build](https://stevekinney.com/writing/agent-memory-systems): The old short-term/long-term taxonomy doesn't capture what modern agent memory systems actually do. A new three-axis framework—Forms, Functions, and Dynamics—maps the design space from flat vector stores to RL-driven memory management. Here's what the research says and what you can build today. ([llms.txt](https://stevekinney.com/writing/agent-memory-systems/llms.txt)) - [Temporal's Developer Skill Is a Promising First Draft](https://stevekinney.com/writing/temporal-developer-skill): Temporal shipped one of the first major infrastructure vendor agent skills. The diagnosis is right and the architecture is sound. The execution has some fixable gaps. ([llms.txt](https://stevekinney.com/writing/temporal-developer-skill/llms.txt)) - [The Anatomy of an Agent Loop](https://stevekinney.com/writing/agent-loops): Every major AI agent runs the same core loop. The 6-line version is easy. The production-hardened version—with context compaction, loop detection, cost budgets, and graceful termination—is where things get interesting. ([llms.txt](https://stevekinney.com/writing/agent-loops/llms.txt)) - [Agent Skills, Stripped of Hype](https://stevekinney.com/writing/agent-skills): Agent skills are not a new capability—they're a context management strategy. Their value comes from routing and progressive disclosure, not from smarter prompts. ([llms.txt](https://stevekinney.com/writing/agent-skills/llms.txt)) - [Designing a Build System That Runs Untrusted Code](https://stevekinney.com/writing/designing-a-system-to-run-untrusted-code): A deep technical walkthrough of what it takes to design a build system that securely executes arbitrary customer repositories and turns build output into deployable artifacts—covering the pipeline, the security model, the architecture, and the operational realities. ([llms.txt](https://stevekinney.com/writing/designing-a-system-to-run-untrusted-code/llms.txt)) - [Designing an AI Gateway and Durable Workflow System](https://stevekinney.com/writing/ai-gateway-durable-workflows): A two-layer architecture for production AI systems: a gateway that abstracts providers, enforces policies, and tracks costs, paired with a durable workflow engine that makes long-running agentic tasks survive failures, pause for human approval, and replay deterministically. ([llms.txt](https://stevekinney.com/writing/ai-gateway-durable-workflows/llms.txt)) - [MCP Apps and the Missing Middle of AI Tooling](https://stevekinney.com/writing/mcp-apps): MCP servers return data. MCP Apps let them ship a UI alongside that data—so the tool author, not the client, decides how results look. ([llms.txt](https://stevekinney.com/writing/mcp-apps/llms.txt)) - [My Ridiculous AI-Assisted Development Workflow](https://stevekinney.com/writing/ai-assisted-development-workflow): A walkthrough of the system I use to ship code with AI agents—from planning in Linear to worktrees, linting gauntlets, and a small army of code review bots. ([llms.txt](https://stevekinney.com/writing/ai-assisted-development-workflow/llms.txt)) - [build-temporal-workflow: Faster Temporal Workflow Bundling with esbuild](https://stevekinney.com/writing/build-temporal-workflow): A drop-in replacement for @temporalio/worker's bundleWorkflowCode that swaps Webpack for esbuild—delivering 9–11x faster builds and 94% less memory usage. ([llms.txt](https://stevekinney.com/writing/build-temporal-workflow/llms.txt)) - [Prompt Engineering Across the OpenAI, Anthropic, and Gemini APIs](https://stevekinney.com/writing/prompt-engineering-frontier-llms): A practical guide to writing reliable prompts across the major LLM APIs—covering core techniques, where the providers actually diverge, trust boundaries, and two production workflows built from brittle to hardened. ([llms.txt](https://stevekinney.com/writing/prompt-engineering-frontier-llms/llms.txt)) - [Introducing Prose Writer](https://stevekinney.com/writing/introducing-prose-writer): A little TypeScript library for building Markdown-friendly strings without template literal sprawl. ([llms.txt](https://stevekinney.com/writing/introducing-prose-writer/llms.txt)) - [Cursor Rules for Writing Temporal Workflows with TypeScript](https://stevekinney.com/writing/cursor-rules-temporal-typescript): Essential guidelines and best practices for writing reliable Temporal workflows in TypeScript, covering serialization, determinism, and workflow patterns. ([llms.txt](https://stevekinney.com/writing/cursor-rules-temporal-typescript/llms.txt)) - [Cursor Rules for TypeScript Engineers](https://stevekinney.com/writing/cursor-rules-typescript): A collection of some potentially useful Cursor rules as well as a rundown of what potentially makes a Cursor rule great. ([llms.txt](https://stevekinney.com/writing/cursor-rules-typescript/llms.txt)) - [Using Anthropic's Message Batches API with Temporal](https://stevekinney.com/writing/anthropic-batch-api-with-temporal): Build scalable, cost-efficient AI processing with Anthropic's Message Batches API and Temporal workflows. ([llms.txt](https://stevekinney.com/writing/anthropic-batch-api-with-temporal/llms.txt)) - [What If It Goes Wrong?: The Hidden Dangers of Counterfactual Reasoning in AI](https://stevekinney.com/writing/counter-factual-reasoning-in-ai): Exploring the pitfalls of counterfactual reasoning in AI, highlighting its fragility, chaotic nature, and alignment with Nassim Taleb's critique of prediction in complex systems. ([llms.txt](https://stevekinney.com/writing/counter-factual-reasoning-in-ai/llms.txt)) - [Getting the Most Out of GPT-4.1](https://stevekinney.com/writing/getting-the-most-out-of-gpt-4-1): A naïve guide to get the most out of GPT-4.1: context window optimization, coding tips, prompt best practices, and when to choose GPT-4.1 over GPT-4.5. ([llms.txt](https://stevekinney.com/writing/getting-the-most-out-of-gpt-4-1/llms.txt)) - [Neural Networks](https://stevekinney.com/writing/neural-networks): A friendly intro to neural networks, what they are, how they learn, and why they matter for software engineers exploring the world of generative AI. ([llms.txt](https://stevekinney.com/writing/neural-networks/llms.txt)) - [A Gentle Introduction to Using a Vector Database](https://stevekinney.com/writing/using-a-vector-database): In which we learn how to build a simple vector database using Pinecone and OpenAI embeddings, and discover it was way easier than we might have expected. ([llms.txt](https://stevekinney.com/writing/using-a-vector-database/llms.txt)) - [Setting Up a Python Environment on macOS](https://stevekinney.com/writing/setup-python): A brief guide for getting started writing Python on a Mac using virtual environments. ([llms.txt](https://stevekinney.com/writing/setup-python/llms.txt)) - [Implementing Obsidian's Callout in Svelte](https://stevekinney.com/writing/obsidian-callout-svelte): A gentle walkthrough where we build our take on Obsidian's callout component in Svelte. ([llms.txt](https://stevekinney.com/writing/obsidian-callout-svelte/llms.txt)) - [Positives, Negatives, and Alternatives to Using Tailwind for a Design System](https://stevekinney.com/writing/tailwind-and-design-systems): Is Tailwind the best choice when building out a design system? It depends. ([llms.txt](https://stevekinney.com/writing/tailwind-and-design-systems/llms.txt)) - [Creating a Markdown Preprocessor for Svelte](https://stevekinney.com/writing/svelte-markdown-preprocessor): Let's look at how to write our own preprocessor for SvelteKit. ([llms.txt](https://stevekinney.com/writing/svelte-markdown-preprocessor/llms.txt)) - [Understanding Generics in TypeScript](https://stevekinney.com/writing/typescript-generics): Let's learn a little bit about what generics are in TypeScript, why they're useful, and how to use them. ([llms.txt](https://stevekinney.com/writing/typescript-generics/llms.txt)) - [A Gentle Introduction to Svelte Stores](https://stevekinney.com/writing/svelte-stores): Svelte stores simplify state management across components. Let's learn how they're implemented. ([llms.txt](https://stevekinney.com/writing/svelte-stores/llms.txt)) ## Course Walkthroughs - [Self-Testing AI Agents](https://stevekinney.com/courses/self-testing-ai-agents): Build the feedback loops that let coding agents catch their own mistakes—Playwright, visual regression, runtime probes, custom MCPs, review bots, a static layer, and CI—so you stop being the verification step. ([llms.txt](https://stevekinney.com/courses/self-testing-ai-agents/llms.txt)) - [Deploying Web Applications on AWS](https://stevekinney.com/courses/aws): Deploy, scale, and secure frontend applications on AWS—from S3 and CloudFront to Lambda, API Gateway, and DynamoDB—without ever needing to become a full-time cloud engineer. ([llms.txt](https://stevekinney.com/courses/aws/llms.txt)) - [Enterprise UI](https://stevekinney.com/courses/enterprise-ui): Scale frontend applications beyond a single-team SPA with composition patterns, module federation, operational infrastructure, and migration strategies. ([llms.txt](https://stevekinney.com/courses/enterprise-ui/llms.txt)) - [React Performance](https://stevekinney.com/courses/react-performance): Profile, measure, and optimize React applications—from understanding reconciliation and re-renders to memoization, code splitting, and React 19's concurrent features. ([llms.txt](https://stevekinney.com/courses/react-performance/llms.txt)) - [React with TypeScript](https://stevekinney.com/courses/react-typescript): Build type-safe React applications with TypeScript and React 19—covering hooks, reducers, context, component APIs, and generics. ([llms.txt](https://stevekinney.com/courses/react-typescript/llms.txt)) - [AI Fundamentals with Python](https://stevekinney.com/courses/python-ai): Get hands-on with AI development using Python and Hugging Face—from tokenization and attention to fine-tuning models and generating images with Stable Diffusion. ([llms.txt](https://stevekinney.com/courses/python-ai/llms.txt)) - [Developing with AI Tools](https://stevekinney.com/courses/ai-development): Learn practical workflows for Cursor, Claude Code, MCP, and agentic software development with current installation, context, permission, and review guidance. ([llms.txt](https://stevekinney.com/courses/ai-development/llms.txt)) - [Tailwind](https://stevekinney.com/courses/tailwind): Learn Tailwind CSS from utility-first fundamentals through design tokens, responsive layouts, dark mode, and the new features in Tailwind 4. ([llms.txt](https://stevekinney.com/courses/tailwind/llms.txt)) - [Full Stack TypeScript](https://stevekinney.com/courses/full-stack-typescript): Wire up end-to-end type safety across the frontend and backend with TypeScript, Express, Zod, tRPC, and branded types. ([llms.txt](https://stevekinney.com/courses/full-stack-typescript/llms.txt)) - [Visual Studio Code](https://stevekinney.com/courses/visual-studio-code): Get more out of VS Code with advanced workflows, debugging tools, customizations, extensions, and keyboard shortcuts that speed up daily development. ([llms.txt](https://stevekinney.com/courses/visual-studio-code/llms.txt)) - [Introduction to Testing](https://stevekinney.com/courses/testing): Build confidence in your codebase with practical testing techniques—covering assertions, mocking, integration tests, and testing strategy. ([llms.txt](https://stevekinney.com/courses/testing/llms.txt)) - [Web Security](https://stevekinney.com/courses/web-security): Understand modern web security fundamentals—from authentication and authorization to XSS, CSRF, and practical mitigation techniques. ([llms.txt](https://stevekinney.com/courses/web-security/llms.txt)) - [Figma for Developers](https://stevekinney.com/courses/figma): Learn Figma's developer-friendly features—constraints, auto layout, component properties, variables, and CSS generation—to bridge the gap between design and code. ([llms.txt](https://stevekinney.com/courses/figma/llms.txt)) - [Building Design Systems in Storybook](https://stevekinney.com/courses/storybook): Build a scalable design system with Storybook—creating reusable components, writing interaction tests, implementing dark mode, and generating documentation. ([llms.txt](https://stevekinney.com/courses/storybook/llms.txt)) ## Projects - [Agent Bureau](https://stevekinney.com/projects/agent-bureau): A playground for durable agent infrastructure: queues, schedules, memory, gateways, and all the glue code that stops being glue once it matters. ([llms.txt](https://stevekinney.com/projects/agent-bureau/llms.txt)) - [Cinder](https://stevekinney.com/projects/cinder): A Svelte design system for the components I keep rebuilding anyway, packaged as something I can use across real projects instead of copying snippets around. ([llms.txt](https://stevekinney.com/projects/cinder/llms.txt)) - [ESLint Plugin Temporal](https://stevekinney.com/projects/eslint-plugin-temporal): ESLint rules for catching Temporal workflow mistakes before they become replay bugs, which is the polite time to learn about them. ([llms.txt](https://stevekinney.com/projects/eslint-plugin-temporal/llms.txt)) - [GitHub Webhook Schemas](https://stevekinney.com/projects/github-webhook-schemas): TypeScript schemas for GitHub webhook payloads, so webhook handlers can validate reality instead of trusting whatever just hit the endpoint. ([llms.txt](https://stevekinney.com/projects/github-webhook-schemas/llms.txt)) - [Octavian](https://stevekinney.com/projects/octavian): Utilities for reasoning about musical notes, frequencies, and intervals in JavaScript without making every project relearn the circle of fifths. ([llms.txt](https://stevekinney.com/projects/octavian/llms.txt)) - [Protokit](https://stevekinney.com/projects/protokit): A small toolkit for protocol-shaped experiments: the sort of project where the interesting part is making messages explicit enough to reason about. ([llms.txt](https://stevekinney.com/projects/protokit/llms.txt)) - [Sandman](https://stevekinney.com/projects/sandman): A sandboxing project for running untrusted code with enough guardrails that the phrase 'what could possibly go wrong' becomes slightly less ominous. ([llms.txt](https://stevekinney.com/projects/sandman/llms.txt)) - [Stardust](https://stevekinney.com/projects/stardust): A product and interface prototype for turning loosely structured ideas into something you can inspect, refine, and eventually hand to an agent. ([llms.txt](https://stevekinney.com/projects/stardust/llms.txt)) - [Temporal Explorer](https://stevekinney.com/projects/temporal-explorer): An experimental interface for poking at Temporal workflows, histories, and runtime state without turning every debugging session into a scavenger hunt. ([llms.txt](https://stevekinney.com/projects/temporal-explorer/llms.txt)) - [Temporal MCP](https://stevekinney.com/projects/temporal-mcp): A Model Context Protocol server for working with Temporal from agent tools, because workflow state is easier to inspect when the agent can ask directly. ([llms.txt](https://stevekinney.com/projects/temporal-mcp/llms.txt)) - [Tribunal](https://stevekinney.com/projects/tribunal): A review and adjudication interface for agent work, built around the idea that automated feedback still needs a place to become a decision. ([llms.txt](https://stevekinney.com/projects/tribunal/llms.txt)) - [Vector Frankl](https://stevekinney.com/projects/vector-frankl): A semantic search and vector database experiment, because sometimes the question is not 'what matched?' but 'what was this kind of like?' ([llms.txt](https://stevekinney.com/projects/vector-frankl/llms.txt)) - [Weft](https://stevekinney.com/projects/weft): Durable execution primitives for TypeScript applications that need workflows, retries, timers, and real state without pretending distributed systems are easy. ([llms.txt](https://stevekinney.com/projects/weft/llms.txt)) ## Links - [RSS Feed](https://stevekinney.com/writing/rss) - [Sitemap](https://stevekinney.com/sitemap.xml) - [Full Content](https://stevekinney.com/llms-full.txt)