User demographics, top popular stories & news sources, community contributions, and real-time AI problem tracking.
Batched news_interactions. Click a row for recent raw events.
Cities with the most user activity in the last 24 hours.
Cities with high user interest but low article coverage.
Real-time view of workers, AI activity, system performance, and live logs.
Articles extracted, categorized, and geocoded in the last hour.
Paste any news website URL and we'll automatically find its RSS feed and add it.
Search the internet for RSS feeds and news websites using AI discovery.
User-submitted requests for news coverage in specific areas.
User-reported issues with articles.
Flags analyzed by AI with auto-fix actions.
User-submitted news source URLs for review. Approve to add to the source database.
Client-side JavaScript errors captured from user sessions. AI analyzes these periodically to identify patterns and suggest fixes.
Inspect browser environment, screen capabilities, session state, and API latency.
clearSearch() function was clearing event markers but keeping the existing pinMarkers (which contained only search results). It wasn't re-fetching viewport pins.clearSearch() to call pinMarkers.clear() before fetchPinsForViewport(), ensuring fresh viewport pins are loaded when search is cleared.
toggleCategoryFilter() stored keys as-is, and loadCategoryFilters() didn't validate against known legend keys.toggleCategoryFilter() to always store lowercased keys. Modified loadCategoryFilters() to validate against known LEGEND_GROUPS keys and reject unknown categories. Added CATEGORY_ROLLUPS constant to define parent-to-subcategory mappings.
ReferenceError: CATEGORY_ROLLUPS is not defined when trying to filter markers by category.CATEGORY_ROLLUPS constant was referenced in syncLayers() but never defined.CATEGORY_ROLLUPS constant at the top of app.js, mapping parent buckets (like "technology") to their subcategories (["ai", "cybersecurity", "gaming", "telecom"]).
.popup-inner at 600px and 480px breakpoints to constrain popup width to calc(100vw - 48px) and limit max-height. Also added mobile-specific styles for feedback dialog.
/api/pins/map for world/continent view but this route was missing from the API./api/pins/map endpoint to api/src/routes/pins.ts - a lightweight endpoint that returns only the fields needed for canvas rendering.
.feedback-dialog and related classes to the stylesheet, matching the visual language of the quick-flag dialog.
coverage-btn nor discover-btn had any event listeners attached in app.js. The buttons were defined in index.html but not wired up./api/locations/search), allowing users to fly to cities and discover news. The Discover button opens the Explore Region panel.
A log of service restarts, deployments, and configuration changes. Events are recorded automatically at startup and when configuration changes are made.
Visualizing global information on a live interactive map.
XYZO is building the most comprehensive, real-time map of global news ever created. We ingest, analyze, and geolocate news from thousands of sources across every continent.
Hi, I'm Asher, the author and creator of xyzo.org.
Feel free to contact me if you have any questions, or if you'd like to help or collaborate on our AI & geolocation algorithms, search code, or have specific UI recommendations!