{
  "schemaVersion": "1.0.0",
  "description": "Project-specific 1loc recipe interface; not a universal agent standard.",
  "resources": [
    {
      "id": "recipe-transactional-email",
      "url": "https://1loc.dev/recipes/transactional-email/",
      "title": "Send your first transactional email",
      "task": "Build one server-side request, keep its idempotency key across retries, and start with a local mock.",
      "environment": "Node.js 22.23.2 / TypeScript",
      "version": "1.0.0",
      "updatedAt": "2026-10-28",
      "executionMode": "Local mock",
      "verificationScope": "Local fixtures on Node.js 22.23.2 and contract review; authenticated sandbox and delivery not executed.",
      "permissions": "No account or network in mock mode. Optional sandbox needs send scope and consumes quota/rate. There is no live-delivery mode in this starter.",
      "limitations": [
        "Only local fixtures were executed; an authenticated API response has not been observed.",
        "Every executable send path forces X-Oveyon-Sandbox: 1. Sandbox consumes quota/rate limits and does not deliver.",
        "The API idempotency window is 24 hours. This minimal recipe does not persist its event key across application restarts; use the order recipe for durable application state."
      ],
      "markdown": "https://1loc.dev/recipes/transactional-email.md",
      "context": "https://1loc.dev/context/transactional-email.md",
      "download": "https://1loc.dev/downloads/transactional-email.tar.gz",
      "files": [
        {
          "name": "README.md",
          "sha256": "f590fc6d4a0594cbcf9d7d8ccafce8ea4ed46b6fb0d999ece1e6f5afe176ec0c",
          "bytes": 2554
        },
        {
          "name": "package.json",
          "sha256": "5269a336c32bc0eda9170ecde9e91465950384b29d64796d41ea1121b176593e",
          "bytes": 520
        },
        {
          "name": "package-lock.json",
          "sha256": "d8971e9658738e53993fb1405b6633cc1ae6d530239f98b82e6b84eadfa84a20",
          "bytes": 295
        },
        {
          "name": ".env.example",
          "sha256": "408889401f7734dc6fbb7ec7bcf2724a57503da3ba1f619ab96bd3450962e6e3",
          "bytes": 186
        },
        {
          "name": ".gitignore",
          "sha256": "369ba0639d10ccc67b301014bb0458d06b4285464aec0aed64fbd0734da61168",
          "bytes": 66
        },
        {
          "name": "LICENSE",
          "sha256": "23532c34eb65291469fb84ccd843ab44e5a8853c735a2b526aebe4164b184ea5",
          "bytes": 1063
        },
        {
          "name": "transactional-email/main.ts",
          "sha256": "8f72d0b47fde0fdd049d87535fb62196be653a460c4c8a7a99c19bc79736068c",
          "bytes": 673
        },
        {
          "name": "transactional-email/recipe.test.ts",
          "sha256": "9572d0d9f33429b5f12a53d34a4e31f3747df60a6affbcc3b7a8c7c5d8f77961",
          "bytes": 2531
        },
        {
          "name": "shared/client.ts",
          "sha256": "aacf31350d51e3d263156b795f112c2d2c4e7c4040b01994a0315950ea876221",
          "bytes": 4564
        },
        {
          "name": "shared/mock.ts",
          "sha256": "5ac1f01d3d61b9131178fbb5ef468dc8d17f38e98f51a0891eeb1e55eb90b2ca",
          "bytes": 2162
        }
      ]
    },
    {
      "id": "recipe-order-confirmation",
      "url": "https://1loc.dev/recipes/order-confirmation/",
      "title": "Confirm an order without a duplicate retry",
      "task": "Persist the business event before the request and reuse its provider key after recoverable failures.",
      "environment": "Node.js 22.23.2 / TypeScript",
      "version": "1.0.0",
      "updatedAt": "2026-10-28",
      "executionMode": "Local mock",
      "verificationScope": "Local fixtures on Node.js 22.23.2 and contract review; authenticated sandbox and delivery not executed.",
      "permissions": "Mock mode writes a local SQLite file. Optional sandbox needs send scope. Manual reconciliation and resume are application-operator actions.",
      "limitations": [
        "SQLite and the sample schema belong to the downloaded backend example; the public website has no database.",
        "This is not an exactly-once transport. A crash after provider acceptance and before the local commit requires reconciliation.",
        "Operator resume assumes no old worker is still running; a distributed queue, leases, full order-system integration and long-term retention policy are outside this starter.",
        "Mock and sandbox use separate default database files. Sandbox still consumes quota and never delivers. No authenticated API call was executed.",
        "The database helper keeps process umask 077 so later WAL/SHM creation stays private; it never changes permissions on a shared parent directory."
      ],
      "markdown": "https://1loc.dev/recipes/order-confirmation.md",
      "context": "https://1loc.dev/context/order-confirmation.md",
      "download": "https://1loc.dev/downloads/order-confirmation.tar.gz",
      "files": [
        {
          "name": "README.md",
          "sha256": "d865940d4b65390dc66a73b768e96f2cc941209ac1090be2b7276dc15c393436",
          "bytes": 3305
        },
        {
          "name": "package.json",
          "sha256": "e422df7d7c6d43290fdb05ff57829d036016fc7c546d789fc3e1eca69291bd67",
          "bytes": 516
        },
        {
          "name": "package-lock.json",
          "sha256": "6816baa289dfaa1708eb4b5deb581db7df657b0fc2557d890915377210694829",
          "bytes": 293
        },
        {
          "name": ".env.example",
          "sha256": "408889401f7734dc6fbb7ec7bcf2724a57503da3ba1f619ab96bd3450962e6e3",
          "bytes": 186
        },
        {
          "name": ".gitignore",
          "sha256": "369ba0639d10ccc67b301014bb0458d06b4285464aec0aed64fbd0734da61168",
          "bytes": 66
        },
        {
          "name": "LICENSE",
          "sha256": "23532c34eb65291469fb84ccd843ab44e5a8853c735a2b526aebe4164b184ea5",
          "bytes": 1063
        },
        {
          "name": "order-confirmation/main.ts",
          "sha256": "946117e2d16a11a68e657c98e391e0198f8fbebde615524f1c6c1c35baf23f75",
          "bytes": 1090
        },
        {
          "name": "order-confirmation/outbox.ts",
          "sha256": "a64ca52688a6433729f5ec46d83f219a5131fed8919e7846d2b07a7574a2fcd4",
          "bytes": 3062
        },
        {
          "name": "order-confirmation/recipe.test.ts",
          "sha256": "50f123f59ed5e45d4882ff474c164f90392922dbb1c7d8bcc8b16f4575770218",
          "bytes": 4168
        },
        {
          "name": "shared/client.ts",
          "sha256": "aacf31350d51e3d263156b795f112c2d2c4e7c4040b01994a0315950ea876221",
          "bytes": 4564
        },
        {
          "name": "shared/mock.ts",
          "sha256": "5ac1f01d3d61b9131178fbb5ef468dc8d17f38e98f51a0891eeb1e55eb90b2ca",
          "bytes": 2162
        },
        {
          "name": "shared/private-store.ts",
          "sha256": "960edbdb8231302a553bfd1b02e96f2cadec70df78b60e45615920069cbdf304",
          "bytes": 1412
        }
      ]
    },
    {
      "id": "recipe-versioned-template",
      "url": "https://1loc.dev/recipes/versioned-template/",
      "title": "Send a welcome email from a pinned template",
      "task": "Create a draft, publish an explicit version, and send data against that immutable version.",
      "environment": "Node.js 22.23.2 / TypeScript",
      "version": "1.0.0",
      "updatedAt": "2026-10-28",
      "executionMode": "Local mock",
      "verificationScope": "Local fixtures on Node.js 22.23.2 and contract review; authenticated sandbox and delivery not executed.",
      "permissions": "Mock mode has no network or account effects. draft/publish mutate templates with write:templates; the separate sandbox command uses send and consumes quota/rate without delivery.",
      "limitations": [
        "Only local fixture tests and contract review were completed; no authenticated template was created or published.",
        "The sandbox header applies to sending. Creating and publishing templates change the account and are not simulated by that header.",
        "The starter exposes those mutations only through explicit draft/publish commands. Published version 1 stays pinned until the application is deliberately changed."
      ],
      "markdown": "https://1loc.dev/recipes/versioned-template.md",
      "context": "https://1loc.dev/context/versioned-template.md",
      "download": "https://1loc.dev/downloads/versioned-template.tar.gz",
      "files": [
        {
          "name": "README.md",
          "sha256": "b02744867a8bf7897a26adf155d5fd4e4b3a967376df529d1e52209d9fe6099b",
          "bytes": 2720
        },
        {
          "name": "package.json",
          "sha256": "8aad76316b540f1d9c4ff56286c0635fe04e8bf01e07ee7aa3e40b2209121728",
          "bytes": 803
        },
        {
          "name": "package-lock.json",
          "sha256": "0706dde06a7c3fd4c4ea06a0c29585fed0919da7a4ba112e91b89a6e7267b541",
          "bytes": 293
        },
        {
          "name": ".env.example",
          "sha256": "408889401f7734dc6fbb7ec7bcf2724a57503da3ba1f619ab96bd3450962e6e3",
          "bytes": 186
        },
        {
          "name": ".gitignore",
          "sha256": "369ba0639d10ccc67b301014bb0458d06b4285464aec0aed64fbd0734da61168",
          "bytes": 66
        },
        {
          "name": "LICENSE",
          "sha256": "23532c34eb65291469fb84ccd843ab44e5a8853c735a2b526aebe4164b184ea5",
          "bytes": 1063
        },
        {
          "name": "versioned-template/main.ts",
          "sha256": "0132e8f819aead333c6df6971292f5f2185471015ac63c5e8b334e601b4d4eb3",
          "bytes": 1405
        },
        {
          "name": "versioned-template/template.ts",
          "sha256": "43881d43a145828d7ef5174bedb82a7efb552af60b80a1b9535825ce3fb8dc33",
          "bytes": 1106
        },
        {
          "name": "versioned-template/recipe.test.ts",
          "sha256": "a67da19267b2cb13993ecd29c0510a69d3e8d5ec1aa4140c198ffc14a9ebd122",
          "bytes": 1169
        },
        {
          "name": "shared/client.ts",
          "sha256": "aacf31350d51e3d263156b795f112c2d2c4e7c4040b01994a0315950ea876221",
          "bytes": 4564
        },
        {
          "name": "shared/mock.ts",
          "sha256": "5ac1f01d3d61b9131178fbb5ef468dc8d17f38e98f51a0891eeb1e55eb90b2ca",
          "bytes": 2162
        }
      ]
    },
    {
      "id": "recipe-delivery-webhook",
      "url": "https://1loc.dev/recipes/delivery-webhook/",
      "title": "Track recipient delivery with a signed webhook",
      "task": "Authenticate raw bytes, reject stale signatures, and persist independent state for each recipient.",
      "environment": "Node.js 22.23.2 / TypeScript",
      "version": "1.0.0",
      "updatedAt": "2026-10-28",
      "executionMode": "Local mock",
      "verificationScope": "Local fixtures on Node.js 22.23.2 and contract review; authenticated sandbox and delivery not executed.",
      "permissions": "Synthetic mode uses an in-memory database only. The local receiver writes a SQLite database and verifies an existing endpoint secret; it does not call Oveyon or create an endpoint.",
      "limitations": [
        "The public OpenAPI outgoing-event schema is permissive. messageId, optional deliveryId, recipient, status and timestamp were reviewed against the current producer; no real signed provider request was observed.",
        "Outgoing notifications do not expose the inbound eventId guarantee. This example deduplicates the same event/recipient/timestamp tuple and applies status idempotently; separately emitted equivalent notifications may remain separate observations.",
        "Recipient identity always uses messageId plus the exact recipient address. Optional deliveryId does not change that identity or bypass ordering/deduplication.",
        "Only delivered/bounced and their fallback variants are stored. Engagement, complaint, blocked, inbound and approval events are ignored by this focused handler.",
        "An older notification cannot overwrite a newer observation. Equal-time conflicting states are not ordered; reconcile them with the message API.",
        "Recipient-server acceptance does not establish inbox placement. A fresh signed retry may contain an old event timestamp; anti-replay uses the signed header timestamp."
      ],
      "markdown": "https://1loc.dev/recipes/delivery-webhook.md",
      "context": "https://1loc.dev/context/delivery-webhook.md",
      "download": "https://1loc.dev/downloads/delivery-webhook.tar.gz",
      "files": [
        {
          "name": "README.md",
          "sha256": "9b1910b16f4466da6e69edc6a1db0dd7b0aa3f63c063aa39f3d4f8639ffb75cf",
          "bytes": 3772
        },
        {
          "name": "package.json",
          "sha256": "3871f8dea73578aac36972ff354890086ef3deab5c18a30b5a3a64f15e913f62",
          "bytes": 491
        },
        {
          "name": "package-lock.json",
          "sha256": "d6ff9fe8a7d6f0afb086adc3a61ad0d316b94fd948e1dba45c428d060ad3b6f3",
          "bytes": 289
        },
        {
          "name": ".env.example",
          "sha256": "52481a2edead1381970b93950a9addc9be53f2f03b0fbd7afe9fa9ee0bc0268b",
          "bytes": 218
        },
        {
          "name": ".gitignore",
          "sha256": "369ba0639d10ccc67b301014bb0458d06b4285464aec0aed64fbd0734da61168",
          "bytes": 66
        },
        {
          "name": "LICENSE",
          "sha256": "23532c34eb65291469fb84ccd843ab44e5a8853c735a2b526aebe4164b184ea5",
          "bytes": 1063
        },
        {
          "name": "delivery-webhook/main.ts",
          "sha256": "67401ef9697433cfcd2b28abea7b84e27cac2caafc650e333a622488ef3ea6b4",
          "bytes": 846
        },
        {
          "name": "delivery-webhook/receiver.ts",
          "sha256": "73e70c5530644bd86f5ce835dcb8fedadf7328485aa817f3c6fa36d40d46e5f6",
          "bytes": 4123
        },
        {
          "name": "delivery-webhook/fixture.ts",
          "sha256": "b421e9bf291b905150409b228ee1b90bce5539c0ae4a1055c5754b66ff930043",
          "bytes": 629
        },
        {
          "name": "delivery-webhook/server.ts",
          "sha256": "11c6c37992ac881fd3717f105ced7d0ba13f4903c9d738949c0eee62c65aa8c9",
          "bytes": 2234
        },
        {
          "name": "delivery-webhook/recipe.test.ts",
          "sha256": "0adf159c67d8dc2a9883b7513133d7f6e33a7855813747a36d87f594a66b476a",
          "bytes": 4861
        },
        {
          "name": "shared/private-store.ts",
          "sha256": "960edbdb8231302a553bfd1b02e96f2cadec70df78b60e45615920069cbdf304",
          "bytes": 1412
        }
      ]
    },
    {
      "id": "recipe-disposable-domain",
      "url": "https://1loc.dev/recipes/disposable-domain/",
      "title": "Check disposable domains during sign-up",
      "task": "Ask about a domain without sending a full address, and keep unavailable results explicitly unknown.",
      "environment": "Node.js 22.23.2 / TypeScript",
      "version": "1.0.0",
      "updatedAt": "2026-10-28",
      "executionMode": "Local mock",
      "verificationScope": "Local fixtures on Node.js 22.23.2 and contract review; authenticated sandbox and delivery not executed.",
      "permissions": "Mock mode is local. The optional lookup makes one public GET request without credentials and consumes the per-IP lookup allowance.",
      "limitations": [
        "Only fixtures were executed; the public lookup command has not been run as a verification claim.",
        "The lookup does not establish mailbox existence, deliverability, trustworthiness or inbox placement.",
        "Matching is for the exact domain, not every subdomain. The documented cap is 60 lookups per IP per hour; use the public list directly for bulk processing."
      ],
      "markdown": "https://1loc.dev/recipes/disposable-domain.md",
      "context": "https://1loc.dev/context/disposable-domain.md",
      "download": "https://1loc.dev/downloads/disposable-domain.tar.gz",
      "files": [
        {
          "name": "README.md",
          "sha256": "9b298767ea8359b95ca03f56e06d494f45c063745a0bd69018d7a760e419d0ad",
          "bytes": 2574
        },
        {
          "name": "package.json",
          "sha256": "8728859998f9ec67dbeb7bcd0ae9c4db3dd719ed1af1bcd0cae303cf55edfc8a",
          "bytes": 517
        },
        {
          "name": "package-lock.json",
          "sha256": "65e22bb6cc1438f6ca0b9a3c0304e15b1c0ce42a6f783ad74e8133a19fbf1a48",
          "bytes": 291
        },
        {
          "name": ".env.example",
          "sha256": "61f70a7a2070b62ad604c0647f65b1a0da6d1ff97fbbb6201863f52f7e195f5a",
          "bytes": 50
        },
        {
          "name": ".gitignore",
          "sha256": "369ba0639d10ccc67b301014bb0458d06b4285464aec0aed64fbd0734da61168",
          "bytes": 66
        },
        {
          "name": "LICENSE",
          "sha256": "23532c34eb65291469fb84ccd843ab44e5a8853c735a2b526aebe4164b184ea5",
          "bytes": 1063
        },
        {
          "name": "disposable-domain/main.ts",
          "sha256": "39ee1d5e9f5cb80fd460e32dc0cd2545018425343e67fe5d8224751ff5c1a483",
          "bytes": 673
        },
        {
          "name": "disposable-domain/lookup.ts",
          "sha256": "2dfb8bed7425075fe268f547f861eb1f359e27b3273eb31f5d5628f8529ef7f3",
          "bytes": 1550
        },
        {
          "name": "disposable-domain/recipe.test.ts",
          "sha256": "97b979b27900f3eed7e5859851e7f9371f5f939ab250d2b1caaa1d2c6f9d9d6f",
          "bytes": 1261
        }
      ]
    }
  ]
}