{"id":51082981,"url":"https://github.com/kanutocd/mammoth","last_synced_at":"2026-06-23T20:00:53.006Z","repository":{"id":365240066,"uuid":"1271195639","full_name":"kanutocd/mammoth","owner":"kanutocd","description":"Reliable delivery of PostgreSQL change events.","archived":false,"fork":false,"pushed_at":"2026-06-16T12:39:59.000Z","size":42,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-16T14:24:12.031Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kanutocd.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","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":"2026-06-16T12:29:43.000Z","updated_at":"2026-06-16T12:40:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kanutocd/mammoth","commit_stats":null,"previous_names":["kanutocd/mammoth"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/kanutocd/mammoth","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fmammoth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fmammoth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fmammoth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fmammoth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kanutocd","download_url":"https://codeload.github.com/kanutocd/mammoth/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanutocd%2Fmammoth/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34704748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-23T20:00:52.388Z","updated_at":"2026-06-23T20:00:52.998Z","avatar_url":"https://github.com/kanutocd.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mammoth\n\n[![Gem Version](https://badge.fury.io/rb/mammoth.svg)](https://badge.fury.io/rb/mammoth)\n[![CI](https://github.com/kanutocd/mammoth/workflows/CI/badge.svg)](https://github.com/kanutocd/mammoth/actions)\n[![Ruby Version](https://img.shields.io/badge/ruby-%3E%3D%204.0-ruby.svg)](https://www.ruby-lang.org/en/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n🦣 Mammoth is a self-hosted PostgreSQL event relay focused on reliable delivery\nof database change events.\n\n```text\nPostgreSQL\n      ↓\nCDC Ecosystem source adapter\n      ↓\nCDC::Core::TransactionEnvelope\n      ↓\nMammoth\n      ↓\nWebhook\n```\n\n🦣 Mammoth is intentionally boring infrastructure. It uses YAML configuration,\nJSON Schema validation, local SQLite operational state, and the CDC Ecosystem's\nshared vocabulary so operators can inspect, recover, and reason about delivery.\n\n## Documentation\n\nDocumentation site:\n\nhttps://kanutocd.github.io/mammoth/\n\nAPI documentation:\n\nhttps://kanutocd.github.io/mammoth/Mammoth.html\n\n\n## OSS MVP\n\n🦣 Mammoth OSS includes:\n\n- CLI foundation\n- YAML configuration loading\n- JSON Schema-backed configuration validation\n- SQLite operational memory bootstrap\n- checkpoint persistence\n- dead letter persistence\n- webhook delivery sink\n- delivery worker with retry, checkpoint, and DLQ handling\n- CDC-core event serialization boundary\n- CDC Ecosystem source-adapter integration boundary\n- Docker image support\n- public Helm chart support\n- unit and e2e test tasks\n\n## Boundary\n\nMammoth begins at CDC-core work items and ends at webhook delivery.\n\nMammoth does not own pgoutput protocol parsing, value decoding, source\nnormalization, ordering policy, or runtime execution. Those belong to the\nupstream CDC Ecosystem components.\n\n## Configuration\n\nMammoth configuration is YAML-backed and IDE-friendly.\n\n```yaml\n# yaml-language-server: $schema=./mammoth.schema.json\n```\n\nValidate configuration:\n\n```bash\nbundle exec ./exe/mammoth validate config/mammoth.example.yml\n```\n\n## CLI\n\n```bash\nbundle exec ./exe/mammoth version\nbundle exec ./exe/mammoth validate config/mammoth.example.yml\nbundle exec ./exe/mammoth bootstrap config/mammoth.example.yml\nbundle exec ./exe/mammoth status config/mammoth.example.yml\nbundle exec ./exe/mammoth start config/mammoth.example.yml\n```\n\nDeliver a single normalized event JSON file through Mammoth's delivery path:\n\n```bash\nbundle exec ./exe/mammoth deliver-sample \\\n  examples/postgres_webhook/config/mammoth.yml \\\n  examples/postgres_webhook/events/order_insert.json\n```\n\n## SQLite Operational State\n\nMammoth stores operational memory in SQLite:\n\n- `schema_migrations`\n- `checkpoints`\n- `dead_letters`\n\n## Performance\n\nMammoth scales downstream delivery throughput using the `cdc-concurrent` runtime while maintaining a single PostgreSQL logical replication stream.\n\n### Concurrent Delivery Benchmark\n\nEnvironment:\n\n* 10,000 transactions\n* 4 events per transaction\n* 40,000 total events\n\n#### Fast Downstream (10ms)\n\n| Concurrency | Transactions/sec |\n| ----------- | ---------------: |\n| 1           |            96.50 |\n| 25          |          2419.65 |\n\n#### Realistic Webhook (50ms)\n\n| Concurrency | Transactions/sec |\n| ----------- | ---------------: |\n| 1           |            19.85 |\n| 25          |           495.11 |\n\nObserved throughput improved from:\n\n- 96.50 → 2419.65 transactions/sec (10ms sink latency)\n- 19.85 → 495.11 transactions/sec (50ms sink latency)\n\nwhen increasing delivery concurrency from 1 to 25.\n\nThe benchmark demonstrates near-linear scaling of delivery throughput without increasing PostgreSQL replication connections.\n\nSee:\n\n- docs/BENCHMARKS.md\n- examples/transaction_webhook\n\nFor full benchmark methodology and results see:\n\nSee [Benchmarks](docs/BENCHMARKS.md).\n\n## E2E\n\n```bash\nbundle exec rake test:e2e\n# or\nscript/test-e2e\n```\n\nThe e2e task uses a real HTTP receiver, real SQLite database, and real\nfilesystem paths.\n\n## Kubernetes\n\nThe public Helm chart lives under:\n\n```text\ncharts/mammoth\n```\n\nInstall example:\n\n```bash\nhelm install mammoth charts/mammoth\n```\n\nThe chart uses one replica and `Recreate` strategy to respect PostgreSQL's\nlogical replication slot constraint: one slot, one active subscriber.\n\n## License\n\nMammoth OSS is licensed under the [MIT License](LICENSE.txt).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanutocd%2Fmammoth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkanutocd%2Fmammoth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanutocd%2Fmammoth/lists"}