Dev Blog

BLOG

Remaking our X header so the profile icon doesn't cover it

We remade the icon, header, and bio of our X account to match our current logo and look. The header uses the same look as our OG image and leaves only the bottom left empty for the icon. How the first version pushed everything to the right and left a big gap, and how we build the header in HTML and export it with Playwright.

Published October 19, 2026

We rebuilt the icon, header, and bio of our official X account, @metronome_fm, to match the current logo and the look of the app. We also added a link to the X account on the top page of the docs, which explain how to use the app.

The X profile before the update. A navy header shows the old logo and the lowercase text metronome.fm, with the old logo icon overlapping the bottom left
The profile before the update

The old icon and header still used the logo from before the app got its current look. The bio was also out of date and listed only two features: "track sets" and tempo ramps, which raise the tempo little by little. The new bio lists tempo ramps, custom beats, polyrhythms, AI BPM search, and the tuner and drone.

This post is mostly about what we thought about while making the header image (1500×500). At the end, it also touches briefly on the icon image.

Matching the look of the OG image

The image that appears when a page is shared on social media is called the OG image. We gave the header the same look as Metronome.fm's OG image: a black background, a headline in light IBM Plex, a ruler of tempo ticks, and the turquoise accent. The logo and headline sit on the top row, and the ruler on the bottom row. As in the OG image, the colors are taken directly from the app's dark theme.

The ruler's ticks also match the OG image and the tempo ruler on the app's screen. It spans 40 to 300 BPM in steps of 5, with longer ticks every 10 and numbers every 30. As in the OG image, the marker is at 120 BPM, in turquoise. Ticks left of the marker (slower tempos) are brighter, and the rest are darker.

// scripts/x-profile/render.mjs (excerpt)
for (let value = min; value <= max; value += 5) {
  const major = value % 30 === 0;
  const mid = value % 10 === 0;
  const length = major ? 44 : mid ? 28 : 16;
  // Ticks left of the marker (slower tempos) are brighter, the rest darker
  const color = value <= bpm ? COLORS.tickOn : COLORS.text3;
  // …
}

Leaving only the bottom left empty for the icon

On an X profile, the round profile icon overlaps the bottom left of the header. In 1500×500 coordinates, it covers roughly 400px from the left and 170px from the bottom.

In the first version, we pushed everything past that area, to the right of x=470, so that no text or ruler would be hidden. But the icon only covers the bottom left. Because the top left was left empty too, the header had a large blank rectangle.

The first version of the header. The wordmark, headline, and ruler are all pushed to the right. Number 1 marks the empty area at the top left
The first version, with everything pushed to the right
  1. Space left empty even though the icon never covers it

In the revised version, the top row (the logo with the METRONOME.FM text, or wordmark, and the headline) starts from the left edge, as in the OG image, and only the ruler on the bottom row sits to the right. The second line of the headline (A metronome that works right in your browser) ends above the top of the round icon. The icon overlaps the space left of the ruler.

An X header might get cropped at the top and bottom depending on the screen. So we also kept text away from the top and bottom edges and grouped the content in the middle.

The revised header. The wordmark and headline start at the left edge, and only the ruler is on the right
The revised version, with a left-aligned headline and only the ruler on the right

Set on X, it fits like this.

The X profile after the update. Number 1 is the icon overlapping the bottom left, number 2 is the ruler to the right of the icon
The profile after the update
  1. The area the round icon covers. Nothing is placed here
  2. The ruler starts to the right of the icon

Exporting the header and icon from HTML to PNG

The header and icon are written as HTML, opened in Playwright, and saved as PNG screenshots. Fonts load from Google Fonts, and the positions of the text and ticks are set as CSS coordinates. To change something, we edit the numbers in the script and run it again.

node scripts/x-profile/render.mjs

The icon (400×400) uses the same logo shapes as the site's favicon. X crops the icon into a circle, though, so at the favicon's size the corners of the logo come close to the edge of the circle. So we scaled the logo to 0.8 to leave room inside the circle.

// scripts/x-profile/render.mjs (excerpt). In 48×48 coordinates, scale around the logo's center
<g transform="translate(24 24) scale(0.8) translate(-24 -24)">${LOGO_PATHS}</g>

We will also post Metronome.fm updates on X.

Share this post

Post on X