{
  "$schema": "https://pointcast.xyz/BLOCKS.md",
  "name": "PointCast",
  "description": "A living broadcast from El Segundo — dispatches, faucets, visits, mints on Tezos.",
  "homepage": "https://pointcast.xyz",
  "forAgents": "https://pointcast.xyz/for-agents",
  "generatedAt": "2026-04-22T06:54:05.449Z",
  "blocksSince": "2025-01-14",
  "blocksCount": 118,
  "location": "El Segundo, California, USA",
  "language": "en-US",
  "license": "CC0-flavored (see /for-agents for terms)",
  "endpoints": {
    "human": {
      "home": "https://pointcast.xyz/",
      "manifesto": "https://pointcast.xyz/manifesto",
      "dao": "https://pointcast.xyz/dao",
      "yield": "https://pointcast.xyz/yield",
      "nounsCola": "https://pointcast.xyz/nouns-cola",
      "nounsColaCrush": "https://pointcast.xyz/nouns-cola-crush",
      "publish": "https://pointcast.xyz/publish",
      "beacon": "https://pointcast.xyz/beacon",
      "aiStack": "https://pointcast.xyz/ai-stack",
      "mesh": "https://pointcast.xyz/mesh",
      "yeePlayer": "https://pointcast.xyz/yee",
      "collabs": "https://pointcast.xyz/collabs",
      "collabsRelay": "https://pointcast.xyz/collabs/relay",
      "collabsArena": "https://pointcast.xyz/collabs/arena",
      "ping": "https://pointcast.xyz/ping",
      "sprint": "https://pointcast.xyz/sprint",
      "sprints": "https://pointcast.xyz/sprints",
      "drop": "https://pointcast.xyz/drop",
      "products": "https://pointcast.xyz/products",
      "polls": "https://pointcast.xyz/polls",
      "briefs": "https://pointcast.xyz/briefs",
      "gallery": "https://pointcast.xyz/gallery",
      "ethLegacy": "https://pointcast.xyz/eth-legacy",
      "glossary": "https://pointcast.xyz/glossary",
      "changelog": "https://pointcast.xyz/changelog",
      "archive": "https://pointcast.xyz/archive",
      "editions": "https://pointcast.xyz/editions",
      "collection": "https://pointcast.xyz/collection",
      "cast": "https://pointcast.xyz/cast",
      "drum": "https://pointcast.xyz/drum",
      "battle": "https://pointcast.xyz/battle",
      "now": "https://pointcast.xyz/now",
      "search": "https://pointcast.xyz/search",
      "random": "https://pointcast.xyz/random",
      "timeline": "https://pointcast.xyz/timeline",
      "status": "https://pointcast.xyz/status",
      "profile": "https://pointcast.xyz/profile",
      "family": "https://pointcast.xyz/family",
      "today": "https://pointcast.xyz/today",
      "moods": "https://pointcast.xyz/moods",
      "local": "https://pointcast.xyz/local",
      "nature": "https://pointcast.xyz/nature",
      "houseplants": "https://pointcast.xyz/houseplants",
      "tv": "https://pointcast.xyz/tv",
      "here": "https://pointcast.xyz/here",
      "forAgents": "https://pointcast.xyz/for-agents",
      "forNodes": "https://pointcast.xyz/for-nodes"
    },
    "json": {
      "agents": "https://pointcast.xyz/agents.json",
      "blocks": "https://pointcast.xyz/blocks.json",
      "archive": "https://pointcast.xyz/archive.json",
      "editions": "https://pointcast.xyz/editions.json",
      "now": "https://pointcast.xyz/now.json",
      "cast": "https://pointcast.xyz/cast.json",
      "battle": "https://pointcast.xyz/battle.json",
      "timeline": "https://pointcast.xyz/timeline.json",
      "feed": "https://pointcast.xyz/feed.json",
      "random": "https://pointcast.xyz/random.json",
      "dao": "https://pointcast.xyz/dao.json",
      "yield": "https://pointcast.xyz/yield.json",
      "nounsCola": "https://pointcast.xyz/nouns-cola.json",
      "nounsColaCrush": "https://pointcast.xyz/nouns-cola-crush.json",
      "publish": "https://pointcast.xyz/publish.json",
      "beacon": "https://pointcast.xyz/beacon.json",
      "aiStack": "https://pointcast.xyz/ai-stack.json",
      "collabs": "https://pointcast.xyz/collabs.json",
      "products": "https://pointcast.xyz/products.json",
      "sprint": "https://pointcast.xyz/sprint.json",
      "sprints": "https://pointcast.xyz/sprints.json",
      "family": "https://pointcast.xyz/family.json",
      "today": "https://pointcast.xyz/today.json",
      "moods": "https://pointcast.xyz/moods.json",
      "local": "https://pointcast.xyz/local.json",
      "nature": "https://pointcast.xyz/nature.json",
      "houseplants": "https://pointcast.xyz/houseplants.json"
    },
    "api": {
      "ping": "https://pointcast.xyz/api/ping",
      "publish": "https://pointcast.xyz/api/publish",
      "indexnow": "https://pointcast.xyz/api/indexnow",
      "queue": "https://pointcast.xyz/api/queue",
      "drop": "https://pointcast.xyz/api/drop",
      "poll": "https://pointcast.xyz/api/poll",
      "presence": "wss://pointcast.xyz/api/presence",
      "presenceSnapshot": "https://pointcast.xyz/api/presence/snapshot",
      "presenceProtocol": {
        "transport": "websocket",
        "query": {
          "sid": "browser-scoped UUID; private; never broadcast back out",
          "kind": [
            "human",
            "agent",
            "wallet"
          ]
        },
        "clientMessages": {
          "identify": {
            "type": "identify",
            "nounId": "required integer 0-1199",
            "mood": "optional string",
            "listening": "optional string",
            "where": "optional string"
          },
          "update": {
            "type": "update",
            "nounId": "required integer 0-1199",
            "mood": "optional string or null to clear",
            "listening": "optional string or null to clear",
            "where": "optional string or null to clear"
          },
          "ping": {
            "type": "ping",
            "nounId": "required integer 0-1199"
          }
        },
        "broadcast": {
          "humans": "count of non-agent visitors (includes wallet kind)",
          "agents": "count of agent visitors",
          "sessions": [
            {
              "nounId": 421,
              "kind": "human",
              "joinedAt": "2026-04-20T05:35:00.000Z",
              "mood": "optional string",
              "listening": "optional string",
              "where": "optional string"
            }
          ]
        },
        "cap": 50,
        "privacy": "Broadcasts never include raw session ids. Agent entries omit mood/listening/where."
      },
      "weather": "https://pointcast.xyz/api/weather?station={slug}"
    },
    "rss": {
      "all": "https://pointcast.xyz/feed.xml",
      "postsOnly": "https://pointcast.xyz/rss.xml"
    },
    "indexnow": "https://pointcast.xyz/api/indexnow",
    "perBlock": {
      "html": "https://pointcast.xyz/b/{id}",
      "json": "https://pointcast.xyz/b/{id}.json"
    },
    "perChannel": {
      "html": "https://pointcast.xyz/c/{slug}",
      "json": "https://pointcast.xyz/c/{slug}.json",
      "rss": "https://pointcast.xyz/c/{slug}.rss"
    },
    "perMood": {
      "html": "https://pointcast.xyz/mood/{slug}",
      "json": "https://pointcast.xyz/mood/{slug}.json",
      "algorithm": "editorial classifier cutting across channels and types; mood slug = lowercase-hyphen, max 40 chars"
    },
    "perYeeTrack": {
      "html": "https://pointcast.xyz/yee/{id}",
      "note": "WATCH-type blocks with a media.beats array get a playable rhythm-game overlay"
    },
    "perStation": {
      "html": "https://pointcast.xyz/tv/{station}",
      "weather": "https://pointcast.xyz/api/weather?station={station}",
      "note": "STATIONS mode — 15 geo-stations within 100mi of El Segundo. Each route renders /tv in station-feed mode for that city. Keyboard: 1-9 + Q-Y for channel surfing across stations."
    },
    "crawl": {
      "sitemap": "https://pointcast.xyz/sitemap-blocks.xml",
      "rss": "https://pointcast.xyz/rss.xml"
    },
    "metadata": {
      "tezosMetadata": "https://pointcast.xyz/api/tezos-metadata/{tokenId}"
    }
  },
  "channels": [
    {
      "code": "FD",
      "slug": "front-door",
      "name": "Front Door",
      "purpose": "AI, interfaces, agent-era thinking.",
      "color": "#185FA5",
      "surfaces": {
        "html": "https://pointcast.xyz/c/front-door",
        "json": "https://pointcast.xyz/c/front-door.json",
        "rss": "https://pointcast.xyz/c/front-door.rss"
      }
    },
    {
      "code": "CRT",
      "slug": "court",
      "name": "Court",
      "purpose": "Pickleball — matches, paddles, drills.",
      "color": "#3B6D11",
      "surfaces": {
        "html": "https://pointcast.xyz/c/court",
        "json": "https://pointcast.xyz/c/court.json",
        "rss": "https://pointcast.xyz/c/court.rss"
      }
    },
    {
      "code": "SPN",
      "slug": "spinning",
      "name": "Spinning",
      "purpose": "Music, playlists, listening notes.",
      "color": "#993C1D",
      "surfaces": {
        "html": "https://pointcast.xyz/c/spinning",
        "json": "https://pointcast.xyz/c/spinning.json",
        "rss": "https://pointcast.xyz/c/spinning.rss"
      }
    },
    {
      "code": "GF",
      "slug": "good-feels",
      "name": "Good Feels",
      "purpose": "Cannabis/hemp, product drops, brand ops.",
      "color": "#993556",
      "surfaces": {
        "html": "https://pointcast.xyz/c/good-feels",
        "json": "https://pointcast.xyz/c/good-feels.json",
        "rss": "https://pointcast.xyz/c/good-feels.rss"
      }
    },
    {
      "code": "GDN",
      "slug": "garden",
      "name": "Garden",
      "purpose": "Balcony, birds, wildlife, quiet noticing.",
      "color": "#0F6E56",
      "surfaces": {
        "html": "https://pointcast.xyz/c/garden",
        "json": "https://pointcast.xyz/c/garden.json",
        "rss": "https://pointcast.xyz/c/garden.rss"
      }
    },
    {
      "code": "ESC",
      "slug": "el-segundo",
      "name": "El Segundo",
      "purpose": "ESCU fiction, local, community.",
      "color": "#534AB7",
      "surfaces": {
        "html": "https://pointcast.xyz/c/el-segundo",
        "json": "https://pointcast.xyz/c/el-segundo.json",
        "rss": "https://pointcast.xyz/c/el-segundo.rss"
      }
    },
    {
      "code": "FCT",
      "slug": "faucet",
      "name": "Faucet",
      "purpose": "Free daily claims, giveaways.",
      "color": "#BA7517",
      "surfaces": {
        "html": "https://pointcast.xyz/c/faucet",
        "json": "https://pointcast.xyz/c/faucet.json",
        "rss": "https://pointcast.xyz/c/faucet.rss"
      }
    },
    {
      "code": "VST",
      "slug": "visit",
      "name": "Visit",
      "purpose": "Human and agent visit log entries.",
      "color": "#5F5E5A",
      "surfaces": {
        "html": "https://pointcast.xyz/c/visit",
        "json": "https://pointcast.xyz/c/visit.json",
        "rss": "https://pointcast.xyz/c/visit.rss"
      }
    },
    {
      "code": "BTL",
      "slug": "battler",
      "name": "Battler",
      "purpose": "Nouns Battler — deterministic duels. Every match is a block.",
      "color": "#8A2432",
      "surfaces": {
        "html": "https://pointcast.xyz/c/battler",
        "json": "https://pointcast.xyz/c/battler.json",
        "rss": "https://pointcast.xyz/c/battler.rss"
      }
    }
  ],
  "blockTypes": [
    {
      "code": "READ",
      "label": "READ",
      "description": "Long-form text — essay, dispatch, article.",
      "footerHint": "readingTime"
    },
    {
      "code": "LISTEN",
      "label": "LISTEN",
      "description": "Audio embed — Spotify, SoundCloud, or a single track.",
      "footerHint": "externalLink"
    },
    {
      "code": "WATCH",
      "label": "WATCH",
      "description": "Video embed with external link and runtime.",
      "footerHint": "duration"
    },
    {
      "code": "MINT",
      "label": "MINT",
      "description": "Paid edition on Tezos FA2. Price in tez, supply, mint button.",
      "footerHint": "edition"
    },
    {
      "code": "FAUCET",
      "label": "FAUCET",
      "description": "Free daily claim. One per wallet per day, gas only.",
      "footerHint": "claimStatus"
    },
    {
      "code": "NOTE",
      "label": "NOTE",
      "description": "Short observation, tweet-sized. Often location-tagged.",
      "footerHint": "location"
    },
    {
      "code": "VISIT",
      "label": "VISIT",
      "description": "Visit-log entry. Shows the visitor vendor or geo.",
      "footerHint": "agent"
    },
    {
      "code": "LINK",
      "label": "LINK",
      "description": "External link — destination domain shown as the footer signal.",
      "footerHint": "destination"
    }
  ],
  "contracts": {
    "visitNouns": {
      "chain": "tezos",
      "network": "mainnet",
      "address": "KT1LP1oTBuudRubAYQDErH7i7mSwazVdohxh",
      "standard": "FA2",
      "status": "live",
      "tzkt": "https://tzkt.io/KT1LP1oTBuudRubAYQDErH7i7mSwazVdohxh",
      "objkt": "https://objkt.com/collection/KT1LP1oTBuudRubAYQDErH7i7mSwazVdohxh",
      "description": "Visit Nouns FA2 — open-supply, each token is a Nouns seed 0-1199."
    },
    "prizeCast": {
      "chain": "tezos",
      "network": "mainnet",
      "address": null,
      "standard": "custom",
      "status": "pending-compile",
      "description": "No-loss prize-linked savings. PoolTogether-flavored, Tezos-native.",
      "source": "https://github.com/MikeHoydich/pointcast/blob/main/contracts/v2/prize_cast.py"
    },
    "drumToken": {
      "chain": "tezos",
      "network": "mainnet",
      "address": null,
      "standard": "FA1.2",
      "status": "pending-compile",
      "description": "DRUM attention coin. Signed-voucher claim flow.",
      "source": "https://github.com/MikeHoydich/pointcast/blob/main/contracts/v2/drum_token.py"
    },
    "marketplace": {
      "chain": "tezos",
      "network": "mainnet",
      "address": null,
      "status": "planned"
    }
  },
  "agentMode": {
    "trigger": "User-Agent prefix \"ai:\" OR matches GPTBot / ClaudeBot / PerplexityBot / OAI-SearchBot / Atlas / Google-Extended",
    "treatment": "Returns stripped HTML: no <style>, no <link rel=stylesheet>, no preload/preconnect/icon/manifest, no inline <script> (JSON-LD preserved), no generator meta, no inline style attrs.",
    "responseHeader": "X-Agent-Mode: stripped · ai:<vendor>",
    "payloadSavings": "~12% smaller on the home feed (97,631 vs 111,170 bytes verified).",
    "source": "https://github.com/MikeHoydich/pointcast/blob/main/functions/_middleware.ts"
  },
  "cors": {
    "policy": "All JSON / markdown agent surfaces carry Access-Control-Allow-Origin: *.",
    "applies": [
      "/agents.json",
      "/blocks.json",
      "/archive.json",
      "/editions.json",
      "/now.json",
      "/cast.json",
      "/battle.json",
      "/timeline.json",
      "/stack.json",
      "/feed.json",
      "/feed.xml",
      "/b/*.json",
      "/c/*.json",
      "/c/*.rss",
      "/llms.txt",
      "/llms-full.txt"
    ],
    "note": "Agents can fetch from any origin. No preflight needed for GETs."
  },
  "push": {
    "indexnow": {
      "endpoint": "https://pointcast.xyz/api/indexnow",
      "method": "POST",
      "shape": "{ urls: [\"https://pointcast.xyz/...\"] }",
      "status": "awaiting key binding (INDEXNOW_KEY in Cloudflare Pages env)",
      "spec": "https://www.indexnow.org/documentation"
    }
  },
  "citationFormat": {
    "template": "PointCast · CH.{CODE} · № {ID} — \"{TITLE}\" · {YYYY-MM-DD}\nhttps://pointcast.xyz/b/{ID}",
    "example": "PointCast · CH.FD · № 0205 — \"The front door is agentic\" · 2026-04-14\nhttps://pointcast.xyz/b/0205"
  },
  "contact": "hello@pointcast.xyz",
  "maintainers": [
    {
      "name": "Mike Hoydich",
      "role": "director",
      "twitter": "@mhoydich"
    },
    {
      "name": "Claude Code",
      "role": "primary engineer",
      "builtBy": "Anthropic"
    },
    {
      "name": "Codex",
      "role": "specialist reviewer",
      "builtBy": "OpenAI"
    },
    {
      "name": "Manus",
      "role": "operations + computer-use"
    }
  ]
}