An open API service indexing awesome lists of open source software.

https://github.com/aswinbennyofficial/projectile

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.
https://github.com/aswinbennyofficial/projectile

cloud cloud-native event-driven event-emitter events go golang microservice pipeline queue yaml

Last synced: 7 days ago
JSON representation

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.

Awesome Lists containing this project

README

          

# ๐Ÿš€ Projectile - Ongoing

**Projectile** is a lightweight, pluggable event router and fan-out engine.
It 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.

With 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.

![Architecture diagram](./_nocode/images/architecture-diagram.png)

## ๐Ÿ”Œ Supported Plugins

### Sources

| Type | Supported |
|----------|-----------|
| `webhook` | โœ… |
| `kafka` | โŒ |
| `rabbitMQ`| โŒ |
| `http-poller`| โœ… |
| `timer` | โŒ |

### Sinks

| Type | Supported |
|------------|-----------|
| `stdout` | โœ… |
| `file` | โœ… |
| `http` | โœ… |
| `kafka` | โŒ |
| `postgres` | โŒ |
| `slack` | โŒ |
| `s3` | โŒ |
| `rabbitMQ` | โŒ |

## ๐Ÿง  Use Cases

- ๐Ÿ”„ Forward webhook events to Kafka, Slack, or internal APIs
- ๐Ÿ” Mirror Kafka events into multiple systems
- ๐Ÿš€ Trigger workflows or alerts from GitHub/GitLab events
- ๐Ÿงช Build pluggable event processing pipelines
- ๐Ÿ“ Log events to file for audit or debugging

## ๐Ÿงฉ Speciality

- โœ… **Modular Plugin System**: Easily add new sources or sinks with simple Go interfaces
- ๐Ÿ” **Dynamic Routing**: Define event flows declaratively via `routes.yaml`
- ๐Ÿง  **Decoupled Design**: Clean separation of concerns between config, orchestration, and plugins
- โš™๏ธ **Config-Driven**: All behavior driven by YAML config โ€“ no code change required for routing
- ๐Ÿ“ฆ **Pluggable Transforms**: (WIP) Plan support for filters and `gojq`-style transformations
- ๐Ÿงช **Single Binary Runtime**: All functionality packed into a single Go binary โ€“ no external dependencies
- ๐Ÿ”ง **Unified Runtime**: Run all plugins (sources/sinks) together in one self-contained process

---

## ๐Ÿงพ Example Configs

### `infra.yaml` โ€“ Secrets, DSNs, and Connection Setup

```yaml
version: v1

sources:
webhook-main:
type: webhook
config:
path: /webhook/main
method: POST

scraper:
type: http-poller
config:
url: https://api.endpoint/
method: GET
headers:
Accept: application/json
body: ""
interval: 10s

sinks:
stdout-log:
type: stdout
config: {}

file-logger:
type: file
config:
path: ./logs/main/
append: true

notify-service:
type: http
config:
method: POST
url: https://webhook-of-someservice/
headers:
X-Auth-Token: abc123

```

### `routes.yaml` โ€“ Routing Logic

```yaml
version: v1

routes:
- name: main_fanout
source: webhook-main
sinks:
- stdout-log
- file-logger
- notify-service

- name: scraper_eval
source: scraper
rules:
- condition: event.status == "warning" && event.usage > 80
sinks:
- notify-service

- condition: event.warning == "ok"
sinks:
- stdout-log

- condition: # fall back
sinks:
- file-logger
- stdout-log

```

---

## ๐Ÿš€ How to Run

```bash
go run cmd/projectile/main.go
```

Make sure you have the required configuration files:

- `configs/infra.yaml`
- `configs/routes.yaml`