{
  "$schema": "https://a2a-protocol.github.io/spec/agent-card.schema.json",
  "name": "TrailPaint",
  "description": "Hand-drawn style trail map maker. Browser-only tool for building route maps from photos (EXIF GPS), KML, GeoJSON, GPX, or AI prompts, with export to PNG illustration, project backup, or geographic interop formats.",
  "url": "https://trailpaint.org/",
  "documentationUrl": "https://trailpaint.org/llms.txt",
  "provider": {
    "name": "NotoriousLab",
    "url": "https://github.com/notoriouslab"
  },
  "version": "1.6.5",
  "license": "GPL-3.0",
  "languages": ["zh-TW", "en", "ja"],
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateful": false,
    "authentication": { "schemes": [] }
  },
  "skills": [
    {
      "id": "editor",
      "name": "Trail Map Editor",
      "description": "Interactive web editor for building hand-drawn style trail maps. Users add spots with 31 icons, draw routes with 5 colors and hand-drawn dashed lines with arrows, attach photos to spots, adjust elevation profiles.",
      "url": "https://trailpaint.org/app/",
      "tags": ["map", "editor", "illustration", "hand-drawn"],
      "examples": [
        "Draw a hiking route on Yangmingshan with 10 scenic spots and photos",
        "Create a bike route across Taipei with distance and elevation stats"
      ]
    },
    {
      "id": "import-photos",
      "name": "Build Route from Photos (EXIF GPS)",
      "description": "Drop up to 20 photos; TrailPaint reads EXIF GPS coordinates and auto-creates spots. Supports iPhone HEIC and Android JPEG. Photos without GPS land in a 'pending location' group for manual placement. Nominatim reverse geocoding auto-fills place names.",
      "url": "https://trailpaint.org/app/",
      "inputModes": ["image/jpeg", "image/heic", "image/heif"],
      "tags": ["photos", "exif", "gps", "import"]
    },
    {
      "id": "import-geo",
      "name": "Import Geographic Formats",
      "description": "Import routes and waypoints from KML (Google My Maps), GeoJSON (geojson.io, Google Takeout), GPX (hiking apps, Garmin), or native .trailpaint project files.",
      "url": "https://trailpaint.org/app/",
      "inputModes": [
        "application/vnd.google-earth.kml+xml",
        "application/geo+json",
        "application/gpx+xml",
        "application/json"
      ],
      "tags": ["kml", "geojson", "gpx", "import", "interop"]
    },
    {
      "id": "export-png",
      "name": "Export as PNG Illustration",
      "description": "Export the trail map as a high-resolution PNG illustration. Multiple aspect ratios (1:1 IG feed, 9:16 Story, 4:3, original), 3 border styles (classic double, paper sketch, minimal thin), 2 style filters (original, sketch), optional stats overlay.",
      "outputModes": ["image/png"],
      "tags": ["export", "png", "illustration", "instagram", "share"]
    },
    {
      "id": "export-backup",
      "name": "Export Project Backup",
      "description": "Download the full project as a .trailpaint file (JSON with embedded photo data URLs). Fully re-importable for continued editing.",
      "outputModes": ["application/json"],
      "tags": ["backup", "export", "trailpaint"]
    },
    {
      "id": "export-geo",
      "name": "Export Geographic Interop Formats",
      "description": "Export pure geographic structure as GeoJSON (for geojson.io, Mapbox, D3) or KML (for Google My Maps, Google Earth, Gaia GPS). Photos excluded by design (open data boundary).",
      "outputModes": [
        "application/geo+json",
        "application/vnd.google-earth.kml+xml"
      ],
      "tags": ["export", "geojson", "kml", "interop"]
    },
    {
      "id": "share-link",
      "name": "Generate Share Link",
      "description": "Generate a short share URL backed by Cloudflare Workers + KV. Recipient opens the link to see the map in TrailPaint. TTL 90 days, with optional Open Graph cover image from the first photo.",
      "outputModes": ["text/uri-list"],
      "tags": ["share", "link"]
    },
    {
      "id": "story-player",
      "name": "Story Player Auto-Playback",
      "description": "Standalone entry for auto-guided playback: fly-to animation through each spot, photo popups, playback interval and loop control, 5 basemaps plus 11 historical overlays (Taiwan 1897/1921/1966 + China 7 dynasties from CCTS: Han BC7 / Three Kingdoms 262 / Tang 741 / Song 1208 / Yuan 1330 / Ming 1582 / Qing 1820 + DARE Roman Mediterranean), background music, fullscreen mode, one-click embed code. v1.4 adds time slider (drag to cross-fade historical maps and spot opacity by era), compilations (multi-story chronological dialogue), and electronic postcards (1080×1080 IG square downloads).",
      "url": "https://trailpaint.org/app/player/",
      "tags": ["player", "playback", "narrative", "embed", "fullscreen", "compilation", "time-slider"]
    },
    {
      "id": "story-compilations",
      "name": "Story Compilations (v1.4)",
      "description": "Pre-built compilation maps that overlay multiple story segments on the same canvas with a time slider. Seven default compilations: Bible Narrative 2000y (9 stories from Exodus to Revelation, 17 segments), Mission East 350y (Ricci + Carey + Hudson Taylor + Taiwan missionaries, 9 segments, sequential), Great Century of Missions (Hudson Taylor + Taiwan missionaries), Age of Discovery 500y (Marco Polo + Zheng He + Columbus + Magellan + Cook, 16 segments, chronological cross-author), Paul Three Journeys, Four Gospels Map, Silk Road 2000 (Zhang Qian + Xuanzang + Marco Polo). Sunday school: drag the slider through 1500 years of biblical narrative on a single map.",
      "url": "https://trailpaint.org/app/player/",
      "tags": ["compilation", "bible", "missions", "church", "sunday-school"]
    },
    {
      "id": "ai-prompt",
      "name": "Generate AI Map-Style Prompts",
      "description": "Copy TrailPaint-generated prompts in 4 styles (Japanese hand-drawn, Treasure map, Kawaii cartoon, Minimal line art) to feed into external image generation AI (Midjourney, Gemini, ChatGPT image) for pure illustration variants.",
      "outputModes": ["text/plain"],
      "tags": ["ai", "prompt", "illustration"]
    },
    {
      "id": "embed",
      "name": "Player Embed Code",
      "description": "Copy an <iframe> HTML snippet with the project data baked in. Paste into blogs, Notion, WordPress, Substack, church sites for a self-contained interactive story map.",
      "outputModes": ["text/html"],
      "tags": ["embed", "iframe"]
    }
  ],
  "defaultInputModes": [
    "image/jpeg",
    "image/heic",
    "application/vnd.google-earth.kml+xml",
    "application/geo+json",
    "application/gpx+xml",
    "application/json"
  ],
  "defaultOutputModes": [
    "image/png",
    "application/json",
    "application/geo+json",
    "application/vnd.google-earth.kml+xml",
    "text/uri-list",
    "text/html"
  ],
  "metadata": {
    "repository": "https://github.com/notoriouslab/trailpaint",
    "issues": "https://github.com/notoriouslab/trailpaint/issues",
    "llmsTxt": "https://trailpaint.org/llms.txt",
    "sitemap": "https://trailpaint.org/sitemap.xml",
    "privacy": {
      "backend": false,
      "account": false,
      "dataLocation": "browser-localStorage",
      "externalServices": [
        "OpenStreetMap (map tiles)",
        "CARTO (map tiles)",
        "Protomaps (multilingual vector tiles)",
        "Photon (primary reverse geocoding)",
        "Nominatim (fallback reverse geocoding)",
        "Open-Meteo (elevation data)",
        "Cloudflare Workers + KV (optional share-link backend, user-triggered)"
      ]
    }
  }
}
