Web AppBuilder Migration Assistant
A Python prototype that prepares reviewable ArcGIS Experience Builder candidates from Web AppBuilder and classic Story Map Series applications.
Why it matters
Migration involves data connections, interactions, and narrative content as well as layout. A reviewable candidate and explicit manual-work list make supported translations and unresolved behavior visible before a replacement application is accepted.
My contribution
I built the translation rules, workflow, diagnostics, and validation with AI assistance. Supported settings and story content become a candidate with a record of unresolved work. Esri supplies the Experience Builder runtime and template.
Result
A recorded story preview navigated all six sections and rendered three recovered charts. The private-draft workflow passed simulated offline checks; live upload and complete replacement behavior remain unverified.
Tools
- Python
- ArcGIS Online
- ArcGIS REST API
- Experience Builder
- OAuth
- JSON
- SQL expression translation
- unittest
- SHA-256
The prototype targets 2D ArcGIS Online configurations and a pinned template. Story candidates require one shared web map; other story families, exact styling, custom widgets, and many interactions remain unsupported or manual. Live sign-in and upload, Builder edit/save/reload, mobile behavior, and complete equivalence remain unverified. No production migration, client relationship, or measured time savings are claimed.
Project gallery
Recorded local previews of an independent migration prototype using Esri’s runtime and public test maps. The Query and controlled Table images use a public NADO map and were recorded September 27, 2026. Source dates and test boundaries remain attached to each example. 5 images. Select an image to view it full size.





