DEV Community

Cover image for Bits of Pluto on Mastodon
Hugo van Kemenade
Hugo van Kemenade

Posted on • Updated on

Bits of Pluto on Mastodon

What I built

I built a Mastodon bot that posts a a different bit of Pluto every six hours.

Category Submission

Wacky Wildcard

App Link


Dark shadows caused by mountains

Red cratered area to the left giving way to creamy pale plain to the right

Long ridges causing shadows

Reddish area with many craters, including a large crater with a central peak

Mostly space with a sliver of surface in the corner

Deep red with ridges, and the curve of Pluto against deep black space

Mostly pale surface with mountainous areas and craters

Mixed white and red surface pocked with many craters


Bits of Pluto posts a different bit of Pluto to Mastodon every six hours. Each is a crop from an image by NASA's New Horizons spacecraft.

Link to Source Code

Permissive License



For decades, Pluto had only been a speck of light until the NASA's Hubble Space Telescope captured it in never-before-seen detail:

NASA: "Hubble's view isn't sharp enough to see craters or mountains, if they exist on the surface, but Hubble reveals a complex-looking and variegated world with white, dark-orange, and charcoal-black terrain."

Just a few years later, I followed the journey of NASA's New Horizons spacecraft in awe as it flew past Pluto, in the far depths of our solar system.

Like many others I was especially struck by the beautiful photographs it shot, especially this large, detailed image:

Pluto in enhanced colour

As NASA describe it:

NASA’s New Horizons spacecraft captured this high-resolution enhanced color view of Pluto on July 14, 2015. The image combines blue, red and infrared images taken by the Ralph/Multispectral Visual Imaging Camera (MVIC). Pluto’s surface sports a remarkable range of subtle colors, enhanced in this view to a rainbow of pale blues, yellows, oranges, and deep reds. Many landforms have their own distinct colors, telling a complex geological and climatological story that scientists have only just begun to decode. The image resolves details and colors on scales as small as 0.8 miles (1.3 kilometers). The viewer is encouraged to zoom in on the full resolution image on a larger screen to fully appreciate the complexity of Pluto’s surface features.

I second the recommendation to zoom in on the full resolution! The detail and is astounding, especially compared to the Hubble image.

I thought it would be fascinating to chop this up and put it in a social media feed to enjoy different aspects of the detail, to punctuate the doomscrolling with a moment of wonder.

How I built it

I built the bot in Python. Originally it posted to Twitter, but as the future of bots on Twitter is less than certain, the time was ready to port it over to Mastodon where bots are welcome.

On the way, I learned how to calculate brightness in images, how to use the Mastodon API, and how to set up a bot on Linode and (the appropriately-named!)

The bot does two things:

  1. Get a bit of Pluto
  2. Post to Mastodon

1. Get a bit of Pluto

The bitsofpluto() function takes a single parameter, the path to the full resolution Pluto image.

The image is opened using Pillow.

We then choose a random width for the image, somewhere between 800 and 2000 pixels, with height is set to ¾ the width. This is to give a different zoom level each time. We then randomly select a window to crop. This is our potential bit of Pluto.

But we don't stop there. The image has quite a large background of empty black (or nearly black) space. We don't want to post that. So we sample 9 points from the image (corners, centre point, and bisecting points) and measure the brightness where 0 is black and 255 is white. If brightness is under 10, we count it as a dark point. If there are 6 or less, we save the image to a temporary directory.

Otherwise if there are too many dark points, we discard this crop, and start again from the top. I came up with these figures of 10 and 7 through trial-and-error. It's quite nice to sometimes get an image with a corner of Pluto's curvature against the darkness of space:

Light surface of Pluto with a few cratered, the darkness of space behind

2. Post to Mastodon

We use the library to via the Mastodon API.

The toot_it() function first reads in the credentials for posting. I generated them using a helper script I wrote based upon Allison Parrish's instructions.

Once authenticated, there's a two-step process for posting:

  1. Upload the image using api.media_post(), which returns a reference to the media
  2. Create the Mastodon post, using the media reference



The bot code is hosted on Linode. The nice thing about Mastodon bots is that they rarely need expensive or high-end hosting. I created a Linode using the cheapest option: for $5/month the "Nanode 1 GB" plan gives 1 GB RAM, 1 CPU and 25 GB storage, more than enough for our needs.

Linode 24-hour usage stats: average 0.43% CPU usage, and about ~1 Kb/s average network both inbound and outbound

I chose a Ubuntu 22.04 LTS image: LTS means "long-term support", it will be supported for 5 years, until April 2027. And I chose the Frankfurt, DE region because it's closest to me.

After creating a user, I logged in via SSH, and cloned the bitsofpluto repo.

I ran crontab -e to schedule it to run once every six hours:

0 */6 * * * /home/botuser/bin/scheduled/ > /tmp/logs/0000-06-repeat.log
Enter fullscreen mode Exit fullscreen mode

Where contains:

#set -e

mkdir -p /tmp/logs/

~/github/bitsofpluto/  > /tmp/logs/bitsofpluto.log 2>&1
Enter fullscreen mode Exit fullscreen mode

Which, when the cron triggers, switches to the repo, fetches any recent changes, and then runs the bot to make a post:

python3 --yaml ~/bin/data/bitsofpluto.yaml --no-web
Enter fullscreen mode Exit fullscreen mode

The bot's Mastodon account is on Colin Mitchell's instance, home to many other excellent bots.

Additional Resources/Info

I've made two other Mastodon bots:


Top comments (0)