FeedSimple: Live XML and GeoRSS Feed Integration with Spatial Join and Dynamic Feature Layer

506
2
03-17-2026 10:31 PM
Labels (2)
adamsimple
Regular Contributor

FeedSimple: XML/GeoRSS Feed Widget

The idea for this came to me Thursday evening at the 2026 Esri Dev/Tech Summit and this is what I have. I am in the process of developing a configuration guide. This widget has gone through a ton of changes in a few days, so that's made lots of my screen shots outdated. I should have that put together shortly. You can find the widget and documentation on my GitHub site (at the bottom). I was going to post the zip file, but this is widget rapidly changing and GitHub is the place to get the latest.

Built a custom ExB widget that consumes live XML-based feeds and displays them as interactive cards alongside a web map. Compatible with RSS, Atom, GeoRSS, and custom XML schemas.

fs usgs desktop.png

King County Road Closures (spatial join mode) https://feed-test.mapsimple.org
USGS Earthquakes - Past 24 Hours (auto-generated map layer) https://feed-quakes.mapsimple.org


Core

  • Universal XML parser: RSS, Atom, GeoRSS, custom XML with recursive nested field flattening, namespace stripping, attribute extraction, array handling
  • Configurable polling with Page Visibility API (pause when hidden, instant resume)
  • Non-blocking error handling: stale data stays visible on fetch failure
  • CORS proxy support via esriRequest with automatic portal token auth
  • Independent versioning and config migration system

Card Rendering

  • Markdown card templates with {{token}} substitution
  • Chainable pipe filters: date formatting (24h, timezone offset), math (/, *, +, -), round, abs, prefix, suffix, upper, lower, autolink, externalLink
  • Mobile card template (separate simplified template at 600px and below)
  • Status color coding: exact match mode (per-value colors) and range mode (numeric class breaks with labels)
  • Color legend: collapsible bar above cards, admin-togglable, shows swatches and labels
  • Card action toolbar: zoom, pan, expand, external link buttons with configurable position (bottom/right/kebab menu) and separate mobile position
  • Hover tooltips from any field
  • Expand button showing raw field:value pairs
  • Source attribution footer with optional link
  • Highlight animation on new/changed items after refresh

Search, Sort and Pagination

  • Real-time client-side text search with 200ms debounce and configurable search fields
  • Runtime sort controls with field dropdown and direction toggle
  • Reverse feed order option
  • Range label search and sort (virtual fields from color breaks)
  • Expand-style pagination with Show More / Show All and {n} remaining count token
  • Configurable item labels (singular/plural) for count display

Feed Map Layer

  • Auto-generated client-side FeatureLayer from feed coordinates: no feature service needed
  • ClassBreaksRenderer for range-based map symbology (independent map colors, sizes, marker styles per range)
  • Dynamic popup title with {{token}} substitution
  • Bidirectional card and map sync
  • GeoRSS georss:point auto-splitting
  • Efficient poll-cycle sync via applyEdits()
  • FeatureEffect dimming on joined layers during search/filter

Spatial Join (Feature Service Integration)

  • Join feed items to existing feature service by shared key
  • Batch WHERE IN queries with numeric/string detection
  • Card click: zoom/pan to matched feature + popup
  • Configurable zoom level (points) and zoom buffer (lines/polygons)

Mobile and Responsive

  • Mobile popup behavior: collapsed, dock position, hide dock button, hide action bar
  • Mobile card template and mobile toolbar position overrides
  • iOS auto-zoom prevention

Developer

  • Debug logger with tagged channels (FETCH, PARSE, RENDER, POLL, JOIN, TEMPLATE, SETTINGS, FEED-LAYER)
  • 137 unit tests across 4 test files

GitHub: https://github.com/MapSimple-Org/ExB-Simple-Public
Docs: https://mapsimple.org/samples/

ExB Developer Edition 1.19.0+.

2 Replies
adamsimple
Regular Contributor

I am working on an updated release for ExB 1.20. I expect that to be done early next week if not later this weekend. I may be sneaking in a few enhancements as well 😉.

adamsimple
Regular Contributor

Update: FeedSimple now runs on Experience Builder 1.20 (r005.018)

FeedSimple has been rebuilt for Experience Builder 1.20. This release focuses on 1.20 support and on hardening how external feed content is rendered, rather than new feed features.

Experience Builder 1.20 / JSAPI 5.0 support

FeedSimple now runs natively on ExB 1.20 with ArcGIS Maps SDK for JavaScript 5.0.4, Calcite 5.0, React 19, and Node.js 24 (tested on 24.16.0). The migration covered the JSAPI 5.0 getId() change, replacing the __esri ambient namespace with explicit @ArcGIS/core ESM imports, Calcite 5.0 NumericInput value widening, and ImmutableArray prop widening for ExB's immutable state, with all TypeScript errors cleared to zero. Type-only changes, no behavior loss.

Note: this build targets ExB 1.20 and is not backward compatible with 1.19. If you are still on 1.19, the previous standalone release on the Releases page covers you.

Security hardening (matters most for feed content)

Because FeedSimple renders content from external feeds, the shared template engine now defends against injection from feed data:

• HTML escaping on every substituted field value, so markup in a feed cannot inject into the card.
• Dangerous URL scheme blocking (javascript:, data:, vbscript:) in markdown links, images, and external link templates. Unsafe links render as plain text.

These protections are inherited automatically from shared-code and are covered by a dedicated security test suite.

Shared template engine with QuerySimple

Since r004, FeedSimple shares its rendering with QuerySimple through shared-code: the same {{field | filter}} token syntax, 16 chainable pipe filters (date, math, text, autolink), markdown formatting, pipe-delimited tables, and the visual Table Builder in settings. One engine, identical behavior across both widgets.

Reminder: FeedSimple is standalone and does not depend on QuerySimple or HelperSimple, but it does require shared-code (since r004). Copy both feed-simple and shared-code into your widgets folder.

A quick recap of what FeedSimple does

• Universal XML parsing: flat XML, nested formats like QuakeML, RSS 2.0, ATOM, and GeoRSS.
• Markdown card templates with token substitution and chainable filters.
• Color coding by exact match or numeric range, with per-range map symbol overrides and a collapsible color legend.
• Feed map layer: a client-side feature layer built from feed coordinates, with bidirectional card-to-map sync and configurable markers.
• Spatial join to an existing feature layer, with click-to-zoom and popups.
• Search, runtime sort, show-more pagination, and configurable polling with new-item highlighting.
• Responsive design with separate mobile card and popup templates.

Get it

Latest release and downloads: https://github.com/MapSimple-Org/ExB-Simple-Public/releases/tag/QS-r028.122-FS-r005.018

Copy feed-simple and shared-code into your-extensions/widgets, then rebuild.

Tested on: Experience Builder 1.20.0, ArcGIS Maps SDK for JavaScript 5.0.4, Calcite 5.0.2, React 19, Node.js 24.16.0.

Feedback and issues welcome in this thread.

0 Kudos