# Custom Gatekeeper > **Retired sample:** Fork Horse's deploy no longer ships this package; it remains a source example to copy and wire yourself. This is a credential-free, read-only example for deployment-owned Cloudflare OS integrations. It exposes deployment information through a typed singleton and records every read as an observation. ## Adapt it Change only the pieces your integration needs: - `src/types.d.ts`: replace `CustomSession` with the API agents and Gadgets may call. - `src/types-code.ts`: keep the agent-facing declaration synchronized with `types.d.ts`. - `src/custom.ts`: replace `getDeploymentInfo()` and its observation description with the real read operation. - `src/custom.ts`: update vendor, account, resource, and binding metadata. - `wrangler.jsonc`: add non-secret bindings/variables and a migration when adding Durable Object classes. - `deployment.jsonc`: provide deployment values. This sample is retired: `scripts/deploy.ts` no longer deploys it or generates a `GATEKEEPER_CUSTOM` binding, so wire a copy yourself the way the deploy wires Fork Horse's gatekeeper (`GATEKEEPER_FORKHORSE`). Put API tokens and OAuth credentials in Wrangler secrets, never `wrangler.jsonc` or `deployment.jsonc`. ## Observer policy `CustomVerifier.verify()` accepts every observer because the example returns the same low-stakes deployment text to every authenticated user. That is not a safe default for account-specific, tenant-specific, or confidential data. A real integration must decide which observers may retain data and implement verification at that data boundary. Use upstream's [`write-gatekeeper` skill](https://github.com/cloudflare/cloudflare-os/blob/main/.agents/skills/write-gatekeeper/SKILL.md) for observer design, OAuth, URL-scoped resources, writes and simulation, hooks, and configurator UI. ## Check ```sh pnpm run test:run pnpm run types:check pnpm exec wrangler deploy --dry-run ```