{"id":28051460,"url":"https://github.com/hookdeck/outpost","last_synced_at":"2026-04-10T22:06:54.008Z","repository":{"id":278516728,"uuid":"845647044","full_name":"hookdeck/outpost","owner":"hookdeck","description":"Open Source Outbound Webhooks and Event Destinations Infrastructure","archived":false,"fork":false,"pushed_at":"2026-03-01T01:21:23.000Z","size":20754,"stargazers_count":878,"open_issues_count":68,"forks_count":31,"subscribers_count":9,"default_branch":"main","last_synced_at":"2026-03-01T05:09:31.712Z","etag":null,"topics":["amazon-eventbridge","aws-sqs","eventdestinations","eventstream","gcp-pubsub","hookdeck","rabbitmq","redis","webhooks","webhooksender"],"latest_commit_sha":null,"homepage":"https://hookdeck.com/outpost","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hookdeck.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-08-21T16:45:40.000Z","updated_at":"2026-02-27T15:39:40.000Z","dependencies_parsed_at":"2026-03-01T03:51:25.462Z","dependency_job_id":null,"html_url":"https://github.com/hookdeck/outpost","commit_stats":null,"previous_names":["hookdeck/outpost"],"tags_count":62,"template":false,"template_full_name":null,"purl":"pkg:github/hookdeck/outpost","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Foutpost","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Foutpost/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Foutpost/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Foutpost/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hookdeck","download_url":"https://codeload.github.com/hookdeck/outpost/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hookdeck%2Foutpost/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29966684,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T09:33:09.965Z","status":"ssl_error","status_checked_at":"2026-03-01T09:25:48.915Z","response_time":124,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amazon-eventbridge","aws-sqs","eventdestinations","eventstream","gcp-pubsub","hookdeck","rabbitmq","redis","webhooks","webhooksender"],"created_at":"2025-05-12T01:02:38.798Z","updated_at":"2026-03-01T10:02:25.472Z","avatar_url":"https://github.com/hookdeck.png","language":"Go","readme":"\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"images/outpost-logo-white.svg\"\u003e\n    \u003cimg alt=\"Outpost logo\" src=\"images/outpost-logo-black.svg\" width=\"40%\"\u003e\n  \u003c/picture\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \n[![License](https://img.shields.io/badge/License-Apache--2.0-blue)](#license)\n[![Go Report Card](https://goreportcard.com/badge/github.com/hookdeck/outpost)](https://goreportcard.com/report/github.com/hookdeck/outpost)\n[![Issues - Outpost](https://img.shields.io/github/issues/hookdeck/outpost)](https://github.com/hookdeck/outpost/issues)\n![GitHub Release](https://img.shields.io/github/v/release/hookdeck/outpost)\n  \n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\nSDKs:\n\n[![Go SDK](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/hookdeck/outpost/refs/heads/main/sdks/outpost-go/shields.json)](sdks/outpost-go/README.md)\n[![TypeScript SDK](https://img.shields.io/npm/v/%40hookdeck%2Foutpost-sdk)](sdks/outpost-typescript/README.md)\n[![Python SDK](https://img.shields.io/pypi/v/outpost-sdk)](sdks/outpost-python/README.md)\n\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eOpen Source Outbound Webhooks and Event Destinations Infrastructure\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[Documentation](#documentation)\n·\n[Report a bug](issues/new?assignees=\u0026labels=bug\u0026projects=\u0026template=bug_report.md\u0026title=%F0%9F%90%9B+Bug+Report%3A+)\n·\n[Request a feature](issues/new?assignees=\u0026labels=enhancement\u0026projects=\u0026template=feature_request.md\u0026title=%F0%9F%9A%80+Feature%3A+)\n\n\u003c!-- ·\n[Join our Slack](https://hookdeck.com/slack?ref=github-outpost) --\u003e\n\n\u003c/div\u003e\n\nOutpost is a self-hosted and open-source infrastructure that enables event producers to add outbound webhooks and [Event Destinations](https://eventdestinations.org?ref=github-outpost) to their platform with support for destination types such as Webhooks, Hookdeck Event Gateway, Amazon EventBridge, AWS SQS, AWS S3, GCP Pub/Sub, RabbitMQ, and Kafka.\n\nThe Outpost runtime has minimal dependencies (Redis or Redis cluster, PostgreSQL, and one of the supported message queues), is 100% backward compatible with your existing webhooks implementation, and is optimized for high-throughput, low-cost operation.\n\nOutpost is built and maintained by [Hookdeck](https://hookdeck.com?ref=github-outpost). It's written in Go and distributed as a binary and Docker container under the Apache-2.0 license.\n\n![Outpost architecture](docs/public/images/architecture.png)\n\nRead [Outpost Concepts](https://outpost.hookdeck.com/docs/concepts) to learn more about the Outpost architecture and design.\n\n## Features\n\n- **Event topics and topic-based subscriptions**: Supports the common publish and subscription paradigm to ease adoption and integration into existing systems.\n- **Publish events via the API or a queue**: Publish events using the Outpost API or configure Outpost to read events from a publish queue.\n- **At least once delivery guarantee**: Messages are guaranteed to be delivered at least once and never lost.\n- **Event fanout**: A message is sent to a topic is replicated and sent to multiple endpoints. This allows for parallel processing and asynchronous event notifications.\n- **Automatic and manual retries**: Configure retry strategies for event destinations and manually trigger event delivery retries via the API or user portal.\n- **Multi-tenant support**: Create multiple tenants on a single Outpost deployment.\n- **User portal**: Allow customers to view metrics, manage, debug, and observe their event destinations.\n- **Delivery failure alerts**: Manage event delivery failure alerts.\n- **OpenTelemetry**: OTel standardized traces, metrics, and logs.\n- **Event destination types**: Out of the box support for Webhooks, Hookdeck Event Gateway, Amazon EventBridge, AWS SQS, AWS S3, GCP Pub/Sub, RabbitMQ, and Kafka.\n- **Webhook best practices**: Opt-out webhook best practices, such as headers for idempotency, timestamp and signature, and signature rotation.\n- **SDKs and MCP server**: Go, Python, and TypeScript SDK are available. Outpost also ships with an MCP server. All generated by [Speakeasy](https://speakeasy.com).\n\nSee the [Outpost Features](https://outpost.hookdeck.com/docs/features) for more information.\n\n## Documentation\n\n- [Overview](https://outpost.hookdeck.com/docs/overview)\n- [Concepts](https://outpost.hookdeck.com/docs/concepts)\n- [Quickstarts](https://outpost.hookdeck.com/docs/quickstarts)\n- [Features](https://outpost.hookdeck.com/docs/features)\n- [Guides](https://outpost.hookdeck.com/docs/guides)\n- [API Reference](https://outpost.hookdeck.com/docs/api)\n- [Configuration Reference](https://outpost.hookdeck.com/docs/references/configuration)\n\n_The Outpost documentation is built using the [Zudoku documentation framework](https://zuplo.link/outpost)._\n\n## Quickstart\n\n### Deploy to Railway\n\n[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/outpost-starter?referralCode=NRulS_)\n\nOnce the deployment is complete, configure your `TOPICS` environment variable to the topics supported for destination subscriptions, publishing, and routing of events. For example, `TOPICS=user.created,user.updated,user.deleted`.\n\nOnce deployed, you'll need the public Railway URL of your Outpost instance (referred to as `$OUTPOST_URL` below) and the generated `API_KEY` environment variable value to authenticate requests.\n\n### Deploy locally with Docker\n\nEnsure you have [Docker](https://docs.docker.com/engine/install/) installed.\n\nClone the Outpost repo:\n\n```sh\ngit clone https://github.com/hookdeck/outpost.git\n```\n\nNavigate to `outpost/examples/docker-compose/`:\n\n```sh\ncd outpost/examples/docker-compose/\n```\n\nCreate a `.env` file from the example:\n\n```sh\ncp .env.example .env\n```\n\nUpdate the `$API_KEY` value within the new `.env` file.\n\n#### Redis Configuration\n\nOutpost supports both standard Redis and cluster Redis configurations:\n\n**Standard Redis** (default, for local development and single-node Redis):\n```env\nREDIS_HOST=\"redis\"\nREDIS_PORT=\"6379\" \nREDIS_TLS_ENABLED=\"false\"\nREDIS_CLUSTER_ENABLED=\"false\"\n```\n\n**Redis Cluster** (for Redis Enterprise and managed Redis services):\n```env\nREDIS_HOST=\"your-redis-cluster.example.com\"\nREDIS_PORT=\"10000\"\nREDIS_TLS_ENABLED=\"true\"\nREDIS_CLUSTER_ENABLED=\"true\"\n```\n\nFor other cloud Redis services or self-hosted Redis clusters, set `REDIS_CLUSTER_ENABLED=\"true\"` if using Redis clustering.\n\n**Troubleshooting Redis connectivity**: Use the built-in diagnostic tool to test your Redis connection:\n```sh\ngo run cmd/redis-debug/main.go your-redis-host 6379 password 0 [tls] [cluster]\n```\nSee the [Redis Troubleshooting Guide](https://docs.outpost.hookdeck.com/references/troubleshooting-redis) for detailed guidance.\n\nStart the Outpost dependencies and services:\n\n```sh\ndocker-compose -f compose.yml -f compose-rabbitmq.yml -f compose-postgres.yml up\n```\n\nOutpost is running on `localhost:3333`. Use this value as your `$OUTPOST_URL`.\n\n### Try out Outpost\n\n\u003e [!TIP]  \n\u003e You can use shell variables to store the tenant ID and API key for easier use in the following commands:\n\u003e\n\u003e ```sh\n\u003e OUTPOST_URL=http://localhost:3333\n\u003e TENANT_ID=your_org_name\n\u003e API_KEY=your_api_key\n\u003e URL=your_webhook_url\n\u003e ```\n\n\nCheck the services are running:\n\n```sh\ncurl $OUTPOST_URL/api/v1/healthz\n```\n\nWait until you get a 200 response.\n\nCreate a tenant with the following command, replacing `$TENANT_ID` with a unique identifier such as \"your_org_name\", and the `$API_KEY` with the value you set in your `.env`:\n\n\n\n```sh\ncurl --location --request PUT \"$OUTPOST_URL/api/v1/tenants/$TENANT_ID\" \\\n--header \"Authorization: Bearer $API_KEY\"\n```\n\nRun a local server exposed via a localtunnel or use a hosted service such as the [Hookdeck Console](https://console.hookdeck.com?ref=github-outpost) to capture webhook events.\n\nCreate a webhook destination where events will be delivered to with the following command. Again, replace `$TENANT_ID` and `$API_KEY`. Also, replace `$URL` with the webhook destinations URL:\n\n```sh\ncurl --location \"$OUTPOST_URL/api/v1/tenants/$TENANT_ID/destinations\" \\\n--header \"Content-Type: application/json\" \\\n--header \"Authorization: Bearer $API_KEY\" \\\n--data '{\n    \"type\": \"webhook\",\n    \"topics\": [\"*\"],\n    \"config\": {\n        \"url\": \"'\"$URL\"'\"\n    }\n}'\n```\n\nPublish an event, remembering to replace `$API_KEY` and `$TENANT_ID`:\n\n```sh\ncurl --location \"$OUTPOST_URL/api/v1/publish\" \\\n--header \"Content-Type: application/json\" \\\n--header \"Authorization: Bearer $API_KEY\" \\\n--data '{\n    \"tenant_id\": \"'\"$TENANT_ID\"'\",\n    \"topic\": \"user.created\",\n    \"eligible_for_retry\": true,\n    \"metadata\": {\n        \"meta\": \"data\"\n    },\n    \"data\": {\n        \"user_id\": \"userid\"\n    }\n}'\n```\n\nCheck the logs on your server or your webhook capture tool for the delivered event.\n\nGet an Outpost portal link for the tenant:\n\n```sh\ncurl \"$OUTPOST_URL/api/v1/tenants/$TENANT_ID/portal\" \\\n--header \"Authorization: Bearer $API_KEY\"\n```\n\nThe response will look something like the following:\n\n```json\n{ \"redirect_url\": \"http://$OUTPOST_URL?token=$TOKEN\" }\n```\n\nThe `token` value is an API-generated JWT.\n\nOpen the `redirect_url` link to view the Outpost portal.\n\n![Dashboard homepage](docs/public/images/dashboard-homepage.png)\n\nContinue to use the [Outpost API](https://outpost.hookdeck.com/docs/api) or the Outpost portal to add and test more destinations.\n\n## Contributing\n\nSee [CONTRIBUTING](CONTRIBUTING.md).\n\n## License\n\nThis repository contains Outpost, covered under the [Apache License 2.0](LICENSE), except where noted (any Outpost logos or trademarks are not covered under the Apache License, and should be explicitly noted by a LICENSE file.)\n","funding_links":[],"categories":["Webhook","Go","\u003ca name=\"Go\"\u003e\u003c/a\u003eGo"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhookdeck%2Foutpost","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhookdeck%2Foutpost","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhookdeck%2Foutpost/lists"}