Prepare a candidate, then review its behavior
The Web AppBuilder path translates supported settings; the separate Story Map Series path adds a section and asset inventory. Both produce a candidate and a manual-work list for review in Experience Builder.
Local preparation makes no online writes. Live sign-in and private-draft creation remain unverified; generating a configuration does not establish that the replacement behaves like the original.
Local toolAutomated preparation
- Inspect the sourceApp, web map and service definitions
- Translate supported settingsBindings and pinned target template
Handoff package
- Candidate + change log
- Unresolved-work report
ReviewerManual completion and checks
- Review runtime behaviorMap actions and widget interactions
- Complete unsupported settingsUse the unresolved-work report
- Validate in BuilderEdit, save and reload checks
Builder validation required
Technical details
Independent project · Working prototype, version 0.8 · October 2026
A GIS application stores behavior across widget settings, web maps, service definitions, and story sections. Migration requires reconstructing supported data connections and interactions, recovering narrative content and images, and checking saved map states. A generated configuration alone does not establish that the replacement behaves like the original.
- Detect Web AppBuilder or classic Story Map Series, capture the source configuration and accessible web map, and inventory supported and unresolved content.
- Bind supported WAB widgets to target components, or convert eligible story sections sharing one 2D web map into native Advanced Bookmark entries.
- Apply deterministic adapters to a pinned Experience Builder 1.21.0 Foldable template, retaining supported narratives, images, extents, and layer visibility.
- Write the candidate, change log, migration report, package checksums, and remaining manual work; Story Map Series packages also include a section inventory and rebuild guide.
- Optionally validate the package before explicitly selected sign-in and private-draft creation. The online workflow checks the destination organization, draft ownership and configuration, and retains a receipt for recovery; these upload checks have been tested offline with simulated SDK responses.
Automated preparation and manual review
Automated preparation produces an intermediate candidate, diagnostics and a manual-work list. The illustration shows the local Web AppBuilder path; the separate Story Map Series path adds a section and asset inventory. Both retain the source web-map connection. A generated candidate does not establish replacement behavior.
Local preparation makes no online writes. The optional online command adds explicit authentication and private-draft checks; it does not publish the app, clone its maps or layers, or establish that the intended audience can access them. Live sign-in and private-draft creation remain unverified.
What the adapters translate
These are configuration capabilities with explicit boundaries; their presence does not establish complete source-to-target behavior equivalence.
- Source inspection: automatic source-family detection, eligible widget or story resources, an accessible web map, and an inventory of unresolved settings.
- Classic Story Map Series: eligible published sections sharing one 2D web map become Advanced Bookmarks with sanitized narratives, embedded recovered PNG/JPEG images, valid saved extents, and known layer visibility. Unsupported sections and content remain recorded for manual rebuilding.
- Search: supported explicit feature-layer and locator sources, field bindings, labels, and compatible result limits.
- Filter: supported structured predicates, map-layer bindings, and selected activation and prompt settings.
- Query: supported tasks, predicates, result fields, output data sources, and Map display and zoom actions.
- Attribute Table: explicit layer and column choices, supported selection and extent settings, and export-menu controls.
Designed to fail visibly
- Versioned adapters: the target template and supported configuration structures are pinned, and conversion rules validate their inputs and target references before applying changes.
- Relationships, not just widgets: filter bindings resolve the actual map-layer identity, and Query tasks receive their own output data sources and the references needed for map interactions.
- Reviewable rejections: unsupported settings block the affected transformation and produce diagnostics, and source, map, metadata, and template fingerprints detect plans whose inputs have changed.
- Story recovery with limits: section visibility combines saved web-map defaults with explicit overrides. External or missing images, unsupported actions, retired-runtime state inheritance, synchronization, and exact accordion styling remain manual checks.
- Explicit table behavior: generated columns are read-only and actions that could create extra table sheets are disabled, with the limitations reported. Service permissions are not changed.
- Integrity is not behavior: checksums detect changed package files, while browser observations establish only the interactions that were exercised.
Private-draft workflow: implemented, tested offline
Version 0.8 adds an explicit online command with browser OAuth, a named saved profile, or explicitly selected ArcGIS Pro authentication. Package hashes, the configuration graph, and resources are checked before sign-in; the destination organization is checked before creating an item.
The adapter requests a private unpublished Web Experience with automatic remapping disabled, then checks the returned owner, Draft status, absence of published item data, and stored configuration. A receipt rechecks an existing item on resume. An uncertain upload without an item ID blocks automatic retry to avoid creating duplicates.
These contracts passed offline tests with simulated SDK responses. No live sign-in or item creation was attempted in the recorded v0.8 validation, and Builder edit/save/reload has not been verified.
Recorded validation, September 27 and October 1, 2026
These are separate recorded tests, not a migration success rate. The latest offline record is v0.8; the story preview was observed in v0.7, and the Query and Table observations belong to v0.6. The public story’s underlying study is dated May 8, 2019, so its charts are historical evidence rather than current statistics.
The story preview exercised all six section titles, three charts, rental and non-rental layer states, a heatmap, and return navigation. Theme-loading and local-preview service-worker warnings were recorded. This did not establish full equivalence to the retired source runtime. A separate real-source WAB Table case remained blocked by an unsupported subtype layer.
| Recorded result | What was established |
|---|---|
| 416 offline tests passed · v0.8, October 1 | The recorded suite covers both source families, simulated private uploads, organization and owner checks, draft configuration checks, receipt recovery, and resume. It does not prove an authenticated online upload. |
| 6 story sections and 4 images recovered · v0.7, October 1 | One public Story Map Series became six configured Advanced Bookmarks. All six titles were navigated and three chart images rendered in the recorded native-runtime preview. |
| 21 Query tasks retained · v0.6, September 27 | A candidate generated from a public application kept its 21 configured Query tasks. Not all 21 were tested interactively. |
| 52 Agriculture results displayed · v0.6, September 27 | One Query workflow ran in Esri’s native runtime. Selecting a result also zoomed to and highlighted its district. |
| 441 records in a controlled Table test · v0.6, September 27 | Synthetic widget settings against a public map produced three permitted columns, multiple selection, and a two-row selected-record view. The hidden ObjectID was excluded from the column menu, and no export menu was visible. |