DEV Community

Susumu Takahashi profile picture

Susumu Takahashi

Founder of Layerworks (solo). Years of maintaining client WordPress sites across Japanese hosts, now building tools for it. I post war stories from real WP maintenance.

Work

Solo developer & founder at Layerworks

Crontab syntax basics, and how it differs from WP-Cron

Crontab syntax basics, and how it differs from WP-Cron

2
Comments
4 min read

Want to connect with Susumu Takahashi?

Create an account to connect with Susumu Takahashi. You can also sign in below to proceed if you already have an account.

Already have an account? Sign in
Organizing per-host settings with `~/.ssh/config` — a standard practice for anyone managing multiple servers

Organizing per-host settings with `~/.ssh/config` — a standard practice for anyone managing multiple servers

1
Comments
4 min read
SSH key types (RSA / ED25519 / ECDSA) — what actually differs, and which one to pick

SSH key types (RSA / ED25519 / ECDSA) — what actually differs, and which one to pick

2
Comments
4 min read
How the WordPress transient API works, and when `wp transient delete` actually helps

How the WordPress transient API works, and when `wp transient delete` actually helps

2
Comments
4 min read
`wp db check` / `wp db optimize` — the database health commands that get overlooked

`wp db check` / `wp db optimize` — the database health commands that get overlooked

2
Comments
3 min read
Using WP-CLI aliases to switch between multiple WordPress environments safely

Using WP-CLI aliases to switch between multiple WordPress environments safely

1
Comments 2
4 min read
Comparing pricing models across four WordPress maintenance tools — what the shape of a price reveals about cost structure

Comparing pricing models across four WordPress maintenance tools — what the shape of a price reveals about cost structure

2
Comments
4 min read
A tabbed form that silently refused to submit — required fields hidden behind another tab

A tabbed form that silently refused to submit — required fields hidden behind another tab

8
Comments 10
4 min read
UTF-8 vs. cp932: Why Some Bugs Only Show Up on Japanese Windows

UTF-8 vs. cp932: Why Some Bugs Only Show Up on Japanese Windows

2
Comments
4 min read
Verifying a WordPress major upgrade — a 7-step post-upgrade checklist

Verifying a WordPress major upgrade — a 7-step post-upgrade checklist

2
Comments
6 min read
Greedy vs. Non-Greedy Regex: Why the Same Pattern Can Match Differently

Greedy vs. Non-Greedy Regex: Why the Same Pattern Can Match Differently

2
Comments
5 min read
Log Level Design and Rotation: Why Apps Use DEBUG/INFO/WARNING/ERROR

Log Level Design and Rotation: Why Apps Use DEBUG/INFO/WARNING/ERROR

1
Comments
5 min read
Site list scrolls to top on every delete — fixing the missing keepScroll argument across 6 call sites

Site list scrolls to top on every delete — fixing the missing keepScroll argument across 6 call sites

1
Comments
2 min read
The Principle of Least Privilege: Why File Permissions Like 600/644/755 Exist

The Principle of Least Privilege: Why File Permissions Like 600/644/755 Exist

1
Comments
5 min read
The excluded-plugin setting that Playwright ignored — fixing browser-mode updates and false residual warnings

The excluded-plugin setting that Playwright ignored — fixing browser-mode updates and false residual warnings

1
Comments
3 min read
The cp932 crash in the build gate that only happened on Windows — static detection, behavioral testing, and a negative check

The cp932 crash in the build gate that only happened on Windows — static detection, behavioral testing, and a negative check

1
Comments
3 min read
Placing corrections exactly where an LLM is tempted to sound plausible instead of right

Placing corrections exactly where an LLM is tempted to sound plausible instead of right

1
Comments
3 min read
A support chatbot needs to be designed for what it won't answer, not just what it will

A support chatbot needs to be designed for what it won't answer, not just what it will

1
Comments
2 min read
The free plan wasn't actually "no registration required" — fixing a landing page claim that contradicted itself

The free plan wasn't actually "no registration required" — fixing a landing page claim that contradicted itself

2
Comments
3 min read
Resuming email verification after the app is closed — the pending_email state that prevents re-sending

