In the first part of this tutorial series, we generated the initial version of our company website’s frontend using Bolt.new and explored how vibe coding helps speed up UI development.
We also set up our Strapi 5 backend on Strapi Cloud and prepared the project structure for integration.
Now, let's finish this tutorial. We will take the next big step:
This tutorial is divided into two parts:
Now that our Strapi backend is fully set up, we can connect it to the frontend we generated with Bolt.new.
Before doing that, it’s a good idea to save the current state of our project in case we need to revert during the integration process.
Bolt.new automatically versions your project as you work, but it’s still good practice to confirm that your latest stable state is saved.
To view your versions:
This built-in history is especially useful when you want to integrate external APSs or make major changes.
With the Strapi backend deployed and available via a public API URL, we can now instruct Bolt to install the @strapi/client and configure our application for backend communication.
To integrate properly, Bolt.new needs to:
@strapi/clientWe’ll use the Plan Mode for this step so Bolt understands the task and executes it precisely.
1Now connect to Strapi v5. I want to use it as my backend.
2
31. Install Strapi Client:
4npm install @strapi/client
5
62. Create a file: src/data/strapi-sdk.ts with this exact code:
7
8import { strapi } from '@strapi/client';
9import { getStrapiURL } from "@/lib/utils";
10
11const BASE_API_URL = getStrapiURL() + "/api";
12export const sdk = strapi({ baseURL: BASE_API_URL });
13
14
153. Update src/lib/utils.ts:
16
17export function getStrapiURL() {
18return process.env.VITE_STRAPI_URL || "https://superb-freedom-8531c68dfe.strapiapp.com/";
19}Ensure you click the implement.
After pasting this into Bolt.new, make sure to click Implement Plan.
Bolt will then:
@strapi/clientstrapi-sdk.ts fileWith the Strapi SDK configured, we’re ready to fetch real content from our CMS.
With the Strapi client SDK now installed and configured in your Bolt.new project, the next step is to fetch real content from your Strapi backend and display it in the UI.
This is where your project transitions from a static prototype into a dynamic, CMS-driven application.
To give Bolt.new additional context about your available endpoints, you can generate an OpenAPI specification for your Strapi project.
This documentation describes all of your API routes, request parameters, and response structures without requiring source code access.
This step is optional, but helpful if your content types are complex.
Run the command to generate the JSON OpenAPI specification
npm run strapi openapi generate
# or
yarn strapi openapi generateBecause Bolt.new has a limited context window, providing the entire OpenAPI file may consume unnecessary tokens for this tutorial.
Feel free to skip it unless you need deep endpoint documentation inside Bolt.
Let’s begin by fetching our Blog content from Strapi. When you hit your Strapi API directly, a response will look something like this:
For this tutorial, we will fetch:
Blog collection type): (with related entities from Dynamic Zones, banners, authors, categories, tags, and SEO metadata)1/blogs?populate[dynamic_zone][on][dynamic-zone.faq-block][populate][faqs]=true&populate[banner]=true&populate[author]=true&populate[category]=true&populate[tags]=true&populate[seo]=true1/blogs?filters[slug][$eq]=slug-valueThese two endpoints are enough to build a blog listing page and a blog details page. Feel free to add more.
Now that the API endpoints are ready, we’ll instruct Bolt.new to:
getBlogs() and getBlogBySlug() functionsSwitch to Plan Mode, and then paste this prompt:
1Using the previously created SDK in data/strapi-sdk.ts
2
3create a new file inside data/api.ts
4
5Add the function:
6
7- getBlogs(): fetch `/blogs?populate[dynamic_zone][on][dynamic-zone.faq-block][populate][faqs]=true&populate[banner]=true&populate[author]=true&populate[category]=true&populate[tags]=true&populate[seo]=true`
8
9- getBlogBySlug(slug): fetch `/blogs?filters[slug][$eq]=slug-value)`
10
11Use async/await and return typed JSON.
12
13Update the blog page with the new data. Leave the dummy data as it is.Keeping the dummy data ensures your app remains functional even if the Strapi server is cold-starting (common on the free tier) or temporarily unreachable.
Once Bolt.new implements the Strapi fetching logic, you may run into errors.
This is normal, especially when combining AI-generated code with a live backend. The key is learning how to debug efficiently without falling into infinite “Fix this” loops, which can quickly burn tokens and break working code.
Here’s the error we encountered when Bolt attempted to fetch Blog data from the Strapi backend:
We can use 3 ways to resolve this issue:
Let’s walk through how each one helped (and sometimes didn’t).
The first attempt was to paste the error message directly into Bolt and ask it to resolve it.
Bolt responded, but suggested using Bolt Database, its built-in backend.
This wasn’t helpful, because our goal is to use Strapi, not Bolt Database.
This is common: when Bolt doesn’t understand the source of a backend error, it sometimes defaults to suggesting its internal database.
The next approach was to use Bolt.new’s Highlight tool.
This allows you to mark a specific line or file and tell Bolt exactly what to fix, instead of letting it rewrite unrelated parts of your project.
We highlighted the import where the Strapi Client was used and asked Bolt to reinstall or repair it:
This is one of the most reliable debugging techniques in Bolt because it prevents the AI from over-correcting or introducing new regressions.
Even after discussing the error and using Highlights, the issue persisted.
This happens occasionally because Bolt runs in a browser environment and can sometimes get stuck in an inconsistent state.
A page reload of the Bolt IDE resolved it.
After reviewing the generated code, I noticed the root cause. Bolt had used Strapi v4 response formatting instead of the new flat Strapi 5 response format, specifically, the Strapi 4 deprecated .attributes field.
Strapi v5 no longer wraps content in .attributes, so any code referencing it will break.
We highlighted the incorrect usage and asked Bolt to remove it:
1Please remove the .attributes as we are using Strapi v5 and not v4.Once Bolt applied the fix, the blog data loaded correctly:
Fetched Data from Strapi Backend
💡 NOTE Bolt implemented the
getBlogBySlug(slug)but did not create the Blog details page. You’ll need to explicitly prompt Bolt to add these.
With our Strapi integration working, the next step is to refine the UI and ensure the frontend correctly renders the dynamic content coming from the CMS.
When navigating to a blog details page (via its slug), Bolt automatically uses the data coming from your Strapi dynamic zones, such as the FAQBlock.
In the demo below, you can see that:
FAQ from Dynamic Zone
This is a major advantage of using Strapi’s modeling system. Bolt can generate UI components that map directly to your content types.
At this point, you can continue enhancing the UI by prompting Bolt to:
GlobalSettings single type)Dynamic content gives your Bolt-generated site structure, and your prompts give it polish.
Bolt-generated UIs sometimes look great on desktop but break or overlap on mobile. To fix this, use the Inspect or Highlight tools to point to exact elements that need adjustments.
You can then provide targeted prompts such as:
1Make this section fully responsive for mobile and tablet.
2Use Tailwind responsive utilities to adjust spacing, stacking, and font sizes.Once the core UI works, you can ask Bolt for improvement ideas. Using Plan Mode or Discussion Mode, ask:
1What features can improve this company website?Bolt may suggest enhancements such as:
Bolt.new includes an inline terminal that allows you to:
npm install swiper, etc.)This terminal is useful especially when installing third-party packages that Bolt doesn’t add automatically.
Before deploying or shipping your project, download your full codebase. This lets you:
Bolt.new is excellent for prototyping, but manual review ensures your final app is production-ready.
Once everything looks good, you can publish directly from Bolt.new by clicking the Publish button at the top-right corner of the interface.
Bolt will:
If issues are detected, Bolt will suggest fixes, and you can attempt fixing them directly using Plan Mode or the Highlight tool.
Bolt will run a security audit. And if any issue is found, you will be advised to ask Bolt to fix it. If successful, Bolt will generate a shareable link to your live project.
In some cases, Bolt may fail to publish your project. For example, my build failed due to a Turbopack limitation that commonly affects browser-based IDEs, and probably because Bolt.new generated my app in Next.js 13.
If this happens, don’t worry, you still have a reliable deployment path using GitHub and Netlify.
Bolt.new provides a built-in GitHub integration that allows you to export your project directly into a new repository.
After authorization, Bolt asks you to name the repo:
Once the repo is created, you're ready to deploy.
With the GitHub repository now available, deployment through Netlify becomes simple:
company-website-example).A few moments later, your site will be live! :
Getting great results from Bolt.new is all about how you prompt. Below are the most effective best practices to help you build faster, avoid unnecessary token usage, and maintain consistent app quality.
For more prompting strategies, check out Bolt’s official guide: 👉 Prompting Tips for Bolt
Bolt.new is a powerful tool for rapid prototyping and AI-assisted development, but it also comes with limitations you should be aware of, especially if you're building more complex, full-stack applications.
The free plan works well for simple, one-shot prompts and small projects, as tokens are limited.
For full-stack apps or frontend + backend integrations, you’ll likely need to upgrade.
Refreshing Bolt’s IDE or inactive sessions can sometimes cause the AI to lose context, which means:
Using Plan Mode, file locking, and targeted prompts helps reduce this problem, but it still happens occasionally.
Bolt sometimes forgets previous constraints or introduces inconsistencies. For example, suggesting Bolt Database instead of your actual backend (Strapi).
When this happens, using the Highlight tool or reverting via Version History is the best approach.
In some cases, Bolt may install a different dependency version than requested.
For example, it generated the project using Next.js 13 even after specifying Next.js 15.
Always verify:
Before continuing with your build.
Because Bolt runs in a browser-based environment, not all toolchains are fully supported. For example, I upgraded to Next.js 16, but this triggered a Turbopack error:
1Error: `turbo.createProject` is not supported by the wasm bindings.This appears to be a limitation of running Turbopack inside a WebAssembly environment. Fortunately, Bolt’s Version History allowed rolling back to a working version.
When Bolt encounters backend-related errors, it sometimes suggests switching to Bolt Database, even when you're intentionally using a custom backend like Strapi.
This isn’t harmful, but it can derail your debugging if you don’t catch it early.
👋 NOTE: We used the free version of Strapi Cloud. So, give some time before the Blog data load as your Strapi server spins up.
Suppose there is one lesson from this project. It would be that Bolt works best when you work in small, controlled steps.
That way, you can easily revert, update, and maintain your code without consuming too many tokens.
You can use the Free plan for experimentation, UI generation, or quick prototypes, but full-stack or multi-page applications benefit heavily from the paid tiers.
But for production-grade, enterprise-level projects, I will always take ownership of the core business logic, security patterns, API integrations, and performance considerations.
Bolt speeds up the work. It doesn’t replace the work.
In this two-part series, you learned how to use vibe coding principles and Bolt.new’s interface, modes, and prompting techniques to generate a full UI scaffold and connect it to a real Strapi backend. You also fetched dynamic content, debugged common issues, and deployed the final application using GitHub and Netlify.
Here are some next steps for your project:
GlobalSettings single type) of the company website in your Strapi backend:1/global-setting?populate[0]=footer&populate[1]=footer.links&populate[2]=header&populate[3]=header.links&populate[4]=defaultSEO&populate[5]=socialLinks&populate[6]=addressBolt.new is a great platform. However, it’s not a full replacement for human designers and developers, at least not yet. The platform should be best used for experimentation, concept generation, and quick MVPs rather than enterprise-ready sites.
If you’re ready to explore the future of website building, Bolt.new is an exciting place to start, but keep your creative and technical instincts close by.
Theodore is a Technical Writer and a full-stack software developer. He loves writing technical articles, building solutions, and sharing his expertise.