The client came back after three years
In August 2023 we built a company website for G-PRO ECO ENERGY from Kalisz, on WordPress with Oxygen Builder. The company installs photovoltaics, heat pumps, energy storage, air conditioning and monitoring systems, and works across Kalisz and a radius of a hundred kilometres around it.
In September 2026 an email arrived: "roofs tab etc.". The client had moved into a new service, roofing, and needed a page for it. Attached were the finished copy and twenty-one photos.
We built the tab the same day. While we were at it, we looked under the bonnet and it turned out that rebuilding the whole site made more sense than adding another storey to a structure from three years ago. The client agreed in the same conversation.
What we found
The site worked, it collected enquiries and there was nothing dramatic about it. The problem was how many moving parts it was made of.
Fifteen active plugins. Three for forms - Contact Form 7, weForms and the page builder's own form. Two for SEO and analytics - Yoast and Site Kit. On top of that, a separate plugin for the cookie banner, another for SVG support, another for maintenance mode, and a page builder that stored every page in the database in its own proprietary format.
The result: eleven stylesheets, twenty-five scripts and eight external domains queried on every visit.
There was also a problem no audit would show. The client's administrator account had its permissions cut back by the page builder. Oxygen has a feature called Client Control, which restricts the dashboard so the client cannot break the layout. The side effect: the business owner could not install a plugin, open the menu editor or add an item to the navigation on their own website.
15 active plugins, including three for forms and two for SEO
11 stylesheets and 25 scripts on the homepage
8 external domains queried during page load
Page layouts stored in the page builder's format
Client account with no access to plugins or menus
Service content scattered across ordinary pages
5 plugins - backups, security and the media library
2 stylesheets and 3 scripts
Zero requests to external servers - the font is hosted locally
Custom theme, layouts in PHP templates
The client manages all content from the dashboard
Services as a dedicated content type - adding one feeds the whole site
Forms, SEO and cookies moved into the theme
Instead of five plugins doing five jobs, five modules inside the theme.
The contact form was written from scratch. It submits without reloading the page, with a working fallback for browsers without JavaScript. Spam protection without a captcha that annoys customers: a hidden honeypot field, a check on how long the form took to fill in and a limit on submissions from a single address. The list of topics in the form is built from the list of services, so it never has to be maintained twice.
Metadata and structured data are generated by a theme module. One consistent JSON-LD graph instead of several separate blocks: the company as a LocalBusiness with its hundred-kilometre service area described as a geographic circle, a service catalogue built automatically from the content, breadcrumbs, FAQ and navigation markup that tells search engines which pages matter most.
Cookie consent is a custom banner with Google Consent Mode v2. Everything is denied by default - until the user clicks, no tool writes a single cookie. A saved choice is restored immediately on arrival, before the tag container has a chance to send anything.
PHP 8.3
Custom theme
Plain CSS with custom properties
BEM
JavaScript ES6+
ACF Pro
Schema.org JSON-LD
Google Consent Mode v2
Google Tag Manager
llms.txt
Chrome DevTools Protocol
A permissions problem solved without asking for access
We started the deployment with nothing but the client's account - the one the page builder had cut down. We could upload a theme, but we could not install a plugin or touch the menus.
Instead of waiting for server credentials, we built the theme so that it did not need them.
ACF bundled inside the theme
Advanced Custom Fields Pro has an officially supported mode for including it in a theme as a library. Uploading the theme therefore installs everything at once - no separate plugin installation. As a bonus, the client cannot accidentally deactivate something the content of the entire site depends on
Navigation that builds itself
With no right to edit menus, the theme generates them from what is in the database: a services dropdown listing every service, followed by pages recognised by their address. Adding a service in the dashboard puts it in the menu, the footer, the homepage tiles and the structured data in one go
A content installer in the dashboard
The content migration runs both from the command line and from a button in the theme settings - in case of a server without shell access. The script identifies entries by their address, so running it again updates the content instead of creating duplicates
The page builder switched off from within the theme
Oxygen overrides the template regardless of which theme is active - switching themes alone is not enough. A theme module restores WordPress's normal template hierarchy and dequeues the plugin's assets, so the switchover was instant
The client's content stayed, the structure changed
We did not rewrite the copy. The company description, the scope of each service, the list of towns - all of that is the client's content and the client's knowledge of their own market. What we changed was how it is presented.
The biggest change concerns the towns. In the old version they sat in eight consecutive paragraphs in the middle of the company description. We split them into groups by service - one set of towns for photovoltaics, another for heat pumps, another for energy storage. Linking a service to a town carries weight with search engines, a flat list of thirty names does not.
We moved everything across: eight services, forty-four completed projects and every image in the media library. Old URLs received 301 redirects so that three years of search rankings were not lost.
The new service got the most attention
For the client, roofing is a move into a new industry and the service with the highest margin, so its page is the most developed: a tiled gallery of completed jobs, five steps of working together from the first phone call to final handover, and the six questions customers ask most often - including the most important one, whether fitting panels will void the roof warranty.
That is in fact the core of G-PRO's expanded offer: one contractor for both the roof and the photovoltaics means one point of responsibility, with no argument over whose fault a leak is.
Measured, not assumed
We checked the mobile view through the browser's debugging protocol, with genuine device emulation. The reason is mundane: a browser running in headless mode enforces a minimum width of five hundred pixels, so a screenshot labelled "390 px" is really a 500-pixel render cropped to 390. Style rules behave differently there than on a phone, and a test like that proves nothing.
The tool also measures the document width and points to any element that overflows the edge. Every page returns the same result: a 390 px document, zero horizontal scrolling.
The same approach uncovered a mobile menu bug that cannot be seen in the code. The header used a background blur, and that property creates a new containing block for fixed-position elements. The menu was therefore positioned relative to the 78-pixel header instead of the screen - it opened as a 33-pixel strip, and once the page was scrolled it was out of view altogether.
Results
What comes next
The next stage is an advanced quote calculator for photovoltaics and roofing - a tool that works out the scope and an indicative cost before the customer even picks up the phone. The client chose a custom solution, written around the way the business works, rather than an off-the-shelf plugin.
And that is really the answer to the question of what KamikStudio does. Not assembling websites from building blocks, but building tools that fit a specific company. Sometimes it is a website, sometimes a scheduling system, and sometimes a calculator you will not find in any plugin directory.