UpsunInternal tool

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

The calendar and the pull request list, with their sync status (titles and authors blurred)
The calendar and the pull request list, with their sync status (titles and authors blurred)

← Back to the portfolio