Skip to main content
Tanmay Savaj — home
Backend & APIsEngineering projectBuilt at Jewlr

Plane to Slack Notifier

Python daemon connecting issue tracking to Slack

A Python daemon and Slack bot that watches Plane.so issues and posts to Slack when issues are created or updated, plus slash commands for querying issues on demand.

Architecture

Architecture illustration of the Plane to Slack notifier: a polling loop reads the Plane API, compares against a local JSON cache, and posts notifications to a Slack webhook, while a Flask server handles slash commands from Slack.

  1. 1. Source

  2. 2. Poll

  3. 3. Decide

  4. 4. Notify

  5. 5. Query

Select any component marked with a dot to see what it does in this system.

IllustrationConceptual architecture — one process, two threads: poller and Flask server.
Runtime
Flask + poller threads
Poll interval
60s configurable
First run
Cache seeded, no flood
Slack surface
Notifications + commands

Problem

Issue status only reaches the team if someone remembers to open the board. Work stalls quietly, and nobody notices until standup.

What I built

  • A polling daemon that watches Plane issues on a configurable interval (60 seconds by default) and posts Slack notifications for newly created and updated issues.
  • A single entrypoint that runs the Flask web server and the notifier loop as two threads in one process, keeping deployment to a single unit.
  • Slack slash commands (/plane pending, /plane inprogress, /plane backlog) so the board can be queried without leaving Slack.
  • A local JSON cache of seen issues, seeded on first run.
  • Configurable filtering by issue state and assignee, driven entirely by environment variables.
  • Debug endpoints to inspect the cache and force a notification for testing.

Engineering decisions

The first-run problem is the one worth talking about: a naive poller treats every existing issue as new and dumps the entire backlog into Slack the moment it starts. The daemon seeds its cache on first run without notifying, so it establishes a baseline instead of announcing history. Slack also requires a public HTTPS endpoint for slash commands, which meant ngrok for local testing and nginx with certbot in front of Flask for a real deployment.

Outcome

Issue activity reaches the team in Slack without anyone polling the board manually.

Next project

Hotel Reservation System

Read case study