Blog (build log)

The KNJ Network Blog

Notes from building KNJ Panel, in the order it actually happened.

blog /blɒɡ/ noun — 1. A web log. 2. Here: a build log. What we built, what broke, and what we learned.

269
Phases written
21 Oct 2026
Latest entry
Every phase
Published as it happens
Phase 169

August 30, 2026 · 1 min read

The Upload That Vanished

During a large cPanel migration test, the upload finished and the page then came back blank, with no error and no new account. What happened The new upload…

Read more →
Phase 167

August 30, 2026 · 1 min read

The Save That Ate Its Own Response

Saving PHP Settings in WHM wrote the configuration correctly but returned a 502 to the browser, and the page then showed stale values. Cause The save reloaded PHP-FPM…

Read more →
Phase 166

August 30, 2026 · 1 min read

The 4GB Limit That Was Never Real

A migration test with a large cPanel backup failed partway through the upload, even though the feature advertises a 4GB limit. The cause The panel’s own web service…

Read more →
Phase 164

August 30, 2026 · 1 min read

The Account That Wouldn’t Leave

During readiness testing, we created a disposable account with one mailbox, confirmed DNS sync and mail delivery, then deleted it and checked that nothing was left behind. DNS…

Read more →
Phase 163

August 30, 2026 · 1 min read

A Report Nobody Has to Remember to Check

Subscribers had real-time stats, but nothing pushed activity to the owner. Feedback asked for a daily email, sent to a chosen address at a chosen time, summarising a…

Read more →
Phase 161

August 30, 2026 · 1 min read

The Address Bar Problem

Visiting a customer domain’s /webmail redirected the browser to the panel’s own hostname. A white-label host should keep the customer’s own domain in the address bar. From redirect…

Read more →
Phase 160

August 30, 2026 · 1 min read

Three Things the Real Servers Wanted

Feedback from running a multi-server stack led to three changes shipped together. phpMyAdmin: installed everywhere except where it mattered phpMyAdmin worked on the development server but was missing…

Read more →
Phase 159

August 30, 2026 · 1 min read

Dogfooding the Deploy Button

Deploy from Git had been tested against disposable domains and framework starters. This time we used it for a real Laravel application with a frontend build step, using…

Read more →
Phase 157

August 29, 2026 · 2 min read

The Autofill Nobody Asked For

After fixing the “Attach to an existing login” uniqueness bug (Phase 156) and shipping it, a live re-test of the same form and mode gave a brand-new error:…

Read more →
Phase 155

August 29, 2026 · 2 min read

The Self-Heal That Healed Nothing

v0.17.6 shipped to fix a confirmed bug: the mail transfer agent on an already-provisioned Mail Only satellite could not reach the mailbox server’s authentication service, because the stock…

Read more →
Phase 154

August 29, 2026 · 1 min read

A Mail Setting That Was Never Switched On

Testing a single-server install had turned up fixes for one Roundcube bug and one mail-server plugin bug that week. The next report, outbound sending failing on a multi-server…

Read more →
Phase 153

August 29, 2026 · 1 min read

The Quota Plugin That Needed a Friend

Testing webmail on a single-server install turned up a second, unrelated bug. Roundcube logged in fine, then showed random-looking “Internal error occurred” banners. The mail server’s own log…

Read more →
Phase 151

August 29, 2026 · 1 min read

Array First, Finally Last

With error capture enabled, the real error finally appeared: the bundled webmail component declares a helper function that newer PHP versions now provide natively, which stops the page…

Read more →
Phase 150

August 29, 2026 · 1 min read

The Log That Was Never Being Written

While tracking down a webmail failure, we found that fatal errors from the webmail worker pool were not being captured anywhere. Earlier changes in this investigation had been…

Read more →
← Newer
Older →