RSSAmplifier

Blog

Posts - Scott Robinson · @ssxio

I'm a software developer located in Staffordshire, United Kingdom specialising in PHP, Laravel and APIs. I love open source, data and sharing the things I learn.

dor.kyRSS feed ↗305 posts

Latest posts

Magento 2 missing bin/magento, lib, dev and setup directories

If you’ve ever pulled a Magento 2 project and found bin/magento , lib/ , dev/ or setup/ simply aren’t there, you’re not going crazy - those directories are deployed out of the magento/magento2-base package by Composer rather than living in the repo. When that deploy step doesn’t run, or runs partially, the files never land and you’re left staring at a project that looks half-installed. The fix In…

Bypassing a Chrome Security Warning From the DevTools Console

If you do any local development against HTTPS you’ll eventually hit Chrome’s NET::ERR_CERT_AUTHORITY_INVALID interstitial - the full-page “Your connection is not private” warning. Usually there’s an “Advanced” link that lets you proceed anyway, but on certain certificate errors (HSTS, some ERR_CERT_* variants) that link is missing entirely, leaving you with no obvious way through. The well-known…

Fixing Klevu Stock Status with Magento MSI Multi-Source Inventory

If you’re running Klevu alongside Magento’s Multi-Source Inventory (MSI) and products are showing the wrong stock status in your Klevu index, the cause turned out to be fairly subtle - and the fix is a single config setting. The problem Products that were genuinely in stock were being indexed as out of stock (or the reverse) in Klevu. The Magento storefront showed the correct status, but Klevu…

How to Detect Service Versions on Adobe Commerce Cloud

Adobe Commerce Cloud manages your infrastructure services for you, but knowing exactly which versions of Valkey, MariaDB and RabbitMQ are running on your environments isn’t always obvious. The .magento/services.yaml file defines what you’ve requested, but that doesn’t always reflect what’s actually deployed - especially after platform upgrades or environment redeployments. Here’s how to check the…

Blocking SessionReaper and PolyShell File Access with Fastly on Magento/Adobe Commerce

If you’ve been keeping an eye on the Magento security space recently, you’ll have seen the research from Sansec around SessionReaper exploitation and the more recent PolyShell - both of which use the media/custom_options/ directory as a vector for uploading and executing malicious PHP files. The SessionReaper attack targets session data to extract customer and admin credentials, and the PolyShell…

Fixing Magento's Telephone Validation to Allow Dots and Slashes

