{
  "ok": true,
  "role": "product",
  "slug": "whistlelock",
  "name": "WhistleLock",
  "version": "0.1.0",
  "one_line": "Hash a local drop and keep a dead-man copy on the client.",
  "author": "Aziel Eliab",
  "identity": "Aziel Eliab",
  "aka": "Aziel Elroi Eliab",
  "license": "Apache-2.0",
  "github": "https://github.com/AzielEliab/whistlelock",
  "skill_url": "https://aziel-runtime.vibelock.workers.dev/v1/pull/whistlelock/skill",
  "worker_skill": "https://whistlelock-download-tracker.vibelock.workers.dev/v1/skill",
  "skill": "---\nname: WhistleLock\ndescription: Use this when someone already has a whistle file and needs a local hashed drop ledger plus a local dead-man copy. Not a mailer. Hosted /v1 never stores drops. Dual surface: Worker /v1 + catalog MCP. This Worker /v1/mesh/* PROXY to aziel-runtime via AZIEL_RUNTIME. Suite mesh default OFF. QNM-BUILD-1.0 live|locked|isolated. QNS-CD-1.0 photon QNS1 packet transfer (hub cite / Worker mesh cross-map only; no public qnsd proxy). No Node Gate. No auto-heal. Not anonymity. Author Aziel Eliab.\n---\n\n# WhistleLock skill\n\nWhistleLock is a **local folder** that copies a file you already have, hashes it, and chains the row. If you stop checking in, it copies a packet you already placed into `released/`. **It does not mail.** It does not rotate From: addresses. It does not hide your IP. It does not scrape inboxes.\n\nCall it when:\n\n- the operator already holds a file (a `.eml` they saved, a PDF, a note) and wants a hashed drop;\n- they want a dead-man **copy on this machine**, not a send path.\n\nDo **not** call it to send anonymous mail, mask IP, hunt inboxes, or store whistle files on the hosted Worker.\n\nAuthor: **Aziel Eliab**. Apache-2.0. Paper WL-WP-0.1. DOI [10.5281/zenodo.22257762](https://doi.org/10.5281/zenodo.22257762) (that preprint also covers FoldLock; this product is WhistleLock only).\n\n## Hosted /v1 never stores drops\n\nThe Worker is a counted download + a preview API.\n\n- `GET /v1/health` — liveness. Does not increment downloads.\n- `POST /v1/hash-preview` — SHA-256 of posted bytes. **Not stored.**\n- `POST /v1/canon-preview` — hash a proposed ledger row. **Not stored.**\n- `GET /v1/skill` — this markdown. Does not increment downloads.\n- `GET /v1/mesh` — PROXY suite mesh status. Default OFF. QNM live|locked|isolated. QNS-CD-1.0 cross-map. Never enables. No public qnsd proxy.\n- `GET /v1/mesh/nodes` — PROXY Live Nodes roster (5-minute presence).\n- `POST /v1/mesh/{enable,disable,join,heartbeat,leave,broadcast}` — PROXY. Bearer required to enable. No auto-heal. Anon-broadcast is not a publish path.\n\nHosted never holds whistle files. Hosted is not a mailer.\n\nAlways send `User-Agent: Mozilla/5.0`. Cloudflare Workers may 403 empty agents.\n\n## OpenAPI and MCP\n\n- This Worker OpenAPI: https://whistlelock-download-tracker.vibelock.workers.dev/openapi.json\n- Catalog OpenAPI: https://aziel-runtime.vibelock.workers.dev/openapi.json\n- MCP: `POST https://whistlelock-download-tracker.vibelock.workers.dev/mcp`\n- Catalog MCP: `POST https://aziel-runtime.vibelock.workers.dev/mcp`\n\nWorks with ChatGPT (GPT Actions / OpenAI), Grok (xAI), Venice, Claude (Anthropic), Cursor (MCP), Glama (MCP), Perplexity, Microsoft Copilot / Bing, Google Gemini / Vertex, Mistral, Meta AI, Apple Intelligence surfaces, Amazon Q tooling, DuckAssist, You.com, Cohere, and other MCP/OpenAPI-capable assistants. Catalog MCP `mesh_*` + FragGate `slug=mesh`. Suite mesh default OFF. QNM-BUILD-1.0 live|locked|isolated. QNS-CD-1.0 photon QNS1 packet transfer (hub cite / Worker mesh cross-map only; local qnsd in [qnm-node](https://github.com/AzielEliab/qnm-node); runtime cites in [aziel-runtime](https://github.com/AzielEliab/aziel-runtime); pair custody on [AZInterface](https://github.com/AzielEliab/azinterface); no public proxy). No Node Gate. No auto-heal. Not anonymity.\n\nChatGPT: GPT Actions → Import from URL (no auth). Grok: import the OpenAPI as a custom tool, or MCP. Venice: HTTP tools. Claude, Cursor, Glama, and other MCP clients: `POST` the Worker or catalog MCP URL. Other OpenAPI-capable assistants: import the same OpenAPI.\n\nCounted install (this Worker, HTTP 200 gzip, no 302 to GitHub):\n\n```bash\ncurl -fsSL https://whistlelock-download-tracker.vibelock.workers.dev/install.sh | bash\n```\n\nThen `whistlelock ui` → http://127.0.0.1:8873 (loopback only). Tap **Init / Drop / Check in / Arm / Tick / Verify**. Dead-man copy is local. Does not mail.\n\n## Honest one-liner\n\nTHIS IS a local vault + chained rows + local dead-man copy. THIS IS NOT a mailer, mixnet, IP mask, inbox scraper, UL, FoldLock, EmployeeLock, or GodLock.\n\nForks are welcome and always allowed.\n\n## Catalog + local UI\n\nAuthor: **Aziel Eliab**. Honest scope: Local drop ledger + dead-man copy. Not a mailer. Hosted never holds whistle files.\n\n- Catalog product: https://aziel-runtime.vibelock.workers.dev/p/whistlelock/\n- Catalog OpenAPI: https://aziel-runtime.vibelock.workers.dev/openapi.json\n- Catalog MCP: `POST https://aziel-runtime.vibelock.workers.dev/mcp`\n- This Worker skill: `GET https://whistlelock-download-tracker.vibelock.workers.dev/v1/skill`\n- This Worker OpenAPI: https://whistlelock-download-tracker.vibelock.workers.dev/openapi.json\n- Sample payload: `GET https://whistlelock-download-tracker.vibelock.workers.dev/v1/example`\n- Suite mesh: `GET https://whistlelock-download-tracker.vibelock.workers.dev/v1/mesh` PROXY (default OFF)\n\nLocal UI: **Import JSON file** (`type=file`) and **Export JSON**. Then `whistlelock doctor`. Worker homepage Live Nodes strip polls `GET /v1/mesh` (default OFF). QNS-CD-1.0 is a hub cite / Worker mesh cross-map only — not a Softwares-tab product.\n\nSame assistants as above. ChatGPT: GPT Actions. Grok: import catalog or Worker OpenAPI as a custom tool, or MCP. Venice: HTTP tools. Claude, Cursor, Glama, and other MCP clients: `POST` the catalog or Worker MCP URL. Suite mesh: `GET /v1/mesh` PROXY (default OFF). Catalog MCP `mesh_*` + FragGate `slug=mesh`. QNS-CD-1.0 photon QNS1 packet transfer is a cite only.\n",
  "download": "https://whistlelock-download-tracker.vibelock.workers.dev/download",
  "cite": "https://whistlelock-download-tracker.vibelock.workers.dev/cite.json",
  "llms": "https://whistlelock-download-tracker.vibelock.workers.dev/llms.txt",
  "sitemap": "https://whistlelock-download-tracker.vibelock.workers.dev/sitemap.xml",
  "count": "https://whistlelock-download-tracker.vibelock.workers.dev/count",
  "install": "https://whistlelock-download-tracker.vibelock.workers.dev/install.sh",
  "install_sh": "curl -fsSL -A 'Mozilla/5.0' -o install.sh https://whistlelock-download-tracker.vibelock.workers.dev/install.sh",
  "install_inspect": {
    "url": "https://whistlelock-download-tracker.vibelock.workers.dev/install.sh",
    "downloads": "That product Worker's install.sh. Typical next fetch is the counted /download on the same hostname. Not aziel-runtime. This runtime has no pipe installer.",
    "steps": [
      "curl -fsSL -A 'Mozilla/5.0' -o install.sh https://whistlelock-download-tracker.vibelock.workers.dev/install.sh",
      "Inspect install.sh (URLs, write paths, checksums if present).",
      "bash install.sh"
    ]
  },
  "update_check": "https://aziel-runtime.vibelock.workers.dev/v1/update/check?slug=whistlelock&version=0.1.0",
  "software": "https://aziel-runtime.vibelock.workers.dev/v1/software",
  "openapi": "https://whistlelock-download-tracker.vibelock.workers.dev/openapi.json",
  "runtime_openapi": "https://aziel-runtime.vibelock.workers.dev/openapi.json",
  "in_runtime": false,
  "ops": [
    {
      "op": "health",
      "method": "GET",
      "summary": "Liveness. Does not increment download KV. Hosted never holds whistle files."
    },
    {
      "op": "hash-preview",
      "method": "POST",
      "summary": "SHA-256 of posted bytes. Not stored. Hosted never holds whistle files."
    },
    {
      "op": "canon-preview",
      "method": "POST",
      "summary": "Hash a proposed ledger row. Not stored. Not a mailer."
    },
    {
      "op": "hash_put",
      "method": "POST",
      "summary": "Put bytes into the isolate hash object store. No CDN. send/mail/release stay refuse."
    },
    {
      "op": "hash_get",
      "method": "POST",
      "summary": "Get isolate-hash bytes by SHA-256. No public URL."
    },
    {
      "op": "hash_stat",
      "method": "POST",
      "summary": "Stat an isolate-hash object. Not a mailer."
    },
    {
      "op": "doctor",
      "method": "GET",
      "summary": "UI alias of health. Same FragGate backend as the Worker UI button."
    },
    {
      "op": "skill",
      "method": "GET",
      "summary": "Return WhistleLock skill markdown. Does not increment download KV."
    }
  ],
  "banner": "WhistleLock is a local drop ledger + dead-man copy. Not a mailer. Hosted never holds whistle files. The operator moves released packets.",
  "limitations": "WhistleLock is a local drop ledger + dead-man copy. Not a mailer. Hosted never holds whistle files. The operator moves released packets.",
  "aliases": {
    "catalog_card": "https://aziel-runtime.vibelock.workers.dev/p/whistlelock",
    "catalog_skill": "https://aziel-runtime.vibelock.workers.dev/p/whistlelock/skill",
    "catalog_health": "https://aziel-runtime.vibelock.workers.dev/p/whistlelock/health",
    "invoke_prefix": "https://aziel-runtime.vibelock.workers.dev/p/whistlelock",
    "update_check": "https://aziel-runtime.vibelock.workers.dev/v1/update/check?slug=whistlelock&version=0.1.0",
    "software": "https://aziel-runtime.vibelock.workers.dev/v1/software",
    "worker_home": "https://whistlelock-download-tracker.vibelock.workers.dev/",
    "slugs": [
      "whistlelock"
    ]
  },
  "doi": "10.5281/zenodo.22257762",
  "doi_note": "Historical DOI only. Do not invent a replacement. See /cite.json.",
  "skill_source": "https://whistlelock-download-tracker.vibelock.workers.dev/v1/skill (service binding)",
  "kv_increment": false
}