DEV Community

Ko Takahashi
Ko Takahashi

Posted on

I Built 'Sanpai Mining' — An AI System Where Visiting Forgotten Shrines Earns More Than Famous Ones

The Problem

Japan has 80,000+ shrines and temples. But 80% of tourism revenue goes to about 5% of them. Famous spots like Fushimi Inari get 30,000 visitors/day while equally historic sites nearby get 3.

Meanwhile:

  • Local festivals are dying (no young people to carry them on)
  • Culture bearers (priests, craftsmen, guides) get almost nothing from tourism revenue
  • Tourists get shallow experiences at overcrowded spots

I'm Ko Takahashi, CEO of Jon & Coo Inc. I've been building Matsuri Platform for the past 3 years to fix this. Here's the technical deep-dive.

The Core Idea: Sanpai Mining

参拝マイニング (Sanpai Mining) = "worship mining"

Visit a sacred site → earn MTC (Matsuri Coin, Solana-based token)

The twist: The less popular the site, the MORE you earn.

AI calculates a real-time "Cultural Impact Score" for each site. A quiet 700-year-old shrine in Shimane prefecture might be worth 20x more MTC than Fushimi Inari.

Tech Stack

Backend:      Rust (Actix-web)
Frontend:     Next.js + TypeScript + Tailwind
Database:     PostgreSQL + PostGIS
AI:           Python (PyTorch) + Claude API
Blockchain:   Solana (MTC Token)
Infra:        AWS + Cloudinary + Redis
Enter fullscreen mode Exit fullscreen mode

Cultural Impact Score — The AI Core

The score considers three factors:

def cultural_impact_score(site):
    # 1. Scarcity: fewer visitors = higher score
    scarcity = log(1000 / max(site.daily_visitors, 1))

    # 2. Preservation urgency: high cultural value + high risk
    urgency = site.cultural_significance * (1 + site.maintenance_risk)

    # 3. Seasonal bonus: off-season visits earn more
    seasonal = 1.0 + (1.0 - site.seasonal_factor) * 0.3

    return min(100, scarcity * urgency * seasonal * 10)
Enter fullscreen mode Exit fullscreen mode

Result:

  • Fushimi Inari (30K visitors/day): Score 3.2 → ~1 MTC
  • Hidden Shimane shrine (3 visitors/day): Score 67.8 → ~20 MTC

Visit Verification: Proof of Visit

How do we know someone actually visited? Multi-layer verification:

1. GPS geofencing (within 100m radius)
2. QR code scan (time-rotating codes at each site)
3. Optional: photo verification via AI
Enter fullscreen mode Exit fullscreen mode

All verified visits are recorded on Solana as Proof of Visit NFTs.

MTC Tokenomics

  • Total supply: 900M MTC (fixed, no inflation)
  • Earning: Sanpai Mining (visit sites)
  • Buyback: 20% of Matsuri platform revenue buys MTC from market
  • Burn: Bought-back MTC is burned → deflationary
  • Halving: Mining rewards halve periodically

This creates a sustainable loop: more platform usage → more revenue → more buyback → MTC value increases → more incentive to visit hidden sites.

The 6-Layer Ecosystem (Culture OS)

Sanpai Mining is just Layer 1. The full system has 6 layers:

L1: Global Guests        → Visit sites, earn MTC
L2: Social Miners         → Create content, spread culture
L3: Local Partners        → Shrines, temples, local businesses
L4: GCF Gold              → Committed community members
L5: GCF Platinum (50 max) → Revenue share from Matsuri GMV
L6: Culture OS Architects  → System governance & evolution
Enter fullscreen mode Exit fullscreen mode

Value flows both ways: culture goes local→global, economics go global→local.

Why Rust for the Backend

Geospatial queries across 80K+ sites with real-time scoring:

async fn find_nearby_with_scores(
    pool: &PgPool,
    lat: f64, lng: f64,
    radius_km: f64,
) -> Vec<ScoredSite> {
    let sites = sqlx::query_as!(
        SiteWithVisitors,
        r#"SELECT s.*, 
            COUNT(v.id) as daily_visitors,
            ST_Distance(
                s.location::geography,
                ST_SetSRID(ST_MakePoint($1, $2), 4326)::geography
            ) as distance
        FROM sacred_sites s
        LEFT JOIN visits v ON v.site_id = s.id 
            AND v.visited_at > NOW() - INTERVAL '24 hours'
        WHERE ST_DWithin(
            s.location::geography,
            ST_SetSRID(ST_MakePoint($1, $2), 4326)::geography,
            $3 * 1000.0)
        GROUP BY s.id
        ORDER BY distance"#,
        lng, lat, radius_km
    ).fetch_all(pool).await.unwrap();

    sites.iter().map(|s| ScoredSite {
        site: s.clone(),
        impact_score: calculate_cultural_impact(s),
        mtc_reward: score_to_mtc(calculate_cultural_impact(s)),
    }).collect()
}
Enter fullscreen mode Exit fullscreen mode

Rust handles this beautifully — zero-cost abstractions, memory safety, and the performance we need for real-time scoring.

What I Learned

  1. The hardest problem isn't technical. It's designing incentives that genuinely change behavior without cheapening cultural experiences.

  2. Blockchain skeptics are partly right. Most token projects are solutions looking for problems. Sanpai Mining works because the incentive structure directly solves a real-world distribution problem.

  3. AI as a routing engine is underexplored. Everyone's building chatbots. We're using AI to route humans to places that need them most.

What's Next

  • Expanding Sanpai Mining to 10,000+ sites by end of 2026
  • Launching GCF Gold membership tier
  • Open-sourcing the Cultural Impact Score algorithm
  • Exploring Culture OS deployment for other countries' cultural heritage

If you're building at the intersection of culture and technology, I'd love to connect.


Ko Takahashi — CEO of Jon & Coo Inc. | Lead Architect of Matsuri Platform
ko-takahashi.jp | matsuri.group

Have you worked on incentive design or cultural tech? Drop your experience in the comments!

Top comments (0)