Magento’s built-in telephone validation for customer accounts is fairly strict - it only allows digits, spaces, parentheses, plus signs and hyphens. That works for a lot of western formats but breaks for plenty of valid international phone numbers. French phone numbers are commonly written with dots as separators (e.g. 06.76.40.32.22 ), and Austrian numbers often use a forward slash (e.g.…

Creating URL Redirects When Updating Product URL Keys via the Magento API

If you’ve ever updated a product’s URL key via the Magento 2 REST API and then wondered why the old URL is now returning a 404, you’ve probably missed the url_key_create_redirect custom attribute. In the admin UI there’s a handy “Create Permanent Redirect for old URL” checkbox that appears when you change a product’s URL key. Behind the scenes, this sets url_key_create_redirect on the product -…

Fixing Broken Product Relationships in Adobe Commerce/Magento 2

I recently ran into a fairly puzzling issue on an Adobe Commerce site where some products were behaving oddly on the frontend. After some digging, it turned out the catalog_product_relation and catalog_product_super_link tables had invalid entries - simple products were listed as parents with child relationships, which should never happen. In Magento/Adobe Commerce, only configurable, bundle and…

Disable Chrome AI Mode in the Omnibox

If you want to disable the AI mode button that appears in Chrome’s omnibox/address bar then you can do so via Chrome flags. Navigate to: chrome://flags/#ai-mode-omnibox-entry-point Set the flag to Disabled and relaunch Chrome.

Claude Code - How to Revert Back to Opus 4.5 from Opus 4.6

If you want to go back to Opus 4.5, start hashtag#claude with: claude --model claude-opus-4-5-20251101 You can also edit your config file to set this as the default if you want to use it by default rather than 4.6.

Signing Git Commits with SSH

I recently ran into a “No signature” error when trying to get my git commits verified and it sent me down a bit of a rabbit hole. If you’ve ever tried to set up GPG signing for git commits, you’ll know it can be a fairly painful experience. As you can now sign git commits with SSH keys rather than GPG and given that pretty much everyone already has an SSH key (and pretty much no one has a GPG key…

Adobe Commerce Isolated Security Patches Changelog

Adobe have changed the way they usually release security patch updates for 2026, but sadly their communcations around the release leaves quite a bit to be desired. I’ll collate the release information here through the year and document what has/hasn’t been released as per the official release schedule . 13/01/2026: No patches released, confirmed by Nathan Smith via Slack . 10/02/2026: There was a…

Adobe Commerce Deployments Failing - Composer block-insecure in Effect for 2.7/2.8

If you’re running into this issue with Adobe Commerce deployments, it’s due to the older versions of composer now being marked as having a few security issues (“PKSA-1gck-s111-yq7g”, “PKSA-b8f7-zn44-r4gz”, “PKSA-s25b-vbmp-jvhh”): Installing build dependencies .. . Installing php build dependencies: composer/composer W: Changed current directory to /app/.global/composer/composer W: No composer.lock…

Nginx client_header_buffer_size - Debugging Cloudflare-related 400 Errors for Magento/Adobe Commerce HTTP Requests

One of the more interesting things I’ve had to debug this year was why Magento was apparently returning 400 responses to builder.io for certain webhook payloads. A few of the team had looked into this but drawn a bit of a blank so I offered to take a look and it ended up being a fairly puzzling one to debug. The same payload POST direct to a local running version of the application would give the…

Adobe Commerce/Magento 2 Concurrent Import Process Interference Issue

If you’re running multiple import processes simultaneously in Adobe Commerce or Magento 2, you might encounter a frustrating bug where the imports interfere with each other, causing data corruption or import failures. This issue, documented in GitHub issue #37593 , has been confirmed in Magento 2.4.6 but is present in other versions too namely 2.4.7. If two import processes run concurrently in…

How to List/Change/Activate Different Service Versions on Fastly for Adobe Commerce

There are times when you need to either list or activate an old version of your Fastly configuration but you may not be able to access your Magento/Adobe Commerce control panel to do so. If you need to list versions of your service, you can do so using the Fastly CLI tool using: fastly service-version list -t API_KEY -s SERVICE_ID This will return you a list of service versions and their…

Flush Fastly CDN via CLI/Command Line for Adobe Commerce Projects

If you ever need the ability to flush Fastly but can’t acess an Adobe Commerce admin panel to do so, you can run the following curl request: curl -H "Fastly-Key: API_KEY” -X POST " https://api.fastly.com/service/SERVICE_ID/purge_all" You can fetch both your API_KEY key and SERVICE_ID from the file mounted at: /mnt/shared/fastly_tokens.txt in your Commerce Cloud cluster.

Adobe Commerce Deployment issue 'does not support Valkey backend model'

If you’ve recently deployed one of the latest release lines of Magento on Commerce Cloud and have: REDIS_BACKEND : '\Magento\Framework\Cache\Backend\RemoteSynchronizedCache' [ 2025 -04-08T10:29:29.486342+00:00 ] ERROR: Magento version '2.4.7.0-patch5' does not support Valkey backend model '\Magento\Framework\Cache\Backend\RemoteSynchronizedCache' There is a Github issue for this problem . That…

Adobe Commerce B2B upgrade issue 'REGEXP_LIKE does not exist'

If you’re using Adobe’s B2B extension and recently tried upgrading then you likely hit this issue: W: Unable to apply data patch Magento \ Company \ Setup \ Patch \ Data \ SetComp W: anyForStructure for module Magento_Company. Original exception message: SQL W: STATE [ 42000 ] : Syntax error or access violation: 1305 FUNCTION abcdefghijk W: .REGEXP_LIKE does not exist, query was: UPDATE `…

Laravel 12 $request->getContentType() does not exist

If you use Laravel’s Request object and had previously used the $request->getContentType() method then in Laravel 12, it’s been changed to $request->getContentTypeFormat() : Old: /** * */ class ApiRequestHandler { /** * @param Illuminate\Http\Request $request */ public function __invoke ( \ Illuminate \ Http \ Request $request ) { if ( $request - > getContentType ( ) === 'form' ) { // Do something…

Set Website/Store Assignment via Magento 2 API

If you need to update the website a product is assigned to in Magento via the REST API, you can do this fairly easily. You can get the current websites assigned by running this query: curl "https://www.mystore.co.uk/rest/all/V1/products/MY-PRODUCT-SKU" \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer [token]' This will return a JSON payload. Within the payload you’ll find: "id" :…

Can't place the order error for Paypal Express (when Stripe is also installed) with Magento 2

This week I needed to debug an issue when Paypal Express was being used and it was throwing a “We can’t place the order”. If you’ve ever looked into the Paypal Express controller within Magento then you’ll see that it’s effectively a catch all when something in the process fails. If you take a look at vendor/magento/module-paypal/Controller/Express/AbstractExpress/PlaceOrder.php : 141 } catch (…

Hyva Not Generating app/etc/hyva-themes.json on Deployment for Magento 2.4.7

Update : Hyva are now recommending Adobe Commerce Cloud customers commit their app/etc/hyva-themes.json file into the repo. The app/etc/hyva-themes.json file The file needs to be generated after Magento is installed, so it can’t be run during the build phase. This means, for Adobe Commerce Cloud projects, the app/etc/ hyva-themes.json file needs to be commited to the repository. Otherwise the file…

Klarna Checkout Won't Install on Magento 2.4.4

If you’re using the Klarna Checkout package (klarna/m2-checkout) then when you upgrade to Magento 2.4.4 it won’t install due to a conflict with Monolog versions. As per a merchant email a short while ago, you need to change over to the new klarna/m2-checkout package. You can switch over using: composer remove klarna/m2-checkout composer require klarna/m2-klarna

How to Re-run a Composer Script After install/create-project

You can re-run a composer script by using this syntax: composer run-script post-create-project-cmd

Magento 2.4.4 Admin Login Redirect Loop/Not Working

If you hit a redirect loop in the admin panel after upgrading to 2.4.4 then you like had the configuration option system/security/max_session_size_admin set to 0 to fix an issue with 2.4.3 and session size. Setting it to 0 in 2.4.4 doesn’t work and causes the session to not get written. If you set it to an actual upper limit then it’ll work: bin/magento config:set…

Create Repeating Google Calendar Event for Last Working Day of Month

I think Google Calendar is brilliant however one type of repeating event it does not support is the last working day of the month. There is the option to import a custom ICS file though and within the specification of that file format you can get pretty much close to last working day (there may be some exceptions where this doesn’t work, such a bank holidays but it is close enough). Create a new…

Create Repeating Google Calendar Event for Last Specific Day of Month

I think Google Calendar is brilliant however one type of repeating event it does not support is the last specific day of the month. There is the option to import a custom ICS file though and within the specification of that file format you can do it. Create a new file, ie last-wed-of-month.ics and put this inside it: BEGIN:VCALENDAR VERSION:2.0 BEGIN:VEVENT RRULE:FREQ = MONTHLY ; INTERVAL = 1 ;…

Create Repeating Google Calendar Event for Last Day of Month

I think Google Calendar is brilliant however one type of repeating event it does not support is the last day of the month. There is the option to import a custom ICS file though and within the specification of that file format you can do it. Create a new file, ie last-day-of-month.ics and put this inside it: BEGIN:VCALENDAR VERSION:2.0 BEGIN:VEVENT RRULE:FREQ = MONTHLY ; INTERVAL = 1 ; BYSETPOS =…

Using logrotate as a non-root user

There may be situations when you need to use logrotate without having root access to the server that you’re dealing with. In these situations you can point logrotate at a state file in your home directory. First, create your logrotate configuration file with something like: /var/log/messages { rotate 5 weekly } and then save to ~/logrotate.conf . Next, touch your state file: touch…

How to Install PHP 7.2 (and 7.1, 7.4 etc) on MacOS Monterey

As PHP older versions have now been deprecated upstream you will encounter errors when trying to to install via Homebrew. For example, attempting to install PHP 7.2 will give the following: Error: php@7.2 has been disabled because it is deprecated upstream ! There’s a tap you can use at shivammathur/php which has all of the older versions that are still installable. First, tap the repo: brew tap…

Easily Create Windows 10/8/7 (or any other OS) Bootable USB Drives

If you ever need to create a bootable USB installer, the most reliable way that I’ve found to do so on a Windows machine is using Rufus . It works every single time and I’ve yet to encounter any issues with a drive created using the tool. I last used it to create a Windows 10 bootable drive after their own instructions didn’t work whereas Rufus worked flawlessly.

Wordpress Docker - How to set memory_limit, max_upload_size and other resource limits

To set max_upload_size and post_max_size to set in the official docker image, open a bash session and run: root@f125876a0568:/var/www/html # echo “php_value upload_max_filesize 256M” >> .htaccess root@f125876a0568:/var/www/html # cat .htaccess # snipped php_value post_max_size 256M php_value upload_max_filesize 256M Using >> in the echo command will append the line to the existing content present.

How to Stop Yourself Bricking Your Mac - Disable Secure Boot

If you’re lucky to have a newer Mac with a T2 chip in it, at some point you’re likely going to reinstall the OS to freshen things up. If “Allow booting from external media” is disabled (see image below) in Startup Security and you use Internet Recovery which then fails at any point (past the point of changing disk partitions) - when hen you then reboot your Mac, it’ll be bricked. Internet Recovery…

Magento 2 - How to delete all special prices

If you ever need to remove all special/sale prices from a Magento 2 installation, you can use the following SQL to do so. First step, back up your databases if you haven’t already. Specifically the catalog_product_entity_decimal table. Then run the following SQL: DELETE FROM catalog_product_entity_decimal WHERE attribute_id IN ( SELECT attribute_id FROM eav_attribute WHERE attribute_code =…

macOS Big Sur - Installing pip for Python

The new version of macOS doesn’t appear to have pip installed by default, you can install it by running this command in a Terminal window: sudo easy_install install pip Note: Make sure that you have version 12.2 of Xcode installed and that in Xcode -> Preferences -> Locations -> Command Line Tools is set to Xcode 12.2 too.

A quick way to truncate files on Mac and Linux systems

A short-hand method of truncating files is by using this syntax: : > /path/to/filename.txt Once it has ran then the files content will be removed and the file itself left in place.

Show user groups on Linux

On most standard Linux operating systems you can view the current users’ group membership with: id -nG or if you’re currently logged in as root then you can just tag the user that you want to view on the end of the command. For example, if I’m logged in as root and want to see the groups that john is a member of: id -nG john which will then output: root@mimas:~ # id -nG john john docker

A neat app for team safety checkins and announcements

Clever little iOS app for businesses/teams called Mustr. It can broadcast critical/urgent messages to your team and take roll calls to make sure everyone’s healthy, safe and secure. 🔗 https://t.co/HdOah1fKHa #ios #app #teams #remotework #remote #safety — Scott (@ssxio) July 30, 2020

Keeping Your Privacy: How to Set-up Your Own VPN Using Cloud Providers

This post is part of a series called “Keeping Your Privacy” . There are a hundred and one reasons to run your own VPN - the biggest and most commonly referenced is privacy. You can control your own privacy when using public networks or public wifi for example. If you’re connecting via your own VPN service then you’re a lot more hidden. In the current climate of protests you would be able to…

Keeping Your Privacy: Face Blurring & EXIF Data

This post is part of a series called “Keeping Your Privacy” . It has been truly remarkable to see the protests around the world in the last two weeks. A message seems to be spreading and getting through to politicians and those in power at least seem to acknowledge that something has to change going forward. The liability in the White House hasn’t exactly helped matters state side but with a white…

Introducing a Series: Keeping Your Privacy

Everyone is aware that privacy online is an important topic. It becomes even more important when you apply the context of the current protests and people needing to protect their identity. I’m lucky that I’ve worked as a professional software developer for a long time and know how to configure, run and operate lots of different services. When the protests broke out worldwide I felt like I should…

How to Install and Configure Docker on Ubuntu 20.04

Create a non-root user to run your docker containers under: adduser steve Next, update the apt sources and install Docker: apt install docker.io systemctl enable —now docker Now, add our new user to the docker user group so they can interact with the service: usermod -aG docker steve and finally, we’ll switch over to that user using su and confirm we can run a simple container: su steve docker run…

How to Configure and Use Hardware Yubikey with Mac OS SSH

Due to recent updates to OpenSSH there is now a much simpler and easier way to use hardware tokens for SSH access. Start by inserting your Yubikey into your Mac. Create a new key ecdsa-sk which will reside on your machine but require your hardware token: ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk -C “user@site.co” It’ll ask you to enter a password to protect your key, then if touch compatible…

Using Additional Configuration Files with Laravel & Lumen

If you’ve got a growing Lumen application or perhaps you just want clear separation of configuration - it can be beneficial to add more configuration files to the config/ directory. These files are pretty simple in nature, if I was creating one to configure settings for users, I could create a file called config/user.php containing: return [ 'prefix' = > 'user_' , 'table' = > 'users' ,…

Git reflog can help you restore lost work

A lot of the software developers I’ve interacted with hold a basic working knowledge of git which I’ve always found surprising as a lot of pieces sound a lot scarier to hear than they are to use. An example of this would be git rebasing - people immediately seem to worry about this even though at the end of the day its a relatively simple concept - you have a stack of commits and you want to trim…

How-to set downloaded filename for S3 pre-signed URLs in PHP

If you use S3 to store files then the chances are at some point you’ll be letting users download these files themselves. If you don’t want to fetch the file yourself and you want to send the user directly to S3 to download it - you can do this securely using pre-signed URLs. In short, a temporary URL is generated to allow the user access to the file and it has a timed expiry. If you’re normalising…

How to Zip and Encrypt a file on a Mac

I’d recently seen a few people recommending app store apps to handle zipping and encrypting files/directories on a Mac. Open up a Terminal session and locate the directory you need and run: zip -er secret-files.zip directory-of-files/things.txt You’ll then be prompted to enter the password and confirm it.

Strong Customer Authentication (SCA)

Later this year on September 14th a new European payment law will come into use. For consumers its a brilliant step forward. Essentially the new law requires two-factor auth when checking out which should cut down on card fraud. If you’re a Stripe user, all you’ll need to do is implement 3D Secure 2. This will cover your requirements for the new law. I asked Stripe on Twitter to confirm this…

PHP 5.6 Vagrant Box for Legacy Projects

I’ve never one to say there shouldn’t be any legacy projects. I’m sure plenty of developers who would like to change the definition of a legacy project to suit this weeks best practices but in all honestly there are legacy applications out there generating hundreds and thousands of pounds for many companies. That in itself should be respected. Legacy has become a dirty word somehow. It shouldn’t…