Releases: hookdeck/outpost
v0.9.0
Features
- Enhanced publish endpoint response with
duplicatefield indicating whether an event was already processed via idempotency, allowing clients to distinguish between new and deduplicated events by @alexluong in #563 - Configurable retry monitor polling via
RETRY_POLL_BACKOFF_MSenvironment variable, allowing operators to tune the retry queue polling interval by @alexluong in #562 - Self-managed message queue infrastructure via
MQS_AUTO_PROVISIONenvironment variable, allowing operators to manage their own message queue infrastructure instead of automatic provisioning by @alexluong in #560 - Comprehensive health check endpoint refactor returning structured JSON with individual worker status reporting (HTTP 200 for healthy, 503 for failed), enabling better integration with container orchestration health probes by @alexluong in #558
Full Changelog: v0.8.0...v0.9.0
v0.8.0
Features
- Standard Webhooks support for webhook deliveries, providing standardized signature format (
webhook-prefixed headers,whsec_secrets) and compatibility with official Standard Webhooks SDKs by @alexluong in #519 - Configurable ID generation, allowing operators to choose between UUID v4, UUID v7, or nanoid algorithms, and configure entity-specific prefixes (e.g.,
evt_,dst_,dlv_) for improved observability by @alexluong in #530 - Custom retry schedules via
RETRY_SCHEDULEconfiguration, allowing operators to define specific retry delays (e.g., 5,60,600,3600) instead of relying solely on exponential backoff by @alexluong in #532 - Destination metadata field for storing operational context and
delivery_metadatafield for automatically merging custom key-value pairs into event payloads on delivery by @alexluong in #542 - Configurable idempotency key TTL via
PUBLISH_IDEMPOTENCY_KEY_TTLandDELIVERY_IDEMPOTENCY_KEY_TTL, allowing operators to tune deduplication windows (defaults to 1 hour) by @alexluong in #544 - Tenant
metadatafield for storing arbitrary operational context and tenant-level configuration data by @alexluong in #550 updated_attimestamp fields to tenant and destination resources for tracking last modification time, useful for change detection and cache invalidation by @alexluong in #551
Updates
- Fixed
ORGANIZATION_NAMEenvironment variable to be correctly lised atPORTAL_ORGANIZATION_NAMEin the docs by @alexluong in #541 - Loadtest workflow enhancements by @alexluong in #540
- Treat whitespace
TOPICSconfig as empty by @alexluong in #553 - Improve GCP Pub/Sub validation by @alexluong in #546
Full Changelog: v0.7.0...v0.8.0
v0.7.0
Fixes
Features
- Add GCP Pub/Sub destination type by @alexluong in #464
- Support webhook delivery through proxy by @alexluong in #513
- Add
deployment_idsupport for multi-deployment by @alexluong in #512
Updates
- SDK API spec tests by @leggetter in #518 & #521
- Docs: update event destination types and roadmap entries by @leggetter in #517
- Streamline Claude GitHub Actions workflow by @alexluong in #516
claude.mdreview prompt by @alexluong in #522
Full Changelog: v0.6.1...v0.7.0
typescript - sdks/outpost-typescript/v0.5.0 - 2025-10-13 12:59:42
Generated by Speakeasy CLI
2025-10-13 12:59:42
Changes
Based on:
- OpenAPI Doc 0.0.1
- Speakeasy CLI 1.636.3 (2.723.11) https://github.com/speakeasy-api/speakeasy
Generated
- [typescript v0.5.0] sdks/outpost-typescript
Releases
- [NPM v0.5.0] https://www.npmjs.com/package/@hookdeck/outpost-sdk/v/0.5.0 - sdks/outpost-typescript
Publishing Completed
v0.6.1
Fixes
- Core: Sanitize go-migrate error messages to prevent credential exposure by @alexluong in #487
- Core: Add retry logic for migration lock errors by @alexluong in #508
Updates
- Core: Support timestamp-ms delivery metadata format by @alexluong in #507
- Docs: Fix broken links and create references page by @obazoud in #493
- Docs: Update reference page content by @leggetter in #506
- Examples: Add Dockerfile.example for custom builds by @obazoud & @alexluong in #505
Full Changelog: v0.6.0...v0.6.1
v0.6.0
Breaking Changes
Redis Schema Migration Required
Existing deployments must migrate Redis keys to hash-tagged format before upgrading to v0.6.0. This enables Redis Cluster support for horizontal scaling.
Schema Change
The Redis key structure has been updated to support Redis Cluster by adding hash tags:
| OLD SCHEMA | NEW SCHEMA |
|---|---|
tenant:123 |
tenant:{123}:tenant |
tenant:123:destinations |
tenant:{123}:destinations |
tenant:123:destination:abc |
tenant:{123}:destination:abc |
Why?
Redis Cluster distributes keys across nodes using hash slots. Without hash tags, related keys like tenant:123 and tenant:123:destinations could be on different nodes, causing CROSSSLOT errors during transactions. Hash tags {...} ensure all tenant data maps to the same hash slot, enabling atomic multi-key operations.
outpost binary behavior change
The outpost binary is now a unified CLI that consolidates server and migration operations.
The binary interface has changed:
Before v0.6.0:
outpost # Start the serverv0.6.0 and later:
outpost serve # Start the server
outpost migrate # Run migrations
outpost --version- Docker service users (e.g., docker-compose up) - No changes required. The container
still starts the server by default. - Docker CLI users (e.g., docker run hookdeck/outpost ...) - The entrypoint is now the
unified CLI, so commands change as shown above. - Binary users - Update scripts/commands to use outpost serve instead of outpost.
- NOTE: The
outpostCLI orchestratesoutpost-serverand
outpost-migrate-redisbinaries. All three binaries must be in the same directory or
available in your $PATH for the CLI to function correctly.
- NOTE: The
Migration Steps
Option 1: Using environment variables
docker run --rm \\
-e REDIS_HOST=your-host \\
-e REDIS_PASSWORD=your-password \\
hookdeck/outpost:v0.6.0 migrate plan
Option 2: Using CLI flags
docker run --rm hookdeck/outpost:v0.6.0 migrate plan \\
--redis-host=your-host \\
--redis-password=your-password
Option 3: Using .env file
docker run --rm --env-file .env hookdeck/outpost:v0.6.0 migrate plan
Then proceed with apply, verify, deploy, and cleanup:
docker run --rm -it hookdeck/outpost:v0.6.0 migrate apply [options]
docker run --rm hookdeck/outpost:v0.6.0 migrate verify [options]
# Deploy v0.6.0 and test thoroughly
docker run --rm -it hookdeck/outpost:v0.6.0 migrate cleanup [options]
📖 Full guide: Outpost Migration Guide
X-Outpost-Timestamp header and metadata timestamps now use Unix seconds
All timestamps now consistently use Unix seconds to align with the signature format. Applications parsing these timestamps will need to update their logic to expect seconds instead of milliseconds.
Features
- Core: Add Redis Cluster support with TLS and automatic node discovery (#465) by @leggetter
- Core: Add unified Outpost CLI with migration tool (
outpost migrate) (#498) by @alexluong
Fixes
- Portal: Fix inline SVG icons inflating table row height (#501) by @leggetter
Full Changelog
v0.5.1
Fixes
- API: Add pagination support to event listings in OpenAPI documentation by @leggetter
in #474 - Core: Delivery timestamp metadata now in unix seconds by @alexluong in #495
- Portal: UI small fixes & enhancements by @alexluong in #497
- Tests: Update destination type count in e2e assertion by @alexluong in #496
Updates
- API: Log /api/v1/healthz requests at debug level instead of info to reduce noise by
@obazoud in #481 - Portal: Add outpost icon SVG to public images by @leggetter in #499
- Examples: Update outpost version in compose.yml to 0.5.0 by @github-actions in #473
New Contributors
Full Changelog: v0.5.0...v0.5.1
typescript - sdks/outpost-typescript/v0.4.0 - 2025-09-03 18:08:30
Generated by Speakeasy CLI
Typescript SDK Changes Detected:
outpost.events.list():requestChangedresponseChanged Breaking⚠️
outpost.events.listByDestination():requestChangedresponseChanged Breaking⚠️
outpost.destinations.list():request.typeChangedresponse.[].[awsS3]Added
outpost.destinations.create():request.destinationCreate.[awsS3]Addedresponse.[aws_s3]Added
outpost.destinations.get():response.[aws_s3]Addedoutpost.destinations.update():request.destinationUpdate.[destinationUpdateAwss3]Addedresponse.[destination].[awsS3]Added
outpost.destinations.enable():response.[aws_s3]Addedoutpost.destinations.disable():response.[aws_s3]Addedoutpost.schemas.get():request.typeChanged
outpost.schemas.getDestinationTypeJwt():request.typeChanged
Generated with Speakeasy CLI 1.609.0
Publishing Completed
python - sdks/outpost-python/v0.4.0 - 2025-09-03 17:57:45
Generated by Speakeasy CLI
2025-09-03 17:57:45
Changes
Based on:
- OpenAPI Doc 0.0.1
- Speakeasy CLI 1.609.0 (2.692.0) https://github.com/speakeasy-api/speakeasy
Generated
- [python v0.4.0] sdks/outpost-python
Releases
- [PyPI v0.4.0] https://pypi.org/project/outpost_sdk/0.4.0 - sdks/outpost-python
Publishing Completed
go - sdks/outpost-go/v0.4.0 - 2025-09-03 14:52:32
Generated by Speakeasy CLI
github.com/hookdeck/outpost/sdks/outpost-go 0.4.0
Go SDK Changes Detected:
Outpost.Events.List():requestChanged Breaking⚠️ responseChanged Breaking⚠️
Outpost.Events.ListByDestination():requestChanged Breaking⚠️ responseChanged Breaking⚠️
Outpost.Destinations.List():request.TypeChangedresponse.[].[awsS3]Added
Outpost.Destinations.Create():request.DestinationCreate.[awsS3]Addedresponse.[awsS3]Added
Outpost.Destinations.Get():response.[awsS3]AddedOutpost.Destinations.Update():request.DestinationUpdate.[destinationUpdateAwss3]Addedresponse.[destination].[awsS3]Added
Outpost.Destinations.Enable():response.[awsS3]AddedOutpost.Destinations.Disable():response.[awsS3]AddedOutpost.Schemas.Get():request.TypeChangedOutpost.Schemas.GetDestinationTypeJwt():request.TypeChanged
Generated with Speakeasy CLI 1.608.0