Lachlan's avatar@lachlanjc/notebook

Custom social card image services

Open Graph images are the image you sometimes see when sharing a link on iMessage, Slack, Twitter, etc. Though they can be any normal image, I first saw the idea of dynamically generating Open Graph images from @levelsio/NomadList a few years ago.

Earlier this year, the indomitable ZEIT team built a web service for their own site’s social cards called og-image, which I forked for Hack Club’s Workshop Cards. Since then, they’ve rewritten the system to be simpler to run & deploy, so I used their latest version for my new projects.

I’ve now created custom cards for all pages on both Notebook & my IMA blog:

Examples of my new social cards, composited with Photoshop for iPad

If you want to play with the systems, try them out here:

Notebook demo

IMA demo

Under the hood, a serverless Node.js function (hosted on ZEIT Now, of course) spins up a Puppeteer instance to render a webpage to an image file. The backend is written in TypeScript and the frontend uses .dom. If you want to read more, ZEIT has you covered.

My changes:

  • I added a caption field, for displaying the course name and/or date
  • I removed the default images (ZEIT logos)
  • I edited the frontend, removing their image presets and custom width/height functionality and updating the style/typography
  • I remade the final card template (primarily static HTML/CSS)

View the final source:

Notebook source

IMA source

If you’re looking to create your own, similar service for your own website/blog, I recommend forking notebook-cards. npm i, now dev, then jump into the api/_lib/template.ts file to edit the template with your own content/styling. When it’s done, just deploy via now & you’re ready to go!

You’ll then need to add the meta tags to links to your card service. This depends significantly on your site’s tech stack, but if you’re using React, I highly recommend making a component to wrap all the necessary tags. If you’re using Next.js, you’ll need their Head component, for Gatsby, react-helmet and its associated plugin.

(On Notebook, I use a completely-ridiculous method of storing post names in slugs, so the way I generate the metadata is confusing and not recommendable, but it works great for me.)

One nice touch is that the service supports a dark mode, which you can automatically use for special posts. On Notebook, that’s my non-dated pages like Tools, and on IMA, I made midterm & final projects use dark mode. If you never touch it, that works too.

Those are my systems, remixed from ZEIT’s & now open source for you to remix too. If you make your own version, let me know!