{"id":50974818,"url":"https://github.com/aswinbennyofficial/projectile","last_synced_at":"2026-06-19T06:32:23.998Z","repository":{"id":305112057,"uuid":"1019939812","full_name":"aswinbennyofficial/projectile","owner":"aswinbennyofficial","description":"Projectile is a lightweight, YAML based pluggable event router and fan-out engine. It connects sources (like webhooks, Kafka, or queues) to multiple sinks (like HTTP APIs, log files, message queues, Slack, or S3), enabling real-time event distribution pipelines with ease. ","archived":false,"fork":false,"pushed_at":"2025-07-21T09:12:38.000Z","size":282,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-02T23:14:20.634Z","etag":null,"topics":["cloud","cloud-native","event-driven","event-emitter","events","go","golang","microservice","pipeline","queue","yaml"],"latest_commit_sha":null,"homepage":"","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/aswinbennyofficial.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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}},"created_at":"2025-07-15T05:35:13.000Z","updated_at":"2025-07-21T09:12:41.000Z","dependencies_parsed_at":"2025-07-18T12:12:24.520Z","dependency_job_id":"3ab4bf0f-379f-40ed-9acd-9b68158097c5","html_url":"https://github.com/aswinbennyofficial/projectile","commit_stats":null,"previous_names":["aswinbennyofficial/projectile"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aswinbennyofficial/projectile","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aswinbennyofficial%2Fprojectile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aswinbennyofficial%2Fprojectile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aswinbennyofficial%2Fprojectile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aswinbennyofficial%2Fprojectile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aswinbennyofficial","download_url":"https://codeload.github.com/aswinbennyofficial/projectile/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aswinbennyofficial%2Fprojectile/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34520431,"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-19T02:00:06.005Z","response_time":61,"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":["cloud","cloud-native","event-driven","event-emitter","events","go","golang","microservice","pipeline","queue","yaml"],"created_at":"2026-06-19T06:32:22.505Z","updated_at":"2026-06-19T06:32:23.989Z","avatar_url":"https://github.com/aswinbennyofficial.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Projectile - Ongoing\n\n**Projectile** is a lightweight, pluggable event router and fan-out engine.  \nIt connects sources (like webhooks, Kafka, or message queues) to multiple sinks (like HTTP endpoints, log files, Slack, S3, or databases), making it easy to build real-time data pipelines.\n\nWith a YAML-based config system and modular plugin support, Projectile is designed for flexibility — whether you're running it on a laptop or deploying to a cloud-native environment.\n\n\n![Architecture diagram](./_nocode/images/architecture-diagram.png)\n\n\n## 🔌 Supported Plugins\n\n### Sources\n\n| Type     | Supported |\n|----------|-----------|\n| `webhook` | ✅        |\n| `kafka`   | ❌        |\n| `rabbitMQ`| ❌        |\n| `http-poller`| ✅        |\n| `timer`   | ❌        |\n\n### Sinks\n\n| Type       | Supported |\n|------------|-----------|\n| `stdout`   | ✅        |\n| `file`     | ✅        |\n| `http`  | ✅        |\n| `kafka`    | ❌        |\n| `postgres` | ❌        |\n| `slack`    | ❌        |\n| `s3`       | ❌        |\n| `rabbitMQ` | ❌        |\n\n\n\n## 🧠 Use Cases\n\n- 🔄 Forward webhook events to Kafka, Slack, or internal APIs\n- 🔁 Mirror Kafka events into multiple systems\n- 🚀 Trigger workflows or alerts from GitHub/GitLab events\n- 🧪 Build pluggable event processing pipelines\n- 📝 Log events to file for audit or debugging\n\n\n\n## 🧩 Speciality\n\n- ✅ **Modular Plugin System**: Easily add new sources or sinks with simple Go interfaces\n- 🔁 **Dynamic Routing**: Define event flows declaratively via `routes.yaml`\n- 🧠 **Decoupled Design**: Clean separation of concerns between config, orchestration, and plugins\n- ⚙️ **Config-Driven**: All behavior driven by YAML config – no code change required for routing\n- 📦 **Pluggable Transforms**: (WIP) Plan support for filters and `gojq`-style transformations\n- 🧪 **Single Binary Runtime**: All functionality packed into a single Go binary – no external dependencies\n- 🔧 **Unified Runtime**: Run all plugins (sources/sinks) together in one self-contained process\n\n\n\n---\n\n## 🧾 Example Configs\n\n### `infra.yaml` – Secrets, DSNs, and Connection Setup\n\n```yaml\nversion: v1\n\nsources:\n  webhook-main:\n    type: webhook\n    config:\n      path: /webhook/main\n      method: POST\n\n  scraper:\n    type: http-poller \n    config:\n      url: https://api.endpoint/\n      method: GET\n      headers:\n        Accept: application/json\n      body: \"\"\n      interval: 10s\n\nsinks:\n  stdout-log:\n    type: stdout\n    config: {}\n\n  file-logger:\n    type: file\n    config:\n      path: ./logs/main/\n      append: true\n\n  notify-service:\n    type: http\n    config:\n      method: POST\n      url: https://webhook-of-someservice/\n      headers:\n        X-Auth-Token: abc123\n\n\n```\n\n\n### `routes.yaml` – Routing Logic\n\n```yaml\nversion: v1\n\nroutes:\n  - name: main_fanout\n    source: webhook-main\n    sinks:\n      - stdout-log\n      - file-logger\n      - notify-service\n\n  - name: scraper_eval\n    source: scraper\n    rules:\n      - condition: event.status == \"warning\" \u0026\u0026 event.usage \u003e 80\n        sinks:\n          - notify-service\n\n      - condition: event.warning == \"ok\"\n        sinks:\n          - stdout-log\n\n      - condition: # fall back\n        sinks:\n          - file-logger\n          - stdout-log\n\n```\n\n\n---\n\n## 🚀 How to Run\n\n```bash\ngo run cmd/projectile/main.go\n```\n\nMake sure you have the required configuration files:\n\n- `configs/infra.yaml`\n- `configs/routes.yaml`\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faswinbennyofficial%2Fprojectile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faswinbennyofficial%2Fprojectile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faswinbennyofficial%2Fprojectile/lists"}