Small-Business → AT Protocol Migration Toolkit — Research Brief
0
Migration_Toolkit_research.md#
Small-Business → AT Protocol Migration Toolkit — Research Brief#
Seed document for a new project chat · Derived from the AT Protocol Ecosystem Repository Analysis (2026-08-12)
1. The Opportunity#
ptharbor is an existence proof: a real small business (Point Harbor Signs) was migrated off Weebly onto a fully AT Protocol–native stack, and its README explicitly frames itself as "a repeatable blueprint for migrating small businesses off Facebook/Instagram/WordPress/Wix to AT Protocol." But every step was manual: hand-ported HTML, hand-run key-generation and deploy scripts, hand-written did:web documents. The toolkit's job is to turn that blueprint into an automated, repeatable pipeline.
2. The Proven Reference Architecture (from ptharbor)#
| Layer | ptharbor's choice | Notes |
|---|---|---|
| Website hosting | wisp.place (PDS-based static hosting) | Site files stored as PDS blobs, signed manifest, CDN cache invalidated via firehose |
| Identity | did:web (did-web/ dir, did.json served at the business domain) |
Alternative: did:plc |
| PDS | Protobase.at (managed PDS) | Business doesn't self-host |
| Code hosting | Tangled (ATProto-native git) | |
| Domain | Marque.at (registrar) | Optional layer |
| Site itself | Plain static HTML, no framework | Ported from Weebly |
3. What the Toolkit Must Automate (pipeline stages)#
- Scrape/export — pull the existing site from Weebly/Wix/WordPress/Squarespace/Facebook Pages. WordPress has XML export; Wix/Weebly/FB generally require crawling the rendered site.
- Static port — normalize scraped output into clean static HTML/CSS; strip builder junk (tracking scripts, builder CSS bloat); rewrite internal links; generate
_redirectsfor old URL structures (wisp.place supports_redirectsand.wispignore— confirmed in the wisp.place monorepo). - Identity setup — generate did:web document (did.json) for the business domain, or register a did:plc; produce DNS instructions (
_atprotoTXT record for handle verification). - PDS provisioning — guided checklist for a managed PDS (Protobase.at or similar) or self-host option; account creation, handle = business domain.
- Deploy — push the ported site to wisp.place via
wispctl/npm create wisp(both confirmed as the official deploy paths in the wisp.place monorepo). - Repo setup — init a Tangled repo for the site source; optionally emit a
.tangled/workflows/deploy.ymlSpindle workflow so future pushes auto-deploy (Spindle supports push-triggered YAML pipelines with repo secrets — see Tangled Spindle docs; note: a deploy-to-wisp workflow template does not yet exist publicly and would be a novel contribution). - Verification — post-deploy checks: site up, did.json resolves, handle verifies, redirects work. (Pattern precedent: atprotozoa's
audit/health-check scripts.)
4. Recommended Tech Stack (evidence-based, from ecosystem rankings)#
- Language: TypeScript — the #1 language in the analyzed ecosystem (4/9 repos), and the language of wisp.place's own tooling.
- Runtime: Bun — used by airglow; fast single-binary CLI story.
- Form factor: CLI (
npx create-atproto-migrationstyle) + a template repo on Tangled. Matches wisp.place's ownnpm create wispconvention. - ATProto access: prefer light/vendorable libs over heavy SDKs for the CLI (ecosystem norm: hand-rolled
oauth.js/identity.js; infra projects use real libs — wisp's Rust CLI uses Jacquard). For TS: atcute or@atproto/apiforuploadBlob/putRecordcalls if not shelling out towispctl. - Scraping: headless fetch + HTML rewriting (e.g. cheerio/linkedom); WordPress XML importer as a fast path.
- No backend needed — the entire pipeline is local CLI + PDS writes, consistent with the ecosystem's static-first pattern.
5. Known Constraints & Open Questions#
- wisp.place limits: file-size/blob limits per PDS, manifest size, supported MIME types — need to verify against the wisp.place monorepo source (
apps/main-app,cli/); README-level docs confirmed only.wispignoreand_redirects. - did:web vs did:plc: did:web ties identity to the domain (good for businesses, breaks if domain lapses); did:plc is portable. Toolkit should support both and explain the tradeoff.
- Scraping legality/ToS: exporting one's own site is fine; automated crawling of Wix/Weebly may hit anti-bot measures — need per-platform export strategies.
- Dynamic features: contact forms, e-commerce, booking widgets don't port to static hosting. Scope v1 to brochure sites; document escape hatches (formsubmit-style services, or a companion Worker).
- PDS provisioning API: does Protobase.at expose programmatic account creation, or is this stage necessarily a human checklist? Unverified.
- Spindle runner availability: Spindle CI requires a self-hosted runner; the auto-deploy stage (§3.6) should degrade gracefully to manual
wispctl deploy.
6. Competitive Landscape (from the analysis)#
- No tool in the analyzed set automates any of this; ptharbor is the only migration artifact and it is fully manual.
- wisp.place provides deploy tooling (
wispctl,npm create wisp) but nothing for sourcing content from legacy platforms. - Broader ecosystem: no known "Wix-to-ATProto" tool exists; adjacent prior art is WordPress→static exporters (Simply Static, wp2static) which solve only stage 2.
7. Suggested First Milestones#
- M0 — Manual playbook: write the ptharbor process as a step-by-step doc; validates the pipeline before automating.
- M1 —
wisp-portCLI: scrape URL → clean static bundle →_redirects→wispctl deploy. (Stages 1, 2, 5.) - M2 — Identity module: did:web generator + DNS instruction output + verification checks. (Stages 3, 7.)
- M3 — Full
create-atproto-migrationwizard: interactive CLI covering all 7 stages, Tangled repo + Spindle template emission.