Web AppBuilder Migration Assistant
A Python tool that prepares ArcGIS Experience Builder candidates from Web AppBuilder configurations. It reuses existing web maps, translates supported widget settings, and records changes and unfinished work for review.
Project gallery
Independent migration prototype using Esri’s runtime and a public NADO map. Recorded September 27, 2026. 4 images. Select an image to view it full size.




My contribution
I built the migration rules, orchestration, diagnostics, and validation for this independent prototype; Esri supplies the Experience Builder runtime and template. The tool produces candidates for review, not finished replacements. It has not been used for a production migration, and time savings have not been measured.
Result: In the recorded v0.6 validation run on September 27, 2026, 306 automated tests passed. A candidate generated from a public application retained its 21 configured Query tasks; one Query workflow displayed 52 results in Esri’s native runtime, and a controlled Table test displayed 441 records with three permitted columns.
Tools
- Python
- ArcGIS Online
- ArcGIS REST API
- Experience Builder
- JSON
- SQL expression translation
- unittest
- SHA-256
Version 0.6 targets 2D ArcGIS Online applications and a pinned Experience Builder template. It does not reconstruct every source layout, custom widget, or interaction. Authenticated draft upload, Builder edit and save behavior, mobile equivalence, and a complete replacement workflow remain unverified, and no production deployment is claimed.
How a migration runs
The generated candidate is an intermediate deliverable. The workflow keeps the connection to the source web map, translates the settings it supports, and records the work that still needs a person before the candidate can replace the source application.
What the adapters translate
These are configuration capabilities with explicit boundaries; their presence does not establish complete source-to-target behavior equivalence.
- Source inspection: the application configuration, eligible widget resources, an accessible web map, and an inventory of unresolved settings.
- 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.
- 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.
Recorded validation, September 27, 2026
These results describe specific tests of version 0.6, not a general migration success rate. A separate real-source Table case remained blocked because its subtype layer required unsupported handling.
| Result | What was established |
|---|---|
| 306 automated tests passed | Local tests covered transformations, expression behavior, data-source references, package integrity, preview routing, and mocked upload behavior. |
| 21 Query tasks retained | A candidate generated from a public application kept its 21 configured Query tasks. Not all 21 were tested interactively. |
| 52 Agriculture results displayed | 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 | 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. |
Technical details
Independent project · Working prototype, version 0.6 · September 2026
A web application stores behavior across its configuration, widget settings, web map, and service definitions. A widget label alone does not describe its field requirements, data connections, or interactions with other widgets, so migrating an app means reconstructing search sources, filter expressions, query outputs, table columns, and widget interactions, not only reconnecting its map.
- Capture the source application configuration and accessible web map, inventory its widgets, and read eligible public service definitions.
- Pair supported source widgets with target components in a binding plan.
- Translate supported settings with deterministic adapters into a pinned Experience Builder 1.21.0 Foldable template.
- Write the candidate configuration, a change log, a migration report, and package checksums, with explicit diagnostics for unsupported or ambiguous settings.
- Optionally request a private unpublished draft through the ArcGIS API for Python; that path has been tested with mocks only.