Resuming email verification after the app is closed — the pending_email state that prevents re-sending

1
Comments
4 min read
SPF, DKIM, and DMARC together — why the missing DMARC record was blocking registration emails

SPF, DKIM, and DMARC together — why the missing DMARC record was blocking registration emails

1
Comments
3 min read
When maintenance ends with an error, the plugin update badge disappears — designing a backend marker and frontend count sync

When maintenance ends with an error, the plugin update badge disappears — designing a backend marker and frontend count sync

2
Comments
4 min read
A csh bug we thought we fixed came back in a new feature — designing a login-shell-independent SSH command wrapper

A csh bug we thought we fixed came back in a new feature — designing a login-shell-independent SSH command wrapper

1
Comments
4 min read
Deploying and committing to git are not the same "done" — the trap of assuming uploaded means synced

Deploying and committing to git are not the same "done" — the trap of assuming uploaded means synced

1
Comments 1
3 min read
Checking that a count didn't change — a sanity check before writing a reorder API's result

Checking that a count didn't change — a sanity check before writing a reorder API's result

1
Comments
3 min read
A version bump that got left behind — fixing it with a single source of truth and a `--check` gate

A version bump that got left behind — fixing it with a single source of truth and a `--check` gate

1
Comments
4 min read
Don't show users a raw Playwright error — translating exceptions into friendly messages

Don't show users a raw Playwright error — translating exceptions into friendly messages

1
Comments
3 min read
When "select all" checkboxes don't actually select anything — verifying after `check()`, not just trusting it

When "select all" checkboxes don't actually select anything — verifying after `check()`, not just trusting it

1
Comments
3 min read
When `update-core.php` version scraping goes wrong — telling a plugin version number apart from WordPress core

When `update-core.php` version scraping goes wrong — telling a plugin version number apart from WordPress core

1
Comments
3 min read
Browser-based updates getting stuck on the "Confirm your admin email" screen — why Playwright stalls in wp-admin

Browser-based updates getting stuck on the "Confirm your admin email" screen — why Playwright stalls in wp-admin

1
Comments
3 min read
Why scheduled posts don't publish on time — inspecting WP-Cron with WP-CLI

Why scheduled posts don't publish on time — inspecting WP-Cron with WP-CLI

1
Comments
3 min read
Locked out of wp-admin? Why WP-CLI works when `wp-login.php` doesn’t

Locked out of wp-admin? Why WP-CLI works when `wp-login.php` doesn’t

1
Comments
4 min read
Why phpMyAdmin migrations break plugin settings — and why `wp search-replace` doesn’t

Why phpMyAdmin migrations break plugin settings — and why `wp search-replace` doesn’t

1
Comments
4 min read
Getting ready for WordPress 7.0 — three things to check now: PHP requirements, FSE migration, and editor extensions

Getting ready for WordPress 7.0 — three things to check now: PHP requirements, FSE migration, and editor extensions

2
Comments
5 min read
Running a WordPress major upgrade step by step with WP-CLI — commands and checkpoints for each stage

Running a WordPress major upgrade step by step with WP-CLI — commands and checkpoints for each stage

1
Comments
6 min read
Three site-list UX improvements: instant completion feedback, error highlighting, and auto-deselect

Three site-list UX improvements: instant completion feedback, error highlighting, and auto-deselect

1
Comments
3 min read
Why environment variables don’t suppress WP-CLI PHP Deprecated warnings — the phar + shebang path and a three-part structural fix

Why environment variables don’t suppress WP-CLI PHP Deprecated warnings — the phar + shebang path and a three-part structural fix

Comments
4 min read
When SSH to Xserver suddenly stops working, it's fail2ban — the official confirmation and a safer reconnection check

When SSH to Xserver suddenly stops working, it's fail2ban — the official confirmation and a safer reconnection check

Comments
3 min read
Five failure patterns from past WordPress major upgrades — what 5.0 Gutenberg through 6.0 FSE taught maintenance teams

Five failure patterns from past WordPress major upgrades — what 5.0 Gutenberg through 6.0 FSE taught maintenance teams

Comments
5 min read
Don't apply WordPress major releases on day one — the "x.0.1 rule" and a calibration framework

