[{"data":1,"prerenderedAt":1811},["ShallowReactive",2],{"post-cards":3,"categories":860,"post-running-codex-inside-claude-code":916},[4,34,51,65,84,100,119,134,159,172,189,211,223,241,258,274,288,305,319,334,349,362,371,380,394,408,422,432,445,455,465,476,491,503,516,527,538,549,560,571,582,595,608,623,638,652,666,678,689,700,710,720,730,740,750,760,770,780,790,800,810,820,830,840,850],{"path":5,"title":6,"slug":7,"summary":8,"date":9,"readTime":10,"hasImage":11,"category":12,"tags":17,"tagSlugs":33},"\u002Fposts\u002Frunning-codex-inside-claude-code","Running Codex inside Claude Code","running-codex-inside-claude-code","Why you'd want OpenAI's Codex reviewing Claude's work from inside Claude Code, the plugin that bridges them, the review-and-rescue workflow, and two copy-paste skills that make delegation a habit.","2026-07-20",10,true,{"id":13,"name":14,"slug":15,"hue":16},9,"AI & Tooling","ai-tooling",285,[18,21,24,27,30],{"name":19,"slug":20},"Claude Code","claude-code",{"name":22,"slug":23},"Codex","codex",{"name":25,"slug":26},"AI","ai",{"name":28,"slug":29},"Developer Tools","developer-tools",{"name":31,"slug":32},"Skills","skills",[20,23,26,29,32],{"path":35,"title":36,"slug":37,"summary":38,"date":39,"readTime":10,"hasImage":11,"category":40,"tags":41,"tagSlugs":50},"\u002Fposts\u002Fllms-txt-and-who-actually-reads-it","llms.txt, and who actually reads it","llms-txt-and-who-actually-reads-it","A plain-text file at \u002Fllms.txt hands language models a curated map of your site. Here is how to add one, what it is genuinely good for (coding agents), and why you should not expect it to move your AI-search numbers.","2026-07-09",{"id":13,"name":14,"slug":15,"hue":16},[42,45,46,49],{"name":43,"slug":44},"llms.txt","llms-txt",{"name":25,"slug":26},{"name":47,"slug":48},"Documentation","documentation",{"name":28,"slug":29},[44,26,48,29],{"path":52,"title":53,"slug":54,"summary":55,"date":56,"readTime":57,"hasImage":11,"category":58,"tags":59,"tagSlugs":64},"\u002Fposts\u002Fthe-grill-me-skill-for-claude-code","The grill-me Skill for Claude Code","the-grill-me-skill-for-claude-code","A look at Matt Pocock's tiny, viral grill-me skill: instead of coding your idea straight away, Claude interviews you one question at a time until the plan has no ambiguity left.","2026-06-18",7,{"id":13,"name":14,"slug":15,"hue":16},[60,61,62,63],{"name":19,"slug":20},{"name":31,"slug":32},{"name":25,"slug":26},{"name":28,"slug":29},[20,32,26,29],{"path":66,"title":67,"slug":68,"summary":69,"date":70,"readTime":71,"hasImage":11,"category":72,"tags":73,"tagSlugs":83},"\u002Fposts\u002Floop-engineering-in-claude-code","Loop Engineering in Claude Code: Designing the System That Prompts the Agent","loop-engineering-in-claude-code","Loop engineering is the shift from prompting an agent step by step to designing a system that prompts it for you. Here is what that means in Claude Code, the building blocks it already ships, a worked example, and an honest look at when it is worth the tokens on a subscription.","2026-06-17",11,{"id":13,"name":14,"slug":15,"hue":16},[74,75,78,81,82],{"name":19,"slug":20},{"name":76,"slug":77},"Loop Engineering","loop-engineering",{"name":79,"slug":80},"Automation","automation",{"name":25,"slug":26},{"name":28,"slug":29},[20,77,80,26,29],{"path":85,"title":86,"slug":87,"summary":88,"date":89,"readTime":57,"hasImage":11,"category":90,"tags":91,"tagSlugs":99},"\u002Fposts\u002Fclaude-code-hooks-by-example","Claude Code Hooks, by Example","claude-code-hooks-by-example","CLAUDE.md asks Claude Code nicely. Hooks make things happen for certain. A short, practical tour of how hooks are wired, built around two that I actually run: one that installs dependencies on session start, and one that filters noisy command output before it reaches the model.","2026-06-15",{"id":13,"name":14,"slug":15,"hue":16},[92,93,96,97,98],{"name":19,"slug":20},{"name":94,"slug":95},"Hooks","hooks",{"name":79,"slug":80},{"name":25,"slug":26},{"name":28,"slug":29},[20,95,80,26,29],{"path":101,"title":102,"slug":103,"summary":104,"date":105,"readTime":106,"hasImage":11,"category":107,"tags":108,"tagSlugs":118},"\u002Fposts\u002Fgetting-more-out-of-claude-code","Getting More Out of Claude Code: Prompting and Token Economy","getting-more-out-of-claude-code","A practical guide to driving Claude Code well: how to prompt for fewer wrong turns, how to keep the context window healthy, and a straight answer to whether running Opus 4.8 at max effort on everything is actually a good idea.","2026-06-14",12,{"id":13,"name":14,"slug":15,"hue":16},[109,110,113,116,117],{"name":19,"slug":20},{"name":111,"slug":112},"Prompting","prompting",{"name":114,"slug":115},"Tokens","tokens",{"name":25,"slug":26},{"name":28,"slug":29},[20,112,115,26,29],{"path":120,"title":121,"slug":122,"summary":123,"date":124,"readTime":71,"hasImage":11,"category":125,"tags":126,"tagSlugs":133},"\u002Fposts\u002Fhow-to-build-a-claude-code-plugin","How to Build a Claude Code Plugin","how-to-build-a-claude-code-plugin","A hands on guide to packaging your Claude Code workflow as a plugin. We build a real conventional-commits helper with a slash command and an auto-invoked skill, then publish it through a marketplace and version it for release.","2026-06-13",{"id":13,"name":14,"slug":15,"hue":16},[127,128,131,132],{"name":19,"slug":20},{"name":129,"slug":130},"Plugins","plugins",{"name":25,"slug":26},{"name":28,"slug":29},[20,130,26,29],{"path":135,"title":136,"slug":137,"summary":138,"date":139,"readTime":10,"hasImage":11,"category":140,"tags":144,"tagSlugs":158},"\u002Fposts\u002Fdeploy-a-lambda-container-image-with-ecr-and-the-console","Deploy a Lambda Container Image With ECR and the Console","deploy-a-lambda-container-image-with-ecr-and-the-console","You built a QR code Lambda and ran it locally. Now put it on AWS the click-through way: create an Amazon ECR repository, push your image, and create the Lambda from that image in the console. Then test it and optionally expose it with a Function URL your Laravel app can call.","2026-06-11",{"id":57,"name":141,"slug":142,"hue":143},"AWS","aws",195,[145,146,149,152,155],{"name":141,"slug":142},{"name":147,"slug":148},"Lambda","lambda",{"name":150,"slug":151},"ECR","ecr",{"name":153,"slug":154},"Docker","docker",{"name":156,"slug":157},"Laravel","laravel",[142,148,151,154,157],{"path":160,"title":161,"slug":162,"summary":163,"date":164,"readTime":10,"hasImage":11,"category":165,"tags":166,"tagSlugs":171},"\u002Fposts\u002Fbuild-a-qr-code-lambda-and-call-it-from-laravel","Build a QR Code Lambda and Call It From Laravel","build-a-qr-code-lambda-and-call-it-from-laravel","A hands-on, beginner-friendly build: write a tiny Python AWS Lambda that turns text into a QR code, run it locally in Docker with no AWS account, and call it from a Laravel app. Every line of Python is explained for developers coming from PHP.","2026-06-10",{"id":57,"name":141,"slug":142,"hue":143},[167,168,169,170],{"name":141,"slug":142},{"name":147,"slug":148},{"name":153,"slug":154},{"name":156,"slug":157},[142,148,154,157],{"path":173,"title":174,"slug":175,"summary":176,"date":177,"readTime":106,"hasImage":11,"category":178,"tags":183,"tagSlugs":188},"\u002Fposts\u002Fpython-for-php-developers","Python for PHP Developers","python-for-php-developers","A friendly tour of Python for developers who already know modern PHP. We map the things you reach for every day, types, arrays, classes, named arguments, match, and enums, onto their Python equivalents so you can read and write Python with confidence.","2026-06-09",{"id":179,"name":180,"slug":181,"hue":182},8,"Python","python",330,[184,185],{"name":180,"slug":181},{"name":186,"slug":187},"PHP","php",[181,187],{"path":190,"title":191,"slug":192,"summary":193,"date":194,"readTime":57,"hasImage":195,"category":196,"tags":201,"tagSlugs":210},"\u002Fposts\u002Fgit-flow-vs-github-flow-choosing-a-branching-strategy","Git Flow vs GitHub Flow: Choosing a Branching Strategy for Your Team","git-flow-vs-github-flow-choosing-a-branching-strategy","Git Flow and GitHub Flow take very different approaches to team branching and releases. Let's compare them, see where trunk-based development fits, and sort out how to handle versioned releases, hotfixes, and everything in between.","2026-06-08",false,{"id":197,"name":198,"slug":199,"hue":200},4,"Git","git",158,[202,204,207],{"name":203,"slug":199},"GIT",{"name":205,"slug":206},"Workflow","workflow",{"name":208,"slug":209},"GitHub","github",[199,206,209],{"path":212,"title":213,"slug":214,"summary":215,"date":216,"readTime":57,"hasImage":195,"category":217,"tags":218,"tagSlugs":222},"\u002Fposts\u002Fgithub-flow-keep-your-main-branch-deployable","GitHub Flow: Keep Your Main Branch Deployable","github-flow-keep-your-main-branch-deployable","GitHub Flow is the lightweight branching workflow built on a single rule: anything in main is deployable. Here is the whole loop, branch, pull request, review, merge and deploy, with the git and gh commands and an honest look at where it fits.","2026-06-06",{"id":197,"name":198,"slug":199,"hue":200},[219,220,221],{"name":203,"slug":199},{"name":205,"slug":206},{"name":208,"slug":209},[199,206,209],{"path":224,"title":225,"slug":226,"summary":227,"date":228,"readTime":13,"hasImage":11,"category":229,"tags":232,"tagSlugs":240},"\u002Fposts\u002Fsolid-principles-modern-php","SOLID Principles in Modern PHP","solid-principles-modern-php","SOLID has not changed in years, but PHP has. Here are the five object-oriented design principles rewritten for PHP 8.5, using typed properties, readonly, enums, constructor promotion, and property hooks to express the same ideas with far less boilerplate.","2026-06-05",{"id":230,"name":186,"slug":187,"hue":231},1,264,[233,234,237],{"name":186,"slug":187},{"name":235,"slug":236},"OOP","oop",{"name":238,"slug":239},"Architecture","architecture",[187,236,239],{"path":242,"title":243,"slug":244,"summary":245,"date":246,"readTime":10,"hasImage":11,"category":247,"tags":248,"tagSlugs":257},"\u002Fposts\u002Forchestrating-lambdas-with-step-functions","Orchestrating Lambdas with Step Functions","orchestrating-lambdas-with-step-functions","Step Functions let you wire Lambdas into workflows with retries, branching, and parallelism, but you do not always need them. Here is an honest guide to when a state machine earns its keep, then a real parallel pipeline built with the modern JSONata syntax, deployed with SAM and tested locally.","2026-06-03",{"id":57,"name":141,"slug":142,"hue":143},[249,250,251,254],{"name":141,"slug":142},{"name":147,"slug":148},{"name":252,"slug":253},"Step Functions","step-functions",{"name":255,"slug":256},"Serverless","serverless",[142,148,253,256],{"path":259,"title":260,"slug":261,"summary":262,"date":263,"readTime":71,"hasImage":11,"category":264,"tags":265,"tagSlugs":273},"\u002Fposts\u002Fgive-your-lambda-an-http-front-door","Give Your Lambda an HTTP Front Door","give-your-lambda-an-http-front-door","Your Lambda works, but how should the world call it? This is a practical tour of the options: invoking directly, Lambda function URLs, and Amazon API Gateway, with a clear guide to what each one buys you. Then we build an HTTP API with SAM, test it locally, and call it from a Laravel app.","2026-05-06",{"id":57,"name":141,"slug":142,"hue":143},[266,267,268,271,272],{"name":141,"slug":142},{"name":147,"slug":148},{"name":269,"slug":270},"API Gateway","api-gateway",{"name":255,"slug":256},{"name":156,"slug":157},[142,148,270,256,157],{"path":275,"title":276,"slug":277,"summary":278,"date":279,"readTime":10,"hasImage":11,"category":280,"tags":281,"tagSlugs":287},"\u002Fposts\u002Fpackage-a-python-lambda-as-a-docker-image","Package a Python Lambda as a Docker Image","package-a-python-lambda-as-a-docker-image","AWS Lambda is not just zip files. Here is how to package a Python function as a Docker container image, choose between arm64 and x86_64, test it locally with the Runtime Interface Emulator, push it to Amazon ECR, and invoke it directly without any API Gateway in front.","2026-04-08",{"id":57,"name":141,"slug":142,"hue":143},[282,283,284,285,286],{"name":141,"slug":142},{"name":147,"slug":148},{"name":153,"slug":154},{"name":150,"slug":151},{"name":255,"slug":256},[142,148,154,151,256],{"path":289,"title":290,"slug":291,"summary":292,"date":293,"readTime":294,"hasImage":11,"category":295,"tags":296,"tagSlugs":304},"\u002Fposts\u002Fwhats-new-in-php-8-5","What's New in PHP 8.5","whats-new-in-php-8-5","PHP 8.5 leans into composition and ergonomics. Here are its headline features with practical examples: the pipe operator, cloning with property updates, the NoDiscard attribute, array_first and array_last, the new URI extension, and backtraces on fatal errors.","2025-11-22",6,{"id":230,"name":186,"slug":187,"hue":231},[297,298,301],{"name":186,"slug":187},{"name":299,"slug":300},"PHP 8.5","php-8-5",{"name":302,"slug":303},"What's New","whats-new",[187,300,303],{"path":306,"title":307,"slug":308,"summary":309,"date":310,"readTime":294,"hasImage":11,"category":311,"tags":312,"tagSlugs":318},"\u002Fposts\u002Fwhats-new-in-php-8-4","What's New in PHP 8.4","whats-new-in-php-8-4","PHP 8.4 brought one of the biggest syntax additions of the 8.x line. Here are its headline features with practical examples: property hooks, asymmetric visibility, new without parentheses, the array_find family, the Deprecated attribute, and a modern HTML5 DOM parser.","2024-11-23",{"id":230,"name":186,"slug":187,"hue":231},[313,314,317],{"name":186,"slug":187},{"name":315,"slug":316},"PHP 8.4","php-8-4",{"name":302,"slug":303},[187,316,303],{"path":320,"title":321,"slug":322,"summary":323,"date":324,"readTime":325,"hasImage":195,"category":326,"tags":330,"tagSlugs":333},"\u002Fposts\u002Fstarting-with-rust-installation-first-program","Starting with Rust: From Installation to Your First Program","starting-with-rust-installation-first-program","Learn how to install Rust and write your first \"Hello, world!\" program.","2024-03-23",2,{"id":294,"name":327,"slug":328,"hue":329},"Rust","rust-programming",38,[331],{"name":332,"slug":332},"rust",[332],{"path":335,"title":336,"slug":337,"summary":338,"date":339,"readTime":340,"hasImage":11,"category":341,"tags":342,"tagSlugs":348},"\u002Fposts\u002Fwhats-new-in-php-8-3","What's New in PHP 8.3","whats-new-in-php-8-3","PHP 8.3 is a focused release full of quality-of-life wins. Here are its headline features with practical examples: typed class constants, the Override attribute, json_validate, dynamic constant fetch, random string generation, and readonly deep cloning.","2023-11-25",5,{"id":230,"name":186,"slug":187,"hue":231},[343,344,347],{"name":186,"slug":187},{"name":345,"slug":346},"PHP 8.3","php-8-3",{"name":302,"slug":303},[187,346,303],{"path":350,"title":351,"slug":352,"summary":353,"date":354,"readTime":325,"hasImage":195,"category":355,"tags":359,"tagSlugs":361},"\u002Fposts\u002Fflutter-version-management-fvm","Flutter Version Management","flutter-version-management-fvm","Managing multiple Flutter versions does not need not be a headache. Let's jump into FVM and see how it can simplify your Flutter journey.","2023-10-07",{"id":340,"name":356,"slug":357,"hue":358},"Flutter","flutter",230,[360],{"name":357,"slug":357},[357],{"path":363,"title":364,"slug":365,"summary":366,"date":354,"readTime":230,"hasImage":195,"category":367,"tags":368,"tagSlugs":370},"\u002Fposts\u002Fsetting-up-cocoapods-fvm","Setting Up CocoaPods for FVM-managed Flutter Projects","setting-up-cocoapods-fvm","A guide to installing CocoaPods for a Flutter project while using FVM to manage Flutter versions, ensuring a smooth setup for iOS development.",{"id":340,"name":356,"slug":357,"hue":358},[369],{"name":357,"slug":357},[357],{"path":372,"title":373,"slug":374,"summary":375,"date":354,"readTime":230,"hasImage":195,"category":376,"tags":377,"tagSlugs":379},"\u002Fposts\u002Ftroubleshooting-xcode-15-build-issues-flutter","Troubleshooting Xcode 15 Build Issues in Flutter Projects","troubleshooting-xcode-15-build-issues-flutter","Uncovering solutions to common issues faced when updating to Xcode 15 in a Flutter project using an older version of CocoaPods.",{"id":340,"name":356,"slug":357,"hue":358},[378],{"name":357,"slug":357},[357],{"path":381,"title":382,"slug":383,"summary":384,"date":385,"readTime":294,"hasImage":11,"category":386,"tags":387,"tagSlugs":393},"\u002Fposts\u002Fwhats-new-in-php-8-2","What's New in PHP 8.2","whats-new-in-php-8-2","PHP 8.2 polished the type system and the immutability story. Here are its headline features with practical examples: readonly classes, DNF types, standalone null, false and true types, the new Random extension, constants in traits, and sensitive parameter redaction.","2022-12-10",{"id":230,"name":186,"slug":187,"hue":231},[388,389,392],{"name":186,"slug":187},{"name":390,"slug":391},"PHP 8.2","php-8-2",{"name":302,"slug":303},[187,391,303],{"path":395,"title":396,"slug":397,"summary":398,"date":399,"readTime":294,"hasImage":11,"category":400,"tags":401,"tagSlugs":407},"\u002Fposts\u002Fwhats-new-in-php-8-1","What's New in PHP 8.1","whats-new-in-php-8-1","PHP 8.1 is one of the most loved releases of the 8.x line. Here are its headline features with practical examples: enums, readonly properties, first-class callable syntax, fibers, the never return type, and new in initializers.","2021-11-27",{"id":230,"name":186,"slug":187,"hue":231},[402,403,406],{"name":186,"slug":187},{"name":404,"slug":405},"PHP 8.1","php-8-1",{"name":302,"slug":303},[187,405,303],{"path":409,"title":410,"slug":411,"summary":412,"date":413,"readTime":294,"hasImage":11,"category":414,"tags":415,"tagSlugs":421},"\u002Fposts\u002Fwhats-new-in-php-8-0","What's New in PHP 8.0","whats-new-in-php-8-0","PHP 8.0 was a true major version. Here is a tour of its headline features with practical examples: constructor property promotion, named arguments, the match expression, the nullsafe operator, union types, and string helpers that finally read like English.","2020-11-28",{"id":230,"name":186,"slug":187,"hue":231},[416,417,420],{"name":186,"slug":187},{"name":418,"slug":419},"PHP 8.0","php-8-0",{"name":302,"slug":303},[187,419,303],{"path":423,"title":424,"slug":425,"summary":426,"date":427,"readTime":197,"hasImage":195,"category":428,"tags":429,"tagSlugs":431},"\u002Fposts\u002Fgit-tracking-a-remote-branch-upstream-for-changes","Git: Tracking a Remote Branch for Changes","git-tracking-a-remote-branch-upstream-for-changes","When you fork a project, you need a way to pull in changes from the original repository, usually called upstream. Here is how to wire up an upstream remote, actually sync your fork, and set up branch tracking so plain git pull and git push just work.","2018-11-04",{"id":197,"name":198,"slug":199,"hue":200},[430],{"name":203,"slug":199},[199],{"path":433,"title":434,"slug":435,"summary":436,"date":427,"readTime":437,"hasImage":11,"category":438,"tags":442,"tagSlugs":444},"\u002Fposts\u002Fjavascript-array-map-filter-reduce-functions","JavaScript's map, filter, and reduce methods","javascript-array-map-filter-reduce-functions","JavaScript provides some amazing functions that can be called against your arrays to help filter them, manipulate them, or even reduce them down to a single value or grouped values.",3,{"id":325,"name":439,"slug":440,"hue":441},"JavaScript","javascript",92,[443],{"name":439,"slug":440},[440],{"path":446,"title":447,"slug":448,"summary":449,"date":450,"readTime":230,"hasImage":11,"category":451,"tags":452,"tagSlugs":454},"\u002Fposts\u002Fphp-fizzbuzz-example","FizzBuzz in PHP: A Fresh Approach","php-fizzbuzz-example","FizzBuzz is a very popular programming question that tests your logic to see if you can build a simple program.","2018-11-02",{"id":230,"name":186,"slug":187,"hue":231},[453],{"name":186,"slug":187},[187],{"path":456,"title":457,"slug":458,"summary":459,"date":460,"readTime":325,"hasImage":11,"category":461,"tags":462,"tagSlugs":464},"\u002Fposts\u002Fphp-array-reduce","PHP's array_reduce is not only for outputting single values","php-array-reduce","PHP's array_reduce is a simple way to partition a set of data or return a single value. It is super powerful and worth spending time learning.","2018-11-01",{"id":230,"name":186,"slug":187,"hue":231},[463],{"name":186,"slug":187},[187],{"path":466,"title":467,"slug":468,"summary":469,"date":470,"readTime":294,"hasImage":195,"category":471,"tags":472,"tagSlugs":475},"\u002Fposts\u002Fimprove-your-git-workflow-with-git-flow","Improve Your Git Workflow with Git Flow","improve-your-git-workflow-with-git-flow","Git Flow is a structured branching model built around versioned, scheduled releases. Here is how its branches fit together, a hands-on walkthrough of features, releases and hotfixes, and an honest take on when it is still the right call.","2016-12-06",{"id":197,"name":198,"slug":199,"hue":200},[473,474],{"name":203,"slug":199},{"name":205,"slug":206},[199,206],{"path":477,"title":478,"slug":479,"summary":480,"date":481,"readTime":294,"hasImage":195,"category":482,"tags":486,"tagSlugs":490},"\u002Fposts\u002Fusing-css-transitions","Using CSS Transitions","using-css-transitions","CSS transitions are the standard way to apply transitions to your elements, and have been for years, replacing the old approach of using JavaScript. In this article, I'll go through each of the transition properties available, and provide examples of how to use them.","2016-12-05",{"id":437,"name":483,"slug":484,"hue":485},"HTML & CSS","html-css",55,[487],{"name":488,"slug":489},"CSS","css",[489],{"path":492,"title":493,"slug":494,"summary":495,"date":496,"readTime":197,"hasImage":195,"category":497,"tags":498,"tagSlugs":502},"\u002Fposts\u002Fstructuring-your-website-with-html-5-semantics","Structuring Your Website With HTML 5 Semantics","structuring-your-website-with-html-5-semantics","Prior to HTML 5, there was no real markup to help explain the intent behind your HTML code. The goal of HTML 5 was to offer a more readable way of writing your code, so that any author that comes after you can have an easier time going through what you've created.","2016-12-04",{"id":437,"name":483,"slug":484,"hue":485},[499],{"name":500,"slug":501},"HTML","html",[501],{"path":504,"title":505,"slug":506,"summary":507,"date":508,"readTime":325,"hasImage":195,"category":509,"tags":510,"tagSlugs":515},"\u002Fposts\u002Finterpolation-in-stylus-css-pre-processor","Interpolation in Stylus","interpolation-in-stylus-css-pre-processor","You can also use interpolation to improve your functions for reuse, as well as your other code within your stylesheet. The way it works is that you can wrap your expression within {}, which will then be outputted as the identifier.","2016-12-03",{"id":437,"name":483,"slug":484,"hue":485},[511,514],{"name":512,"slug":513},"Stylus","stylus",{"name":488,"slug":489},[513,489],{"path":517,"title":518,"slug":519,"summary":520,"date":521,"readTime":230,"hasImage":195,"category":522,"tags":523,"tagSlugs":526},"\u002Fposts\u002Fcreating-configuration-files-in-stylus-css-pre-processor","Creating Configuration Files In Stylus","creating-configuration-files-in-stylus-css-pre-processor","It's super simple to create a configuration file for instance that would manage your media query break points. You could also use a configuration file for managing colors, font sizes, and other variables such as gutter spacing and more.","2016-12-02",{"id":437,"name":483,"slug":484,"hue":485},[524,525],{"name":488,"slug":489},{"name":512,"slug":513},[489,513],{"path":528,"title":529,"slug":530,"summary":531,"date":532,"readTime":197,"hasImage":195,"category":533,"tags":534,"tagSlugs":537},"\u002Fposts\u002Fusing-functions-and-mixins-with-stylus-css-pre-processor","Using Functions and Mixins with Stylus","using-functions-and-mixins-with-stylus-css-pre-processor","Stylus allows you to create functions and mixins of reusable code for your stylesheets. You can also handle mathematical operations, unary operations, and more allowing you complete control over your stylesheets with ease.","2016-12-01",{"id":437,"name":483,"slug":484,"hue":485},[535,536],{"name":488,"slug":489},{"name":512,"slug":513},[489,513],{"path":539,"title":540,"slug":541,"summary":542,"date":543,"readTime":325,"hasImage":195,"category":544,"tags":545,"tagSlugs":548},"\u002Fposts\u002Fsetting-variables-in-stylus-css-pre-processor","Setting Variables in Stylus","setting-variables-in-stylus-css-pre-processor","Unlike CSS, in Stylus you can assign expressions to variables that can be reusable throughout your stylesheets.","2016-11-29",{"id":437,"name":483,"slug":484,"hue":485},[546,547],{"name":488,"slug":489},{"name":512,"slug":513},[489,513],{"path":550,"title":551,"slug":552,"summary":553,"date":554,"readTime":340,"hasImage":195,"category":555,"tags":556,"tagSlugs":559},"\u002Fposts\u002Fusing-selectors-in-stylus-css-pre-processor","Using Selectors in Stylus","using-selectors-in-stylus-css-pre-processor","Selectors are a way to pick the elements that you want styled. In Stylus, similar to CSS, you can apply a set of styles to any element by separating them by a comma delimited list. Stylus though, also allows you to select multiple elements by separating each on their own line.","2016-11-28",{"id":437,"name":483,"slug":484,"hue":485},[557,558],{"name":488,"slug":489},{"name":512,"slug":513},[489,513],{"path":561,"title":562,"slug":563,"summary":564,"date":565,"readTime":230,"hasImage":195,"category":566,"tags":567,"tagSlugs":570},"\u002Fposts\u002Flearning-stylus-a-css-pre-processor","Learning Stylus: A CSS Pre-Processor","learning-stylus-a-css-pre-processor","This mini-series will be a little different to how you may see other articles on my site. Really this article is more geared as notes for me as I go through the documentation for Stylus, and learn the ins and outs of this beautiful language.","2016-11-27",{"id":437,"name":483,"slug":484,"hue":485},[568,569],{"name":488,"slug":489},{"name":512,"slug":513},[489,513],{"path":572,"title":573,"slug":574,"summary":575,"date":576,"readTime":197,"hasImage":195,"category":577,"tags":578,"tagSlugs":581},"\u002Fposts\u002Fbem-methodology-overview-and-naming-conventions","BEM Methodology Overview and Naming Conventions","bem-methodology-overview-and-naming-conventions","BEM or Block Element Modifier is a naming convention used to help organize your code base. In this article, I discuss its uses within your CSS projects.","2016-11-26",{"id":437,"name":483,"slug":484,"hue":485},[579,580],{"name":488,"slug":489},{"name":500,"slug":501},[489,501],{"path":583,"title":584,"slug":585,"summary":586,"date":587,"readTime":230,"hasImage":195,"category":588,"tags":589,"tagSlugs":594},"\u002Fposts\u002Fintroduction-to-ecmascript-6","Introduction to ECMAScript 6","introduction-to-ecmascript-6","The latest in ECMAScript 6 introduces new features to JavaScript which makes it so much more fun to use, while solving problems that have been around for years. The intent of this article is to provide you with resources you can use to start learning ES6 today.","2016-11-25",{"id":325,"name":439,"slug":440,"hue":441},[590,591],{"name":439,"slug":440},{"name":592,"slug":593},"ECMAScript","ecmascript",[440,593],{"path":596,"title":597,"slug":598,"summary":599,"date":600,"readTime":437,"hasImage":195,"category":601,"tags":602,"tagSlugs":607},"\u002Fposts\u002Fbabel-installation-and-configuration","Babel Installation and Configuration","babel-installation-and-configuration","Babel offers a convenient way to transform your ES6 code to JavaScript that all browsers can understand. In this article we'll go over a basic configuration that will enable you to start using it with any project right away.","2016-11-24",{"id":325,"name":439,"slug":440,"hue":441},[603,604],{"name":439,"slug":440},{"name":605,"slug":606},"Babel","babel",[440,606],{"path":609,"title":610,"slug":611,"summary":612,"date":613,"readTime":230,"hasImage":195,"category":614,"tags":615,"tagSlugs":622},"\u002Fposts\u002Fconfiguring-stylus-css-pre-processor-with-gulp-and-sourcemaps","Configuring Stylus CSS Pre-Processor with Gulp and Sourcemaps","configuring-stylus-css-pre-processor-with-gulp-and-sourcemaps","In this article we'll go over how to configure your project to process Stylus files using Gulp. We'll also create source map file which your browser will use to help point you in the right direction of your files when developing","2016-11-23",{"id":325,"name":439,"slug":440,"hue":441},[616,617,618,619],{"name":439,"slug":440},{"name":512,"slug":513},{"name":488,"slug":489},{"name":620,"slug":621},"Gulp","gulp",[440,513,489,621],{"path":624,"title":625,"slug":626,"summary":627,"date":628,"readTime":325,"hasImage":195,"category":629,"tags":630,"tagSlugs":637},"\u002Fposts\u002Fconfiguring-gulp-with-less-css-pre-processor","Configuring Gulp With Less CSS Pre-Processor","configuring-gulp-with-less-css-pre-processor","Less is a CSS pre-processor allowing you to create variables, mixins, and functions in an effort to make your CSS more maintainable.","2016-11-22",{"id":325,"name":439,"slug":440,"hue":441},[631,632,633,636],{"name":620,"slug":621},{"name":439,"slug":440},{"name":634,"slug":635},"Less","less",{"name":488,"slug":489},[621,440,635,489],{"path":639,"title":640,"slug":641,"summary":642,"date":643,"readTime":325,"hasImage":11,"category":644,"tags":645,"tagSlugs":651},"\u002Fposts\u002Fusing-browser-sync-with-gulp-for-live-reloading","Using Browser Sync with Gulp for Live Reloading","using-browser-sync-with-gulp-for-live-reloading","Browser Sync is a nice tool to use while developing. It allows your browser to reload live when changes are made to your files. For instance, assuming we're watching our CSS file for changes we can have the browser auto refresh\u002Fsync when it sees those changes made.","2016-11-21",{"id":325,"name":439,"slug":440,"hue":441},[646,647,650],{"name":439,"slug":440},{"name":648,"slug":649},"Browser Sync","browser-sync",{"name":620,"slug":621},[440,649,621],{"path":653,"title":654,"slug":655,"summary":656,"date":657,"readTime":325,"hasImage":195,"category":658,"tags":659,"tagSlugs":665},"\u002Fposts\u002Fgulp-watch-automate-your-gulp-tasks","Gulp Watch: Automate Your Gulp Tasks","gulp-watch-automate-your-gulp-tasks","Gulp watch is perfect for when you're editing project files since it allows you to not have to run the gulp command manually each time.","2016-11-20",{"id":325,"name":439,"slug":440,"hue":441},[660,661,664],{"name":439,"slug":440},{"name":662,"slug":663},"Yarn","yarn",{"name":620,"slug":621},[440,663,621],{"path":667,"title":668,"slug":669,"summary":670,"date":671,"readTime":294,"hasImage":195,"category":672,"tags":673,"tagSlugs":677},"\u002Fposts\u002Fconfiguring-gulp-on-a-new-project","Configuring Gulp On A New Project","configuring-gulp-on-a-new-project","Gulp may seem like a scary thing to wrap your head around at first, but it's actually quite easy to start using once you understand the basics.","2016-11-19",{"id":325,"name":439,"slug":440,"hue":441},[674,675,676],{"name":439,"slug":440},{"name":620,"slug":621},{"name":662,"slug":663},[440,621,663],{"path":679,"title":680,"slug":681,"summary":682,"date":683,"readTime":437,"hasImage":195,"category":684,"tags":685,"tagSlugs":688},"\u002Fposts\u002Fyarn-publishing-a-package","Yarn: Publishing a Package","yarn-publishing-a-package","Publishing a package to the npm repository has never been simpler. With a few steps, you can create a package that is redistributable to all of your projects.","2016-11-18",{"id":325,"name":439,"slug":440,"hue":441},[686,687],{"name":439,"slug":440},{"name":662,"slug":663},[440,663],{"path":690,"title":691,"slug":692,"summary":693,"date":694,"readTime":437,"hasImage":195,"category":695,"tags":696,"tagSlugs":699},"\u002Fposts\u002Fyarn-fast-and-secure-dependency-management","Yarn: Fast and Secure Dependency Management","yarn-fast-and-secure-dependency-management","Yarn is a super simple dependency management tool which is way faster to use instead of traditional npm. It acts as a drop-in replacement, so you can get started using yarn right away. The best way to install yarn is by using npm.","2016-11-17",{"id":325,"name":439,"slug":440,"hue":441},[697,698],{"name":439,"slug":440},{"name":662,"slug":663},[440,663],{"path":701,"title":702,"slug":703,"summary":704,"date":705,"readTime":230,"hasImage":11,"category":706,"tags":707,"tagSlugs":709},"\u002Fposts\u002Fsupport-for-keys-in-list-or-its-new-shorthand-syntax-in-php","Support for keys in list(), or its new shorthand syntax [] in PHP","support-for-keys-in-list-or-its-new-shorthand-syntax-in-php","Now as of PHP 7.1, you can define the keys of your array that will be parsed when destructuring your arrays. Prior to PHP 7.1, you could only use arrays with numeric indexes. Now with this new addition, our lives just got easier.","2016-11-16",{"id":230,"name":186,"slug":187,"hue":231},[708],{"name":186,"slug":187},[187],{"path":711,"title":712,"slug":713,"summary":714,"date":715,"readTime":230,"hasImage":11,"category":716,"tags":717,"tagSlugs":719},"\u002Fposts\u002Ftype-hinting-with-the-iterable-pseudo-type-in-php","Type Hinting With The Iterable pseudo-type In PHP","type-hinting-with-the-iterable-pseudo-type-in-php","As of PHP 7.1, you can now type hint your method\u002Ffunction arguments with the keyword iterable for handling arrays or even objects that implement the Traversable interface.","2016-11-15",{"id":230,"name":186,"slug":187,"hue":231},[718],{"name":186,"slug":187},[187],{"path":721,"title":722,"slug":723,"summary":724,"date":725,"readTime":230,"hasImage":11,"category":726,"tags":727,"tagSlugs":729},"\u002Fposts\u002Ftype-hinting-callable-functions-in-php","Type Hinting Callable Functions in PHP","type-hinting-callable-functions-in-php","As of PHP 5.4, you can type hint your method arguments with the callable keyword allowing you to enforce the type of data that is passed via your arguments.","2016-11-14",{"id":230,"name":186,"slug":187,"hue":231},[728],{"name":186,"slug":187},[187],{"path":731,"title":732,"slug":733,"summary":734,"date":735,"readTime":230,"hasImage":11,"category":736,"tags":737,"tagSlugs":739},"\u002Fposts\u002Fsetting-visibility-for-your-class-constants-in-php","Setting Visibility for Your Class Constants in PHP","setting-visibility-for-your-class-constants-in-php","Now in PHP 7.1+, you can set different visibility modifiers for each of your class constants. The available visibility modifiers consist of public, protected, and private.","2016-11-13",{"id":230,"name":186,"slug":187,"hue":231},[738],{"name":186,"slug":187},[187],{"path":741,"title":742,"slug":743,"summary":744,"date":745,"readTime":230,"hasImage":11,"category":746,"tags":747,"tagSlugs":749},"\u002Fposts\u002Fanonymous-classes-php","Using Anonymous Classes in PHP","anonymous-classes-php","As of PHP 7, you can now create quick throwaway objects for use within your projects. This can be especially useful for your automated tests, for instance, with allowing you to create quick implementations of your interfaces.","2016-11-12",{"id":230,"name":186,"slug":187,"hue":231},[748],{"name":186,"slug":187},[187],{"path":751,"title":752,"slug":753,"summary":754,"date":755,"readTime":230,"hasImage":11,"category":756,"tags":757,"tagSlugs":759},"\u002Fposts\u002Fsymmetric-array-destructuring-in-php","Symmetric Array Destructuring in PHP","symmetric-array-destructuring-in-php","As of PHP 7.1, you can now use the shorthand array syntax to destructure your arrays for assignment. Previously you would have had to use a function like list, but now you can use the simple new array shorthand syntax.","2016-11-11",{"id":230,"name":186,"slug":187,"hue":231},[758],{"name":186,"slug":187},[187],{"path":761,"title":762,"slug":763,"summary":764,"date":765,"readTime":325,"hasImage":11,"category":766,"tags":767,"tagSlugs":769},"\u002Fposts\u002Fphp-array-map-to-format-your-arrays-without-loops","Using PHP's array_map to format your arrays without loops","php-array-map-to-format-your-arrays-without-loops","So let's face it, loops are a bit boring. So how can we mix it up? Let's assume we have a case where we have a CSV file that we want to quickly parse.","2016-11-10",{"id":230,"name":186,"slug":187,"hue":231},[768],{"name":186,"slug":187},[187],{"path":771,"title":772,"slug":773,"summary":774,"date":775,"readTime":57,"hasImage":11,"category":776,"tags":777,"tagSlugs":779},"\u002Fposts\u002Fsolid-principles-in-php","SOLID Principles in PHP","solid-principles-in-php","The 5 basic principles for Object-Oriented Design, SOLID, were first created in an effort to improve maintainability in our code bases. SOLID is a mnemonic acronym that stands for each of the following principles: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, and Dependency Inversion.","2016-11-09",{"id":230,"name":186,"slug":187,"hue":231},[778],{"name":186,"slug":187},[187],{"path":781,"title":782,"slug":783,"summary":784,"date":785,"readTime":230,"hasImage":11,"category":786,"tags":787,"tagSlugs":789},"\u002Fposts\u002Ffiltering-arrays-without-using-loops-in-php","Filtering Arrays Without Using Loops in PHP","filtering-arrays-without-using-loops-in-php","PHP has a built-in function called array_filter that allows you to filter through your arrays without the need for a loop. Personally, this approach feels much cleaner to me and simpler to comprehend.","2016-11-08",{"id":230,"name":186,"slug":187,"hue":231},[788],{"name":186,"slug":187},[187],{"path":791,"title":792,"slug":793,"summary":794,"date":795,"readTime":230,"hasImage":11,"category":796,"tags":797,"tagSlugs":799},"\u002Fposts\u002Fvoid-return-types-in-php","Void Return Types in PHP","void-return-types-in-php","As of PHP 7.1, we can now use void return types within our methods. This is useful for cases where you have methods that are just setting or processing data without the need of returning any values.","2016-11-07",{"id":230,"name":186,"slug":187,"hue":231},[798],{"name":186,"slug":187},[187],{"path":801,"title":802,"slug":803,"summary":804,"date":805,"readTime":230,"hasImage":11,"category":806,"tags":807,"tagSlugs":809},"\u002Fposts\u002Ftype-hinting-with-nullable-types-in-php","Type Hinting with Nullable Types in PHP","type-hinting-with-nullable-types-in-php","As of PHP 7.1, you can now set your type declarations as nullable by simply prefixing them with a question mark ?. In doing so a null value can be passed in as a parameter or returned as a value for your methods.","2016-11-06",{"id":230,"name":186,"slug":187,"hue":231},[808],{"name":186,"slug":187},[187],{"path":811,"title":812,"slug":813,"summary":814,"date":815,"readTime":230,"hasImage":11,"category":816,"tags":817,"tagSlugs":819},"\u002Fposts\u002Fphp-group-multiple-use-declarations","PHP Group Multiple use Declarations","php-group-multiple-use-declarations","As of PHP 7, you can now group your imported classes, functions, and constants from under the same namespace.","2016-11-05",{"id":230,"name":186,"slug":187,"hue":231},[818],{"name":186,"slug":187},[187],{"path":821,"title":822,"slug":823,"summary":824,"date":825,"readTime":230,"hasImage":11,"category":826,"tags":827,"tagSlugs":829},"\u002Fposts\u002Fphp-null-coalescing-operator","PHP Null Coalescing Operator","php-null-coalescing-operator","One of my new favorite additions to PHP 7, is the Null Coalescing Operator. It cleans up your code by removing a tedious step of checking if some value is isset() and not NULL and returning it or if not setting a default.","2016-11-04",{"id":230,"name":186,"slug":187,"hue":231},[828],{"name":186,"slug":187},[187],{"path":831,"title":832,"slug":833,"summary":834,"date":835,"readTime":325,"hasImage":11,"category":836,"tags":837,"tagSlugs":839},"\u002Fposts\u002Fphp-spaceship-operator","PHP Spaceship Operator","php-spaceship-operator","One of the new features to hit PHP 7 is the Spaceship Operator. This new trick helps improve the way you'd compare 2 expressions. In short, the comparison returns 1 of 3 values (-1, 0, or 1) depending on the result of the comparison.","2016-11-03",{"id":230,"name":186,"slug":187,"hue":231},[838],{"name":186,"slug":187},[187],{"path":841,"title":842,"slug":843,"summary":844,"date":845,"readTime":437,"hasImage":11,"category":846,"tags":847,"tagSlugs":849},"\u002Fposts\u002Freturn-type-declarations-in-php","Return Type Declarations in PHP","return-type-declarations-in-php","PHP 7 now makes it possible to declare return types for your methods. This allows you better control over the data that will be returned from each method in your application.","2016-11-02",{"id":230,"name":186,"slug":187,"hue":231},[848],{"name":186,"slug":187},[187],{"path":851,"title":852,"slug":853,"summary":854,"date":855,"readTime":230,"hasImage":11,"category":856,"tags":857,"tagSlugs":859},"\u002Fposts\u002Fscalar-type-hints-php","Scalar Type Hints in PHP","scalar-type-hints-php","Starting with PHP 7.0, it's now possible to declare scalar type hints for your method arguments. Previously, we were able to use array and callable, but now with PHP 7+, we have much more control.","2016-11-01",{"id":230,"name":186,"slug":187,"hue":231},[858],{"name":186,"slug":187},[187],[861,868,874,880,886,892,898,904,910],{"id":862,"description":863,"extension":864,"hue":231,"meta":865,"name":186,"slug":187,"stem":866,"weight":230,"__hash__":867},"categories\u002Fcategories\u002Fphp.json","PHP articles and tutorials ranging from new language features to using interesting packages.","json",{},"categories\u002Fphp","h_EmN4YMO4b2mBt3MPLs7RvscJx0NBmwDIZPxqPqKLE",{"id":869,"description":870,"extension":864,"hue":441,"meta":871,"name":439,"slug":440,"stem":872,"weight":325,"__hash__":873},"categories\u002Fcategories\u002Fjavascript.json","JavaScript articles and tutorials ranging from new language features to using interesting packages.",{},"categories\u002Fjavascript","7gmVgkw5BRo26i1bFoSv96bwDJ4nTtZcJ9Ud6u5p0yk",{"id":875,"description":876,"extension":864,"hue":485,"meta":877,"name":483,"slug":484,"stem":878,"weight":437,"__hash__":879},"categories\u002Fcategories\u002Fhtml-css.json","HTML & CSS articles and tutorials ranging from new language features to using interesting packages.",{},"categories\u002Fhtml-css","vXvPlRA-iaeCJ64Wi3sLyUR0kqL48zYcZWORRqt8N70",{"id":881,"description":882,"extension":864,"hue":200,"meta":883,"name":198,"slug":199,"stem":884,"weight":197,"__hash__":885},"categories\u002Fcategories\u002Fgit.json","Git articles and tutorials ranging from new language features to different workflows.",{},"categories\u002Fgit","qOqFsFTKI9XB444UodUKW_3AakFadHzW-ss8V-maUmE",{"id":887,"description":888,"extension":864,"hue":358,"meta":889,"name":356,"slug":357,"stem":890,"weight":340,"__hash__":891},"categories\u002Fcategories\u002Fflutter.json","Dive into Flutter, the open-source UI software development toolkit, as we explore its capabilities in creating natively compiled applications for mobile, web, and desktop from a single codebase.",{},"categories\u002Fflutter","aD1moU8CgoYt4FRnSeA4Iy9xxnnopdEKBEYP2arAzdI",{"id":893,"description":894,"extension":864,"hue":329,"meta":895,"name":327,"slug":328,"stem":896,"weight":294,"__hash__":897},"categories\u002Fcategories\u002Frust-programming.json","From setting up your environment to advanced concepts, this is your go-to resource for all things Rust.",{},"categories\u002Frust-programming","LscnqSsk-htWc9yZg9eXaIUJwNfTK5oaZOClYKagNC4",{"id":899,"description":900,"extension":864,"hue":143,"meta":901,"name":141,"slug":142,"stem":902,"weight":57,"__hash__":903},"categories\u002Fcategories\u002Faws.json","Hands-on AWS for builders: Lambda, containers and ECR, API Gateway, Step Functions, and the serverless glue in between.",{},"categories\u002Faws","gU2fpFeHDrBz8RJy54lYK7NJxCnMyma_fblrxDoJByQ",{"id":905,"description":906,"extension":864,"hue":182,"meta":907,"name":180,"slug":181,"stem":908,"weight":179,"__hash__":909},"categories\u002Fcategories\u002Fpython.json","Python for people who already build software: a practical, PHP-developer-friendly path into the language and its ecosystem.",{},"categories\u002Fpython","B6ssFzfg4dLAIzOltx3jcPOk7qghiDxoDD74rhlQ9kU",{"id":911,"description":912,"extension":864,"hue":16,"meta":913,"name":14,"slug":15,"stem":914,"weight":13,"__hash__":915},"categories\u002Fcategories\u002Fai-tooling.json","Building with AI coding tools: Claude Code plugins, skills, agents, and the workflows that grow up around them.",{},"categories\u002Fai-tooling","MSW9v8hDS6wLO24_SmWWDv2FfrC7AFCDKmLj5Svyvis",{"id":917,"title":6,"body":918,"category":1798,"date":9,"description":924,"extension":1799,"hasImage":11,"meta":1800,"navigation":11,"path":5,"readTime":10,"seo":1801,"slug":7,"stem":1802,"summary":8,"tagSlugs":1803,"tags":1804,"__hash__":1810},"posts\u002Fposts\u002Frunning-codex-inside-claude-code.md",{"type":919,"value":920,"toc":1789},"minimark",[921,925,939,944,947,950,953,957,971,974,1021,1051,1076,1093,1100,1122,1126,1132,1167,1210,1238,1326,1345,1349,1352,1359,1362,1368,1372,1387,1390,1578,1581,1723,1739,1743,1746,1755,1764,1770,1774,1777,1785],[922,923,924],"p",{},"Claude writes the code, then Claude reviews the code, then Claude tells me it looks good. That loop always sat a little wrong with me. A model reviewing its own work grades on the same instincts it wrote with, so it waves through the exact assumptions it baked in. The bug and the sign-off come from the same place, which is why the sign-off keeps missing the bug.",[922,926,927,928,938],{},"The fix I have settled on is to put a second model from a different family in the loop, and to do it without leaving Claude Code. OpenAI ships a plugin, ",[929,930,934],"a",{"href":931,"rel":932},"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fcodex-plugin-cc",[933],"nofollow",[935,936,937],"code",{},"codex-plugin-cc",", that lets Claude hand work to Codex, your own local install of it, for a review or a fix, then hand the result back. I run it on a Claude Max plan plus a ChatGPT Plus subscription, which is two separate quotas doing two different jobs. Here is how it fits together and whether it earns the setup.",[940,941,943],"h2",{"id":942},"why-bother-running-a-second-model","Why bother running a second model",[922,945,946],{},"This has nothing to do with Codex being smarter than Claude. On any given change either one might catch more, and which one wins flips by the task. What earns the setup is that the two fail in different places.",[922,948,949],{},"Claude and Codex were built by different labs on different data, so their weak spots do not line up. When Claude reviews its own diff it re-derives the same reasoning that produced the bug, recognizes it as normal, and moves on. A model from another family has no such memory of writing it. It has to trace the logic from scratch, and that is where it stumbles onto the thing Claude glossed over. The overlap between what the two flag is smaller than you would guess, and the non-overlapping half is the part worth reading.",[922,951,952],{},"There is a second, more boring reason, and on my plan it matters as much: Codex runs on my ChatGPT usage, not my Claude usage. Delegating a chunky review or a stubborn fix to Codex spends the OpenAI quota and leaves the Claude quota for the work I want Opus doing. Two subscriptions, two limits, and the plugin lets me choose which one to draw down.",[940,954,956],{"id":955},"getting-codex-into-claude-code","Getting Codex into Claude Code",[922,958,959,960,962,963,966,967,970],{},"The plugin does not bundle its own copy of Codex. It drives the ",[935,961,23],{}," binary already on your machine, with the same login, the same ",[935,964,965],{},"config.toml",", the same sandbox and ",[935,968,969],{},"AGENTS.md"," you would get running Codex on its own. So the prerequisites are Codex itself (Node.js 18.18 or later, and a ChatGPT subscription or an OpenAI API key) and then the plugin on top.",[922,972,973],{},"Inside a Claude Code session:",[975,976,981],"pre",{"className":977,"code":978,"language":979,"meta":980,"style":980},"language-bash shiki shiki-themes github-dark github-dark","\u002Fplugin marketplace add openai\u002Fcodex-plugin-cc\n\u002Fplugin install codex@openai-codex\n\u002Freload-plugins\n\u002Fcodex:setup\n","bash","",[935,982,983,1001,1011,1016],{"__ignoreMap":980},[984,985,987,991,995,998],"span",{"class":986,"line":230},"line",[984,988,990],{"class":989},"sFR8T","\u002Fplugin",[984,992,994],{"class":993},"s4wv1"," marketplace",[984,996,997],{"class":993}," add",[984,999,1000],{"class":993}," openai\u002Fcodex-plugin-cc\n",[984,1002,1003,1005,1008],{"class":986,"line":325},[984,1004,990],{"class":989},[984,1006,1007],{"class":993}," install",[984,1009,1010],{"class":993}," codex@openai-codex\n",[984,1012,1013],{"class":986,"line":437},[984,1014,1015],{"class":989},"\u002Freload-plugins\n",[984,1017,1018],{"class":986,"line":197},[984,1019,1020],{"class":989},"\u002Fcodex:setup\n",[922,1022,1023,1026,1027,1030,1031,1034,1035,1038,1039,1042,1043,1046,1047,1050],{},[935,1024,1025],{},"\u002Fcodex:setup"," checks whether Codex is installed and logged in. If Codex is missing and you have npm, it offers to install it (",[935,1028,1029],{},"npm install -g @openai\u002Fcodex","). If it is installed but not signed in, run ",[935,1032,1033],{},"!codex login"," (the ",[935,1036,1037],{},"!"," runs it in your shell from the prompt). When it is done you will have the ",[935,1040,1041],{},"\u002Fcodex:*"," commands and a ",[935,1044,1045],{},"codex:codex-rescue"," subagent in ",[935,1048,1049],{},"\u002Fagents",".",[922,1052,1053,1054,1059,1060,1063,1064,1067,1068,1071,1072,1075],{},"One step the setup will not do for you: pick your model. As of July 2026 Codex runs the ",[929,1055,1058],{"href":1056,"rel":1057},"https:\u002F\u002Fopenai.com\u002Findex\u002Fgpt-5-6\u002F",[933],"GPT-5.6 family",", which comes in three tiers, ",[935,1061,1062],{},"gpt-5.6-sol"," (the flagship for hard problems), ",[935,1065,1066],{},"gpt-5.6-terra"," (the everyday default, and the natural replacement for anything you used to give 5.5), and ",[935,1069,1070],{},"gpt-5.6-luna"," (fast and cheap). On a Plus plan you can select any of the three. The plugin reads whatever your Codex config points at, so set it once in ",[935,1073,1074],{},"~\u002F.codex\u002Fconfig.toml",":",[975,1077,1081],{"className":1078,"code":1079,"language":1080,"meta":980,"style":980},"language-toml shiki shiki-themes github-dark github-dark","model = \"gpt-5.6-terra\"\nmodel_reasoning_effort = \"medium\"\n","toml",[935,1082,1083,1088],{"__ignoreMap":980},[984,1084,1085],{"class":986,"line":230},[984,1086,1087],{},"model = \"gpt-5.6-terra\"\n",[984,1089,1090],{"class":986,"line":325},[984,1091,1092],{},"model_reasoning_effort = \"medium\"\n",[922,1094,1095,1096,1099],{},"If your config still says ",[935,1097,1098],{},"gpt-5.5",", that is why Codex has not moved on its own. A pinned model does not auto-upgrade; you name the new one. Terra is the right default to leave there, and I reach for Sol only on the changes that deserve it.",[1101,1102,1104],"note",{"label":1103},"Two quotas, two dashboards",[922,1105,1106,1107,1111,1112,1115,1116,1121],{},"The plugin uses your local Codex, so its work counts against your ",[1108,1109,1110],"strong",{},"ChatGPT\u002FCodex"," limits, not your Claude limits. There is no combined usage view. Watch Claude's ",[935,1113,1114],{},"\u002Fusage"," and the Codex usage dashboard separately, and see OpenAI's ",[929,1117,1120],{"href":1118,"rel":1119},"https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fpricing",[933],"Codex pricing notes"," for how effort levels burn through a plan.",[940,1123,1125],{"id":1124},"the-commands-youll-actually-use","The commands you'll actually use",[922,1127,1128,1129,1131],{},"There are more ",[935,1130,1041],{}," commands than you need day to day. Three carry the weight.",[1133,1134,1135,1159],"ul",{},[1136,1137,1138,1143,1144,1147,1148,1151,1152,1155,1156,1050],"li",{},[1108,1139,1140],{},[935,1141,1142],{},"\u002Fcodex:review"," runs a normal, read-only Codex review of your current changes. It reviews the working tree by default, or a branch against a base with ",[935,1145,1146],{},"--base main",". It is deliberately not steerable, no custom focus text, a solid second pass looking for bugs, edge cases, and missing tests. Multi-file reviews take a while, so run it with ",[935,1149,1150],{},"--background"," and check back with ",[935,1153,1154],{},"\u002Fcodex:status"," and ",[935,1157,1158],{},"\u002Fcodex:result",[1136,1160,1161,1166],{},[1108,1162,1163],{},[935,1164,1165],{},"\u002Fcodex:adversarial-review"," is the steerable one. It challenges the design rather than only hunting defects: the assumptions the change depends on, the tradeoff you made, where it falls apart under real load. Unlike the plain review it takes free-text focus after the flags, which is the whole point. Save it for the changes that scare you.",[975,1168,1170],{"className":977,"code":1169,"language":979,"meta":980,"style":980},"\u002Fcodex:adversarial-review --base main challenge whether this caching and retry design is right\n",[935,1171,1172],{"__ignoreMap":980},[984,1173,1174,1176,1180,1183,1186,1189,1192,1195,1198,1201,1204,1207],{"class":986,"line":230},[984,1175,1165],{"class":989},[984,1177,1179],{"class":1178},"s8ozJ"," --base",[984,1181,1182],{"class":993}," main",[984,1184,1185],{"class":993}," challenge",[984,1187,1188],{"class":993}," whether",[984,1190,1191],{"class":993}," this",[984,1193,1194],{"class":993}," caching",[984,1196,1197],{"class":993}," and",[984,1199,1200],{"class":993}," retry",[984,1202,1203],{"class":993}," design",[984,1205,1206],{"class":993}," is",[984,1208,1209],{"class":993}," right\n",[1133,1211,1212],{},[1136,1213,1214,1219,1220,1222,1223,1155,1226,1229,1230,1233,1234,1237],{},[1108,1215,1216],{},[935,1217,1218],{},"\u002Fcodex:rescue"," is the only command that writes. It hands a bounded task to the ",[935,1221,1045],{}," subagent to investigate a bug, try a fix, or continue a previous Codex thread. It is also the only command that takes ",[935,1224,1225],{},"--model",[935,1227,1228],{},"--effort"," per call, so this is where you escalate on purpose. ",[935,1231,1232],{},"spark"," is a shorthand for a fast, cheap pass (",[935,1235,1236],{},"gpt-5.3-codex-spark",").",[975,1239,1241],{"className":977,"code":1240,"language":979,"meta":980,"style":980},"\u002Fcodex:rescue investigate why the auth tests started failing\n\u002Fcodex:rescue --model gpt-5.6-sol --effort high --background redesign the retry logic to be idempotent\n\u002Fcodex:rescue --model spark fix the lint errors\n",[935,1242,1243,1268,1306],{"__ignoreMap":980},[984,1244,1245,1247,1250,1253,1256,1259,1262,1265],{"class":986,"line":230},[984,1246,1218],{"class":989},[984,1248,1249],{"class":993}," investigate",[984,1251,1252],{"class":993}," why",[984,1254,1255],{"class":993}," the",[984,1257,1258],{"class":993}," auth",[984,1260,1261],{"class":993}," tests",[984,1263,1264],{"class":993}," started",[984,1266,1267],{"class":993}," failing\n",[984,1269,1270,1272,1275,1278,1281,1284,1287,1290,1292,1294,1297,1300,1303],{"class":986,"line":325},[984,1271,1218],{"class":989},[984,1273,1274],{"class":1178}," --model",[984,1276,1277],{"class":993}," gpt-5.6-sol",[984,1279,1280],{"class":1178}," --effort",[984,1282,1283],{"class":993}," high",[984,1285,1286],{"class":1178}," --background",[984,1288,1289],{"class":993}," redesign",[984,1291,1255],{"class":993},[984,1293,1200],{"class":993},[984,1295,1296],{"class":993}," logic",[984,1298,1299],{"class":993}," to",[984,1301,1302],{"class":993}," be",[984,1304,1305],{"class":993}," idempotent\n",[984,1307,1308,1310,1312,1315,1318,1320,1323],{"class":986,"line":437},[984,1309,1218],{"class":989},[984,1311,1274],{"class":1178},[984,1313,1314],{"class":993}," spark",[984,1316,1317],{"class":993}," fix",[984,1319,1255],{"class":993},[984,1321,1322],{"class":993}," lint",[984,1324,1325],{"class":993}," errors\n",[922,1327,1328,1329,1331,1332,1334,1335,1337,1338,1340,1341,1344],{},"The asymmetry trips people up, so state it plainly: the two review commands do not take ",[935,1330,1225],{}," or ",[935,1333,1228],{},". They inherit whatever is in your ",[935,1336,965],{},". Only ",[935,1339,1218],{}," is steerable per call. If you want your reviews on a heavier model than your default, pin one with ",[935,1342,1343],{},"review_model"," in the config rather than reaching for a flag that the review commands quietly ignore.",[940,1346,1348],{"id":1347},"the-workflow","The workflow",[922,1350,1351],{},"None of these commands are the workflow on their own. The loop is what makes it pay off.",[922,1353,1354,1355,1358],{},"I plan and write with Claude as usual, Opus 4.8 for the everyday work and Fable 5 when a task is long and architectural. When a change is ready, before it becomes a commit, I kick off ",[935,1356,1357],{},"\u002Fcodex:review --background"," and keep working. When it lands I read Codex's findings against what Claude already told me, and I only care about the disagreements. The places both models flag are usually real and usually already handled. The places one flags and the other missed are the reason I am running two.",[922,1360,1361],{},"For a risky change, auth, a migration, anything touching data I cannot get back, I add an adversarial pass with a focus line naming the risk. That one is not looking for typos, it is trying to talk me out of the approach, and sometimes it should.",[922,1363,1364,1365,1367],{},"Then the escalation. When Claude has failed the same fix twice, or when I can see my Claude usage running low and I would rather spend the OpenAI side, I hand the problem to ",[935,1366,1218],{},". A fresh model from another family unsticks a loop more often than a third attempt from the same one. The rule I hold to: whatever Codex writes, Claude reads the diff before it gets accepted. The second engineer proposes; it does not merge.",[940,1369,1371],{"id":1370},"two-skills-that-make-it-a-habit","Two skills that make it a habit",[922,1373,1374,1375,1378,1379,1382,1383,1050],{},"Left to willpower, I forget to run the review until after I have pushed. So I wrote two small skills that turn the routine into something Claude reaches for on its own. A skill is just a ",[935,1376,1377],{},"SKILL.md"," file in its own folder under ",[935,1380,1381],{},"~\u002F.claude\u002Fskills\u002F",", and Claude loads it when the moment fits. If you want the fuller picture of how skills work, I went into it in ",[929,1384,1386],{"href":1385},"\u002Farticles\u002Fhow-to-build-a-claude-code-plugin","how to build a Claude Code plugin",[922,1388,1389],{},"The first is a router. It encodes the decision I keep making by hand, when to stay in Claude and when to hand off, so I do not have to remember the policy every time.",[975,1391,1395],{"className":1392,"code":1393,"language":1394,"meta":980,"style":980},"language-markdown shiki shiki-themes github-dark github-dark","---\nname: delegate-to-codex\ndescription: Decide when to hand work to Codex versus handle it in Claude. Use when finishing an implementation, before opening a PR, when a bug survives two fix attempts, or when the user asks for an independent or second-opinion review.\n---\n\nYou have the Codex plugin available. Codex is a different model family, so it\nis a decorrelated second opinion, not a smarter clone. Use it for cross-checks\nand to spend the ChatGPT quota instead of the Claude quota.\n\n## Handle it in Claude\n- Planning, first-pass implementation, routine edits.\n- Anything where a second opinion adds nothing.\n\n## Hand off to Codex\n1. Before a PR: run your own review of the diff, then run `\u002Fcodex:review\n   --background` for the cross-family pass.\n2. For risky or irreversible changes (auth, migrations, cache invalidation,\n   money, deletes): also run `\u002Fcodex:adversarial-review` with a focus line\n   naming the specific risk.\n3. When a bug survives two Claude fix attempts, or the user is low on Claude\n   usage: `\u002Fcodex:rescue` to investigate root cause.\n\n## Reporting\nCompare the Codex findings against your own review and surface only the\ndisagreements. Agreement is not interesting; the gap between the two is.\nNever accept a Codex diff without reading it first.\n","markdown",[935,1396,1397,1403,1415,1425,1429,1434,1439,1444,1449,1453,1459,1468,1475,1480,1486,1495,1501,1510,1522,1528,1537,1549,1554,1560,1566,1572],{"__ignoreMap":980},[984,1398,1399],{"class":986,"line":230},[984,1400,1402],{"class":1401},"suv1-","---\n",[984,1404,1405,1409,1412],{"class":986,"line":325},[984,1406,1408],{"class":1407},"sxg3X","name",[984,1410,1411],{"class":1401},": ",[984,1413,1414],{"class":993},"delegate-to-codex\n",[984,1416,1417,1420,1422],{"class":986,"line":437},[984,1418,1419],{"class":1407},"description",[984,1421,1411],{"class":1401},[984,1423,1424],{"class":993},"Decide when to hand work to Codex versus handle it in Claude. Use when finishing an implementation, before opening a PR, when a bug survives two fix attempts, or when the user asks for an independent or second-opinion review.\n",[984,1426,1427],{"class":986,"line":197},[984,1428,1402],{"class":1401},[984,1430,1431],{"class":986,"line":340},[984,1432,1433],{"emptyLinePlaceholder":11},"\n",[984,1435,1436],{"class":986,"line":294},[984,1437,1438],{"class":1401},"You have the Codex plugin available. Codex is a different model family, so it\n",[984,1440,1441],{"class":986,"line":57},[984,1442,1443],{"class":1401},"is a decorrelated second opinion, not a smarter clone. Use it for cross-checks\n",[984,1445,1446],{"class":986,"line":179},[984,1447,1448],{"class":1401},"and to spend the ChatGPT quota instead of the Claude quota.\n",[984,1450,1451],{"class":986,"line":13},[984,1452,1433],{"emptyLinePlaceholder":11},[984,1454,1455],{"class":986,"line":10},[984,1456,1458],{"class":1457},"sNs27","## Handle it in Claude\n",[984,1460,1461,1465],{"class":986,"line":71},[984,1462,1464],{"class":1463},"s-3mD","-",[984,1466,1467],{"class":1401}," Planning, first-pass implementation, routine edits.\n",[984,1469,1470,1472],{"class":986,"line":106},[984,1471,1464],{"class":1463},[984,1473,1474],{"class":1401}," Anything where a second opinion adds nothing.\n",[984,1476,1478],{"class":986,"line":1477},13,[984,1479,1433],{"emptyLinePlaceholder":11},[984,1481,1483],{"class":986,"line":1482},14,[984,1484,1485],{"class":1457},"## Hand off to Codex\n",[984,1487,1489,1492],{"class":986,"line":1488},15,[984,1490,1491],{"class":1463},"1.",[984,1493,1494],{"class":1401}," Before a PR: run your own review of the diff, then run `\u002Fcodex:review\n",[984,1496,1498],{"class":986,"line":1497},16,[984,1499,1500],{"class":1401},"   --background` for the cross-family pass.\n",[984,1502,1504,1507],{"class":986,"line":1503},17,[984,1505,1506],{"class":1463},"2.",[984,1508,1509],{"class":1401}," For risky or irreversible changes (auth, migrations, cache invalidation,\n",[984,1511,1513,1516,1519],{"class":986,"line":1512},18,[984,1514,1515],{"class":1401},"   money, deletes): also run ",[984,1517,1518],{"class":1178},"`\u002Fcodex:adversarial-review`",[984,1520,1521],{"class":1401}," with a focus line\n",[984,1523,1525],{"class":986,"line":1524},19,[984,1526,1527],{"class":1401},"   naming the specific risk.\n",[984,1529,1531,1534],{"class":986,"line":1530},20,[984,1532,1533],{"class":1463},"3.",[984,1535,1536],{"class":1401}," When a bug survives two Claude fix attempts, or the user is low on Claude\n",[984,1538,1540,1543,1546],{"class":986,"line":1539},21,[984,1541,1542],{"class":1401},"   usage: ",[984,1544,1545],{"class":1178},"`\u002Fcodex:rescue`",[984,1547,1548],{"class":1401}," to investigate root cause.\n",[984,1550,1552],{"class":986,"line":1551},22,[984,1553,1433],{"emptyLinePlaceholder":11},[984,1555,1557],{"class":986,"line":1556},23,[984,1558,1559],{"class":1457},"## Reporting\n",[984,1561,1563],{"class":986,"line":1562},24,[984,1564,1565],{"class":1401},"Compare the Codex findings against your own review and surface only the\n",[984,1567,1569],{"class":986,"line":1568},25,[984,1570,1571],{"class":1401},"disagreements. Agreement is not interesting; the gap between the two is.\n",[984,1573,1575],{"class":986,"line":1574},26,[984,1576,1577],{"class":1401},"Never accept a Codex diff without reading it first.\n",[922,1579,1580],{},"The second is the pre-PR check, split out because it is the one I want to fire the same way every time. It runs Claude's own review first, then the Codex one, and reports where they differ.",[975,1582,1584],{"className":1392,"code":1583,"language":1394,"meta":980,"style":980},"---\nname: pre-pr-review\ndescription: Two-model review of a diff before opening a PR. Runs the built-in Claude review, then a cross-family Codex review, and reports only where the two disagree. Use before opening a pull request or when asked to review a branch for merge.\ndisable-model-invocation: true\n---\n\nRun before a PR. Do not fix anything during this skill; report only.\n\n1. Review the current diff yourself for correctness, edge cases, security, and\n   missing tests. Hold the findings.\n2. Run `\u002Fcodex:review --background` for the same diff (use `--base \u003Cbranch>`\n   for a branch review). Wait for it with `\u002Fcodex:status` and `\u002Fcodex:result`.\n3. Produce one short report with three buckets:\n   - **Both flagged** (high confidence, fix these first)\n   - **Only Claude flagged**\n   - **Only Codex flagged** (the decorrelated catches, read closely)\n4. Stop there. The human decides what to fix.\n",[935,1585,1586,1590,1599,1608,1618,1622,1626,1631,1635,1642,1647,1663,1679,1686,1698,1705,1715],{"__ignoreMap":980},[984,1587,1588],{"class":986,"line":230},[984,1589,1402],{"class":1401},[984,1591,1592,1594,1596],{"class":986,"line":325},[984,1593,1408],{"class":1407},[984,1595,1411],{"class":1401},[984,1597,1598],{"class":993},"pre-pr-review\n",[984,1600,1601,1603,1605],{"class":986,"line":437},[984,1602,1419],{"class":1407},[984,1604,1411],{"class":1401},[984,1606,1607],{"class":993},"Two-model review of a diff before opening a PR. Runs the built-in Claude review, then a cross-family Codex review, and reports only where the two disagree. Use before opening a pull request or when asked to review a branch for merge.\n",[984,1609,1610,1613,1615],{"class":986,"line":197},[984,1611,1612],{"class":1407},"disable-model-invocation",[984,1614,1411],{"class":1401},[984,1616,1617],{"class":1178},"true\n",[984,1619,1620],{"class":986,"line":340},[984,1621,1402],{"class":1401},[984,1623,1624],{"class":986,"line":294},[984,1625,1433],{"emptyLinePlaceholder":11},[984,1627,1628],{"class":986,"line":57},[984,1629,1630],{"class":1401},"Run before a PR. Do not fix anything during this skill; report only.\n",[984,1632,1633],{"class":986,"line":179},[984,1634,1433],{"emptyLinePlaceholder":11},[984,1636,1637,1639],{"class":986,"line":13},[984,1638,1491],{"class":1463},[984,1640,1641],{"class":1401}," Review the current diff yourself for correctness, edge cases, security, and\n",[984,1643,1644],{"class":986,"line":10},[984,1645,1646],{"class":1401},"   missing tests. Hold the findings.\n",[984,1648,1649,1651,1654,1657,1660],{"class":986,"line":71},[984,1650,1506],{"class":1463},[984,1652,1653],{"class":1401}," Run ",[984,1655,1656],{"class":1178},"`\u002Fcodex:review --background`",[984,1658,1659],{"class":1401}," for the same diff (use ",[984,1661,1662],{"class":1178},"`--base \u003Cbranch>`\n",[984,1664,1665,1668,1671,1673,1676],{"class":986,"line":106},[984,1666,1667],{"class":1401},"   for a branch review). Wait for it with ",[984,1669,1670],{"class":1178},"`\u002Fcodex:status`",[984,1672,1155],{"class":1401},[984,1674,1675],{"class":1178},"`\u002Fcodex:result`",[984,1677,1678],{"class":1401},".\n",[984,1680,1681,1683],{"class":986,"line":1477},[984,1682,1533],{"class":1463},[984,1684,1685],{"class":1401}," Produce one short report with three buckets:\n",[984,1687,1688,1691,1695],{"class":986,"line":1482},[984,1689,1690],{"class":1463},"   -",[984,1692,1694],{"class":1693},"sguZG"," **Both flagged**",[984,1696,1697],{"class":1401}," (high confidence, fix these first)\n",[984,1699,1700,1702],{"class":986,"line":1488},[984,1701,1690],{"class":1463},[984,1703,1704],{"class":1693}," **Only Claude flagged**\n",[984,1706,1707,1709,1712],{"class":986,"line":1497},[984,1708,1690],{"class":1463},[984,1710,1711],{"class":1693}," **Only Codex flagged**",[984,1713,1714],{"class":1401}," (the decorrelated catches, read closely)\n",[984,1716,1717,1720],{"class":986,"line":1503},[984,1718,1719],{"class":1463},"4.",[984,1721,1722],{"class":1401}," Stop there. The human decides what to fix.\n",[922,1724,1725,1726,1729,1730,1733,1734,1738],{},"I set ",[935,1727,1728],{},"disable-model-invocation: true"," on the pre-PR one so it only fires when I type ",[935,1731,1732],{},"\u002Fpre-pr-review",". Anything that spends the other quota, I would rather trigger on purpose than have trigger itself. The router I leave open so Claude can consult it at the natural moments. If you want to see how far a three-sentence skill can go, the ",[929,1735,1737],{"href":1736},"\u002Farticles\u002Fthe-grill-me-skill-for-claude-code","grill-me skill"," is a good reminder that the prompt is doing the work, not the plumbing.",[940,1740,1742],{"id":1741},"what-it-costs-on-two-quotas","What it costs on two quotas",[922,1744,1745],{},"The honest catch is that you are now managing two budgets that do not know about each other. A few habits keep it sane.",[922,1747,1748,1749,1751,1752,1754],{},"Leave the Codex default on Terra. Reviews and routine delegation do not need the flagship, and pointing your config at Sol means every ",[935,1750,1142],{}," runs on the most expensive tier. Escalate to Sol only where it pays, on a hard ",[935,1753,1218],{}," or an adversarial pass on a genuinely risky change, and do it per command so the default stays cheap.",[922,1756,1757,1758,1760,1761,1763],{},"Keep the review gate off. ",[935,1759,1025],{}," can install a Stop hook that reviews every response and blocks Claude until issues are addressed. It is a legitimate feature, but OpenAI's own warning is blunt: it \"can create a long-running Claude\u002FCodex loop and may drain usage limits quickly.\" I would rather run ",[935,1762,1142],{}," when I mean to than have two models ping-ponging while I am not watching. Turn it on for a monitored release audit if you like, then turn it back off.",[922,1765,1766,1767,1769],{},"And watch both dashboards, because nothing shows you a combined number. Claude's ",[935,1768,1114],{}," covers one side; the Codex usage view covers the other. The first month you will misjudge the split, then it settles.",[940,1771,1773],{"id":1772},"worth-it","Worth it?",[922,1775,1776],{},"For solo throwaway work, no. The setup is overhead you will not recoup on a script you run once.",[922,1778,1779,1780,1784],{},"For anything you are going to ship, yes, and more than I expected. The reviews I act on are the ones where Claude and Codex disagree, and I would not have those without a second family in the loop. The rescue path has pulled me out of more than one two-attempt spiral in a single pass. And on a Max-plus-Plus setup the quota math works in your favor: the expensive Claude model plans and decides, while the second engineer does the independent read and the grunt fixes on a different meter. If you already lean on Claude Code, this is the same instinct behind ",[929,1781,1783],{"href":1782},"\u002Farticles\u002Fgetting-more-out-of-claude-code","getting more out of Claude Code",", aimed at review instead of writing. The disagreements are the payoff, and a reader from another family is the only way I have found to get them.",[1786,1787,1788],"style",{},"html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .s4wv1, html code.shiki .s4wv1{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sxg3X, html code.shiki .sxg3X{--shiki-default:#85E89D;--shiki-dark:#85E89D}html pre.shiki code .sNs27, html code.shiki .sNs27{--shiki-default:#79B8FF;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html pre.shiki code .s-3mD, html code.shiki .s-3mD{--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .sguZG, html code.shiki .sguZG{--shiki-default:#E1E4E8;--shiki-default-font-weight:bold;--shiki-dark:#E1E4E8;--shiki-dark-font-weight:bold}",{"title":980,"searchDepth":325,"depth":325,"links":1790},[1791,1792,1793,1794,1795,1796,1797],{"id":942,"depth":325,"text":943},{"id":955,"depth":325,"text":956},{"id":1124,"depth":325,"text":1125},{"id":1347,"depth":325,"text":1348},{"id":1370,"depth":325,"text":1371},{"id":1741,"depth":325,"text":1742},{"id":1772,"depth":325,"text":1773},{"id":13,"name":14,"slug":15,"hue":16},"md",{},{"title":6,"description":924},"posts\u002Frunning-codex-inside-claude-code",[20,23,26,29,32],[1805,1806,1807,1808,1809],{"name":19,"slug":20},{"name":22,"slug":23},{"name":25,"slug":26},{"name":28,"slug":29},{"name":31,"slug":32},"w--texWnSFE5BAYy67_40hwlPbT8k_kPH7OeCACHquQ",1784552965955]