{"slug": "gtf-event-driven-go-service-converting-github-events-into-linkedin-posts", "title": "GTF – Event-driven Go service converting GitHub events into LinkedIn posts", "summary": "Developer hawksxo released git-to-feed, an open-source event-driven Go microservice that converts GitHub webhook events — pull requests and releases — into LinkedIn posts using Google's Gemini AI, with Discord bot approval required before publication. The MIT-licensed project verifies webhooks via HMAC, runs content through a pipeline that includes curated few-shot examples and an \"Anti-Cringe\" component, and stores state in PostgreSQL/Supabase; it requires Go 1.22+ and ships with a multi-stage Dockerfile and docker-compose configuration.", "body_md": "Automated Event-Driven Microservice converting GitHub Webhooks into LinkedIn posts via Gemini AI & Discord Human-in-the-Loop approval.\n    \n\n**Explore the docs »**\n\n[Report Bug](https://github.com/hawksxo/git-to-feed/issues)\n    ·\n    [Request Feature](https://github.com/hawksxo/git-to-feed/issues)\n\n## Table of Contents\n\n`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**.\n\n``` php\nflowchart TD\n    GH[\"GitHub Webhook\"] -->|\"HMAC Verified\"| WH[\"Webhook Handler\"]\n    WH --> PIPE[\"Pipeline Gemini AI\"]\n    PIPE --> BOT[\"Discord Bot\"]\n    BOT -->|\"Approve / Reject\"| APP[\"Approval Engine\"]\n    APP -->|\"Published\"| LI[\"LinkedIn API\"]\n```\n\nThe codebase strictly decouples business domain logic from infrastructure, storage, and transport layers.\n\n```\ngit-to-feed/\n├── cmd/\n│   └── api/                  # Main HTTP API Entrypoint\n├── internal/\n│   ├── approval/             # Approval Feature Module (Entities, Use Cases, Repositories, HTTP Handlers)\n│   ├── pipeline/             # Content Generation Pipeline (ContextBuilder, PromptBuilder, GeminiLLMClient, Anti-Cringe, Few-Shot)\n│   ├── publisher/            # LinkedIn Publisher Feature Module (Entities, Use Cases, HTTP Client, Mocks)\n│   ├── webhook/              # GitHub Ingestion Feature Module (Payload Parser, HMAC Validation)\n│   └── platform/             # Infrastructure & Platform Adapters\n│       ├── config/           # Environment Configuration & godotenv Loader\n│       ├── discord/          # Interactive Discord Bot (discordgo WebSocket & Embed Buttons)\n│       ├── http/             # HTTP Server Router & Endpoint Wire-up\n│       └── storage/          # Database Drivers (PostgreSQL/Supabase & SQL Auto-Migrations Engine)\n├── supabase/\n│   └── migrations/           # SQL Database Schema Migrations (.sql)\n├── .github/                  # GitHub Workflows, Templates & Community Guidelines\n├── CODE_OF_CONDUCT.md        # Community Contributor Covenant Standards\n├── CONTRIBUTING.md           # Contribution Guidelines & Template Specifications\n├── Dockerfile                # Multi-stage Production Docker Build\n├── docker-compose.yml        # Orchestration Config\n├── LICENSE                   # MIT Open-Source License Terms\n├── ROADMAP_EVOLUTION.md      # Future Architectural Roadmap & Evolution Specifications\n└── SECURITY.md               # Responsible Vulnerability Disclosure Policy\n```\n\nFollow these steps to set up and run `git-to-feed`.\n\n- **Docker & Docker Compose** (Recommended for production & local execution)\n- **Go 1.22+** (Optional for local Go CLI development)\n\nCreate a `.env` file in the root directory (refer to `.env.example`):\n\n```\nPORT=\":8080\"\nGITHUB_WEBHOOK_SECRET=\"your-github-webhook-secret\"\nLINKEDIN_ACCESS_TOKEN=\"your-linkedin-access-token\"\nLINKEDIN_AUTHOR_URN=\"urn:li:person:your-author-urn\"\nDATABASE_URL=\"postgres://postgres.[PROJECT-REF]:[PASSWORD]@aws-0-[REGION].pooler.supabase.com:5432/postgres?sslmode=require\"\nDISCORD_BOT_TOKEN=\"your-discord-bot-token\"\nDISCORD_CHANNEL_ID=\"your-discord-channel-id\"\nGEMINI_API_KEY=\"your-google-gemini-api-key\"\nGEMINI_MODEL_NAME=\"gemini-3.5-flash-lite\"\n```\n\nRun the application stack using Docker Compose:\n\n```\ndocker-compose up --build -d\n```\n\nOr build and run using Docker CLI directly:\n\n```\ndocker build -t git-to-feed:latest .\ndocker run -d -p 8080:8080 --env-file .env git-to-feed:latest\n```\n\nFor building and testing directly with the Go toolchain:\n\n```\n# Download Go module dependencies\ngo mod download\n\n# Run the API server locally\ngo run cmd/api/main.go\n\n# Run unit tests & static analysis\ngo vet ./...\ngo test -v ./...\n```\n\nThe microservice exposes clean REST HTTP endpoints and granular OpenStatus component health monitoring:\n\n| Method | Endpoint | Description | \n|---|---|---|\n| `GET` | `/health` | Global application health check ( `200 OK` ) | \n| `GET` | `/health/api-router` | Health check for HTTP API Router component | \n| `GET` | `/health/webhook-engine` | Health check for GitHub Webhook Ingestion engine | \n| `GET` | `/health/pipeline-gemini` | Health check for Google Gemini AI Pipeline | \n| `GET` | `/health/discord-bot` | Health check for Discord Interactive Bot session | \n| `GET` | `/health/linkedin-engine` | Health check for LinkedIn API Publishing engine | \n| `GET` | `/health/database` | Live `db.Ping()` health check for Supabase PostgreSQL | \n| `POST` | `/api/v1/webhooks/github` | Ingests and processes GitHub Webhook events | \n| `GET` | `/api/v1/approvals/pending` | Lists all draft posts awaiting approval | \n| `POST` | `/api/v1/approvals/{uuid}/approve` | Approves and publishes a draft post to LinkedIn | \n| `POST` | `/api/v1/approvals/{uuid}/reject` | Rejects and discards a pending draft post | \n| `PUT` | `/api/v1/approvals/{uuid}/edit` | Edits content and approves post for publishing | \n| `GET` | `/api/v1/examples` | Lists active Few-Shot examples | \n| `POST` | `/api/v1/examples` | Creates a new Few-Shot example entity | \n\n-  Universal Multi-Repository Webhook Ingestion (`pull_request` ,`release` )\n- Google Gemini AI Integration with Curated Few-Shot Engineering\n- Anti-Cringe & Payload Sanitization Filters\n- Interactive Discord Bot for Human-in-the-Loop Approvals\n-  Automatic PostgreSQL Schema Migration Engine (`supabase/migrations` )\n- Granular OpenStatus Health Monitoring Sub-Endpoints\n-  Open-Source Governance Suite (`LICENSE` ,`CONTRIBUTING` ,`CODE_OF_CONDUCT` ,`SECURITY` )\n- Automated CI/CD Workflows (GitHub Actions)\n- Event Batching & Aggregation Engine (Frequency Windows)\n\nSee [ROADMAP_EVOLUTION.md](https://github.com/hawksxo/git-to-feed/blob/develop/ROADMAP_EVOLUTION.md) for full architectural roadmap specifications.\n\nContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nPlease review our [Contributing Guidelines](https://github.com/hawksxo/git-to-feed/blob/develop/CONTRIBUTING.md) and [Code of Conduct](https://github.com/hawksxo/git-to-feed/blob/develop/CODE_OF_CONDUCT.md) for details on Git Flow, Conventional Commits, Gitmojis, and Pull Request templates.\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature` )\n3. Commit your Changes (`git commit -m 'feat: :sparkles: add AmazingFeature'` )\n4. Push to the Branch (`git push origin feature/AmazingFeature` )\n5. Open a Pull Request using templates in `.github/PULL_REQUEST_TEMPLATE/`\n\nDistributed under the MIT License. See [LICENSE](https://github.com/hawksxo/git-to-feed/blob/develop/LICENSE) for more information.\n\nFor security vulnerabilities and disclosure, please refer to our [Security Policy](https://github.com/hawksxo/git-to-feed/blob/develop/SECURITY.md).\n\nhawksxo - [@hawksxo](https://github.com/hawksxo)\n\nProject Link: [https://github.com/hawksxo/git-to-feed](https://github.com/hawksxo/git-to-feed)", "url": "https://wpnews.pro/news/gtf-event-driven-go-service-converting-github-events-into-linkedin-posts", "canonical_source": "https://github.com/hawksxo/git-to-feed", "published_at": "2026-10-02 20:47:21+00:00", "updated_at": "2026-10-02 21:06:27.853349+00:00", "lang": "en", "topics": ["ai-tools", "generative-ai", "developer-tools", "ai-agents"], "entities": ["git-to-feed", "hawksxo", "GitHub", "LinkedIn", "Google Gemini", "Discord", "Supabase", "Go"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/gtf-event-driven-go-service-converting-github-events-into-linkedin-posts", "markdown": "https://wpnews.pro/news/gtf-event-driven-go-service-converting-github-events-into-linkedin-posts.md", "text": "https://wpnews.pro/news/gtf-event-driven-go-service-converting-github-events-into-linkedin-posts.txt", "jsonld": "https://wpnews.pro/news/gtf-event-driven-go-service-converting-github-events-into-linkedin-posts.jsonld"}}