An AI-powered system that autonomously discovers, enriches, and maps living cultural heritage traditions from communities worldwide β including those not yet formally documented.
- What is ICH Radar?
- Live Demo
- How It Works
- Architecture
- Data Schema
- Dashboard Features
- Setup & Deployment
- Configuration
- Adding Keywords
- Schedule & Automation
- Tech Stack
- Purpose & Alignment
- Disclaimer
Intangible Cultural Heritage (ICH) encompasses the living traditions, expressions, knowledge, and practices that communities recognize as part of their cultural identity β including oral traditions, performing arts, traditional craftsmanship, social rituals, and culinary heritage.
ICH Radar is an automated intelligence engine that continuously discovers and documents these practices from open online sources, including:
- Local community blogs and village websites
- Regional news archives
- Wikipedia and Wikimedia Commons
- Social media and cultural forums
- Academic and institutional repositories
Unlike static databases that rely on formal institutional submissions, ICH Radar actively hunts for undocumented and at-risk traditions β practices that communities still live by but that have never appeared in any official heritage inventory.
| Traditional Databases | ICH Radar |
|---|---|
| Requires formal nomination | Autonomous discovery |
| Only registered UNESCO elements | Includes unregistered local traditions |
| Updated manually | Updated automatically every 2 days |
| English-only sources | 40+ language keyword database |
| Static records | AI-enriched with steps, materials, connections |
| No cross-cultural linking | Shared heritage detection across regions |
The interactive dashboard is deployed on GitHub Pages and updates automatically with every crawler run.
The dashboard includes:
- An interactive world map with pulsing heritage nodes and animated shared-heritage connection lines
- Filterable directory of all discovered elements
- Full AI-enriched detail view per element including step-by-step processes
- Dublin Core XML export for archival use
- Print-to-PDF export per element
The system operates in two automatic phases per scheduled run:
Before doing anything new, the engine scans existing records for data quality issues β specifically missing or broken thumbnail images. Any COMPLETE record with an invalid image is downgraded to INCOMPLETE and queued for re-enrichment.
The engine selects up to 3 incomplete records from the previous run and re-queries Gemini with a targeted prompt to find the missing data β a step-by-step crafting process, a recipe, or a valid source URL with an image. If the missing data is found, the record is upgraded to COMPLETE.
The engine randomly selects keywords from a multilingual database of 200+ search patterns and instructs Gemini to discover 2β4 brand-new heritage elements not already in the inventory. Each new element is geocoded, assigned a thumbnail, and stored.
Scheduled Trigger (every 2 days)
β
βΌ
Phase 0: Audit
Scan for broken images β downgrade to INCOMPLETE
β
βΌ
Phase 1: Enrichment
Fix up to 3 INCOMPLETE records β upgrade to COMPLETE
β
βΌ
Phase 2: Discovery
Find 2β4 new heritage elements via multilingual keywords
β
βΌ
Geocode coordinates (Nominatim / OpenStreetMap)
Fetch thumbnails (Microlink β Wikimedia fallback)
β
βΌ
Commit data.json to repository
β
βΌ
GitHub Pages re-deploys dashboard automatically
Unlike traditional web scrapers that crawl URLs directly and are often blocked by rate limits or bot detection, ICH Radar delegates discovery to Google's infrastructure via AI Search Grounding. Gemini queries the web on behalf of the system and returns structured results β reaching blogs, local archives, and regional news that conventional scrapers cannot access reliably.
GitHub Actions (Scheduled Automation)
β
βΌ
scraper.py (AI Discovery Engine)
β
ββββΊ Gemini 2.5 Flash + Google Search Grounding
β βββ Discovers cultural practices via multilingual keywords
β βββ Extracts structured heritage data (description, significance, process)
β βββ Detects shared heritage relationships across regions
β βββ Assigns ICH categories and gemini_tags
β
ββββΊ OpenStreetMap Nominatim API
β βββ Geocodes country/province names β lat/lng coordinates
β
ββββΊ Microlink.io API
β βββ Generates screenshot thumbnails from source page URLs
β
ββββΊ Wikimedia Commons API (fallback)
β βββ Fetches alternative thumbnails when Microlink fails
β
βΌ
data.json (ICH Inventory Database)
β
βΌ
Git Commit & Push (automated)
β
βΌ
GitHub Pages β Interactive Cultural Heritage Dashboard
The crawler produces and maintains a single data.json file that serves as the live database for the dashboard.
{
"summary": {
"generated_at": "2026-03-13T02:43:12Z",
"total_ich_elements": 248,
"complete_records": 180,
"incomplete_records": 68,
"categories_breakdown": {
"Culinary Traditions": 65,
"Traditional Craftsmanship": 54,
"Performing Arts": 42,
"Oral Traditions": 36,
"Social Practices & Rituals": 51
}
}
}{
"id": "ich-4b1f9c3a",
"element_name": "Traditional Bamboo Fish Trap Weaving",
"category": "Traditional Craftsmanship",
"thumbnail_url": "https://...",
"source_urls": ["https://en.wikipedia.org/wiki/..."],
"scraped_at": "2026-03-13T02:43:12Z",
"completion_status": "COMPLETE",
"location": {
"country": "Indonesia",
"provinces": ["West Java"],
"lat": -6.9147,
"lng": 107.6098
},
"resume_analisa": {
"description": "A traditional fishing trap weaving technique using bamboo strips practiced by rural fishing communities.",
"cultural_significance": "Represents local ecological knowledge and sustainable fishing practices passed through generations.",
"gemini_tags": ["bamboo", "fishing", "weaving"]
},
"resume_tata_cara": {
"type": "crafting_process",
"materials_and_tools": ["Bamboo", "Knife", "Binding fiber"],
"step_by_step": [
"Split bamboo into thin strips",
"Weave circular base frame",
"Construct funnel entrance",
"Secure trap with binding fiber"
]
},
"shared_heritage_detection": {
"is_shared": true,
"confidence_score": 0.84,
"related_elements": [
{
"country": "Vietnam",
"element_name": "Traditional Bamboo Fish Trap",
"relationship_reason": "Similar weaving structure used in river fishing communities across Southeast Asia."
}
]
}
}| Field | Type | Description |
|---|---|---|
id |
string |
MD5-based unique identifier (ich- prefix) |
element_name |
string |
Name of the heritage element |
category |
string |
ICH category (see below) |
thumbnail_url |
string |
Image URL β Microlink screenshot, direct image, or Wikimedia fallback |
source_urls |
string[] |
Direct URLs to source pages used by the AI |
scraped_at |
ISO 8601 |
Discovery timestamp |
completion_status |
COMPLETE | INCOMPLETE |
Whether step-by-step process data was found |
location.lat / .lng |
float |
Geocoded coordinates via Nominatim |
resume_analisa |
object |
AI-generated description, significance, and tags |
resume_tata_cara |
object | null |
Process/recipe/ritual steps and materials. null if not found |
shared_heritage_detection |
object |
Cross-cultural connection analysis with confidence score |
The AI assigns each element to one of five standard UNESCO-aligned categories:
Culinary TraditionsTraditional CraftsmanshipPerforming ArtsOral TraditionsSocial Practices & Rituals
The index.html dashboard is a fully self-contained single-file web application. It reads data.json at load time and requires no backend.
An interactive Leaflet.js map with a dark CartoDB base layer.
- Green pulsing nodes β origin locations of ICH elements. Badge shows count when multiple elements share a location.
- Yellow nodes β related heritage elements in other countries detected by the shared heritage AI.
- Animated dashed lines β visual connections between cultures with a shared heritage relationship.
- Markers cluster automatically at lower zoom levels to prevent overplotting.
- Map filters in real-time to match the active directory filters.
- Filter by country of origin
- Filter by completion status (Complete / Incomplete / Shared Heritage only)
- Sort by newest or oldest discovery date
- Configurable items per page (9 / 18 / 36 / 72)
- Full pagination with smart ellipsis for large datasets
Clicking any card opens a full detail panel with:
- Cover image and mini-map showing the element and its shared heritage connections
- Cultural significance, description, and AI tags
- Tools/materials list and numbered step-by-step process
- Shared heritage panel with confidence score and relationship reasons
- YouTube video carousel (auto-detected from source URLs)
- Direct links to all source pages
The printer icon inside any detail modal opens a print-ready document in a new tab containing the full record, a static light-mode map, YouTube thumbnails, and all sources. The browser print dialog opens automatically after ~1.5 seconds to allow map tile rendering.
Note on popup blockers: The PDF export opens a new browser tab. If nothing happens when you click the printer icon, your browser's popup blocker is preventing it. Look for the blocked popup icon in your address bar and allow popups for this site, then click the icon again.
The Export XML button in the header downloads the full inventory as an OAI-DC (Dublin Core) XML file β a standard metadata format compatible with digital library systems (DSpace, Omeka, Fedora), OAI-PMH harvesters, and academic citation tools.
The interface supports English and Bahasa Indonesia, switchable at any time without losing filter or pagination state.
- A GitHub account
- A free Google Gemini API key from aistudio.google.com
- GitHub Pages enabled on your repository
git clone https://github.com/your-username/ich-radar.git
cd ich-radarGo to your repository β Settings β Secrets and variables β Actions β New repository secret:
| Secret name | Value |
|---|---|
GEMINI_API_KEY |
Your Google Gemini API key |
your-repo/
βββ .github/
β βββ workflows/
β βββ crawler.yml # GitHub Actions workflow definition
βββ scraper.py # AI Discovery Engine (main crawler)
βββ index.html # Dashboard UI (self-contained)
βββ data.json # Auto-generated inventory (committed by bot)
βββ history.json # Crawl state tracker (committed by bot)
βββ README.md
Go to Settings β Pages β Source and set it to Deploy from a branch, selecting the main branch and / (root) folder. Your dashboard will be live at https://your-username.github.io/ich-radar.
Go to Actions β ICH Radar Auto-Crawler β Run workflow.
Set Force crawl now to true to bypass the 2-day guard and run immediately. This will populate data.json for the first time and commit it to your repository, which will trigger a GitHub Pages redeploy.
Key constants in scraper.py:
| Variable | Default | Description |
|---|---|---|
CRAWL_INTERVAL_DAYS |
2 |
Minimum days between automatic crawler runs |
max_discoveries_per_run |
3 |
Number of new elements to discover per run |
incomplete_items[:3] |
3 |
Maximum incomplete records to enrich per run |
To increase discovery throughput, raise max_discoveries_per_run. Keep in mind that each discovery requires one Gemini API call, and the free tier has daily quota limits.
The workflow is scheduled via cron. The default runs every 2 days at 02:00 UTC:
on:
schedule:
- cron: '0 2 */2 * *'
workflow_dispatch:
inputs:
force_run:
description: 'Force crawl now'
required: false
default: 'false'Understanding the Workflow Design: Cron Schedule Breakdown (0 0 */2 * *): * 0 β Minute 0
0 β Hour 0 (Midnight UTC)
*/2 β Every 2 days
-
β Every month
-
β Every day of the week
Manual Trigger (workflow_dispatch): Allows you to manually trigger the scraper at any time directly from the GitHub Actions UI.
Infinite Loop Protection ([skip ci]): The [skip ci] tag acts as a crucial safeguard during the automated git commit, preventing the bot from triggering subsequent workflow runs infinitely.
The discovery engine uses a rotating multilingual keyword database. Each run, a keyword is selected at random to seed a new Gemini search query. Add your own targeted patterns to KEYWORDS in scraper.py:
KEYWORDS = [
# English β general
"unregistered local heritage traditions",
"forgotten village traditions",
"traditional food preparation ancestral recipe",
# Indonesian / Malay
"tradisi lokal masyarakat adat kampung",
"ritual adat lokal yang hampir punah",
# Spanish β Latin America
"prΓ‘cticas culturales comunitarias no registradas",
"rituales tradicionales de comunidades indΓgenas",
# Add your own patterns below:
# "your keyword in any language",
]The current database spans 40+ languages including Arabic, Chinese (Simplified and Traditional), Japanese, Korean, Hindi, Swahili, Yoruba, Amharic, Vietnamese, Thai, Tagalog, and many more. The multilingual coverage is intentional β many undocumented traditions are only discussed in their local language online.
The crawler is managed entirely by GitHub Actions at no cost within the free tier limits.
| Event | Behaviour |
|---|---|
| Scheduled (every 2 days) | Full audit β enrichment β discovery run |
Manual trigger (workflow_dispatch) |
Same run, with optional force flag to bypass the 2-day guard |
Push to main |
Does not trigger a crawl (guard prevents redundant runs) |
The 2-day guard is implemented in scraper.py by reading the generated_at timestamp from the last data.json and comparing it to the current time. This prevents unnecessary API usage if the workflow is triggered by other repository events.
To change the crawl interval:
- Edit
CRAWL_INTERVAL_DAYSinscraper.py - Update the cron expression in
crawler.ymlto match
| Component | Technology |
|---|---|
| AI Discovery | Google Gemini 2.5 Flash (Search Grounding) |
| Geocoding | OpenStreetMap Nominatim API |
| Thumbnails | Microlink.io API + Wikimedia Commons fallback |
| Automation | GitHub Actions |
| Dashboard | Vanilla HTML/JS + Leaflet.js + Tailwind CSS |
| Map tiles | CartoDB Dark Matter (via Leaflet) |
| Marker clustering | Leaflet.markercluster |
| Icons | Phosphor Icons |
| Hosting | GitHub Pages |
| Data format | JSON (inventory) + OAI-DC XML (export) |
ICH Radar aims to support:
- Cultural heritage research β structured, machine-readable records of living traditions
- Early detection of endangered practices β finding traditions before they disappear from online sources entirely
- Shared heritage mapping β identifying cross-regional cultural relationships that formal institutions often miss
- Digital documentation β creating reusable records compatible with archival standards
The system focuses especially on locally practised traditions not present in official inventories β the gap between what communities actually practice and what institutions have formally documented.
This project aligns with the principles of the UNESCO Convention for the Safeguarding of the Intangible Cultural Heritage (2003), particularly Article 13 (national measures for safeguarding) and Article 14 (education, awareness, and capacity-building).
This tool is intended solely for cultural heritage research, documentation, and safeguarding support. All data is sourced from publicly available online information. The AI enrichment layer summarises and structures existing public knowledge β it does not generate or fabricate cultural information.
Source URLs for every record are stored and displayed in the dashboard, allowing full traceability back to original sources.
Heritage communities and researchers who identify inaccuracies in any record are encouraged to open an issue or pull request.
License: AGPL
Built with β€οΈ for the preservation of living human culture.
"Culture is the widening of the mind and of the spirit." β Jawaharlal Nehru