An event-driven Go microservice built with Clean Architecture that automates professional LinkedIn posts from GitHub releases using AI pipelines and Human-in-the-Loop approval.
See the code
Automated Event-Driven Microservice converting GitHub Webhooks into LinkedIn posts via Gemini AI & Discord Human-in-the-Loop approval.
Explore the docs »
Report Bug
·
Request Feature
git-to-feed is a production-ready, event-driven Go microservice designed under Clean Architecture and Package-by-Feature principles. It listens to GitHub repository Webhooks (Pull Requests and Releases), enriches event contexts, formats payloads using LLMs (Google Gemini AI) guided by curated Few-Shot Examples, and notifies an interactive Discord Bot for Human-in-the-Loop approval before live publication to LinkedIn.
flowchart TD
GH["GitHub Webhook"] -->|"HMAC Verified"| WH["Webhook Handler"]
WH --> PIPE["Pipeline Gemini AI"]
PIPE --> BOT["Discord Bot"]
BOT -->|"Approve / Reject"| APP["Approval Engine"]
APP -->|"Published"| LI["LinkedIn API"]
The codebase strictly decouples business domain logic from infrastructure, storage, and transport layers.
git-to-feed/
├── cmd/
│ └── api/ # Main HTTP API Entrypoint
├── internal/
│ ├── approval/ # Approval Feature Module (Entities, Use Cases, Repositories, HTTP Handlers)
│ ├── pipeline/ # Content Generation Pipeline (ContextBuilder, PromptBuilder, GeminiLLMClient, Anti-Cringe, Few-Shot)
│ ├── publisher/ # LinkedIn Publisher Feature Module (Entities, Use Cases, HTTP Client, Mocks)
│ ├── webhook/ # GitHub Ingestion Feature Module (Payload Parser, HMAC Validation)
│ └── platform/ # Infrastructure & Platform Adapters
│ ├── config/ # Environment Configuration & godotenv Loader
│ ├── discord/ # Interactive Discord Bot (discordgo WebSocket & Embed Buttons)
│ ├── http/ # HTTP Server Router & Endpoint Wire-up
│ └── storage/ # Database Drivers (PostgreSQL/Supabase & SQL Auto-Migrations Engine)
├── supabase/
│ └── migrations/ # SQL Database Schema Migrations (.sql)
├── .github/ # GitHub Workflows, Templates & Community Guidelines
├── CODE_OF_CONDUCT.md # Community Contributor Covenant Standards
├── CONTRIBUTING.md # Contribution Guidelines & Template Specifications
├── Dockerfile # Multi-stage Production Docker Build
├── docker-compose.yml # Orchestration Config
├── LICENSE # MIT Open-Source License Terms
├── ROADMAP_EVOLUTION.md # Future Architectural Roadmap & Evolution Specifications
└── SECURITY.md # Responsible Vulnerability Disclosure Policy
Follow these steps to set up and run git-to-feed.
Create a .env file in the root directory (refer to .env.example):
PORT=":8080"
GITHUB_WEBHOOK_SECRET="your-github-webhook-secret"
LINKEDIN_ACCESS_TOKEN="your-linkedin-access-token"
LINKEDIN_AUTHOR_URN="urn:li:person:your-author-urn"
DATABASE_URL="postgres://postgres.[PROJECT-REF]:[PASSWORD]@aws-0-[REGION].pooler.supabase.com:5432/postgres?sslmode=require"
DISCORD_BOT_TOKEN="your-discord-bot-token"
DISCORD_CHANNEL_ID="your-discord-channel-id"
GEMINI_API_KEY="your-google-gemini-api-key"
GEMINI_MODEL_NAME="gemini-3.5-flash-lite"
Run the application stack using Docker Compose:
docker-compose up --build -d
Or build and run using Docker CLI directly:
docker build -t git-to-feed:latest .
docker run -d -p 8080:8080 --env-file .env git-to-feed:latest
For building and testing directly with the Go toolchain:
# Download Go module dependencies
go mod download
# Run the API server locally
go run cmd/api/main.go
# Run unit tests & static analysis
go vet ./...
go test -v ./...
The microservice exposes clean REST HTTP endpoints and granular OpenStatus component health monitoring:
| Method | Endpoint | Description |
|---|---|---|
GET | /health | Global application health check (200 OK) |
GET | /health/api-router | Health check for HTTP API Router component |
GET | /health/webhook-engine | Health check for GitHub Webhook Ingestion engine |
GET | /health/pipeline-gemini | Health check for Google Gemini AI Pipeline |
GET | /health/discord-bot | Health check for Discord Interactive Bot session |
GET | /health/linkedin-engine | Health check for LinkedIn API Publishing engine |
GET | /health/database | Live db.Ping() health check for Supabase PostgreSQL |
POST | /api/v1/webhooks/github | Ingests and processes GitHub Webhook events |
GET | /api/v1/approvals/pending | Lists all draft posts awaiting approval |
POST | /api/v1/approvals/{uuid}/approve | Approves and publishes a draft post to LinkedIn |
POST | /api/v1/approvals/{uuid}/reject | Rejects and discards a pending draft post |
PUT | /api/v1/approvals/{uuid}/edit | Edits content and approves post for publishing |
GET | /api/v1/examples | Lists active Few-Shot examples |
POST | /api/v1/examples | Creates a new Few-Shot example entity |
pull_request, release)supabase/migrations)LICENSE, CONTRIBUTING, CODE_OF_CONDUCT, SECURITY)See ROADMAP_EVOLUTION.md for full architectural roadmap specifications.
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
Please review our Contributing Guidelines and Code of Conduct for details on Git Flow, Conventional Commits, Gitmojis, and Pull Request templates.
git checkout -b feature/AmazingFeature)git commit -m 'feat: :sparkles: add AmazingFeature')git push origin feature/AmazingFeature).github/PULL_REQUEST_TEMPLATE/Distributed under the MIT License. See LICENSE for more information.
For security vulnerabilities and disclosure, please refer to our Security Policy.
hawksxo - @hawksxo
Project Link: https://github.com/hawksxo/git-to-feed
Go
99.1%
An event-driven Go microservice built with Clean Architecture that automates professional LinkedIn posts from GitHub releases using AI pipelines and Human-in-the-Loop approval.
See the code
Automated Event-Driven Microservice converting GitHub Webhooks into LinkedIn posts via Gemini AI & Discord Human-in-the-Loop approval.
Explore the docs »
Report Bug
·
Request Feature
git-to-feed is a production-ready, event-driven Go microservice designed under Clean Architecture and Package-by-Feature principles. It listens to GitHub repository Webhooks (Pull Requests and Releases), enriches event contexts, formats payloads using LLMs (Google Gemini AI) guided by curated Few-Shot Examples, and notifies an interactive Discord Bot for Human-in-the-Loop approval before live publication to LinkedIn.
flowchart TD
GH["GitHub Webhook"] -->|"HMAC Verified"| WH["Webhook Handler"]
WH --> PIPE["Pipeline Gemini AI"]
PIPE --> BOT["Discord Bot"]
BOT -->|"Approve / Reject"| APP["Approval Engine"]
APP -->|"Published"| LI["LinkedIn API"]
The codebase strictly decouples business domain logic from infrastructure, storage, and transport layers.
git-to-feed/
├── cmd/
│ └── api/ # Main HTTP API Entrypoint
├── internal/
│ ├── approval/ # Approval Feature Module (Entities, Use Cases, Repositories, HTTP Handlers)
│ ├── pipeline/ # Content Generation Pipeline (ContextBuilder, PromptBuilder, GeminiLLMClient, Anti-Cringe, Few-Shot)
│ ├── publisher/ # LinkedIn Publisher Feature Module (Entities, Use Cases, HTTP Client, Mocks)
│ ├── webhook/ # GitHub Ingestion Feature Module (Payload Parser, HMAC Validation)
│ └── platform/ # Infrastructure & Platform Adapters
│ ├── config/ # Environment Configuration & godotenv Loader
│ ├── discord/ # Interactive Discord Bot (discordgo WebSocket & Embed Buttons)
│ ├── http/ # HTTP Server Router & Endpoint Wire-up
│ └── storage/ # Database Drivers (PostgreSQL/Supabase & SQL Auto-Migrations Engine)
├── supabase/
│ └── migrations/ # SQL Database Schema Migrations (.sql)
├── .github/ # GitHub Workflows, Templates & Community Guidelines
├── CODE_OF_CONDUCT.md # Community Contributor Covenant Standards
├── CONTRIBUTING.md # Contribution Guidelines & Template Specifications
├── Dockerfile # Multi-stage Production Docker Build
├── docker-compose.yml # Orchestration Config
├── LICENSE # MIT Open-Source License Terms
├── ROADMAP_EVOLUTION.md # Future Architectural Roadmap & Evolution Specifications
└── SECURITY.md # Responsible Vulnerability Disclosure Policy
Follow these steps to set up and run git-to-feed.
Create a .env file in the root directory (refer to .env.example):
PORT=":8080"
GITHUB_WEBHOOK_SECRET="your-github-webhook-secret"
LINKEDIN_ACCESS_TOKEN="your-linkedin-access-token"
LINKEDIN_AUTHOR_URN="urn:li:person:your-author-urn"
DATABASE_URL="postgres://postgres.[PROJECT-REF]:[PASSWORD]@aws-0-[REGION].pooler.supabase.com:5432/postgres?sslmode=require"
DISCORD_BOT_TOKEN="your-discord-bot-token"
DISCORD_CHANNEL_ID="your-discord-channel-id"
GEMINI_API_KEY="your-google-gemini-api-key"
GEMINI_MODEL_NAME="gemini-3.5-flash-lite"
Run the application stack using Docker Compose:
docker-compose up --build -d
Or build and run using Docker CLI directly:
docker build -t git-to-feed:latest .
docker run -d -p 8080:8080 --env-file .env git-to-feed:latest
For building and testing directly with the Go toolchain:
# Download Go module dependencies
go mod download
# Run the API server locally
go run cmd/api/main.go
# Run unit tests & static analysis
go vet ./...
go test -v ./...
The microservice exposes clean REST HTTP endpoints and granular OpenStatus component health monitoring:
| Method | Endpoint | Description |
|---|---|---|
GET | /health | Global application health check (200 OK) |
GET | /health/api-router | Health check for HTTP API Router component |
GET | /health/webhook-engine | Health check for GitHub Webhook Ingestion engine |
GET | /health/pipeline-gemini | Health check for Google Gemini AI Pipeline |
GET | /health/discord-bot | Health check for Discord Interactive Bot session |
GET | /health/linkedin-engine | Health check for LinkedIn API Publishing engine |
GET | /health/database | Live db.Ping() health check for Supabase PostgreSQL |
POST | /api/v1/webhooks/github | Ingests and processes GitHub Webhook events |
GET | /api/v1/approvals/pending | Lists all draft posts awaiting approval |
POST | /api/v1/approvals/{uuid}/approve | Approves and publishes a draft post to LinkedIn |
POST | /api/v1/approvals/{uuid}/reject | Rejects and discards a pending draft post |
PUT | /api/v1/approvals/{uuid}/edit | Edits content and approves post for publishing |
GET | /api/v1/examples | Lists active Few-Shot examples |
POST | /api/v1/examples | Creates a new Few-Shot example entity |
pull_request, release)supabase/migrations)LICENSE, CONTRIBUTING, CODE_OF_CONDUCT, SECURITY)See ROADMAP_EVOLUTION.md for full architectural roadmap specifications.
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
Please review our Contributing Guidelines and Code of Conduct for details on Git Flow, Conventional Commits, Gitmojis, and Pull Request templates.
git checkout -b feature/AmazingFeature)git commit -m 'feat: :sparkles: add AmazingFeature')git push origin feature/AmazingFeature).github/PULL_REQUEST_TEMPLATE/Distributed under the MIT License. See LICENSE for more information.
For security vulnerabilities and disclosure, please refer to our Security Policy.
hawksxo - @hawksxo
Project Link: https://github.com/hawksxo/git-to-feed
Go
99.1%