Building a GitHub to Productive Integration with Go
How I built a lightweight Go service that links GitHub repositories to Productive task boards, removing manual sync work for engineering teams.
The problem
Engineering teams at Plank track their work in Productive. Their code lives in GitHub. When a new repository is created, someone manually had to create a corresponding project in Productive and link it. This took time, introduced inconsistency, and occasionally got forgotten entirely.
Why Go
The integration needed to be lightweight, fast to deploy, and easy to containerise. It had no need for an ORM, templating engine, or admin panel. Go compiled to a single binary, handled HTTP easily with the standard library, and produced a Docker image under 15MB. It was the right tool for the job.
The architecture
The service exposes a webhook endpoint that GitHub calls when repository events occur. On a repository.created event, it calls the Productive API to create a matching project, then stores the mapping in a small SQLite database. A background goroutine handles retries for failed Productive API calls.
Deployment
The service runs in a Docker container on a DigitalOcean droplet behind Nginx. GitHub delivers webhooks over HTTPS with a shared secret for request verification. The service validates that secret on every incoming request before processing anything.
What I learned
Go's explicit error handling — which feels verbose coming from PHP — is genuinely clarifying in network-heavy code. Every operation that can fail must be handled. There is no silent exception swallowing. After a few weeks I stopped finding it verbose and started finding it reassuring.