# Frank Perez — Writing > Field notes on building software: practical developer write-ups on PHP, Python, JavaScript, HTML & CSS, Git, Flutter, Rust, AWS, and AI coding tools. ## Documentation Sets - [Frank Perez — Writing (full content)](https://franktheprogrammer.com/llms-full.txt): The complete text of every article. ## Articles All articles, newest first. - [Using Anonymous Classes in PHP](https://franktheprogrammer.com/raw/posts/anonymous-classes-php.md): 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, by allowing you to create quick implementations of your interfaces. - [Babel Installation and Configuration](https://franktheprogrammer.com/raw/posts/babel-installation-and-configuration.md): 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. - [BEM Methodology Overview and Naming Conventions](https://franktheprogrammer.com/raw/posts/bem-methodology-overview-and-naming-conventions.md): 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. For a more detailed look into BEM, feel free to read through the official BEM documentation. - [Build a QR Code Lambda and Call It From Laravel](https://franktheprogrammer.com/raw/posts/build-a-qr-code-lambda-and-call-it-from-laravel.md): You do not need to know Python, and you do not even need an AWS account, to follow this. We are going to build one small, fun thing: a function that turns text into a QR code, run it on your own machine inside Docker, and call it from a Laravel app. I will explain the Python as we go, because if you write PHP, the ideas all rhyme. When you are ready to put it on AWS for real, the next part handles that. - [Claude Code Hooks, by Example](https://franktheprogrammer.com/raw/posts/claude-code-hooks-by-example.md): Some instructions are too important to leave to a model's good intentions. "Install the dependencies before you run anything." "Never commit to main." "Run the formatter after every edit." You can put these in CLAUDE.md and Claude Code will usually follow them, but usually is not always, and for the things that genuinely have to happen, usually is not good enough. - [Configuring Gulp On A New Project](https://franktheprogrammer.com/raw/posts/configuring-gulp-on-a-new-project.md): In this example, we'll go through configuring gulp for a new project. We'll be using yarn as the dependency manager. If you are not familiar with yarn, please refer to my tutorial for setting it up. - [Configuring Gulp With Less CSS Pre-Processor](https://franktheprogrammer.com/raw/posts/configuring-gulp-with-less-css-pre-processor.md): Less is a CSS pre-processor allowing you to create variables, mixins, and functions in an effort to make your CSS more maintainable. In this article, we'll discuss the process of getting less configured with gulp so that you can start using this CSS pre-processor today within your own projects. - [Configuring Stylus CSS Pre-Processor with Gulp and Sourcemaps](https://franktheprogrammer.com/raw/posts/configuring-stylus-css-pre-processor-with-gulp-and-sourcemaps.md): In this article we'll go over how to configure your project to process Stylus files using Gulp. We'll also create a source map file which your browser will use to help point you in the right direction of your files when developing. - [Creating Configuration Files In Stylus](https://franktheprogrammer.com/raw/posts/creating-configuration-files-in-stylus-css-pre-processor.md) - [Deploy a Lambda Container Image With ECR and the Console](https://franktheprogrammer.com/raw/posts/deploy-a-lambda-container-image-with-ecr-and-the-console.md): In the previous part we built a QR code Lambda, ran it locally in Docker, and called it from Laravel, all without an AWS account. Now we put it online. This part is mostly clicking through the AWS Console, with a couple of Docker commands you have already run. You will need an AWS account, the AWS CLI configured (aws configure), and Docker running with the qr-generator image you built last time. - [Filtering Arrays Without Using Loops in PHP](https://franktheprogrammer.com/raw/posts/filtering-arrays-without-using-loops-in-php.md): Have you ever had the need to filter through an existing array and create a new array based on your filter for your application to process? I'm sure the majority of you have, and personally I find it a bit tedious having to create a loop each time I need to filter through the data I need. - [Flutter Version Management](https://franktheprogrammer.com/raw/posts/flutter-version-management-fvm.md): As you dive deep into Flutter you'll probably start to wonder how you can juggle multiple versions of Flutter per project. This is where FVM (Flutter Version Management) helps. Its purpose is managing different Flutter versions, allowing you to set specific versions for each of your projects. - [Getting More Out of Claude Code: Prompting and Token Economy](https://franktheprogrammer.com/raw/posts/getting-more-out-of-claude-code.md): For months my Claude Code setup was one reflex: whatever the newest Opus is, pinned to max effort, on everything. Renaming a variable? Max effort. Reading a config file? Max effort. It felt responsible. Then I read the docs and watched my own /usage numbers, and changed my mind. Max effort is a great tool and a terrible default. - [Git Flow vs GitHub Flow: Choosing a Branching Strategy for Your Team](https://franktheprogrammer.com/raw/posts/git-flow-vs-github-flow-choosing-a-branching-strategy.md): There's no single "right" way to branch your code. Git Flow, GitHub Flow, and trunk-based development are all popular, all battle tested, and all used by teams shipping great software every day. The trick isn't picking the "best" one, it's picking the one that matches how your team actually releases. In this article we'll compare the two big names, see where trunk-based development fits in, and sort out how to handle versioned releases along with the fixes that inevitably follow. - [Git: Tracking a Remote Branch for Changes](https://franktheprogrammer.com/raw/posts/git-tracking-a-remote-branch-upstream-for-changes.md): Sometimes you need to track a remote branch for changes, typically the original project you forked from, conventionally named upstream. Say you are on a team where you forked a project and have your own copy. Before you open a pull request, you want to pull in any changes from the originating repository so your work sits on top of the latest code. Here is how to set that up and keep it in sync. - [GitHub Flow: Keep Your Main Branch Deployable](https://franktheprogrammer.com/raw/posts/github-flow-keep-your-main-branch-deployable.md): If Git Flow is the structured, ceremony-heavy end of the branching spectrum, GitHub Flow is the opposite. It throws out the long-lived branches and release windows and runs on one rule: anything in main is deployable. Everything else follows from that. If you want the head to head, I wrote a Git Flow vs GitHub Flow comparison; this post is the hands-on deep dive into GitHub Flow itself. - [Give Your Lambda an HTTP Front Door](https://franktheprogrammer.com/raw/posts/give-your-lambda-an-http-front-door.md): In part one we packaged a Python thumbnailer as a container image, pushed it to ECR, and invoked it directly. Direct invocation is perfect for internal tools and event-driven work, but it needs AWS credentials and request signing on every call, so it is not how a browser, a webhook, or a third party reaches your function. For that you want a plain HTTPS endpoint. Lambda gives you two front doors, and knowing which to pick (and when you need neither) is most of the battle. - [Gulp Watch: Automate Your Gulp Tasks](https://franktheprogrammer.com/raw/posts/gulp-watch-automate-your-gulp-tasks.md): In this article, we'll go over how to automate your gulp tasks. If you're interested in how to configure and use gulp reference this article below. - [How to Build a Claude Code Plugin](https://franktheprogrammer.com/raw/posts/how-to-build-a-claude-code-plugin.md): Once you have used Claude Code for a while you start to collect rituals: the way you phrase a commit, the checklist you paste before a release, the prompt you keep re-typing to summarize what changed. A plugin is how you bottle those rituals up and hand them to the rest of your team, or to yourself on a different machine, without copy and paste. - [Improve Your Git Workflow with Git Flow](https://franktheprogrammer.com/raw/posts/improve-your-git-workflow-with-git-flow.md): Git Flow is a development workflow for keeping branching consistent across a team. It was the workflow everyone copied for years, and it is still a great fit for certain kinds of projects. In this article I will walk through the branches it uses, show a hands-on example of features, releases and hotfixes, and give you an honest read on when to reach for it. - [Interpolation in Stylus](https://franktheprogrammer.com/raw/posts/interpolation-in-stylus-css-pre-processor.md) - [Introduction to ECMAScript 6](https://franktheprogrammer.com/raw/posts/introduction-to-ecmascript-6.md): 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. - [JavaScript's map, filter, and reduce methods](https://franktheprogrammer.com/raw/posts/javascript-array-map-filter-reduce-functions.md): 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. - [Learning Stylus: A CSS Pre-Processor](https://franktheprogrammer.com/raw/posts/learning-stylus-a-css-pre-processor.md): How the content is displayed for 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. - [llms.txt, and who actually reads it](https://franktheprogrammer.com/raw/posts/llms-txt-and-who-actually-reads-it.md): llms.txt is a single Markdown file you drop at the root of your site, /llms.txt, that hands a language model a curated map of your content. It takes an afternoon to add and almost nothing can go wrong. What most write-ups skip is that in 2026 barely anything reads it. The one payoff that holds up is the one it was designed for: feeding documentation to coding agents. This blog ships one, so I want to walk through what it is, how to add it, and where it helps versus where it is wishful thinking. - [Loop Engineering in Claude Code: Designing the System That Prompts the Agent](https://franktheprogrammer.com/raw/posts/loop-engineering-in-claude-code.md): 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." - [Orchestrating Lambdas with Step Functions](https://franktheprogrammer.com/raw/posts/orchestrating-lambdas-with-step-functions.md): Across part one and part two we built a containerized thumbnailer and gave it an HTTP front door. One function behind one endpoint goes a long way. This finale is about the moment it stops being enough, when the work becomes several steps with retries, branching, and things running in parallel, and whether AWS Step Functions are the right answer. Sometimes they are not, and I will be honest about that before we build one. - [Package a Python Lambda as a Docker Image](https://franktheprogrammer.com/raw/posts/package-a-python-lambda-as-a-docker-image.md): AWS Lambda has a reputation for being all about little zip files, but it has supported Docker container images since 2020, and for a lot of real work they are the better fit. In this series we will build a small but genuinely useful Python function, a thumbnail generator, and take it from a Dockerfile all the way to something you can call over HTTP and even orchestrate into a workflow. This first part is the foundation: package the function as an image, pick an architecture, run it locally, push it to ECR, and invoke it directly. - [Using PHP's array_map to format your arrays without loops](https://franktheprogrammer.com/raw/posts/php-array-map-to-format-your-arrays-without-loops.md): 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. The CSV's first row contains the headers for each column of the CSV. How can we setup a new array with each key of being the name of the header field and the corresponding values assigned to them without using loops? I'll show you. - [PHP's array_reduce is not only for outputting single values](https://franktheprogrammer.com/raw/posts/php-array-reduce.md): Sometimes we need to partition our data, which can be done in many ways. In this article I'll show you how to do this using PHP's array_reduce function. - [FizzBuzz in PHP: A Fresh Approach](https://franktheprogrammer.com/raw/posts/php-fizzbuzz-example.md): A popular question asked during interviews is to apply the FizzBuzz logic to a range of numbers. This normally means the following: - [PHP Group Multiple use Declarations](https://franktheprogrammer.com/raw/posts/php-group-multiple-use-declarations.md): As of PHP 7, you can now group your imported classes, functions, and constants from under the same namespace. Let's look at an example to show you how you can start using this today in your projects. - [PHP Null Coalescing Operator](https://franktheprogrammer.com/raw/posts/php-null-coalescing-operator.md): 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. - [PHP Spaceship Operator](https://franktheprogrammer.com/raw/posts/php-spaceship-operator.md): 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. - [Python for PHP Developers](https://franktheprogrammer.com/raw/posts/python-for-php-developers.md): If you write modern PHP, you already think in the right shapes: types, classes, enums, match, named arguments, immutability. Python has all of those too, it just spells them differently, with indentation instead of braces and snake_case instead of camelCase. This guide maps what you know onto Python so you can start reading and writing it quickly, without relearning how to program. If you followed my AWS Lambda series, those handlers were Python; this is the language behind them. - [Return Type Declarations in PHP](https://franktheprogrammer.com/raw/posts/return-type-declarations-in-php.md): 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. - [Scalar Type Hints in PHP](https://franktheprogrammer.com/raw/posts/scalar-type-hints-php.md): 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 access to the following list. - [Setting Up CocoaPods for FVM-managed Flutter Projects](https://franktheprogrammer.com/raw/posts/setting-up-cocoapods-fvm.md): When working with Flutter and managing different versions using FVM, setting up CocoaPods can present a challenge. This guide provides a straightforward approach to installing CocoaPods for a specific Flutter version managed by FVM. - [Setting Variables in Stylus](https://franktheprogrammer.com/raw/posts/setting-variables-in-stylus-css-pre-processor.md) - [Setting Visibility for Your Class Constants in PHP](https://franktheprogrammer.com/raw/posts/setting-visibility-for-your-class-constants-in-php.md): 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. Any constants within your class set to protected or private that you try to access directly outside of the class will throw a Fatal Error. - [SOLID Principles in PHP](https://franktheprogrammer.com/raw/posts/solid-principles-in-php.md): 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. - [SOLID Principles in Modern PHP](https://franktheprogrammer.com/raw/posts/solid-principles-modern-php.md): SOLID is a set of five object-oriented design principles, popularized by Robert C. Martin, that help you write code that is easier to extend, test, and maintain. The ideas have not changed in years. PHP, on the other hand, has changed enormously. When I first wrote about SOLID in 2016, expressing these principles took a lot of ceremony: manual property assignment, no real enums, getters and setters everywhere. PHP 8.5 strips most of that away, so the principles shine through with far less code. Let's walk through all five with modern PHP. - [Starting with Rust: From Installation to Your First Program](https://franktheprogrammer.com/raw/posts/starting-with-rust-installation-first-program.md): This guide will walk you through installing Rust and writing your first "Hello, world!" program. By the end, you'll have a foundational understanding of the Rust toolchain and the Cargo.toml file's significance. - [Structuring Your Website With HTML 5 Semantics](https://franktheprogrammer.com/raw/posts/structuring-your-website-with-html-5-semantics.md): 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. - [Support for keys in list(), or its new shorthand syntax [] in PHP](https://franktheprogrammer.com/raw/posts/support-for-keys-in-list-or-its-new-shorthand-syntax-in-php.md): 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. - [Symmetric Array Destructuring in PHP](https://franktheprogrammer.com/raw/posts/symmetric-array-destructuring-in-php.md): 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. - [The grill-me Skill for Claude Code](https://franktheprogrammer.com/raw/posts/the-grill-me-skill-for-claude-code.md): You have probably hit this one. You type a paragraph describing some feature, Claude reads it, and half a minute later it is off building. The thing it builds answers the prompt you wrote, not the thing you actually had in mind. The requirements were fuzzy in your head, so they came out fuzzy on the keyboard, and the model just filled the gaps with reasonable-looking guesses. - [Troubleshooting Xcode 15 Build Issues in Flutter Projects](https://franktheprogrammer.com/raw/posts/troubleshooting-xcode-15-build-issues-flutter.md): Updating to Xcode 15 brought a few hurdles in my Flutter project, especially since I was using an older version of CocoaPods, below version 1.13. Here's a breakdown of how I navigated through these issues and got my project back on track. - [Type Hinting Callable Functions in PHP](https://franktheprogrammer.com/raw/posts/type-hinting-callable-functions-in-php.md): 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. - [Type Hinting with Nullable Types in PHP](https://franktheprogrammer.com/raw/posts/type-hinting-with-nullable-types-in-php.md): 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. - [Type Hinting With The Iterable pseudo-type In PHP](https://franktheprogrammer.com/raw/posts/type-hinting-with-the-iterable-pseudo-type-in-php.md): As of PHP 7.1, you can now type hint your method/function arguments with the keyword iterable for handling arrays or even objects that implement the Traversable interface. - [Using Browser Sync with Gulp for Live Reloading](https://franktheprogrammer.com/raw/posts/using-browser-sync-with-gulp-for-live-reloading.md): 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/sync when it sees those changes made. - [Using CSS Transitions](https://franktheprogrammer.com/raw/posts/using-css-transitions.md): 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. - [Using Functions and Mixins with Stylus](https://franktheprogrammer.com/raw/posts/using-functions-and-mixins-with-stylus-css-pre-processor.md) - [Using Selectors in Stylus](https://franktheprogrammer.com/raw/posts/using-selectors-in-stylus-css-pre-processor.md) - [Void Return Types in PHP](https://franktheprogrammer.com/raw/posts/void-return-types-in-php.md): 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. - [What's New in PHP 8.0](https://franktheprogrammer.com/raw/posts/whats-new-in-php-8-0.md): PHP 8.0 landed on 26 November 2020, and unlike the 7.x line it really earned the major version bump. It is the release that brought the JIT compiler, but the changes you actually feel day to day are the language features: less boilerplate, stricter types, and a handful of constructs that make everyday code read better. Let's walk through the ones I reach for most. - [What's New in PHP 8.1](https://franktheprogrammer.com/raw/posts/whats-new-in-php-8-1.md): PHP 8.1 arrived on 25 November 2021, and it is the release that turned a lot of skeptics into fans. After 8.0 modernized the syntax, 8.1 filled in the features people had been faking for years: real enums, properties you cannot mutate, and a proper concurrency primitive. Here are the ones worth knowing. - [What's New in PHP 8.2](https://franktheprogrammer.com/raw/posts/whats-new-in-php-8-2.md): PHP 8.2 shipped on 8 December 2022. It is a quieter release than 8.1, more about refinement than headline features, but the refinements are good ones: whole classes can be readonly, the type system gained new building blocks, and a couple of long-standing rough edges around traits and security finally got sanded down. Here is what stands out. - [What's New in PHP 8.3](https://franktheprogrammer.com/raw/posts/whats-new-in-php-8-3.md): PHP 8.3 was released on 23 November 2023. There is no single blockbuster feature here, but it is a deeply practical release: it closes gaps in the type system, adds tooling that catches real mistakes, and ships a few standard-library functions you will wonder how you lived without. Here are the highlights. - [What's New in PHP 8.4](https://franktheprogrammer.com/raw/posts/whats-new-in-php-8-4.md): PHP 8.4 landed on 21 November 2024, and it carries the most significant syntax change since enums: property hooks. Alongside it came asymmetric visibility, a cleaner way to chain off new, some array functions people had been requesting for a decade, and a brand-new HTML5 DOM parser. This is a big one. - [What's New in PHP 8.5](https://franktheprogrammer.com/raw/posts/whats-new-in-php-8-5.md): PHP 8.5 was released on 20 November 2025, closing out a remarkable run of yearly releases. Where 8.4 was about how you design classes, 8.5 is about how you compose and use them: a pipe operator for chaining, a clean way to clone-with-changes, and a built-in URI parser, among others. Here is the tour, and the end of our series. - [Yarn: Fast and Secure Dependency Management](https://franktheprogrammer.com/raw/posts/yarn-fast-and-secure-dependency-management.md): Yarn is a super simple dependency management tool which acts as a drop-in replacement for npm, so you can get started using it right away. The best way to install yarn is by using npm. That's right, you use npm to install yarn, npm's replacement essentially, how fun is that! - [Yarn: Publishing a Package](https://franktheprogrammer.com/raw/posts/yarn-publishing-a-package.md): 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.