{"id":376045,"date":"2026-10-24T09:20:22","date_gmt":"2026-10-24T09:20:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/esipher-ai-site-to-theme-converter\/"},"modified":"2026-10-25T07:55:53","modified_gmt":"2026-10-25T07:55:53","slug":"esipher","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/esipher\/","author":23573728,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.0","stable_tag":"0.3.0","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Esipher - AI Site to Theme Converter","header_author":"<a href=\"https:\/\/inwebtify.com\/\">Samuel Olaosebikan<\/a> & <a href=\"https:\/\/github.com\/adebayomoses\">Moses Adebayo<\/a>","header_description":"Converts AI site builder exports (Lovable, Bolt.new and other Vite\/React builds) into an activatable theme. The core conversion runs entirely on your own site; optional GitHub and app-build features are described in the readme.","assets_banners_color":"fdfdfe","last_updated":"2026-10-25 07:55:53","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/inwebtify.com\/esipher","header_author_uri":"https:\/\/inwebtify.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":103,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.0":{"tag":"0.2.0","author":"oluwaseunolaosebikan","date":"2026-10-24 09:20:12","revision":3762994},"0.2.1":{"tag":"0.2.1","author":"oluwaseunolaosebikan","date":"2026-10-24 09:32:20","revision":3763012},"0.2.2":{"tag":"0.2.2","author":"oluwaseunolaosebikan","date":"2026-10-24 18:57:47","revision":3763670},"0.3.0":{"tag":"0.3.0","author":"afrirates","date":"2026-10-25 07:55:53","revision":3764075}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3763190,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3763190,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3763514,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3763488,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.2.0","0.2.1","0.2.2","0.3.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3763661,"resolution":"1","location":"assets","locale":"","width":1280,"height":760},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3763661,"resolution":"2","location":"assets","locale":"","width":1280,"height":600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3763661,"resolution":"3","location":"assets","locale":"","width":1280,"height":1472},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3763661,"resolution":"4","location":"assets","locale":"","width":1280,"height":1330}},"screenshots":{"1":"Convert screen - upload an AI site-builder export ZIP and turn it into a theme.","2":"Connected Projects - GitHub-synced projects with live status and one-click \"Apply update\".","3":"Mobile App (Android) - app settings plus build status and download.","4":"Mobile App (iOS) - App Store Connect details and iOS build status."}},"plugin_section":[],"plugin_tags":[2353,5520,87,43073,258580],"plugin_category":[59],"plugin_contributors":[281570,288214],"plugin_business_model":[],"class_list":["post-376045","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-converter","plugin_tags-import","plugin_tags-theme-generator","plugin_tags-vite","plugin_category-utilities-and-tools","plugin_contributors-afrirates","plugin_contributors-oluwaseunolaosebikan","plugin_committers-afrirates","plugin_committers-oluwaseunolaosebikan"],"banners":{"banner":"https:\/\/ps.w.org\/esipher\/assets\/banner-772x250.jpg?rev=3763488","banner_2x":"https:\/\/ps.w.org\/esipher\/assets\/banner-1544x500.jpg?rev=3763514","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/esipher\/assets\/icon-128x128.png?rev=3763190","icon_2x":"https:\/\/ps.w.org\/esipher\/assets\/icon-256x256.png?rev=3763190","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/esipher\/assets\/screenshot-1.png?rev=3763661","caption":"Convert screen - upload an AI site-builder export ZIP and turn it into a theme."},{"src":"https:\/\/ps.w.org\/esipher\/assets\/screenshot-2.png?rev=3763661","caption":"Connected Projects - GitHub-synced projects with live status and one-click \"Apply update\"."},{"src":"https:\/\/ps.w.org\/esipher\/assets\/screenshot-3.png?rev=3763661","caption":"Mobile App (Android) - app settings plus build status and download."},{"src":"https:\/\/ps.w.org\/esipher\/assets\/screenshot-4.png?rev=3763661","caption":"Mobile App (iOS) - App Store Connect details and iOS build status."}],"raw_content":"<!--section=description-->\n<p>AI site builders produce a polished Vite\/React + Tailwind site in minutes, exported as a ZIP. Esipher turns that export into a real, activatable theme. The core conversion - extraction, parsing, asset rewriting, theme generation and installation - runs entirely on your own server: no third-party upload service, no external API call.<\/p>\n\n<p>Developed by <a href=\"https:\/\/inwebtify.com\/\">Samuel Olaosebikan<\/a> and <a href=\"https:\/\/github.com\/adebayomoses\">Moses Adebayo<\/a>.<\/p>\n\n<p>Work from the admin screen (Esipher in wp-admin) or from WP-CLI (<code>wp esipher convert<\/code>).<\/p>\n\n<p>Two optional features connect to third-party APIs, and only when you set them up (see \"External services\" below):<\/p>\n\n<ul>\n<li>Esipher &gt; Connected Projects - connect your own GitHub account and repo. GitHub rebuilds on every push and Esipher shows an \"Apply update\" button; an administrator clicks it to update the theme. Nothing is installed or activated without that click.<\/li>\n<li>Esipher &gt; Mobile App - Esipher generates a build project in a GitHub repo you own; GitHub Actions builds a native Android (and, optionally, iOS) app from your site.<\/li>\n<\/ul>\n\n<p>This is an early development build; per-builder adapters beyond the generic fallback and a conversion history\/rollback screen are still to come.<\/p>\n\n<h4>What does not convert<\/h4>\n\n<ul>\n<li>Supabase-backed auth, database reads\/writes, and live data - detected and reported, never silently dropped.<\/li>\n<li>Client-side routing beyond what exists in the built HTML.<\/li>\n<li>Custom component layouts (cards, nav bars, icons) - these display exactly as exported, but aren't broken into individually editable pieces yet. Headings, paragraphs, and images <em>within<\/em> multi-page conversions are: they come through as real, native Block Editor blocks.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>The core \"upload a ZIP and get a theme\" flow makes no external requests. The features below\ndo, and only after you enable them and provide your own credentials. You can use the plugin\nindefinitely without ever touching them.<\/p>\n\n<h4>GitHub (github.com, api.github.com)<\/h4>\n\n<p>Used by <strong>Connected Projects<\/strong> and <strong>Mobile App<\/strong>. When you connect a repo, sync, or build an\napp, the plugin talks to the GitHub REST API as your own GitHub account, using an OAuth access\ntoken you obtain by authorising your own GitHub OAuth App. It sends: that access token, the\nrepository owner and name you enter, the contents of the build workflow file it commits into\nyour repo, webhook configuration (including a random shared secret), Actions repository\nsecrets and variables it sets for the build, and, for the Mobile App feature, an\nApp-Store-Connect-signed certificate request routed to Apple (see below). It downloads the\nbuild artifacts your workflow produces. The OAuth sign-in also redirects your browser to\ngithub.com. For Connected Projects, GitHub also calls this site's REST route\n(<code>\/wp-json\/esipher\/v1\/github-webhook<\/code>) when a build finishes; the request is verified with the\nwebhook's shared secret and only records that an update is ready. Nothing is sent to GitHub\nunless you have connected an account.<\/p>\n\n<p>GitHub Terms of Service: https:\/\/docs.github.com\/en\/site-policy\/github-terms\/github-terms-of-service\nGitHub Privacy Statement: https:\/\/docs.github.com\/en\/site-policy\/privacy-policies\/github-general-privacy-statement<\/p>\n\n<h4>Apple App Store Connect (api.appstoreconnect.apple.com)<\/h4>\n\n<p>Used by the <strong>Mobile App<\/strong> feature only, and only if you fill in the iOS fields (Apple Team\nID, App Store Connect API Key ID, Issuer ID and .p8 key). When you save those and start an\niOS build, the plugin calls the App Store Connect API, authenticating with a short-lived\nJSON Web Token it signs locally with your .p8 key. It sends: a certificate signing request\n(to obtain an Apple Distribution certificate), your app's bundle identifier (to register it\nif needed), and a request to create an App Store provisioning profile. It receives the\ncertificate and provisioning profile, which are stored encrypted on your site and set as\nGitHub Actions secrets for the build. No request is made to Apple unless you provide an App\nStore Connect API key.<\/p>\n\n<p>Apple Media Services Terms: https:\/\/www.apple.com\/legal\/internet-services\/itunes\/\nApple Privacy Policy: https:\/\/www.apple.com\/legal\/privacy\/<\/p>\n\n<h4>Original project image hosting (opt-in)<\/h4>\n\n<p>The multi-page conversion option <strong>\"Try to recover cloud-hosted images from the original\nproject\"<\/strong> (and the WP-CLI <code>--recover-images<\/code> flag) fetches image files from the URL your AI\nsite builder still hosts them at (for Lovable exports this is a <code>*.lovableproject.com<\/code>\naddress derived from a descriptor file inside your own export). The request sends only a normal\nHTTP GET for each image path, so the host sees your site's IP address. This happens only for that\none opt-in setting, and only for images your export references but did not bundle. No other\nrequest is made to that host. This service is provided by Lovable.<\/p>\n\n<p>Lovable Terms of Service: https:\/\/lovable.dev\/terms\nLovable Privacy Policy: https:\/\/lovable.dev\/privacy<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/esipher<\/code>, or install it from the Plugins screen.<\/li>\n<li>Activate it through the \"Plugins\" screen.<\/li>\n<li>Open <strong>Esipher<\/strong> in the wp-admin menu and upload your export ZIP, or run\n   wp esipher convert  from WP-CLI.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20there%20a%20video%20walkthrough%3F\"><h3>Is there a video walkthrough?<\/h3><\/dt>\n<dd><p>Yes: <a href=\"https:\/\/youtu.be\/6-ne9-7Wgt4\">https:\/\/youtu.be\/6-ne9-7Wgt4<\/a> covers exporting from Lovable, building it with the Esipher Build template, and converting it here, start to finish.<\/p><\/dd>\n<dt id=\"does%20my%20code%20ever%20leave%20my%20server%3F\"><h3>Does my code ever leave my server?<\/h3><\/dt>\n<dd><p>No. The entire conversion pipeline - extraction, parsing, asset rewriting, theme generation, and installation - runs locally within your WordPress install.<\/p><\/dd>\n<dt id=\"can%20esipher%20skip%20the%20manual%20export%2Fupload%20entirely%20and%20just%20stay%20in%20sync%3F\"><h3>Can Esipher skip the manual export\/upload entirely and just stay in sync?<\/h3><\/dt>\n<dd><p>Yes, under Esipher &gt; Connected Projects. Connect your own GitHub account (you register a free GitHub OAuth App once and paste its Client ID\/Secret in - no third-party broker, same \"your account, your server\" model as the rest of this plugin), then connect the GitHub repo your AI builder syncs to (e.g. GitHub sync from the Lovable or Bolt.new project menu). Esipher commits a small build workflow into that repo and registers a webhook; from then on, every push builds on GitHub and Esipher flags it as \"Update ready\"; an administrator clicks \"Apply update\" to download that build and update the theme - no export, no template repo, no manual artifact download. The incoming webhook only records that a build is ready: it can never install or activate anything by itself. A \"Sync now\" button triggers a rebuild without waiting for your next push. This is separate from, and doesn't replace, the manual ZIP-upload flow below.<\/p><\/dd>\n<dt id=\"my%20lovable%20or%20bolt.new%20export%20was%20rejected%20as%20%22raw%20source%2C%20not%20a%20build%22%20-%20what%20do%20i%20do%3F\"><h3>My Lovable or Bolt.new export was rejected as \"raw source, not a build\" - what do I do?<\/h3><\/dt>\n<dd><p>Esipher converts a Vite build's finished output, not a project's raw, uncompiled source. If you exported straight from Lovable or Bolt.new and have never run a build on it, use the <a href=\"https:\/\/github.com\/adebayomoses\/Esipher-Build\">Esipher Build<\/a> template: a free, one-click GitHub Actions workflow made for this. Open that page, click \"Use this template\" to get your own copy, upload your export's raw .zip to it, and a build runs automatically - no installs, no command line. Download the finished result from that run's Artifacts and upload it to Esipher instead of the original file.<\/p>\n\n<p>This template is the recommended path for Lovable and Bolt.new exports; StackBlitz (build in your own browser) is a general-purpose fallback for other builders' exports.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>New: redesigned admin dashboard. All Esipher screens (Convert, Connected Projects, Mobile App) share a branded header with navigation, card-based sections, clearer forms and colour-coded status labels. The Mobile App screen uses a side menu for Android and iOS.<\/li>\n<li>Change: new Esipher menu icon, and the \"how it works\" steps now sit below the convert form.<\/li>\n<li>Fix: removed an outdated note about a server-side build option that no longer exists.<\/li>\n<li>Housekeeping: added screenshots to the plugin page.<\/li>\n<\/ul>\n\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>Credits: developers listed in the readme and plugin header.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Fix: plugin author is now shown correctly in the directory.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>New: Bolt.new exports are supported alongside Lovable (built Vite\/React output converts the same way; raw Bolt.new source is detected and pointed at the Esipher Build template), and Connected Projects works with Bolt.new's GitHub sync as well.<\/li>\n<li>New: Esipher &gt; Connected Projects - connect a GitHub-synced AI-builder repo\nonce (your own OAuth App, your own account). Every push builds on GitHub; a\nwebhook (with an hourly cron safety net) flags \"Update ready\" and an\nadministrator applies it with one click. A manual \"Sync now\" button\ntriggers a rebuild.<\/li>\n<li>Fix: the GitHub connection now also requests the \"workflow\" OAuth scope,\nwhich GitHub requires to commit the build workflow file. Without it,\nconnecting a project failed with a bare \"Not Found\". If you connected a\nGitHub account on an earlier build, disconnect and reconnect once to grant\nthe added permission - the settings screen warns when this is needed.<\/li>\n<li>Fix: downloading a build artifact failed with \"HTTP 401\" - the request to\nthe artifact's signed storage URL was still carrying the GitHub auth\nheader. The download now follows that redirect without it.<\/li>\n<li>Fix: an auto-sync would report \"Up to date\" while the site still showed a\ndifferent theme. With \"Keep this theme active\" enabled (the default), a\nconnected project now re-activates its theme on any sync where the site\nisn't already on it, not only the first - and a successful sync that\nleaves the theme inactive now says so instead of a bare \"Up to date\".<\/li>\n<li>Fix: disconnecting a project now always forgets it locally even if GitHub\nwon't remove the webhook, so a later reconnect starts from a clean slate\ninstead of silently reusing stale sync state.<\/li>\n<li>New: multi-page conversions now bundle a tiny dependency-free script that\nrestores the mobile menu. Because a multi-page conversion ships no framework\nJavaScript, the hamburger button had nothing wiring it up; the helper wires\nit - toggling an existing hidden menu panel, or, when the panel only existed\nin the framework's runtime, synthesising one from the nav's own links.<\/li>\n<li>New: Esipher &gt; Mobile App - wrap the site in a native app. Esipher generates\na Capacitor project in a GitHub repo you own and a bundled GitHub Actions\nworkflow builds it:\n\n<ul>\n<li>Android (always): a debug APK (sideload to test) and a signed release AAB\n(for the Google Play Console). The signing keystore is generated in pure\nPHP (no Java), stored encrypted, and set as encrypted repo secrets.<\/li>\n<li>iOS (optional, \"iOS\" tab): a signed .ipa for App Store Connect \/ TestFlight,\nbuilt on a macOS runner. Needs a paid Apple Developer account and an App\nStore Connect API key (Team ID, Key ID, Issuer ID, .p8) - leave those blank\nand the iOS build is skipped. From that key Esipher provisions a\ndistribution certificate and an App Store provisioning profile via the App\nStore Connect API (no Mac, no manual certificate steps), stores them\nencrypted, and the workflow signs with them.\nAndroid and iOS build independently: the Android tab builds Android only, the\niOS tab builds iOS only, and an \"Rebuild Android + iOS\" button builds both.\nSo an Apple-side problem never blocks or red-flags an Android build.\nUses the same GitHub connection as Connected Projects.<\/li>\n<\/ul><\/li>\n<li>Change: removed the server-side \"build it now\" \/ <code>wp esipher convert --build<\/code>\noption, which ran a project's own npm\/yarn\/pnpm\/bun install and build on the\nserver. Build raw source with the Esipher Build GitHub template, a local\nbuild, or Connected Projects instead, then upload\/sync the output.<\/li>\n<li>Housekeeping: uploads now go through wp_handle_upload(); ZIP extraction and\ncleanup go through WP_Filesystem; renamed to \"Esipher - AI Site to Theme\nConverter\".<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial development build: headless conversion engine driven by WP-CLI, generic adapter only.<\/li>\n<\/ul>","raw_excerpt":"Convert Lovable, Bolt.new and other Vite\/React site exports into a theme on your own server. Optional GitHub sync and mobile app builds.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/376045","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=376045"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/oluwaseunolaosebikan"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=376045"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=376045"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=376045"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=376045"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=376045"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=376045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}