Skip to main content

Full conversion — start to finish

This is the complete picture: everything you download once, the inputs you gather per site, and the two ways to run a conversion — the automated Site Converter, and the higher-fidelity AI-assisted build. The other pages in this section go deep on each piece; this one ties them together so you know the whole flow before you start.

💡 Web dev tip: re-measure performance after the import, don't assume it

A source site's speed doesn't automatically transfer to the converted copy — new markup, a different theme's CSS/JS, and freshly imported (often unoptimized) images can all shift your Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift. Run a Core Web Vitals check once the conversion is done rather than assuming "it matched the source" also means "it's fast." web.dev: Web Vitals

Two lanes, one goal

Both lanes turn a source design into a native, editable Unyson+ site — a child theme + page-builder pages + real menus + populated Media Library. Nothing is hand-coded HTML; every page stays editable in the builder.

Step 1 — Install once (your workspace)​

You set these up a single time; then every conversion reuses them.

#WhatWhere / how
1Unyson+ pluginInstall & activate the plugin in Plugins → Add New → Upload (the framework that powers everything).
2Parent theme unysonplus-themeInstall & activate under Appearance → Themes. A conversion builds a child of this theme.
3Site Converter extensionEnable it in Unyson+ → Extensions. The tool then appears at Unyson+ → Convert.
4The capture service (for URLs + full-fidelity file rendering)Clone UnysonPlus-Capture-Service, then run it (below). Needs Node 20+ and Google Chrome.
5(Optional) AIYour AI subscription through a signed-in command-line AI agent (no key), a provider API key (pay per use), or a free local model — see Set up AI for Unyson+. Enables AI assist / the AI-assisted lane.

Start the capture service (leave the terminal open while converting):

# inside the UnysonPlus-Capture-Service clone
cd tools/design-capture
npm install # first time only
node serve.mjs # serves http://localhost:8787

The status next to Analyze & convert in wp-admin turns green once it's detected. The first time it checks, Chrome asks whether your site may "Access other apps and services on this device" — click Allow (the admin page is calling the service on localhost); a blocked prompt leaves the status on "not detected". Full detail — endpoints, ports, security, troubleshooting — is on The capture service.

No Node?

You can still convert a file offline (lower fidelity) and import a pre-built bundle under Manual tools. The capture service is only needed to render live URLs (and to render file uploads at full fidelity).

Step 2 — Gather your source inputs​

What you collect depends on how faithful you need the result.

Minimum (automated lane): one of —

  • a source URL (a live site / an AI-generated preview link — Lovable, v0, Bolt, Stitch, any Tailwind/Bootstrap page), or
  • a design file — a Google Stitch .zip or a pasted code.html.

For the highest fidelity (AI-assisted lane) — also grab, into a folder per site:

InputWhy it helps
The rendered view-source.html (the live DOM, "Save as → Webpage, HTML only" or copy the rendered source)The authoritative computed markup/classes. It wins over any framework source (page.tsx etc.), which can be an earlier variant.
A full-page reference screenshotThe fidelity target — you diff the rebuilt page against it, section by section.
Real media — the hero video.mp4, key imagesSo the build uses the actual assets (sideloaded into the Media Library), not hot-linked placeholders.
The source files (page source / component files)Exact tokens (hex, font families, spacing) when the view-source is ambiguous.

Step 3 — Convert (pick a lane)​

Lane A — Automated (the Site Converter UI)​

Point-and-click in Unyson+ → Convert. It renders the design, reads the real layout + computed styles, and rebuilds it as clean shortcodes + a matching child theme — each page reviewable before it's built.

Lane B — AI-assisted, high-fidelity build​

When you need it pixel-close — a flagship page, a client site, a demo — pair the capture service with an AI coding assistant driving the build from your gathered inputs (view-source + screenshot + media). This lane leans on the extra inputs from Step 2 and the method below to reproduce the design from Theme Settings + shortcode options in a near-empty child theme (not a wall of scoped CSS).

Step 4 — Review & refine​

  • Review before build — the converter shows each section → the shortcode it will become; adjust roles before committing.
  • Diff against the screenshot — compare the rebuilt page to your reference, section by section, and correct spacing / colors / type until it matches. Fidelity is measured, not guessed.
  • Iterate one thing at a time — colors → typography → buttons → boxes → spacing → per-element, verifying each before the next (never a big-bang rewrite).

What you end up with​

  • A child theme of unysonplus-theme reproducing the palette, fonts, spacing, and header/footer.
  • A dynamic header + footer — a real WordPress nav menu + footer widget areas, styled to match.
  • Pages rebuilt as page-builder sections → the right native shortcodes (special_heading, icon_box, feature_list, counter, media_image, media_video, button, table, …).
  • Media in the Library (de-duped by source URL) and styling presets (palette, type scale, button styles, spacing) that the shortcodes reference.

The method, in one breath​

The north star both lanes aim for:

  1. Theme-Settings-first — colors, typography, buttons, box/card presets, and spacing become presets that elements consume; if a needed control is missing, it belongs in the framework, not in hardcoded child CSS.
  2. Measure, don't guess — read the source's computed styles (the view-source is authoritative) and match them; verify each step against the reference.
  3. Right element for the content — pick the purpose-built shortcode (a stat number → counter, an icon list → feature_list, a single image → media_image, a video → media_video), and don't add motion the source doesn't have.