Don't apply WordPress major releases on day one — the "x.0.1 rule" and a calibration framework

Comments
4 min read
Seven things to check before a WordPress major upgrade — before "patch what breaks after" becomes a disaster

Seven things to check before a WordPress major upgrade — before "patch what breaks after" becomes a disaster

Comments
5 min read
A variable I'd refactored into one function — and kept referencing from another. Python's lazy evaluation hid it, and an AST test finally caught it

A variable I'd refactored into one function — and kept referencing from another. Python's lazy evaluation hid it, and an AST test finally caught it

Comments
5 min read
When the same selector appears twice on a WordPress admin page — Playwright strict mode and the `.first` habit

When the same selector appears twice on a WordPress admin page — Playwright strict mode and the `.first` habit

Comments
5 min read
The day a user told me "the running site looks weak" — rebuilding the three-state visual hierarchy with background color

The day a user told me "the running site looks weak" — rebuilding the three-state visual hierarchy with background color

Comments
5 min read
Visualizing maintenance status on the site list — blue pulsing border for running, green solid for done

Visualizing maintenance status on the site list — blue pulsing border for running, green solid for done

Comments
5 min read
Three pitfalls in a dashboard cache lifetime — boot-time restore, TTL, and partial invalidation

Three pitfalls in a dashboard cache lifetime — boot-time restore, TTL, and partial invalidation

Comments
5 min read
A pending-plugin-count badge on the 🔌 button — reusing the dashboard cache instead of doubling state

A pending-plugin-count badge on the 🔌 button — reusing the dashboard cache instead of doubling state

1
Comments
4 min read
A "days since last maintenance" badge — color-coding staleness across many sites

A "days since last maintenance" badge — color-coding staleness across many sites

Comments
4 min read
Detecting the running site from streaming logs — why log-order inference broke, and how one marker fixed it

Detecting the running site from streaming logs — why log-order inference broke, and how one marker fixed it

Comments
4 min read
Quieting PHP 8.2+ deprecated noise from older WP-CLI — three layers to keep JSON parse clean

Quieting PHP 8.2+ deprecated noise from older WP-CLI — three layers to keep JSON parse clean

1
Comments
5 min read
Implementing a dynamic OGP image generator for our blog — PHP GD, per-post 1200 630 cards

Implementing a dynamic OGP image generator for our blog — PHP GD, per-post 1200 630 cards

Comments
5 min read
Diff from the live server, not from your git history — when a local repo has drifted from production

Diff from the live server, not from your git history — when a local repo has drifted from production

Comments 2
4 min read
Multilingual emails from a Stripe webhook — inferring language from currency

Multilingual emails from a Stripe webhook — inferring language from currency

Comments
4 min read
Maintaining WordPress sites behind HTTP Basic auth — Playwright, urllib, and encrypted credentials

Maintaining WordPress sites behind HTTP Basic auth — Playwright, urllib, and encrypted credentials

Comments
4 min read
When paramiko's defaults silently get your IP banned — the look_for_keys and allow_agent trap

When paramiko's defaults silently get your IP banned — the look_for_keys and allow_agent trap

Comments
4 min read
Sweeping i18n leaks with four parallel AI agents — from 300 candidates down to 60 real bugs

Sweeping i18n leaks with four parallel AI agents — from 300 candidates down to 60 real bugs

Comments
4 min read
When SSH commands hit a csh login shell — wrapping every command in /bin/sh -c across the codebase

When SSH commands hit a csh login shell — wrapping every command in /bin/sh -c across the codebase

Comments
4 min read
Building a cache-first dashboard — explicit fetch and a "closes-but-keeps-running" notice

Building a cache-first dashboard — explicit fetch and a "closes-but-keeps-running" notice

Comments
4 min read
Connection architectures for WordPress maintenance tools — mapping four products on a two-axis grid

Connection architectures for WordPress maintenance tools — mapping four products on a two-axis grid

Comments
5 min read
Hub-and-spoke SEO for comparison pages — fielding "alternative" search intent from multiple angles

Hub-and-spoke SEO for comparison pages — fielding "alternative" search intent from multiple angles

1
Comments
3 min read
loading...