Buildora

An AI website builder you run as your own business. Your customers describe their business in a sentence, the AI writes a multi-page website, they edit every block, and publish it to a free address or their own domain. You sell plans with Stripe and run everything from an admin panel.

1. Welcome

Thank you for choosing Buildora. This guide takes you from the download to a running website-builder business. It is written for beginners: every command is shown in full, and every setting says where to find it.

What you get

What is in the download

FolderWhat it is
buildora_web_nextjs/The whole application: builder, admin panel, API and published sites (Next.js 16, TypeScript, Prisma, PostgreSQL).
deploy/Docker Compose stack, Caddy HTTPS config and the .env.example for it.
docs/This documentation as HTML and PDF.
CHANGELOG.md, LICENSE.txtVersion history and licence notes.

Screenshots

The builder (your customers)

AI wizard: describe the business
1. Describe the business
AI wizard: pick a style
2. Pick a look
AI wizard: generating the pages
3. The AI writes every page
The AI draft in the editor
4. The draft opens in the editor
Block editor
Block editor
Rewrite a section with AI
Rewrite any section with AI
Add a section
14 section types, or describe one
Theme settings
Styles, colours and fonts
SEO settings
SEO with a Google preview
Phone preview
Phone and tablet preview
Publish settings
Publish, address and domain
Customer dashboard
Dashboard
Templates
Templates
Form inbox
Form inbox
Domains
Domains
Billing and plans
Billing and plans
A published website
A published website
Your landing page
Your landing page

Install and admin panel (you)

Admin overview
Overview
Users
Users
Sites
Sites
Plans
Plans
Payments
Payments
Templates
Templates
AI settings
AI settings
Setup check
Setup check
Settings and branding
Settings and branding
Install wizard: server check
Install wizard: server check
Install wizard: admin account
Install wizard: admin account

2. Requirements

You need one of these:

For a public launch you also need a domain name (for example yourbuilder.com) where you can add DNS records.

Everything else is optional and can be added later: an AI key, a stock photo key, Stripe, SMTP email and S3 storage. Without them Buildora still works, using its built-in demo writer, a test checkout, log-only email and local file storage.

Third-party services (accounts you will create)

These services have their own pricing. Each one is run by another company, not by us, and has its own pricing tiers, usage limits and fees (for example per AI request, per payment taken, per email sent, or for storage and bandwidth). Most offer a free tier or a free test mode, but prices and limits can change at any time. You are responsible for any costs from these providers, as well as your server and domain. Check each provider's pricing page before you go live.
ServiceWhat Buildora uses it forNeeded?
OpenAI, Anthropic (Claude) or Google GeminiWriting websites, pages and section rewrites. You pick one in Admin → AI settings.Optional (the demo writer works without a key)
Pixabay or PexelsFree stock photos in AI drafts and the editor's "Find a photo".Optional (free keys)
StripeMonthly subscriptions, invoices and the customer billing portal.Optional (a test checkout works without it)
Any SMTP provider (Amazon SES, Postmark, Mailgun, Brevo, Gmail…)Password resets and form notifications.Optional (emails are written to the log without it)
Any S3-compatible storage (AWS S3, Cloudflare R2, MinIO…)Logos and photos. The Docker stack includes MinIO.Optional
A VPS host and a domain registrarRunning the app and its addresses.For a public launch

3. Quick start (Docker)

This runs Buildora on your own computer or server in about ten minutes.

  1. Unzip the download and open a terminal in the deploy/ folder.
  2. Create your settings file:
    cp .env.example .env
  3. Open .env in any text editor and fill in the three required values:
    POSTGRES_PASSWORD=pick-a-long-password       # letters and digits only
    APP_SECRET=paste-a-random-string-here         # generate: openssl rand -hex 32
    S3_SECRET_ACCESS_KEY=pick-another-password    # at least 8 characters
    Leave APP_URL=http://localhost:3000 for now.
  4. Start everything:
    docker compose up -d --build
    The first build takes 3 to 6 minutes. It starts PostgreSQL, MinIO (file storage), runs the database migrations and starts the app.
  5. Open http://localhost:3000. The install wizard opens: create your admin account, set your brand, and choose whether to add sample sites.
To see what the app is doing: docker compose logs -f web. To stop it: docker compose down (your data stays in Docker volumes). To use another port, set WEB_PORT=8080 in .env.

4. Put it online (VPS, HTTPS)

