[{"data":1,"prerenderedAt":1511},["ShallowReactive",2],{"post-cards":3,"categories":812,"post-loop-engineering-in-claude-code":868},[4,34,51,70,85,111,124,141,163,175,193,210,226,240,257,271,286,301,314,323,332,346,360,374,384,397,407,417,428,443,455,468,479,490,501,512,523,534,547,560,575,590,604,618,630,641,652,662,672,682,692,702,712,722,732,742,752,762,772,782,792,802],{"path":5,"title":6,"slug":7,"summary":8,"date":9,"readTime":10,"hasImage":11,"category":12,"tags":17,"tagSlugs":33},"\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,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},"Loop Engineering","loop-engineering",{"name":25,"slug":26},"Automation","automation",{"name":28,"slug":29},"AI","ai",{"name":31,"slug":32},"Developer Tools","developer-tools",[20,23,26,29,32],{"path":35,"title":36,"slug":37,"summary":38,"date":39,"readTime":40,"hasImage":11,"category":41,"tags":42,"tagSlugs":50},"\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",7,{"id":13,"name":14,"slug":15,"hue":16},[43,44,47,48,49],{"name":19,"slug":20},{"name":45,"slug":46},"Hooks","hooks",{"name":25,"slug":26},{"name":28,"slug":29},{"name":31,"slug":32},[20,46,26,29,32],{"path":52,"title":53,"slug":54,"summary":55,"date":56,"readTime":57,"hasImage":11,"category":58,"tags":59,"tagSlugs":69},"\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},[60,61,64,67,68],{"name":19,"slug":20},{"name":62,"slug":63},"Prompting","prompting",{"name":65,"slug":66},"Tokens","tokens",{"name":28,"slug":29},{"name":31,"slug":32},[20,63,66,29,32],{"path":71,"title":72,"slug":73,"summary":74,"date":75,"readTime":10,"hasImage":11,"category":76,"tags":77,"tagSlugs":84},"\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},[78,79,82,83],{"name":19,"slug":20},{"name":80,"slug":81},"Plugins","plugins",{"name":28,"slug":29},{"name":31,"slug":32},[20,81,29,32],{"path":86,"title":87,"slug":88,"summary":89,"date":90,"readTime":91,"hasImage":11,"category":92,"tags":96,"tagSlugs":110},"\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",10,{"id":40,"name":93,"slug":94,"hue":95},"AWS","aws",195,[97,98,101,104,107],{"name":93,"slug":94},{"name":99,"slug":100},"Lambda","lambda",{"name":102,"slug":103},"ECR","ecr",{"name":105,"slug":106},"Docker","docker",{"name":108,"slug":109},"Laravel","laravel",[94,100,103,106,109],{"path":112,"title":113,"slug":114,"summary":115,"date":116,"readTime":91,"hasImage":11,"category":117,"tags":118,"tagSlugs":123},"\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":40,"name":93,"slug":94,"hue":95},[119,120,121,122],{"name":93,"slug":94},{"name":99,"slug":100},{"name":105,"slug":106},{"name":108,"slug":109},[94,100,106,109],{"path":125,"title":126,"slug":127,"summary":128,"date":129,"readTime":57,"hasImage":11,"category":130,"tags":135,"tagSlugs":140},"\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":131,"name":132,"slug":133,"hue":134},8,"Python","python",330,[136,137],{"name":132,"slug":133},{"name":138,"slug":139},"PHP","php",[133,139],{"path":142,"title":143,"slug":144,"summary":145,"date":146,"readTime":40,"hasImage":147,"category":148,"tags":153,"tagSlugs":162},"\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":149,"name":150,"slug":151,"hue":152},4,"Git","git",158,[154,156,159],{"name":155,"slug":151},"GIT",{"name":157,"slug":158},"Workflow","workflow",{"name":160,"slug":161},"GitHub","github",[151,158,161],{"path":164,"title":165,"slug":166,"summary":167,"date":168,"readTime":40,"hasImage":147,"category":169,"tags":170,"tagSlugs":174},"\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":149,"name":150,"slug":151,"hue":152},[171,172,173],{"name":155,"slug":151},{"name":157,"slug":158},{"name":160,"slug":161},[151,158,161],{"path":176,"title":177,"slug":178,"summary":179,"date":180,"readTime":13,"hasImage":11,"category":181,"tags":184,"tagSlugs":192},"\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":182,"name":138,"slug":139,"hue":183},1,264,[185,186,189],{"name":138,"slug":139},{"name":187,"slug":188},"OOP","oop",{"name":190,"slug":191},"Architecture","architecture",[139,188,191],{"path":194,"title":195,"slug":196,"summary":197,"date":198,"readTime":91,"hasImage":11,"category":199,"tags":200,"tagSlugs":209},"\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":40,"name":93,"slug":94,"hue":95},[201,202,203,206],{"name":93,"slug":94},{"name":99,"slug":100},{"name":204,"slug":205},"Step Functions","step-functions",{"name":207,"slug":208},"Serverless","serverless",[94,100,205,208],{"path":211,"title":212,"slug":213,"summary":214,"date":215,"readTime":10,"hasImage":11,"category":216,"tags":217,"tagSlugs":225},"\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":40,"name":93,"slug":94,"hue":95},[218,219,220,223,224],{"name":93,"slug":94},{"name":99,"slug":100},{"name":221,"slug":222},"API Gateway","api-gateway",{"name":207,"slug":208},{"name":108,"slug":109},[94,100,222,208,109],{"path":227,"title":228,"slug":229,"summary":230,"date":231,"readTime":91,"hasImage":11,"category":232,"tags":233,"tagSlugs":239},"\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":40,"name":93,"slug":94,"hue":95},[234,235,236,237,238],{"name":93,"slug":94},{"name":99,"slug":100},{"name":105,"slug":106},{"name":102,"slug":103},{"name":207,"slug":208},[94,100,106,103,208],{"path":241,"title":242,"slug":243,"summary":244,"date":245,"readTime":246,"hasImage":11,"category":247,"tags":248,"tagSlugs":256},"\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":182,"name":138,"slug":139,"hue":183},[249,250,253],{"name":138,"slug":139},{"name":251,"slug":252},"PHP 8.5","php-8-5",{"name":254,"slug":255},"What's New","whats-new",[139,252,255],{"path":258,"title":259,"slug":260,"summary":261,"date":262,"readTime":246,"hasImage":11,"category":263,"tags":264,"tagSlugs":270},"\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":182,"name":138,"slug":139,"hue":183},[265,266,269],{"name":138,"slug":139},{"name":267,"slug":268},"PHP 8.4","php-8-4",{"name":254,"slug":255},[139,268,255],{"path":272,"title":273,"slug":274,"summary":275,"date":276,"readTime":277,"hasImage":147,"category":278,"tags":282,"tagSlugs":285},"\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":246,"name":279,"slug":280,"hue":281},"Rust","rust-programming",38,[283],{"name":284,"slug":284},"rust",[284],{"path":287,"title":288,"slug":289,"summary":290,"date":291,"readTime":292,"hasImage":11,"category":293,"tags":294,"tagSlugs":300},"\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":182,"name":138,"slug":139,"hue":183},[295,296,299],{"name":138,"slug":139},{"name":297,"slug":298},"PHP 8.3","php-8-3",{"name":254,"slug":255},[139,298,255],{"path":302,"title":303,"slug":304,"summary":305,"date":306,"readTime":277,"hasImage":147,"category":307,"tags":311,"tagSlugs":313},"\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":292,"name":308,"slug":309,"hue":310},"Flutter","flutter",230,[312],{"name":309,"slug":309},[309],{"path":315,"title":316,"slug":317,"summary":318,"date":306,"readTime":182,"hasImage":147,"category":319,"tags":320,"tagSlugs":322},"\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":292,"name":308,"slug":309,"hue":310},[321],{"name":309,"slug":309},[309],{"path":324,"title":325,"slug":326,"summary":327,"date":306,"readTime":182,"hasImage":147,"category":328,"tags":329,"tagSlugs":331},"\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":292,"name":308,"slug":309,"hue":310},[330],{"name":309,"slug":309},[309],{"path":333,"title":334,"slug":335,"summary":336,"date":337,"readTime":246,"hasImage":11,"category":338,"tags":339,"tagSlugs":345},"\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":182,"name":138,"slug":139,"hue":183},[340,341,344],{"name":138,"slug":139},{"name":342,"slug":343},"PHP 8.2","php-8-2",{"name":254,"slug":255},[139,343,255],{"path":347,"title":348,"slug":349,"summary":350,"date":351,"readTime":246,"hasImage":11,"category":352,"tags":353,"tagSlugs":359},"\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":182,"name":138,"slug":139,"hue":183},[354,355,358],{"name":138,"slug":139},{"name":356,"slug":357},"PHP 8.1","php-8-1",{"name":254,"slug":255},[139,357,255],{"path":361,"title":362,"slug":363,"summary":364,"date":365,"readTime":246,"hasImage":11,"category":366,"tags":367,"tagSlugs":373},"\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":182,"name":138,"slug":139,"hue":183},[368,369,372],{"name":138,"slug":139},{"name":370,"slug":371},"PHP 8.0","php-8-0",{"name":254,"slug":255},[139,371,255],{"path":375,"title":376,"slug":377,"summary":378,"date":379,"readTime":149,"hasImage":147,"category":380,"tags":381,"tagSlugs":383},"\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":149,"name":150,"slug":151,"hue":152},[382],{"name":155,"slug":151},[151],{"path":385,"title":386,"slug":387,"summary":388,"date":379,"readTime":389,"hasImage":11,"category":390,"tags":394,"tagSlugs":396},"\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":277,"name":391,"slug":392,"hue":393},"JavaScript","javascript",92,[395],{"name":391,"slug":392},[392],{"path":398,"title":399,"slug":400,"summary":401,"date":402,"readTime":182,"hasImage":11,"category":403,"tags":404,"tagSlugs":406},"\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":182,"name":138,"slug":139,"hue":183},[405],{"name":138,"slug":139},[139],{"path":408,"title":409,"slug":410,"summary":411,"date":412,"readTime":277,"hasImage":11,"category":413,"tags":414,"tagSlugs":416},"\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":182,"name":138,"slug":139,"hue":183},[415],{"name":138,"slug":139},[139],{"path":418,"title":419,"slug":420,"summary":421,"date":422,"readTime":246,"hasImage":147,"category":423,"tags":424,"tagSlugs":427},"\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":149,"name":150,"slug":151,"hue":152},[425,426],{"name":155,"slug":151},{"name":157,"slug":158},[151,158],{"path":429,"title":430,"slug":431,"summary":432,"date":433,"readTime":246,"hasImage":147,"category":434,"tags":438,"tagSlugs":442},"\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":389,"name":435,"slug":436,"hue":437},"HTML & CSS","html-css",55,[439],{"name":440,"slug":441},"CSS","css",[441],{"path":444,"title":445,"slug":446,"summary":447,"date":448,"readTime":149,"hasImage":147,"category":449,"tags":450,"tagSlugs":454},"\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":389,"name":435,"slug":436,"hue":437},[451],{"name":452,"slug":453},"HTML","html",[453],{"path":456,"title":457,"slug":458,"summary":459,"date":460,"readTime":277,"hasImage":147,"category":461,"tags":462,"tagSlugs":467},"\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":389,"name":435,"slug":436,"hue":437},[463,466],{"name":464,"slug":465},"Stylus","stylus",{"name":440,"slug":441},[465,441],{"path":469,"title":470,"slug":471,"summary":472,"date":473,"readTime":182,"hasImage":147,"category":474,"tags":475,"tagSlugs":478},"\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":389,"name":435,"slug":436,"hue":437},[476,477],{"name":440,"slug":441},{"name":464,"slug":465},[441,465],{"path":480,"title":481,"slug":482,"summary":483,"date":484,"readTime":149,"hasImage":147,"category":485,"tags":486,"tagSlugs":489},"\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":389,"name":435,"slug":436,"hue":437},[487,488],{"name":440,"slug":441},{"name":464,"slug":465},[441,465],{"path":491,"title":492,"slug":493,"summary":494,"date":495,"readTime":277,"hasImage":147,"category":496,"tags":497,"tagSlugs":500},"\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":389,"name":435,"slug":436,"hue":437},[498,499],{"name":440,"slug":441},{"name":464,"slug":465},[441,465],{"path":502,"title":503,"slug":504,"summary":505,"date":506,"readTime":292,"hasImage":147,"category":507,"tags":508,"tagSlugs":511},"\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":389,"name":435,"slug":436,"hue":437},[509,510],{"name":440,"slug":441},{"name":464,"slug":465},[441,465],{"path":513,"title":514,"slug":515,"summary":516,"date":517,"readTime":182,"hasImage":147,"category":518,"tags":519,"tagSlugs":522},"\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":389,"name":435,"slug":436,"hue":437},[520,521],{"name":440,"slug":441},{"name":464,"slug":465},[441,465],{"path":524,"title":525,"slug":526,"summary":527,"date":528,"readTime":149,"hasImage":147,"category":529,"tags":530,"tagSlugs":533},"\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":389,"name":435,"slug":436,"hue":437},[531,532],{"name":440,"slug":441},{"name":452,"slug":453},[441,453],{"path":535,"title":536,"slug":537,"summary":538,"date":539,"readTime":182,"hasImage":147,"category":540,"tags":541,"tagSlugs":546},"\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":277,"name":391,"slug":392,"hue":393},[542,543],{"name":391,"slug":392},{"name":544,"slug":545},"ECMAScript","ecmascript",[392,545],{"path":548,"title":549,"slug":550,"summary":551,"date":552,"readTime":389,"hasImage":147,"category":553,"tags":554,"tagSlugs":559},"\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":277,"name":391,"slug":392,"hue":393},[555,556],{"name":391,"slug":392},{"name":557,"slug":558},"Babel","babel",[392,558],{"path":561,"title":562,"slug":563,"summary":564,"date":565,"readTime":182,"hasImage":147,"category":566,"tags":567,"tagSlugs":574},"\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":277,"name":391,"slug":392,"hue":393},[568,569,570,571],{"name":391,"slug":392},{"name":464,"slug":465},{"name":440,"slug":441},{"name":572,"slug":573},"Gulp","gulp",[392,465,441,573],{"path":576,"title":577,"slug":578,"summary":579,"date":580,"readTime":277,"hasImage":147,"category":581,"tags":582,"tagSlugs":589},"\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":277,"name":391,"slug":392,"hue":393},[583,584,585,588],{"name":572,"slug":573},{"name":391,"slug":392},{"name":586,"slug":587},"Less","less",{"name":440,"slug":441},[573,392,587,441],{"path":591,"title":592,"slug":593,"summary":594,"date":595,"readTime":277,"hasImage":11,"category":596,"tags":597,"tagSlugs":603},"\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":277,"name":391,"slug":392,"hue":393},[598,599,602],{"name":391,"slug":392},{"name":600,"slug":601},"Browser Sync","browser-sync",{"name":572,"slug":573},[392,601,573],{"path":605,"title":606,"slug":607,"summary":608,"date":609,"readTime":277,"hasImage":147,"category":610,"tags":611,"tagSlugs":617},"\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":277,"name":391,"slug":392,"hue":393},[612,613,616],{"name":391,"slug":392},{"name":614,"slug":615},"Yarn","yarn",{"name":572,"slug":573},[392,615,573],{"path":619,"title":620,"slug":621,"summary":622,"date":623,"readTime":246,"hasImage":147,"category":624,"tags":625,"tagSlugs":629},"\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":277,"name":391,"slug":392,"hue":393},[626,627,628],{"name":391,"slug":392},{"name":572,"slug":573},{"name":614,"slug":615},[392,573,615],{"path":631,"title":632,"slug":633,"summary":634,"date":635,"readTime":389,"hasImage":147,"category":636,"tags":637,"tagSlugs":640},"\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":277,"name":391,"slug":392,"hue":393},[638,639],{"name":391,"slug":392},{"name":614,"slug":615},[392,615],{"path":642,"title":643,"slug":644,"summary":645,"date":646,"readTime":389,"hasImage":147,"category":647,"tags":648,"tagSlugs":651},"\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":277,"name":391,"slug":392,"hue":393},[649,650],{"name":391,"slug":392},{"name":614,"slug":615},[392,615],{"path":653,"title":654,"slug":655,"summary":656,"date":657,"readTime":182,"hasImage":11,"category":658,"tags":659,"tagSlugs":661},"\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":182,"name":138,"slug":139,"hue":183},[660],{"name":138,"slug":139},[139],{"path":663,"title":664,"slug":665,"summary":666,"date":667,"readTime":182,"hasImage":11,"category":668,"tags":669,"tagSlugs":671},"\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":182,"name":138,"slug":139,"hue":183},[670],{"name":138,"slug":139},[139],{"path":673,"title":674,"slug":675,"summary":676,"date":677,"readTime":182,"hasImage":11,"category":678,"tags":679,"tagSlugs":681},"\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":182,"name":138,"slug":139,"hue":183},[680],{"name":138,"slug":139},[139],{"path":683,"title":684,"slug":685,"summary":686,"date":687,"readTime":182,"hasImage":11,"category":688,"tags":689,"tagSlugs":691},"\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":182,"name":138,"slug":139,"hue":183},[690],{"name":138,"slug":139},[139],{"path":693,"title":694,"slug":695,"summary":696,"date":697,"readTime":182,"hasImage":11,"category":698,"tags":699,"tagSlugs":701},"\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":182,"name":138,"slug":139,"hue":183},[700],{"name":138,"slug":139},[139],{"path":703,"title":704,"slug":705,"summary":706,"date":707,"readTime":182,"hasImage":11,"category":708,"tags":709,"tagSlugs":711},"\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":182,"name":138,"slug":139,"hue":183},[710],{"name":138,"slug":139},[139],{"path":713,"title":714,"slug":715,"summary":716,"date":717,"readTime":277,"hasImage":11,"category":718,"tags":719,"tagSlugs":721},"\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":182,"name":138,"slug":139,"hue":183},[720],{"name":138,"slug":139},[139],{"path":723,"title":724,"slug":725,"summary":726,"date":727,"readTime":40,"hasImage":11,"category":728,"tags":729,"tagSlugs":731},"\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":182,"name":138,"slug":139,"hue":183},[730],{"name":138,"slug":139},[139],{"path":733,"title":734,"slug":735,"summary":736,"date":737,"readTime":182,"hasImage":11,"category":738,"tags":739,"tagSlugs":741},"\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":182,"name":138,"slug":139,"hue":183},[740],{"name":138,"slug":139},[139],{"path":743,"title":744,"slug":745,"summary":746,"date":747,"readTime":182,"hasImage":11,"category":748,"tags":749,"tagSlugs":751},"\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":182,"name":138,"slug":139,"hue":183},[750],{"name":138,"slug":139},[139],{"path":753,"title":754,"slug":755,"summary":756,"date":757,"readTime":182,"hasImage":11,"category":758,"tags":759,"tagSlugs":761},"\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":182,"name":138,"slug":139,"hue":183},[760],{"name":138,"slug":139},[139],{"path":763,"title":764,"slug":765,"summary":766,"date":767,"readTime":182,"hasImage":11,"category":768,"tags":769,"tagSlugs":771},"\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":182,"name":138,"slug":139,"hue":183},[770],{"name":138,"slug":139},[139],{"path":773,"title":774,"slug":775,"summary":776,"date":777,"readTime":182,"hasImage":11,"category":778,"tags":779,"tagSlugs":781},"\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":182,"name":138,"slug":139,"hue":183},[780],{"name":138,"slug":139},[139],{"path":783,"title":784,"slug":785,"summary":786,"date":787,"readTime":277,"hasImage":11,"category":788,"tags":789,"tagSlugs":791},"\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":182,"name":138,"slug":139,"hue":183},[790],{"name":138,"slug":139},[139],{"path":793,"title":794,"slug":795,"summary":796,"date":797,"readTime":389,"hasImage":11,"category":798,"tags":799,"tagSlugs":801},"\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":182,"name":138,"slug":139,"hue":183},[800],{"name":138,"slug":139},[139],{"path":803,"title":804,"slug":805,"summary":806,"date":807,"readTime":182,"hasImage":11,"category":808,"tags":809,"tagSlugs":811},"\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":182,"name":138,"slug":139,"hue":183},[810],{"name":138,"slug":139},[139],[813,820,826,832,838,844,850,856,862],{"id":814,"description":815,"extension":816,"hue":183,"meta":817,"name":138,"slug":139,"stem":818,"weight":182,"__hash__":819},"categories\u002Fcategories\u002Fphp.json","PHP articles and tutorials ranging from new language features to using interesting packages.","json",{},"categories\u002Fphp","h_EmN4YMO4b2mBt3MPLs7RvscJx0NBmwDIZPxqPqKLE",{"id":821,"description":822,"extension":816,"hue":393,"meta":823,"name":391,"slug":392,"stem":824,"weight":277,"__hash__":825},"categories\u002Fcategories\u002Fjavascript.json","JavaScript articles and tutorials ranging from new language features to using interesting packages.",{},"categories\u002Fjavascript","7gmVgkw5BRo26i1bFoSv96bwDJ4nTtZcJ9Ud6u5p0yk",{"id":827,"description":828,"extension":816,"hue":437,"meta":829,"name":435,"slug":436,"stem":830,"weight":389,"__hash__":831},"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":833,"description":834,"extension":816,"hue":152,"meta":835,"name":150,"slug":151,"stem":836,"weight":149,"__hash__":837},"categories\u002Fcategories\u002Fgit.json","Git articles and tutorials ranging from new language features to different workflows.",{},"categories\u002Fgit","qOqFsFTKI9XB444UodUKW_3AakFadHzW-ss8V-maUmE",{"id":839,"description":840,"extension":816,"hue":310,"meta":841,"name":308,"slug":309,"stem":842,"weight":292,"__hash__":843},"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":845,"description":846,"extension":816,"hue":281,"meta":847,"name":279,"slug":280,"stem":848,"weight":246,"__hash__":849},"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":851,"description":852,"extension":816,"hue":95,"meta":853,"name":93,"slug":94,"stem":854,"weight":40,"__hash__":855},"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":857,"description":858,"extension":816,"hue":134,"meta":859,"name":132,"slug":133,"stem":860,"weight":131,"__hash__":861},"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":863,"description":864,"extension":816,"hue":16,"meta":865,"name":14,"slug":15,"stem":866,"weight":13,"__hash__":867},"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":869,"title":6,"body":870,"category":1498,"date":9,"description":876,"extension":1499,"hasImage":11,"meta":1500,"navigation":11,"path":5,"readTime":10,"seo":1501,"slug":7,"stem":1502,"summary":8,"tagSlugs":1503,"tags":1504,"__hash__":1510},"posts\u002Fposts\u002Floop-engineering-in-claude-code.md",{"type":871,"value":872,"toc":1481},"minimark",[873,877,880,883,888,891,899,908,912,915,920,946,950,953,957,973,977,980,984,991,1070,1073,1077,1080,1090,1093,1103,1220,1242,1247,1284,1287,1296,1300,1303,1306,1397,1400,1409,1413,1416,1419,1422,1426,1429,1448,1452,1455,1458,1461,1464,1477],[874,875,876],"p",{},"A tweet from Addy Osmani reframed how I think about working with Claude Code. He put it this way: \"Loop engineering is replacing yourself as the person who prompts the agent. You design the system that does it instead. A loop here can be thought of a recursive goal where you define a purpose and the AI iterates until complete.\"",[874,878,879],{},"He is not the only one saying it. Peter Steinberger put it more bluntly: \"You shouldn't be prompting coding agents anymore. You should be designing loops that prompt your agents.\" And Boris Cherny, who heads Claude Code at Anthropic, said the quiet part out loud: \"I don't prompt Claude anymore. I have loops running that prompt Claude and figuring out what to do. My job is to write loops.\"",[874,881,882],{},"It is easy to wave this off as a cron job wearing a hat, and that reaction is not entirely wrong. But the framing stuck with me, because once you go looking, every piece you need to build one of these loops is already sitting inside Claude Code. This is a tour of those pieces, with the examples I actually reach for, and a straight answer to when a loop is worth it versus when you are just lighting tokens on fire.",[884,885,887],"h2",{"id":886},"from-prompting-to-designing-the-loop","From prompting to designing the loop",[874,889,890],{},"The familiar way to work with a coding agent is straightforward. You write a good prompt, give the agent enough context, read what comes back, and type the next thing. You are holding the tool the entire time, one turn after another. That works, and for a lot of tasks it is still the right way to work.",[874,892,893,894,898],{},"Loop engineering is what happens when you stop being the thing in the loop. Instead of prompting each step, you build a small system that finds the work, hands it out, checks the result, writes down what happened, and decides what to do next, and you let ",[895,896,897],"em",{},"that"," poke the agent. The \"recursive goal\" idea is the heart of it: you define a purpose once, and the agent iterates until that purpose is met.",[874,900,901,902,907],{},"The part that surprised me is how little custom plumbing this takes. You might expect a loop to mean a pile of bash you own and babysit forever, but the pieces already ship inside the product itself. If you have read my notes on ",[903,904,906],"a",{"href":905},"\u002Farticles\u002Fgetting-more-out-of-claude-code","prompting and the token economy",", think of this as the layer above that: not how to phrase one turn well, but how to arrange many turns so you do not have to phrase each one at all.",[884,909,911],{"id":910},"the-building-blocks-claude-code-already-ships","The building blocks Claude Code already ships",[874,913,914],{},"Osmani's list is five pieces plus one place to remember things. Here they are, each mapped to the actual Claude Code mechanism.",[916,917,919],"h3",{"id":918},"automations-the-heartbeat","Automations: the heartbeat",[874,921,922,923,927,928,931,932,935,936,935,939,935,942,945],{},"A loop is only a loop if something kicks it off again. In Claude Code that is ",[924,925,926],"code",{},"\u002Floop"," for in-session cadence, ",[903,929,46],{"href":930},"\u002Farticles\u002Fclaude-code-hooks-by-example"," for firing shell commands at points in the agent lifecycle (",[924,933,934],{},"SessionStart",", ",[924,937,938],{},"PreToolUse",[924,940,941],{},"PostToolUse",[924,943,944],{},"SubagentStop",", and more), and GitHub Actions when you want the thing to keep running after you close the laptop. You define an autonomous task, give it a trigger, and let the findings come to you instead of going around checking.",[916,947,949],{"id":948},"worktrees-so-parallel-does-not-become-chaos","Worktrees: so parallel does not become chaos",[874,951,952],{},"The moment you run more than one agent, they start colliding on the same files. A git worktree is a separate working directory on its own branch sharing the same repo history, so one agent's edits cannot touch another's checkout. Claude Code leans on this directly: you can open a session in its own worktree, and you can give a subagent its own isolated checkout so each helper works in a fresh copy that cleans itself up afterward. The worktrees remove the mechanical collision, but your review bandwidth is still the ceiling on how many agents you can usefully run.",[916,954,956],{"id":955},"skills-stop-re-explaining-your-project-every-session","Skills: stop re-explaining your project every session",[874,958,959,960,964,965,968,969,972],{},"A ",[903,961,963],{"href":962},"\u002Farticles\u002Fhow-to-build-a-claude-code-plugin","skill"," is a ",[924,966,967],{},"SKILL.md"," file in a folder under ",[924,970,971],{},".claude\u002Fskills\u002F",", holding the project knowledge the agent would otherwise guess at every time: your conventions, your build steps, the \"we don't do it like that because of one bad incident\" rules. Without skills, a loop re-derives your whole project from zero on every cycle. With them, the knowledge compounds. The tight, boring description matters more than clever instructions, because that description is what tells the agent when the skill applies.",[916,974,976],{"id":975},"plugins-and-connectors-let-the-loop-touch-your-real-tools","Plugins and connectors: let the loop touch your real tools",[874,978,979],{},"A loop that can only see the filesystem is a tiny loop. Connectors built on MCP (the Model Context Protocol) let the agent read your issue tracker, query a database, hit a staging API, or drop a message in Slack. Plugins are how you bundle skills and connectors together so a teammate installs your whole setup in one go. This is the difference between an agent that says \"here is the fix\" and a loop that opens the PR, links the ticket, and pings the channel once CI is green, by itself.",[916,981,983],{"id":982},"sub-agents-keep-the-maker-away-from-the-checker","Sub-agents: keep the maker away from the checker",[874,985,986,987,990],{},"The single most useful structural move in a loop is splitting the agent that writes the code from the one that checks it. The model that wrote something is far too generous grading its own homework. In Claude Code you define a subagent as a Markdown file with frontmatter under ",[924,988,989],{},".claude\u002Fagents\u002F",":",[992,993,998],"pre",{"className":994,"code":995,"language":996,"meta":997,"style":997},"language-markdown shiki shiki-themes github-dark github-dark","---\nname: spec-reviewer\ndescription: Reviews a diff against the project spec and tests. Read-only.\ntools: Read, Glob, Grep\nmodel: sonnet\n---\n\nYou are a reviewer. Check the change against the existing tests and the\nconventions in our skills. Report what is wrong; do not fix it yourself.\n","markdown","",[924,999,1000,1008,1021,1031,1041,1051,1055,1060,1065],{"__ignoreMap":997},[1001,1002,1004],"span",{"class":1003,"line":182},"line",[1001,1005,1007],{"class":1006},"suv1-","---\n",[1001,1009,1010,1014,1017],{"class":1003,"line":277},[1001,1011,1013],{"class":1012},"sxg3X","name",[1001,1015,1016],{"class":1006},": ",[1001,1018,1020],{"class":1019},"s4wv1","spec-reviewer\n",[1001,1022,1023,1026,1028],{"class":1003,"line":389},[1001,1024,1025],{"class":1012},"description",[1001,1027,1016],{"class":1006},[1001,1029,1030],{"class":1019},"Reviews a diff against the project spec and tests. Read-only.\n",[1001,1032,1033,1036,1038],{"class":1003,"line":149},[1001,1034,1035],{"class":1012},"tools",[1001,1037,1016],{"class":1006},[1001,1039,1040],{"class":1019},"Read, Glob, Grep\n",[1001,1042,1043,1046,1048],{"class":1003,"line":292},[1001,1044,1045],{"class":1012},"model",[1001,1047,1016],{"class":1006},[1001,1049,1050],{"class":1019},"sonnet\n",[1001,1052,1053],{"class":1003,"line":246},[1001,1054,1007],{"class":1006},[1001,1056,1057],{"class":1003,"line":40},[1001,1058,1059],{"emptyLinePlaceholder":11},"\n",[1001,1061,1062],{"class":1003,"line":131},[1001,1063,1064],{"class":1006},"You are a reviewer. Check the change against the existing tests and the\n",[1001,1066,1067],{"class":1003,"line":13},[1001,1068,1069],{"class":1006},"conventions in our skills. Report what is wrong; do not fix it yourself.\n",[874,1071,1072],{},"The pattern I keep reaching for is one agent explores, one implements, and a different one verifies. That split is not a built-in feature with a fancy name, it is just how you wire the agents up. Subagents do cost more tokens, since each one runs its own model and tools, so spend them where a second opinion actually earns its keep.",[916,1074,1076],{"id":1075},"memory-the-agent-forgets-the-repo-does-not","Memory: the agent forgets, the repo does not",[874,1078,1079],{},"The sixth piece is the one that sounds too dumb to matter: a place to write down what is done and what is next, outside the conversation. A Markdown state file, a checklist in the repo, an issue tracker board, anything durable. The model forgets everything between runs, so the memory has to live on disk, not in the context window. This is the spine of any loop that runs more than once.",[884,1081,1083,1084,1086,1087],{"id":1082},"the-two-primitives-loop-versus-goal","The two primitives: ",[924,1085,926],{}," versus ",[924,1088,1089],{},"\u002Fgoal",[874,1091,1092],{},"Two in-session commands do most of the work, and the difference between them is the whole point.",[874,1094,1095,1097,1098,1102],{},[924,1096,926],{}," re-runs a prompt or command on a ",[1099,1100,1101],"strong",{},"cadence",". Give it an interval and a prompt and it schedules the job:",[992,1104,1108],{"className":1105,"code":1106,"language":1107,"meta":997,"style":997},"language-bash shiki shiki-themes github-dark github-dark","# fixed interval\n\u002Floop 5m check if the deploy finished and tell me what happened\n\n# omit the interval and Claude self-paces between 1 minute and 1 hour,\n# waiting longer when nothing is happening\n\u002Floop check whether CI passed and address any review comments\n\n# re-run a saved slash command each iteration\n\u002Floop 20m \u002Freview-pr 1234\n","bash",[924,1109,1110,1116,1154,1158,1163,1168,1197,1201,1206],{"__ignoreMap":997},[1001,1111,1112],{"class":1003,"line":182},[1001,1113,1115],{"class":1114},"sJ8bj","# fixed interval\n",[1001,1117,1118,1121,1124,1127,1130,1133,1136,1139,1142,1145,1148,1151],{"class":1003,"line":277},[1001,1119,926],{"class":1120},"sFR8T",[1001,1122,1123],{"class":1019}," 5m",[1001,1125,1126],{"class":1019}," check",[1001,1128,1129],{"class":1019}," if",[1001,1131,1132],{"class":1019}," the",[1001,1134,1135],{"class":1019}," deploy",[1001,1137,1138],{"class":1019}," finished",[1001,1140,1141],{"class":1019}," and",[1001,1143,1144],{"class":1019}," tell",[1001,1146,1147],{"class":1019}," me",[1001,1149,1150],{"class":1019}," what",[1001,1152,1153],{"class":1019}," happened\n",[1001,1155,1156],{"class":1003,"line":389},[1001,1157,1059],{"emptyLinePlaceholder":11},[1001,1159,1160],{"class":1003,"line":149},[1001,1161,1162],{"class":1114},"# omit the interval and Claude self-paces between 1 minute and 1 hour,\n",[1001,1164,1165],{"class":1003,"line":292},[1001,1166,1167],{"class":1114},"# waiting longer when nothing is happening\n",[1001,1169,1170,1172,1174,1177,1180,1183,1185,1188,1191,1194],{"class":1003,"line":246},[1001,1171,926],{"class":1120},[1001,1173,1126],{"class":1019},[1001,1175,1176],{"class":1019}," whether",[1001,1178,1179],{"class":1019}," CI",[1001,1181,1182],{"class":1019}," passed",[1001,1184,1141],{"class":1019},[1001,1186,1187],{"class":1019}," address",[1001,1189,1190],{"class":1019}," any",[1001,1192,1193],{"class":1019}," review",[1001,1195,1196],{"class":1019}," comments\n",[1001,1198,1199],{"class":1003,"line":40},[1001,1200,1059],{"emptyLinePlaceholder":11},[1001,1202,1203],{"class":1003,"line":131},[1001,1204,1205],{"class":1114},"# re-run a saved slash command each iteration\n",[1001,1207,1208,1210,1213,1216],{"class":1003,"line":13},[1001,1209,926],{"class":1120},[1001,1211,1212],{"class":1019}," 20m",[1001,1214,1215],{"class":1019}," \u002Freview-pr",[1001,1217,1219],{"class":1218},"s8ozJ"," 1234\n",[874,1221,1222,1223,1225,1226,1229,1230,1233,1234,1237,1238,1241],{},"A bare ",[924,1224,926],{}," runs a built-in maintenance prompt (continue unfinished work, tend the current PR, run cleanup passes). You can replace that with your own default by dropping a ",[924,1227,1228],{},".claude\u002Floop.md"," in the project or ",[924,1231,1232],{},"~\u002F.claude\u002Floop.md"," for all projects. Press ",[924,1235,1236],{},"Esc"," to stop a loop while it waits for the next iteration. A few guardrails apply: recurring tasks expire after 7 days, a session holds at most 50 scheduled tasks, and tasks are session-scoped, so they live in the current conversation and are restored only if you reopen it with ",[924,1239,1240],{},"--resume",".",[874,1243,1244,1246],{},[924,1245,1089],{}," is the one closer to the recursive-goal idea. Instead of a clock, it runs until a condition you wrote is actually true:",[992,1248,1250],{"className":1105,"code":1249,"language":1107,"meta":997,"style":997},"\u002Fgoal all tests in test\u002Fauth pass and the linter is clean\n",[924,1251,1252],{"__ignoreMap":997},[1001,1253,1254,1256,1259,1262,1265,1268,1271,1273,1275,1278,1281],{"class":1003,"line":182},[1001,1255,1089],{"class":1120},[1001,1257,1258],{"class":1019}," all",[1001,1260,1261],{"class":1019}," tests",[1001,1263,1264],{"class":1019}," in",[1001,1266,1267],{"class":1019}," test\u002Fauth",[1001,1269,1270],{"class":1019}," pass",[1001,1272,1141],{"class":1019},[1001,1274,1132],{"class":1019},[1001,1276,1277],{"class":1019}," linter",[1001,1279,1280],{"class":1019}," is",[1001,1282,1283],{"class":1019}," clean\n",[874,1285,1286],{},"After every turn, a separate, smaller model reads the condition and the conversation and returns a yes-or-no plus a short reason for the next turn. The agent that wrote the code is not the one deciding whether it is done. That is the maker\u002Fchecker split applied to the stop condition itself, and it is why you can actually walk away.",[874,1288,1289,1290,1292,1293,1295],{},"So: ",[924,1291,926],{}," for \"keep checking on this,\" ",[924,1294,1089],{}," for \"keep working until this is true.\" When you need it to survive a closed laptop, push the whole thing to GitHub Actions instead.",[884,1297,1299],{"id":1298},"what-one-loop-actually-looks-like","What one loop actually looks like",[874,1301,1302],{},"This is the shape I keep coming back to, stitched together from the pieces above.",[874,1304,1305],{},"A scheduled run fires on the repo every morning. Its prompt calls a triage skill that reads yesterday's CI failures, the open issues, and the recent commits, and writes the findings into a state file:",[992,1307,1310],{"className":994,"code":1308,"language":996,"meta":1309,"style":997},"Read the latest CI runs, open issues labeled `bug`, and commits since the\nlast entry in `notes\u002Ftriage.md`. For each problem worth fixing:\n\n1. Open an isolated worktree and send a subagent to draft a minimal fix.\n2. Send a second subagent to review that draft against our skills and the\n   existing tests. It must not edit the code, only report.\n3. If the review passes and CI is green, open a PR and link the issue.\n4. If anything is unsure or risky, leave it in `notes\u002Ftriage.md` for me.\n\nAppend what you tried, what passed, and what is still open to\n`notes\u002Ftriage.md` so tomorrow's run picks up where this one stopped.\n","title=\".claude\u002Floop.md\"",[924,1311,1312,1323,1334,1338,1347,1355,1360,1368,1381,1385,1390],{"__ignoreMap":997},[1001,1313,1314,1317,1320],{"class":1003,"line":182},[1001,1315,1316],{"class":1006},"Read the latest CI runs, open issues labeled ",[1001,1318,1319],{"class":1218},"`bug`",[1001,1321,1322],{"class":1006},", and commits since the\n",[1001,1324,1325,1328,1331],{"class":1003,"line":277},[1001,1326,1327],{"class":1006},"last entry in ",[1001,1329,1330],{"class":1218},"`notes\u002Ftriage.md`",[1001,1332,1333],{"class":1006},". For each problem worth fixing:\n",[1001,1335,1336],{"class":1003,"line":389},[1001,1337,1059],{"emptyLinePlaceholder":11},[1001,1339,1340,1344],{"class":1003,"line":149},[1001,1341,1343],{"class":1342},"s-3mD","1.",[1001,1345,1346],{"class":1006}," Open an isolated worktree and send a subagent to draft a minimal fix.\n",[1001,1348,1349,1352],{"class":1003,"line":292},[1001,1350,1351],{"class":1342},"2.",[1001,1353,1354],{"class":1006}," Send a second subagent to review that draft against our skills and the\n",[1001,1356,1357],{"class":1003,"line":246},[1001,1358,1359],{"class":1006},"   existing tests. It must not edit the code, only report.\n",[1001,1361,1362,1365],{"class":1003,"line":40},[1001,1363,1364],{"class":1342},"3.",[1001,1366,1367],{"class":1006}," If the review passes and CI is green, open a PR and link the issue.\n",[1001,1369,1370,1373,1376,1378],{"class":1003,"line":131},[1001,1371,1372],{"class":1342},"4.",[1001,1374,1375],{"class":1006}," If anything is unsure or risky, leave it in ",[1001,1377,1330],{"class":1218},[1001,1379,1380],{"class":1006}," for me.\n",[1001,1382,1383],{"class":1003,"line":13},[1001,1384,1059],{"emptyLinePlaceholder":11},[1001,1386,1387],{"class":1003,"line":91},[1001,1388,1389],{"class":1006},"Append what you tried, what passed, and what is still open to\n",[1001,1391,1392,1394],{"class":1003,"line":10},[1001,1393,1330],{"class":1218},[1001,1395,1396],{"class":1006}," so tomorrow's run picks up where this one stopped.\n",[874,1398,1399],{},"Connectors open the PR and update the ticket. Anything the loop cannot handle safely lands in the notes file for me to look at. The state file is the part that makes it a loop and not a one-off, because tomorrow's run reads where today's stopped.",[874,1401,1402,1403,1405,1406,1408],{},"Look at what you actually did there: you designed it once, and you prompted none of those individual steps. That is the pitch in one example, and it works the same way whether you run it through ",[924,1404,926],{},", a ",[924,1407,1089],{},", or a GitHub Action.",[884,1410,1412],{"id":1411},"when-to-reach-for-a-loop-and-when-not","When to reach for a loop, and when not",[874,1414,1415],{},"A loop earns its place when the work is repetitive, the trigger is clear, and there is a real signal for \"done\" that something other than the maker can check. Babysitting a deploy or a PR, triaging CI failures every morning, grinding a test suite to green, hunting a class of bug across a codebase: good fits, because each one has an automatic way to know it worked.",[874,1417,1418],{},"A loop is the wrong tool when the goal is fuzzy and there is no verifier, when the action is irreversible and there is no human gate in front of it, or when the task is genuinely one-shot and a loop is just ceremony around a single prompt. If you cannot write the condition that means \"done,\" you are not ready to write the loop yet.",[874,1420,1421],{},"When you do build one, ramp it. Start in report-only mode, where the loop tells you what it would do. Move to assisted, where it drafts changes you approve. Only then let it run unattended, and even then keep a gate in front of anything you cannot undo.",[884,1423,1425],{"id":1424},"the-subscription-reality","The subscription reality",[874,1427,1428],{},"If you are on a Claude Code plan rather than paying per token, loops change your usage math, and not always gently. Osmani's own caveat is the right one to keep in mind: outcomes differ wildly between the token rich and the token poor.",[874,1430,1431,1432,1434,1435,1437,1438,1441,1442,1444,1445,1241],{},"A few things to watch. Sub-agents multiply spend, because each one runs its own model and tool calls, so a three-agent explore\u002Fimplement\u002Fverify loop costs roughly three times a single pass. A tight fixed interval burns tokens even when nothing is happening, so prefer a self-paced ",[924,1433,926],{}," (or ",[924,1436,1089],{},", which only runs when there is a turn to take) over ",[924,1439,1440],{},"\u002Floop 1m"," on a quiet repo. Remember that ",[924,1443,926],{}," needs the session open and idle to fire and does not catch up on missed runs, so a babysat terminal is not the same thing as durable scheduling. Anything that genuinely needs to run while you sleep belongs in GitHub Actions, not a window you have to leave open. And treat the 7-day expiry as a feature: it bounds how long a forgotten loop can quietly run up your usage. When in doubt, start in report-only mode, where the loop reads a lot and writes almost nothing. For more on keeping spend sane, see ",[903,1446,1447],{"href":905},"Getting More Out of Claude Code",[884,1449,1451],{"id":1450},"stay-the-engineer","Stay the engineer",[874,1453,1454],{},"The loop changes the work; it does not delete you from it. Three problems actually get sharper as the loop gets better, not easier.",[874,1456,1457],{},"Verification is still on you. A loop running unattended is also a loop making mistakes unattended, and \"done\" is a claim, not a proof. That separate verifier is what makes the claim mean something, which is the entire reason to bother with it.",[874,1459,1460],{},"Your understanding rots if you let it. The faster a loop ships code you did not write, the wider the gap between what exists and what you actually grasp. A smooth loop just grows that gap faster unless you read what it made.",[874,1462,1463],{},"And the comfortable posture is the dangerous one. When the loop runs itself, it is tempting to stop having an opinion and take whatever comes back. The same loop, in two different hands, produces opposite results: one person uses it to move faster on work they understand deeply, the other uses it to avoid understanding the work at all. The loop cannot tell the difference. You can.",[1465,1466,1468],"note",{"label":1467},"The short version",[874,1469,1470,1471,1473,1474,1476],{},"Loop engineering is designing the system that prompts the agent instead of prompting it yourself. Claude Code already ships the pieces: ",[924,1472,926],{}," and ",[924,1475,1089],{}," for the heartbeat, worktrees for isolation, skills for knowledge, MCP connectors for reach, sub-agents for a maker and a separate checker, and a state file for memory. Reach for it on repetitive work with a verifiable \"done,\" start in report-only mode, watch your token spend, and build the loop like someone who intends to stay the engineer, not just the person who presses go.",[1478,1479,1480],"style",{},"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 .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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .s-3mD, html code.shiki .s-3mD{--shiki-default:#FFAB70;--shiki-dark:#FFAB70}",{"title":997,"searchDepth":277,"depth":277,"links":1482},[1483,1484,1492,1494,1495,1496,1497],{"id":886,"depth":277,"text":887},{"id":910,"depth":277,"text":911,"children":1485},[1486,1487,1488,1489,1490,1491],{"id":918,"depth":389,"text":919},{"id":948,"depth":389,"text":949},{"id":955,"depth":389,"text":956},{"id":975,"depth":389,"text":976},{"id":982,"depth":389,"text":983},{"id":1075,"depth":389,"text":1076},{"id":1082,"depth":277,"text":1493},"The two primitives: \u002Floop versus \u002Fgoal",{"id":1298,"depth":277,"text":1299},{"id":1411,"depth":277,"text":1412},{"id":1424,"depth":277,"text":1425},{"id":1450,"depth":277,"text":1451},{"id":13,"name":14,"slug":15,"hue":16},"md",{},{"title":6,"description":876},"posts\u002Floop-engineering-in-claude-code",[20,23,26,29,32],[1505,1506,1507,1508,1509],{"name":19,"slug":20},{"name":22,"slug":23},{"name":25,"slug":26},{"name":28,"slug":29},{"name":31,"slug":32},"eDvEvzbZwgVZXd_eOUZVLoOrHHjrdcidZGD3kjUl2X0",1781699138899]