Skip to content

Latest commit

Β 

History

232 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🌏 ICH Shared Heritage Radar

Global Intangible Cultural Heritage Intelligence Engine

An AI-powered system that autonomously discovers, enriches, and maps living cultural heritage traditions from communities worldwide β€” including those not yet formally documented.

GitHub Actions Powered by Gemini Live on GitHub Pages License: MIT Data Updated


πŸ“– Table of Contents


πŸ” What is ICH Radar?

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.

What makes it different?

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

🌐 Live Demo

The interactive dashboard is deployed on GitHub Pages and updates automatically with every crawler run.

β†’ View Live Dashboard

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

βš™οΈ How It Works

The system operates in two automatic phases per scheduled run:

Phase 0 β€” Data Audit

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.

Phase 1 β€” 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.

Phase 2 β€” Discovery

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

πŸ—οΈ Architecture

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

πŸ“¦ Output: data.json

The crawler produces and maintains a single data.json file that serves as the live database for the dashboard.

Summary block

{
  "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
    }
  }
}

Inventory record (full example)

{
  "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 reference

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

ICH Categories

The AI assigns each element to one of five standard UNESCO-aligned categories:

  • Culinary Traditions
  • Traditional Craftsmanship
  • Performing Arts
  • Oral Traditions
  • Social Practices & Rituals

πŸ–₯️ Dashboard Features

The index.html dashboard is a fully self-contained single-file web application. It reads data.json at load time and requires no backend.

Heritage Network Map

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.

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

Element Detail Modal

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

Export: PDF

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.

Export: Dublin Core XML

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.

Language Toggle

The interface supports English and Bahasa Indonesia, switchable at any time without losing filter or pagination state.


πŸš€ Setup & Deployment

Prerequisites

  • A GitHub account
  • A free Google Gemini API key from aistudio.google.com
  • GitHub Pages enabled on your repository

Step 1 β€” Fork or clone this repository

git clone https://github.com/your-username/ich-radar.git
cd ich-radar

Step 2 β€” Add your Gemini API key as a repository secret

Go to your repository β†’ Settings β†’ Secrets and variables β†’ Actions β†’ New repository secret:

Secret name Value
GEMINI_API_KEY Your Google Gemini API key

Step 3 β€” Verify file structure

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

Step 4 β€” Enable GitHub Pages

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.

Step 5 β€” Run your first crawl

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.


πŸ”§ Configuration

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.

GitHub Actions workflow (crawler.yml)

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.

πŸ”‘ Adding More Keywords

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.


πŸ“… Schedule & Automation

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:

  1. Edit CRAWL_INTERVAL_DAYS in scraper.py
  2. Update the cron expression in crawler.yml to match

πŸ› οΈ Tech Stack

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)

🎯 Purpose & Alignment

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).


βš–οΈ Disclaimer

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

About

ICH Radar is an AI-assisted cultural intelligence engine designed to discover, document, and analyze Intangible Cultural Heritage (ICH) practices from across the world. Powered by Google Gemini with Google Search grounding, the system autonomously scans blogs, local news, community forums, and other open online sources to identify traditional ICH

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages