Blog publishing calendar
Scheduling the technical blog's posts by dragging and dropping their pull requests on a calendar.
- Role
- Design and development, started at the internal hackathon
- Period
- Nov 2025 – ongoing · Upsun
- Stack
- TypeScript
- Vite 7
- GitHub API
- Cron
Context
Posts on Upsun's developer blog are written and reviewed as GitHub pull requests, the pull request itself carrying the publication date. Knowing what shipped when meant opening pull requests one by one. No overview, no way to avoid two posts on the same day or to spot a late one. And every post needed someone from the Advocacy team around, on the day, to merge the pull request. I got publishing requests while at a conference, on the booth, in the middle of customer demos.
I started it at the internal hackathon in late November 2025, then rolled it out to the whole team.
What I built
- A monthly calendar of scheduled posts, next to the pull request list: planned date, labels, links to the pull request and to the post preview.
- Drag-and-drop scheduling: move a post on the calendar, then sync, with the option to cancel changes before sending. Syncing updates the date in the pull request and in the post's Markdown file: the date picked on the calendar is the one the blog shows once the post is live.
- A status per post, with filters: synced, needs sync, overdue or error, merged or closed. A post whose date passed without publication shows in red.
- Public holidays in the team's four countries (US, France, Germany, UK) shown on the calendar, so a post isn't scheduled on a day its author or reviewers are off.
- Marketing's publishing rules made easy to follow: the overview makes it simple to place every post on a Tuesday, Wednesday or Thursday, without blocking anything.
- Publication on the planned date, with no one on duty to merge the pull request.
- Daily collection (cron) of the Git repositories' information, plus on-demand reload.
- An automatic message on every new post pull request, linking to the back office: authors discover it at the right time, with no training.
- Light or dark theme.
Stack
TypeScript backend, front end built with Vite 7, GitHub API integration. Open to anyone with access to the technical blog's GitHub repository.
Results
- The Advocacy team gained three weeks of visibility on upcoming blog posts.
- The blog opened up to contributions from other teams: a post goes live on the chosen date without Advocacy having to stand by to merge it.
- Marketing's publishing rules (Tuesday, Wednesday or Thursday) are much easier to follow.
- Late posts stand out, and so do gaps in the schedule.
- The date stays in the pull request: one source of truth; the tool only makes it readable and editable.
Screenshots
