# Demo transcript: a WordPress site moves to the Internet Computer

This 75-second recording has no audio. It shows a city council website built on WordPress being moved to the Internet Computer (ICP) by a coding agent using the migrating-php-apps skill, and the result running on ICP mainnet. Every command shown ran for real; waiting time was removed. Private payment details, funding amounts, balances, the owner controller identifier and internal workspace paths are hidden in this public edit.

## Opening card (0:00)

The kicker reads “migrating-php-apps · real run · waiting removed”. The title reads “A WordPress site moves to the Internet Computer.” Below it: “A city council website with a custom theme, forms, comments and search, moved by a coding agent with the migrating-php-apps skill. Every command below ran for real.”

## Before: the WordPress site (0:04)

A browser window labelled “Before · WordPress on PHP” shows `larkhaven.test`, the website of the fictional City of Larkhaven. The view moves down the home page: the hero with a service search, popular services, latest news and what’s on. It then shows the bin collection days page and the comments on the “Draft budget 2027: your priorities” consultation. Captions read “Custom theme”, “Contact Form 7 · Yoast SEO · ACF” and “Comments · search · events”.

## The agent’s run (0:14)

A terminal replays eleven steps from the recorded mainnet run. Each segment has a numbered title with its phase, the command, and lines copied from its real output. Long outputs are trimmed to the relevant lines; no text is changed. A progress bar runs along the top.

- **1 of 11: Phase 1 · Inventory: what does this site actually contain?** (0:14). The inventory script, `bash php-inventory.sh /var/www/larkhaven`, detects WordPress and lists the installed plugins (Yoast SEO, Advanced Custom Fields, Contact Form 7), the installed themes including the custom `larkhaven` theme, 2,347 PHP source files with 339,710 lines, the files that handle form posts (100), file uploads (8) and email (3), and 114 MB of uploads in 615 files. Only selected lines of the report are shown.
- **2 of 11: Phase 4 · Export through WordPress itself (no password hashes)** (0:18). `bash tools/export-batches.sh` exports the content through WordPress itself, without password hashes, and converts it to Candid batches: 70 content rows, 70 search rows, 19 comments, 4 users, 3 forms and 34 form rules.
- **3 of 11: Phase 3 · Snapshot every public page, file and old URL** (0:20). `bash tools/snapshot-site.sh` snapshots the public site and reports 981 URLs by status: 727 with 200, 181 with 301, 1 with 302 and 72 with 404.
- **4 of 11: Phase 6 · Buy cycles by card (CyclePay)** (0:23). CyclePay funding took place during the recorded run. The public edit hides payment links, order identifiers, amounts, fees, account balances and the associated command output. Card checkout is not shown.
- **5 of 11: Phase 6 · Create the two canisters on ICP mainnet** (0:26). The frontend and backend canisters were created on ICP mainnet. Funding allocations are hidden in this public edit. Their public demo addresses remain visible later in the video.
- **6 of 11: Phase 6 · Add the owner as a backup controller** (0:29). The owner was added as a backup controller of both canisters. The controller identifier and command are hidden in this public edit.
- **7 of 11: Phase 3 · Build the site at its old paths for the mainnet address** (0:31). The site was built for its public mainnet address. Internal workspace paths and the associated output are hidden in this public edit.
- **8 of 11: Phase 6 · Deploy to ICP mainnet** (0:34). `icp deploy -e ic` installs both canisters, syncs 722 assets to the frontend canister and lists the two canister URLs.
- **9 of 11: Phase 4 · Import into the backend canister (controller-only, safe to re-run)** (0:37). The import tool loads the batches into the backend canister: 70 content rows, 70 search documents, 19 comments, 3 forms, 34 form rules and 4 legacy users. The segment title says the import is controller-only and safe to re-run; a repeat run is not shown.
- **10 of 11: Phase 4 · Reconcile against the WordPress database** (0:40). A query of the backend canister's import counts shows 70 content items, 70 search documents, 70 routes, 19 comments (19 approved), 3 forms, 34 form rules and 4 legacy users. These match the WordPress database (70 posts and pages, 19 comments, 3 forms and 4 staff records); the WordPress side of the comparison is not shown on screen.
- **11 of 11: Phase 6 · Check every old URL against the live site** (0:43). The URL checker requests 987 old URLs from WordPress and from the live site. 808 behave the same at HTTP level, 176 query-string links are resolved in the browser, and 3 differ: `/wp-admin/`, `/wp-login.php` and `/xmlrpc.php`, which were retired on purpose.

## Proof (0:45)

WordPress (left) and the live ICP site (right) show the `/events/` page side by side and scroll together. The two full-page captures are then subtracted: WordPress minus ICP gives a black difference panel reading “0 differing pixels” (2400 × 6636 px compared), and the corner label reads “Proof · /events/ is pixel-identical”. A caption reads “987 old URLs checked on the live site: 808 identical, 176 query links resolved in the browser, 3 retired on purpose”.

## After: the live site on ICP mainnet (0:55)

The same browser window, labelled “After · canisters on ICP mainnet”, shows `lhhxl-xqaaa-aaaao-qqkwq-cai.icp.net`. These steps were recorded on the live site:

- The old bookmark `/?p=92` is typed into the address bar and the browser lands on the news article “Harbour Bridge closes 24–26 October for repairs”. Caption: “An old ?p=92 bookmark still lands on the article”.
- The contact form is filled in: name “Demo recording”, email demo@example.com, topic “General enquiry”, message “Recorded for the demo video. Please ignore.” The consent box is ticked and the form is sent. The site replies “Thank you. We have received your message and will reply within 5 working days. We have also sent a confirmation to your email address.” Caption: “Forms answered by a Motoko backend”.
- “bins” is typed into the site search and the results page lists 7 results, with the matches highlighted. Caption: “Search ported from WordPress”.

## Closing card (1:10)

The card reads “Same site. Same links. No PHP engine, web server or OS left to patch.” It shows “See it live: lhhxl-xqaaa-aaaao-qqkwq-cai.icp.net” and “Get the skill: movetomotoko.com”. The small print reads “Larkhaven is a fictional city built for this demo. Photos: Creative Commons, credited on the site.”

The recording shows selected pages, data and URL checks. Sign-in and the admin area, email delivery, integrations, a production-domain cutover and retiring the old host need their own evidence. Your team remains responsible for the rebuilt application, its access controls, dependencies and operation.
