If You Want Something Done Right, Do It Yourself. With AI.

Our website now loads in under a second. Lightning fast.
Earlier this week, on October 21, we deployed our fully rebuilt website. But performance wasn't the only reason we decided to rebuild.
There are several pain points that almost every small business and marketing team will recognize.
You have an idea.
You know what you want to communicate.
You know how it should look.
And how your services should be presented.
But…
There are so many sections, images, and other elements to put together. You just need to format everything and make it look right, but somehow you end up spending an entire day doing it.
Frustration
You spend too much time turning your ideas and specifications into actual website content, making sure it looks good and reflects your original vision.
And of course, you want to publish it as quickly as possible, make changes along the way, and adjust things when the result looks different from what you originally imagined. Your changes can easily become a second or third priority. And unexpected website behavior, technical complexity, or the need for additional features can delay deployment and leave your ideas stuck in the backlog.
Our old website was slow, clunky, and difficult to maintain. We had accumulated plenty of UI improvements and inconsistent components. Traditionally, a rebuild like this would happen in phases: migrate the existing website, standardize components, and then introduce a new design. But even with hundreds of pages, we decided to do it all in one go.
So, how did we leave WordPress and PHP behind and move to something sleeker, faster, and more modern, with just a hint of pumpkin spice latte? Here's a look back at our journey to Next.js and Payload CMS, while our designer worked on a fresh UI/UX and Codex handled code generation, implementation, and deployment.
The problem wasn't just the website
For about a year, I had been tolerating problems with our website, both technical and operational.
Technical Debt
Our website had been live for seven years. Over that time, many people worked on it, each bringing their own ideas and approaches. Technical debt kept accumulating. Components weren't standardized, even when they looked identical. Pages took five to six seconds to load on average, and some took up to ten seconds.
Multiple Intermediate Steps
Even when the content was ready, publishing it meant going into the CMS, manually copying text from Word, formatting it, adding images, and adjusting individual sections. What should have been a straightforward content update could easily consume an entire day.
"Simple" Changes
Technical debt turned even simple changes into a nightmare. Components that should have been reusable existed as separate implementations, making it difficult to maintain consistency across the website. Adding a landing page, updating a service description, or implementing a new idea took around a month on average, sometimes stretching into several months.
But the bigger problem was how difficult it was to deliver our knowledge and ideas directly to potential customers.
As a business owner and founder, I regularly speak with clients, understand their needs, and participate in technical solution architecture sessions with our engineering team.
Our engineers work directly with customers. They know what problems customers face, what could improve their business, and often have great ideas worth sharing. The same goes for our sales team, which constantly communicates with customers and identifies their pain points and needs.
The question is: how do we shorten the distance between these ideas and the customer while preserving the author's original vision and intentions?
How we worked before
Previously, we followed a traditional content production process.
1. Interview and prepare
First, gather insights from an engineer. Then a specification was prepared for an article, including SEO keywords, potential images, and other requirements.
2. Copywriting and design
This went to a copywriter and designer. Creating the text and assets alone could take a week.
3. Implementation
Implementation meant creating pictures, copying and pasting each paragraph into the CMS, and manually styling every paragraph to make the page look right.
4. Reviews and substantial changes
During reviews, we often had to make substantial changes because the original technical idea had been interpreted differently along the way. What the author wanted to communicate wasn't necessarily what ended up in the article. Then go back to step 3 to apply the changes.
5. Publication
Finally, the article was published.
I realized AI could help us remove these unnecessary intermediate steps.
How we work now
It is important for the author to directly control how the idea is communicated, rather than leaving those decisions and the implementation entirely to a copywriter or designer. The author can present clearer concepts, so designers and SEO specialists can stay focused on the idea and the author's vision.
1. The author describes the idea and layout
The author describes the problem, what was done, and the benefits delivered, then explains how to arrange the article and suggests images, content blocks, and diagrams.
2. AI prepares the content and visuals
AI turns the author's instructions into an article, generates visuals, and arranges the images, diagrams, and structured content blocks on the page.
3. The author reviews and refines
The author checks that the result reflects the original idea and intentions, then guides AI to revise the wording, visuals, or layout.
And changes that previously took a day could now take just minutes.
This article itself is a good example. I dictate my thoughts, which aren't always particularly structured. Then I read the result, review it, move paragraphs around, clarify how problems are described, or simply prompt: "Show these problems as separate blocks on the page."
That's the experience I wanted to create: a website where the people who actually understand the subject can communicate their ideas directly, refine them immediately, and publish without unnecessary handoffs.
AI should bring the people doing the work closer to the customer, not create another layer between them.
Boring Part: let's fix what we already have
I started working on the website transformation on October 1, 2026.
My first idea was straightforward: clean up the existing website, refactor the codebase, remove unnecessary duplication, and improve performance.
But I couldn't produce tons of code within a short period of time, so I decided to use Codex.
I reviewed the PHP code and realized that almost every page template had serious duplication issues.
Inconsistent implementations
Similar sections had been implemented by different people, with different approaches and opinions on how things should work.
Inconsistent visual styles
The same problem existed visually. Components serving the same purpose looked different across pages, with inconsistent colors, borders, and spacing.
Cleanup before unification
Together with our designer, we decided to unify the website's styles and components. But first, I wanted to get the existing codebase into a reasonable state.
With Codex, I was able to extract reusable components, eliminate duplication across pages, shorten the codebase, and improve performance.
And the interesting thing is that the prompts were pretty simple.
For example:
Take this section, [provide section ID from HTML page that's rendered], and replace it and extract it as a reusable. Check all other pages across the website and replace it with new page. Make sure to remove all legacy and unused code afterwards and validate your work.
That was basically it.
I could identify a section in the rendered HTML, give Codex its ID, and ask it to extract the implementation into a reusable component.
Then it could find similar implementations across the website, replace them, and remove the legacy code.
Along the way, I found quite a lot of other issues.
For example, some navigation menu icons displayed at 32 pixels were actually image files around one megabyte each.
Imagine loading a one-megabyte image just to display a tiny navigation icon.
So I asked Codex:
Take [image], analyze it, upscale it if needed, and convert it to WebP format. Optimize it for page loading performance, resize it to the actual display dimensions (for example, 32 × 32 pixels), and reduce the file size as much as possible without compromising visual quality.
We repeated this across the website, replacing unnecessarily large graphics and cleaning up the codebase.
And it worked.
Before
Approximately five to six seconds. Average: 5.7 seconds.
After
Under two seconds. Average: 1.7 seconds.
Which was pretty impressive.
I worked on this first phase from October 1 to October 10, spending approximately four hours per working day, excluding weekends.
That was roughly 28 hours spent cleaning up the PHP codebase and optimizing our existing WordPress website.
At this point, I thought I was done with the technical changes.
I just needed our designer to finish the new styling, and we could move forward.
So I took a break from active development.
But things got unexpectedly worse.
Incident October 12: the website went offline
Between October 10 and October 12, I wasn't actively working on the website, but I kept monitoring our server metrics from time to time.
And I noticed occasional spikes in memory and CPU consumption.
The website was working, but something clearly wasn't right.
Then, around October 12, the website went offline.
At first, I thought it might have been caused by my recent changes.
So I started investigating and also used ChatGPT to dig into the existing website and server configuration.
What I found was that the issue didn't appear to be caused by my code changes.
PHP workers seemed to be getting stuck while handling requests associated with GTranslate, the plugin we used for real-time content translation.
Requests were piling up, consuming available server resources, and eventually the website stopped responding.
But the problem seemed to be that requests kept accumulating until the available resources were exhausted.
We hosted the website on a server with 2 GB of RAM and two CPUs, which I would expect to be enough for our website.
Now, I'm not saying that GTranslate is a bad product.
The issue was probably a combination of several factors in our infrastructure. The plugin required active maintenance and adjustments from our side to keep everything working correctly.
I knew the problem could reappear. We also had quite a few plugins that were essentially there to avoid writing code for relatively simple functionality, such as contact forms, translations, and several other features.
Many of these plugins could easily be removed or replaced, ideally with their functionality handled directly by a new CMS.
And if we wanted to maintain and support our website ourselves, it made sense to move away from PHP to something every Salesforce developer knows by heart: JavaScript.
That's why we chose Node.js for the server.
Rebuilding with Node.js, Next.js, React, and Payload CMS
So on October 12, I started rebuilding the website.
I wanted to reduce our reliance on plugins and build a unified platform with a content management system, integrated translations, and a structure that I could control.
I'm comfortable with JavaScript and Node.js and had done several projects with them in the past.
Why Payload CMS?
Because it's built around Next.js, and Next.js looked like a pretty good option to me.
I wanted something that would allow me to work with a familiar technology stack instead of introducing another set of tools and dependencies.
Payload and Next.js also gave us a reasonable architectural foundation, so I didn't have to invent everything from scratch.
And yeah, I had a temptation to just tell the agent:
Rewrite the entire WordPress website using my desired Node.js, Next.js, React, and Payload CMS stack. Do it correctly, do it right, validate everything, use sub-agents, and don't bother me.
But I had to do it the other way around.
First, I established a basic deployable version of Payload CMS and got it running from zero.
Then I started building the frontend application with React, using the existing page templates and components as the source for refactoring.
The first alpha version was essentially a one-to-one migration, except for the database.
We introduced several new entities and reorganized content management. I wanted the CMS experience to feel more like Pipedrive or HubSpot, with navigation on the left and content on the right.
Migrating the existing website
One important thing to mention is that we weren't creating the entire website from zero.
We already had content, page structures, design ideas, and years of previous work.
In fact, this is probably the fourth major version of our website.
Back in 2019, we started with the Flaton WordPress theme. We even had a different logo back then.
Later, we developed our own theme, updated it, and continued improving the UI.
Our designer had also been working on the latest design system before this migration started.
So this was a full technical migration and restructuring of an existing website, not creating an entirely new product from scratch.
For the content migration, we extracted everything from WordPress and used an AI agent to map it into the new Payload CMS database model.
The agent helped transform the content to fit the new structure rather than simply copying everything into another database.
We also used agents to deploy the new website, cut over from the PHP implementation, and clean up the old PHP files and configuration from the server.
Was it the most elegant approach?
Probably not.
But for us, it was the fastest way to get everything migrated and running.
Fixing what didn't survive the rewrite
Once the initial rewrite was finished, I was looking at pretty much the same website, just with some slight differences.
And then I started addressing bugs.
Somewhere a slider stopped working. Somewhere the markup was shifted. Some components didn't behave exactly as they did before.
While fixing these issues, I realized that not all components had been properly replaced.
Some page templates still contained raw HTML, while others had newly implemented components that slightly resembled reusable ones we already had.
So I started identifying and cataloguing these places and addressing them one by one.
The prompt was something like:
Hey, here is a section [provide section name or ID]. Please replace it with the existing reusable component [provide component name]. Make sure to maintain the same or similar semantics and behavior, remove the legacy implementation, and clean up unused code.
I continued replacing legacy implementations, improving server-side rendering, introducing caching, and optimizing components.
From October 12 to October 23, I spent approximately four hours per working day on this second phase, roughly 32 hours in total.
An agent creates, another agent reviews, and a human decides
Another interesting part was how I organized development and deployment.
Instead of using one agent for everything, I created several agents with specific responsibilities: one to investigate the legacy implementation, another to recreate the existing UI on the new platform, others to validate the implementation, and one to handle deployment.
I also created reusable skills containing instructions for deployment scripts, testing, and validation, so agents could follow the same processes without having to explain everything from scratch each time.
These skills contained instructions on how to navigate our design system, reuse design tokens, and work with the newly introduced frameworks.
Why skills? Because they allow agents to reuse the same knowledge and instructions without creating too many highly specialized agents for every individual task.
For code review, I relied heavily on Git diffs, checking changes for duplicated code, unnecessary complexity, and inconsistent implementations. Whenever I found something, I asked the agents to fix it.
Since Next.js and Payload CMS already provide established architectural patterns, I instructed the agents to follow those conventions rather than invent their own architecture.
I also tasked separate agents with reviewing the implementation.
The process was pretty straightforward:
An agent creates, another agent reviews, and a human decides what's right or wrong.
And the human pays attention to the actual website, not just the code.
We were manually checking the UI, looking at how pages were rendered, testing components, and identifying visual issues that might not be obvious from reviewing the code alone.
Roughly 30% of my time went into reviewing code, checking implementations, and validating results.
I also introduced additional agent-based checks before deployment to identify remaining issues and clean up code left behind after repeated iterations.
Because AI generates tons of code.
And if nobody pays attention to what it generates, you can easily end up replacing your old technical debt with new technical debt.
Translating the website with AI agents
Another important part of the implementation was translations.
Previously, we relied on GTranslate to translate our content in real time.
This time, I wanted translations handled directly within our platform.
We used an AI agent to translate our English content into all the other language versions of the website.
The prompt was:
You are translating content from English into [target language].
Analyze the English version of the content and identify brand names, technology-specific terms, product names, and other proper names.
Make sure you understand the original intent and exact meaning of the content before translating it. Keep the translation as close as possible to the original meaning and intent, while following the native language rules of [target language].
Preserve brand names, product names, and technology-specific terminology where appropriate.
After translating, validate your work to ensure the meaning is preserved, the language sounds natural, and no content has been omitted.
Make sure you translate all content, including the article title, headings, body text, and all associated metadata.
The goal wasn't just to translate words. I wanted content to follow native language rules and sound natural to local readers.
We also kept brand-specific information separate from translatable content, so company names, product names, and other important terms wouldn't be translated incorrectly.
Now we can manage translations directly in our CMS without relying on a plugin that translates everything in real time.
Of course, AI translation isn't perfect, especially with technical content about Salesforce, CRM, and software engineering.
So if you guys visit our website in your local language and notice that something sounds unnatural, is poorly written, or doesn't make sense, just send me a direct message.
I'll address it.
When Figma, Codex, and GPT-6 came together
In the meantime, our designer completed the new design system in Figma. And this is where things started getting interesting.
Figma supports MCP integration, and we already use OpenAI with Salesforce and other platforms. So I connected Figma to my OpenAI account.
This allowed me to take a link to a Figma node, whether it was a button, section, or another component, and pass it to Codex running GPT-6. Codex would take the design and implement it directly into our website.
Thanks to the previous work on extracting reusable components, it could apply the new design system across pages rather than implementing the same changes separately everywhere. Instead of manually writing CSS and adjusting every padding, border radius, or component layout, I could use the designer's work from Figma and have it implemented in the codebase.
Of course, it wasn't completely automatic. I still had to review the code, HTML structure, component behavior, and places where OpenAI might have taken a shortcut or misunderstood the requirements.
On average, each component took about two iterations.
The first was to implement the design. Making a component look like it does in Figma is one thing.
The second was to fix missing functionality, restore lost logic, or adapt the design to the component's actual behavior. Making sure it behaves correctly and preserves its functionality is another.
And that's where I spent most of my attention.
What we actually achieved
Before
Approximately five or six seconds.
After
Under one second on average.
With the new Node.js implementation, caching, server-side rendering, and other optimizations, pages now load in under one second on average, compared to approximately five or six seconds before the transformation.
generate and update articles
Now we can generate and update articles using the same Codex and ChatGPT approach that we used to develop the website.
updating existing pages
Instead of finding the right template or editing HTML, we can refer to a page URL, title, or section ID and explain what we want to change.
We looked at browser performance metrics, including page rendering, Largest Contentful Paint, and layout shifts, and used Semrush audits to evaluate site health, crawlability, navigation, and other technical issues.
But I also evaluated performance in a much simpler way.
With the old website, I could actually see delays, both on mobile and desktop. Pages took time to load, and the experience wasn't particularly comfortable.
With the new implementation, the difference was immediately noticeable.
The website simply feels significantly faster.
Of course, visual perception isn't a substitute for technical measurements, but it was an important indicator for me because this is what actual visitors experience.
Metric | Result |
|---|---|
Site Health | 94% |
AI Crawlability | 92%, up from 30% |
Crawlability | 97% |
Internal Navigation | 100% |
Site Performance | 100% |
According to our Semrush results:
Another important improvement was the number of technical issues.
Around September and October, Semrush reported approximately 2,000 issues, with peaks approaching 3,000.
Now we're down to around 400 issues, approximately 200 of which are related to Cloudflare's email protection mechanism being reported as broken internal links.
There are still things to improve, but compared to where we started, it's a completely different situation.
From website maintenance to direct-to-customer content
Performance wasn't the only improvement.
We also achieved something probably even more important: a much more comfortable way to create and manage content.
Previously, changing a page required someone to manually update templates, adjust content, and handle the technical work.
Instead of going through multiple people to transform our experience into website content, we can handle most of the routine work through the platform.
The engineer doesn't need to become a copywriter. The account executive doesn't need to become a developer. And the person who has an idea shouldn't have to wait months for someone to implement it on the website.
And this doesn't mean generating artificial AI slop.
Take this article, for example.
It's not actually being written manually. The ideas and thoughts are dictated, transcribed into text, and then refined.
We can say something like, "Reword this, make that part sound nicer, remove unnecessary words, use more polite language."
But the ideas, experience, and narrative are still ours.
AI helps us turn our thoughts into readable text, much like it helped turn our design and technical requirements into actual code.
And this is exactly the workflow we wanted.
This article is actually a good example of the content publishing process we're building.
The ideas come directly from our experience. We dictate them, transcribe them, review and improve the text, and then use an agent to prepare the content for our website.
The article will be uploaded into our CMS, translated into the other supported languages, reviewed, and published.
The same approach can work for technical articles, customer success stories, service descriptions, and other content we want to share.
Previously, we relied heavily on copywriters and website administrators to turn a few words from technical experts into full articles.
A technical expert spends a few minutes explaining what they did, and then a copywriter turns it into thousands of words.
Big, bold articles with lots of text, explanations, and quite often, lots of water.
Meanwhile, the actual engineer would probably describe the same project in a few sentences:
"Yeah, we did the thing. It was easy. It was interesting. It was fun."
Maybe they'll mention some business benefits along the way. Although business benefits are probably something an account executive should be able to explain much better.
We want our engineers to briefly explain what was interesting about the implementation, what was technically challenging, and what was useful, then return to doing other interesting work.
Rather than spending hours describing everything to someone who will eventually turn it into an article.
That's the kind of routine we wanted to eliminate.
And that's also what I mean by bringing production closer to the customer.
AI can help remove the routine work between these people, allowing knowledge to move much more directly from those who have it to those who need it.
Development effort and costs
60 hours
Overall, the latest website transformation took approximately 60 hours of my own development and review time, spread across two phases in October.
30%
Around 30% of that time went into code review, checking technical approaches, identifying problems, and validating AI-generated changes.
€245
With our ChatGPT Business subscriptions, we spent approximately €245 in additional token usage, on top of my regular subscription of approximately €23.
Of course, this doesn't mean the website was rebuilt entirely for €245.
That figure doesn't include my time, our designer's work, infrastructure, or the years of previous investment in the website.
We've been developing and improving our website since 2019, changing themes, updating designs, creating content, and adjusting the structure.
The latest migration reused much of that work.
But the interesting part is how much I was able to accomplish within approximately 60 hours of my own involvement, using AI for development, refactoring, testing, deployment, and code review.
What changed in practice
The comparison below is about the elapsed implementation timeline when working with a freelance developer, not project budgets or a like-for-like comparison of working hours.
For example, a page might involve around 40 hours of development work, spread across several weeks of work and ongoing improvements.
These estimates start after the idea and requirements are defined. Ideation and requirements are important phases in their own right, and they are not included here.
Before
Article from a brief: 8 hours.
Add a page: 3–4 weeks.
Add several pages: 1–3 months.
After
Article from a brief: 1 hour.
Add a page: 1–4 hours.
Add several pages: 1–4 hours.
Responsive design and validation
The agent also handles most of the responsive design and validation work, fixing obvious issues as well as problems that are difficult to spot.
Beyond expectations
Sometimes it exceeds expectations and creates something better than I originally requested.
Guidance is still needed
But it can also overcomplicate a solution or produce something that doesn't match my vision. Clear instructions, review, and human guidance are still needed.
What's next?
The technical foundation is now in place.
We have a platform that we can maintain without manually editing every single thing on the website.
Of course, we can still edit everything directly if we want to. But now we can simply tell the agent that maintains our website:
Hey, add [article], use [images], create some infographics or tables from this content, and publish it as [case study or blog article].
The same applies to updating existing pages.
For example:
Take this page [provide URL or page title], find this section [provide section name, title, or ID], and update it. Replace the image, update or enrich the text based on my instructions, and make sure everything follows our existing design system. Preserve the component's functionality and validate the changes.
Whether we want to replace an image, enrich a service description, publish an article, or update an entire section, we can explain what we want to achieve, review the result, and make adjustments if needed.
This saves hours of routine work that we can spend on developing ideas, researching customer needs, and creating useful content.
And yeah, the situation is now significantly better from pretty much every perspective.
The infrastructure is there. The platform is easy to maintain. Just articulate what you need, and the agent can add it in minutes. Content is easier to publish, and we have much more control over how the website works.
Now we can focus on ideas instead of technicalities.
But the more important change is how we can work with our customers.
Instead of having engineers, account executives, marketing, and website administrators separated by multiple steps and processes, we can make the exchange of knowledge much more direct.
The people who understand the customer's problems can share what they know, and the people who build solutions can hear what customers actually need.
Technology was never supposed to be the problem we spent most of our time solving.
It was supposed to help us deliver our ideas to customers.
And now, finally, technology is not a pain anymore.