The Docker stack includes Caddy, a web server that gets free HTTPS certificates automatically: for your app, for every free site address, and for every customer domain once its DNS points at you.

1. DNS records

At your domain registrar, add these records (replace 203.0.113.10 with your server's IP address):

TypeNameValueWhy
A@ (or app)203.0.113.10The builder and admin panel.
A*203.0.113.10Free site addresses like joes-bakery.yourbuilder.com.
Asites203.0.113.10The target your customers point their own domains at (CNAME).

2. Settings

In deploy/.env:

APP_URL=https://yourbuilder.com
ROOT_DOMAIN=yourbuilder.com
CNAME_TARGET=sites.yourbuilder.com
SERVER_IP=203.0.113.10

3. Start with HTTPS

Open ports 80 and 443 in your server's firewall, then:

docker compose --profile https up -d --build

Open https://yourbuilder.com. The first visit to each address takes a few seconds while its certificate is issued. Caddy asks Buildora before every new certificate, so only your app, real site addresses and connected customer domains get one.

Already run Nginx, Traefik or another proxy on this server? Skip the https profile, forward your app domain, the wildcard *.yourbuilder.com and all other hosts to http://127.0.0.1:3000, and keep the original Host header. Set WEB_PORT=127.0.0.1:3000 so the app is reachable only through your proxy. Customer domains then need certificates from your proxy (Traefik and Caddy can do this on demand; plain Nginx cannot).

5. Other hosting

A server without Docker

  1. Install Node.js 22, pnpm (npm install -g pnpm) and PostgreSQL. Create a database and a user for Buildora.
  2. In buildora_web_nextjs/: cp .env.example .env, then set DATABASE_URL, APP_URL and APP_SECRET.
  3. Install, migrate and build:
    pnpm install
    pnpm prisma:migrate:deploy
    pnpm build
  4. Start it and keep it running with a process manager such as PM2:
    npm install -g pm2
    pm2 start "pnpm start" --name buildora
    pm2 save
  5. Put Caddy in front for HTTPS (copy deploy/Caddyfile and change web:3000 to 127.0.0.1:3000).

Uploads go to buildora_web_nextjs/uploads/ unless you set the S3_* keys. Back that folder up with your database.

Vercel with a managed database

Buildora runs on Vercel with a managed PostgreSQL (Neon, Supabase, Vercel Postgres…) and S3-compatible storage (Vercel has no permanent disk):

  1. Import the buildora_web_nextjs folder as a new Vercel project (framework: Next.js).
  2. Add the environment variables: DATABASE_URL, APP_URL, APP_SECRET, the five S3_* keys, and any optional keys.
  3. Run the migrations once from your computer: DATABASE_URL=… pnpm prisma:migrate:deploy.
  4. Deploy, open the app and finish the install wizard.
On Vercel, add *.yourbuilder.com to the project's domains for free site addresses, and add each customer domain to the project yourself (Vercel issues its certificate). Domain checks run when the customer presses "Check DNS now"; the 10-minute background re-check needs a long-running server. For a fully automatic custom-domain business, use the Docker stack.

6. Install wizard and sample data

The first visit to a new install opens the wizard at /install:

  1. Check the server: Node.js version, uploads folder or storage bucket, and required settings.
  2. Database: confirms the connection and that the migrations ran.
  3. Admin account: your name, email and password.
  4. Brand: app name, brand colour and tagline (change them later in Admin → Settings).
  5. Sample content: the three plans and eight templates are always added. Tick "Add three sample sites" to see a finished account.

Remove the sample sites later in Admin → Settings → Sample data. The wizard locks itself once an admin exists.

7. Setup check

Admin → Setup lists every outside service, the keys it reads from .env, and its state: Working, Check or Not set. Press Test all to make a small live call to each (database, AI provider, Stripe, SMTP, storage, stock photos). Keys live only in .env; after changing one, restart the app (docker compose up -d) and test again.

From a terminal you can run the same check: pnpm doctor in buildora_web_nextjs/.

8. AI providers and credits

  1. Get a key from OpenAI, Anthropic or Google AI Studio.
  2. Add it to .env (OPENAI_API_KEY, ANTHROPIC_API_KEY or GEMINI_API_KEY) and restart.
  3. Open Admin → AI settings, pick the provider, check the model name, and press Test connection.

Defaults: OpenAI gpt-5-mini, Claude claude-opus-5-5, Gemini gemini-2.5-flash. Any model your key can use works; type its name in AI settings, or set OPENAI_MODEL, ANTHROPIC_MODEL or GEMINI_MODEL in .env (the .env value wins). Smaller models cost less per site.

Credits

Each plan includes AI credits per month. In AI settings you set what each action costs: a whole new site (default 25), a new page (5) and one section rewrite (1). Credits reset each billing month.

When the provider fails

With Fall back to the demo writer on (the default), a user still gets a complete site if the provider times out or rejects the key; they see a short notice. The demo writer is a built-in template engine that fills each section from the business description. Turn the switch off to show an error instead.

Extra instructions for the AI (tone, words to avoid, house style) go in the Writing instructions box in AI settings.

9. Stock photos

Add a free PIXABAY_API_KEY (pixabay.com/api/docs) or PEXELS_API_KEY (pexels.com/api). Then AI drafts come with matching photos and the editor's Find a photo searches them. A chosen photo is copied into your storage, so sites never depend on the photo site. Without a key, sections show a soft colour until the customer uploads a photo.

Photos are subject to each provider's licence; both allow use on websites without attribution.

10. Site addresses and custom domains

Free addresses

With ROOT_DOMAIN=yourbuilder.com and a wildcard DNS record, each site lives at name.yourbuilder.com. Without ROOT_DOMAIN, sites live at yourbuilder.com/s/name, which needs no extra DNS. Customers change the name on the site's Publish page.

Custom domains

On plans with custom domains, the customer enters their domain on the Publish page and sees the exact DNS record to add:

Buildora checks the DNS when the domain is saved, when the customer presses Check DNS now, and every 10 minutes in the background. Once it points at you, Caddy issues the HTTPS certificate on the first visit.

11. Plans and payments (Stripe)

Plans

Admin → Plans edits each plan: name, monthly price, number of websites, AI credits, custom domains, whether the "Made with Buildora" badge can be removed, and which plan new users get. Three plans are included: Starter (free, 1 site, 50 credits), Growth ($12, 10 sites, 500 credits, custom domains) and Agency ($39, 50 sites, 3,000 credits).

Test checkout

Without Stripe keys, upgrades go through a test checkout: the plan changes at once and a payment marked "Test checkout" is recorded, so you can try everything. Set DEMO_PAYMENTS=false to hide paid plans until Stripe is set.

Connect Stripe

  1. In the Stripe dashboard copy the secret key into STRIPE_SECRET_KEY. Use a sk_test_… key first.
  2. Stripe → Developers → Webhooks → Add endpoint: URL https://yourbuilder.com/api/billing/webhook, events checkout.session.completed, invoice.paid, invoice.payment_failed and customer.subscription.deleted.
  3. Copy the endpoint's signing secret into STRIPE_WEBHOOK_SECRET, restart, and test in Admin → Setup.
  4. Turn on the Customer portal in Stripe (Settings → Billing → Customer portal) so customers can change cards and cancel.

Products and prices are created by Buildora at checkout from your plan settings, so there is nothing to copy from Stripe. A price change applies to new checkouts; existing subscriptions keep their price until you change them in Stripe.

Charging your customers through Buildora (selling plans) requires the Envato Extended Licence. See Support and licence.

12. Email

Set SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS and SMTP_FROM with the details from your email provider. Buildora sends password-reset links and new form-message alerts. Without SMTP, each email is written to the app log instead (docker compose logs web), which is handy while testing.

13. File storage

Logos, uploads and copied stock photos are stored:

Files are served through the app at /media/…, so the bucket stays private.

14. Using the builder

Create a site with AI

Dashboard → New site with AI. The customer enters the business name, type, a description, location, language and the pages to create, picks a style (or lets the AI choose), and presses Generate my site. About 20 to 60 seconds later the draft opens in the editor.

Or start from a template

Templates → Use copies a finished site (café, clinic, law firm, photographer, gym, landscaping, restaurant, salon) into the account.

The editor

Forms

The Contact form section stores every message in the customer's Form inbox (filters, unread, starred, CSV export) and emails them when SMTP is set.

15. The admin panel

PageWhat you do there
OverviewMonthly recurring revenue, users, paying customers, live sites, AI usage, revenue chart, customers by plan, setup health.
UsersSearch, filter by plan or status, change a plan (skips payment), reset AI credits, make or remove admins, suspend, reactivate or delete an account.
SitesEvery site with owner, status and pages; open it live or in the editor, take it offline, or delete it.
PlansEdit prices, limits and features (see Plans and payments).
PaymentsEvery invoice with status, search and filters.
TemplatesShow or hide templates, preview them, or turn any site into a new template.
AI settingsProvider, model, credit costs, fallback, instructions, usage.
SetupEvery key and a live test for each service.
SettingsBrand, sign-ups, the "Made with" badge, maintenance mode, legal pages, sample data.

16. Rebrand without code

In Admin → Settings: app name, support email, tagline, logo, favicon, brand colour (any colour; the app's buttons and highlights follow it), heading font, default light or dark mode, terms and privacy links, and whether anyone can sign up. Changes apply at once to the landing page, the builder, emails and receipts.

The landing page text lives in src/app/page.tsx if you want to rewrite it in your own words.

17. Every key, explained

All keys go in deploy/.env (Docker) or buildora_web_nextjs/.env (no Docker). Only the first three are required.

KeyRequiredWhat it does
Required
DATABASE_URLYesPostgreSQL 15+ connection string. The Docker stack builds it for you.
APP_URLYesPublic address of the app without a trailing slash, e.g. https://builder.example.com.
APP_SECRETYesA long random string (32+ characters). Protects sessions. Generate one with: openssl rand -hex 32.
Site addresses
ROOT_DOMAIN—Domain for free site addresses (<name>.ROOT_DOMAIN). Needs a wildcard DNS record. Empty = sites live at APP_URL/s/<name>.
CNAME_TARGET—Host customers point their own domain at. Defaults to sites.ROOT_DOMAIN, or the APP_URL host.
SERVER_IP—Your server's public IPv4 (comma separated). Lets customers use an A record instead of a CNAME.
AI
AI_PROVIDER—Forces a provider (openai, anthropic, gemini or demo). Empty = the choice in Admin → AI settings.
OPENAI_API_KEY—OpenAI key from https://platform.openai.com/api-keys.
OPENAI_MODEL—Overrides the OpenAI model set in Admin → AI settings.
ANTHROPIC_API_KEY—Anthropic (Claude) key from https://console.anthropic.com/settings/keys.
ANTHROPIC_MODEL—Overrides the Claude model set in Admin → AI settings.
GEMINI_API_KEY—Google Gemini key from https://aistudio.google.com/apikey.
GEMINI_MODEL—Overrides the Gemini model set in Admin → AI settings.
Stock photos
PIXABAY_API_KEY—Free key from https://pixabay.com/api/docs/. Turns on photo search and photos in AI drafts.
PEXELS_API_KEY—Free key from https://www.pexels.com/api/ (used when no Pixabay key is set).
Payments
STRIPE_SECRET_KEY—Stripe secret key from https://dashboard.stripe.com/apikeys. Empty = demo checkout.
STRIPE_WEBHOOK_SECRET—Signing secret of the webhook endpoint APP_URL/api/billing/webhook (Stripe → Developers → Webhooks).
DEMO_PAYMENTS—"false" hides the demo checkout while Stripe is not set (paid plans are then unavailable).
Email
SMTP_HOST—SMTP server (any provider: Amazon SES, Postmark, Mailgun, Gmail…). Empty = emails are printed to the log.
SMTP_PORT—Usually 587 (or 465 with SMTP_SECURE=true).
SMTP_USER—SMTP user name.
SMTP_PASS—SMTP password or API key.
SMTP_SECURE—"true" for port 465 (TLS from the start).
SMTP_FROM—Sender address, e.g. hello@yourdomain.com. Defaults to SMTP_USER.
File storage
S3_BUCKET—Bucket for uploads (AWS S3, Cloudflare R2, MinIO…). Empty = the local uploads folder.
S3_ENDPOINT—Endpoint for non-AWS stores, e.g. https://<account>.r2.cloudflarestorage.com.
S3_REGION—Region, e.g. us-east-1 (R2: auto).
S3_ACCESS_KEY_ID—Access key for the bucket.
S3_SECRET_ACCESS_KEY—Secret key for the bucket.
UPLOAD_DIR—Local folder for uploads when no bucket is set. Default: ./uploads.
Demo
DEMO_MODE—"true" only for a public demo: one-click demo sign-in, read-only admin, nightly reset, no emails.

The Docker stack also reads POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD (it builds DATABASE_URL from them) and WEB_PORT.

18. File structure

buildora_web_nextjs/
  src/app/                 pages and API routes (App Router)
    page.tsx               your landing page
    (auth)/                sign in, sign up, password reset
    install/               the install wizard
    app/                   the builder (dashboard, sites, editor, inbox, billing…)
    admin/                 the admin panel
    s/ d/ t/               published sites (free address, custom domain, template preview)
    api/                   JSON API used by the builder and admin
  src/components/          React components (editor/, app/, admin/, site/, marketing/)
  src/lib/blocks.ts        the 14 section types: fields and defaults
  src/lib/themes.ts        the six styles, colours and fonts of published sites
  src/lib/server/          auth, AI adapters, billing, email, storage, stock photos, jobs
  src/database/            Prisma schema, migrations and seed data
  src/tests/               unit and API tests (Vitest)
  e2e/                     browser tests (Playwright)
deploy/
  docker-compose.yml       the whole stack
  Caddyfile                automatic HTTPS
  .env.example             every setting, explained

19. Customise the code

Run it for development

cd buildora_web_nextjs
cp .env.example .env        # set DATABASE_URL, APP_URL=http://localhost:3000, APP_SECRET
pnpm install
pnpm prisma:migrate:deploy
pnpm dev

Checks: pnpm lint, pnpm typecheck, pnpm test (uses TEST_DATABASE_URL or DATABASE_URL; the tests work in their own schema), pnpm e2e.

Add a section type

  1. Add its fields and defaults to BLOCK_KINDS in src/lib/blocks.ts. The editor builds its form from these fields, and the AI is told about them automatically.
  2. Draw it in src/components/site/site-renderer.tsx, next to the existing types.

Add a style

Add a preset to src/lib/themes.ts (colours, fonts, button shape). New fonts go in src/app/fonts.ts; they are self-hosted at build time, so published sites call no font server.

Add an AI provider

Providers live in src/lib/server/ai/providers.ts. Each one takes a system prompt and a user message and returns JSON; add yours there and to the provider list in AI settings.

20. Updating

  1. Back up your database (docker compose exec postgres pg_dump -U buildora buildora > backup.sql) and your .env.
  2. Replace the buildora_web_nextjs/ folder with the new one. Keep deploy/.env.
  3. Run docker compose up -d --build. Migrations run automatically before the app starts.

If you changed the code, compare your changes with the new version first (a Git repository makes this easy). Read CHANGELOG.md for what changed.

21. FAQ and troubleshooting

The page says "Install" again after a restart.

The app cannot see its database. Check docker compose ps and docker compose logs migrate; in a non-Docker install check DATABASE_URL.

AI drafts look generic.

No AI key is set, or the provider failed and the demo writer answered. Open Admin → AI settings, press Test connection, and look at docker compose logs web for lines starting with [ai].

Sites have no photos.

Add a Pixabay or Pexels key (see Stock photos). Existing sites keep their sections; use Find a photo in the editor.

A customer domain stays "Waiting for DNS".

DNS changes can take up to an hour. Check the record with dig www.customer.com: it must show your CNAME_TARGET or SERVER_IP. Cloudflare users must set the record to "DNS only" (grey cloud).

HTTPS does not work for a domain.

Ports 80 and 443 must be open, the app must be started with --profile https, and the domain must already point at the server. docker compose logs caddy shows each certificate request.

I forgot the admin password.

Use "Forgot password" on the sign-in page (with SMTP set, or read the link in the log).

Upgrades do not change the plan with Stripe.

The webhook is missing or its secret is wrong. Check Stripe → Webhooks for failed deliveries and Admin → Setup → Payments.

Port 3000 is already used.

Set WEB_PORT to a free port in deploy/.env and run docker compose up -d.

22. Credits

Buildora is built with these open-source projects, each under its own licence (MIT unless noted):

The photos in our live demo come from Pixabay and are not included in the download. Templates in the download have no photos; with a stock photo key, photos are fetched for each new site.

23. Changelog

Version 1.0.0 (16 October 2026)

24. Support and licence

Questions, bug reports and help with installation: use the Support tab on the item's page on the marketplace. Please include your Buildora version, how you host it (Docker, Node.js or Vercel) and what you see (a screenshot or the lines from docker compose logs web). Never send us your API keys or passwords.

Support covers questions about the item's features, help with bugs and help with installing it as described here. It does not cover custom changes to the code or third-party services.

Licence. The Regular Licence lets you use Buildora for one product where your end users are not charged. To charge your customers (sell plans, subscriptions or paid sites), you need the Envato Extended Licence. Details: codecanyon.net/licenses/standard.