How to read ebooks purchased from Kobo on a Kindle

When an ebook is not available directly through a publisher, I’d like to purchase it through Kobo rather than Amazon. A nice part of Kobo is the option to associate your account with an independent bookstore. Once associated, the store receives some amount of money for any ebook you purchase. This allows me to continue to support local shops while also reading books digitally.

Kobo provides ebooks as EPUB files with DRM applied via Adobe Digital Editions. Only Kobo authorized readers have the ability to open these files.

The Kindle does not support any type of EPUB file. If it did, I’m sure it would not support Adobe Digital Editions DRM, as Amazon has its own. Kindle primarily supports the more proprietary MOBI and AZW3 formats. You can convert non-DRM locked EPUB files to MOBI using Amazon’s KindleGen tool on the command line, though I’m not sure how robust it is.

When I purchased a Kindle Voyage 5 years ago, Amazon’s intent was to lock me into their ecosystem as much as possible. I would like to use another reader, but one point of reading digitally is to save natural resources, not burn through them faster by buying more devices. If I can’t use another e-reader, I can at least use another book source.

I’ll avoid digressing any further and save some thoughts on Amazon and e-readers for another time.

According a ruling recapped by the EFF, explaining how to remove the lock from a piece of content is not copyright infringement. The federal judge in that ruling said:

The act of infringement underlying the inducement claim, however, is not the removal of DRM protection. Rather, it is the copying and distribution of ebooks to others after such protection has been removed.

Because of that ruling, I’ll feel comfortable—legally and ethically—following these instructions every time I forget what I had to do the last time to read an EPUB I purchased.

So here’s how to remove the DRM on an ebook purchased from Kobo (or elsewhere) so that it can be read on a Kindle.


  • Download and install Adobe Digital Editions.
  • Download and install Calibre, an open source ebook manager.
  • Download and extract the latest ZIP release of DeDRM_tools.
  • Open Calibre, open its preferences, and navigate to “Plugin” under “Advanced.
  • Use “Load plugin from file” to add the file from its respective directory in the extracted DeDRM folder.
  • Use “Load plugin from file” to add the file from its respective directory in the extracted DeDRM folder.
  • Restart Calibre before loading any books.

Obtain the EPUB file from a Kobo purchase

When a ebook is downloaded from your Kobo library, it is saved by default as URLLink.acsm. This is not an ebook, but instead a document containing a fullfillmentToken element with a bunch of information about the ebook. This includes its format and the license data associated with Adobe. This file can only be opened with Adobe Digital Editions (or a reader that supports Adobe’s DRM).

Drag or otherwise open the ACSM file in Adobe Digital Editions.

You’ll need to authorize your computer the first time you do this, but there’s an option for doing so without an Adobe ID. I have absolutely no idea what happens during that process, but it works.

Once authorized, the book should then open in Adobe Digital Editions. Close the book itself and go back to Bookshelves. Right click on the book title and choose “Show in Finder”. This brings you directly to the EPUB file that was downloaded by Adobe Digital Editions for this ebook.

Convert the EPUB to MOBI

Whether or not the EPUB has DRM, via Adobe and Kobo, or is an unlocked EPUB through a source, like Gutenberg or a forward-thinking author, Calibre can now be used to convert the file into MOBI, a format readable by Kindle, so that you can read the book you purchased.

Drag or otherwise open the EPUB file in Calibre. Right click on the book title, choose “Convert Books” and “convert individually”.

A screen will come up with a bunch of options that are likely unnecessary. In the top left, Calibre will show that the conversion is from EPUB. In the top right, it will show that the conversion is to MOBI.

Click “Ok” in the bottom right and Calibre will proceed to convert the book.

Once that window disappears, MOBI will be listed as one of the book’s available formats. Use “Click to open” next to “Path” or right click on the book and select “open containing folder”.

This folder contains all of the formats available for the book. Either email the MOBI file to Kindle’s personal document service or copy it manually to the device via USB.

The purchased book can now be read! 📚

Now supporting Webmention

I think? If you know how to send a Webmention, please do so that I know it works! 😂

I’ve installed the IndieWeb plugin as well as its companions, Webmention and Semantic-Linkbacks.

The IndieWeb plugin adds a few semantic things to the user profile in WordPress and acts as a launch platform for installing a bunch of other IndieWeb related plugins.

The Webmention plugin adds support for, imagine this, the Webmention protocol. This should enable support for sending and receiving mentions.

The Semantic-Linkbacks plugin treats Webmentions and other linkbacks as proper comments and formats things in a nice rich way.

I have added all of these, but I haven’t tested any of them yet. So this post should play the role of general announcement and playground.

Some things to do in 2020

Here is a selection of things I hope to spend time reflecting and acting on throughout the year. Previous iterations of this look-forward have ranged from vague to specific: 2015, 2016, 2017, 2018. Vague seems more fun, as is posting this when it’s ready rather than on the first of the year.

Reclaim email. I’ve spent some time over the last several days clicking “unsubscribe” on almost every automated email I receive.

It’s funny to think that it didn’t take long for email to go from a cool useful tool we used to communicate with each other to a thing primarily used by marketers to keep us constantly tracked and informed.

I’d like to find something closer to a world in which I thought about Brands when I needed something rather than a constant stream of Brands.

The second part of reclaiming email is deciding when it should be a part of my life. I’m blessed—🙄—with 3 email addresses that require some amount of daily attention. My current way of dealing with this is to leave each open in its own pinned tab so that they’re available to me throughout the day.

I just closed those pinned tabs and will determine a different workflow for when to check and process email. My guess is that it will have something to do with a schedule. We’ll see what that turns into.

A bonus level to this is tackling the mess that Slack, “the constant email”, has become.

Support independence. I spend a lot of time reading peoples’ updates on a single company’s platform. I spend an outsize amount of money on another single company’s platform.

When I buy books, I’m starting to spend time looking for the source rather than relying on Amazon. This has been a pleasant experience that has started to lead me toward a more diverse set of books in general. As my familiarity with smaller presses goes up, so does my awareness and happiness.

I also finally started supporting a couple small publications via Patreon or Substack last year. These are some of the most useful and enjoyable to me and I’d like to keep finding them.

And I’m continuing to dive into the world of IndieWeb. I’m going to make that a priority throughout the year. Our first local gathering is just over a week from now and I’m looking forward to seeing where that takes me.

Support community. I’m getting more and more frustrated with the idea of everything needing to be “big” or work at “scale”. While I haven’t identified anything concrete yet, I think there are community sized issues that can be approached without a reliance on big.

There will likely be a correlation between the independence I support and the communities I support. Or, maybe: I want independence to be something communities have access to.

My idea of independence in this context is something along the lines of “the community has access to the tools it needs to communicate”.

I could keep rephrasing this for a while, but however it works out and whatever it means, I’ll spend more time on community.

Happy 2020, y’all! 🎉

Quirky content considerations in RSS feeds

The separators I’ve been putting between each of the week’s end notes are HR elements styled as 3 blue dots. This is one of those seamless finishing touch things Gutenberg offers.

When output on the front-end of my site, several classes are added to the HR element so that it is styled properly:

<hr class="wp-block-separator has-text-color has-background has-vivid-cyan-blue-background-color has-vivid-cyan-blue-color is-style-dots" />

The style is then applied to a pseudo element: { .... }

This effectively accounts for a nice display in all modern browsers without me having to think about it.

When distributed via a feed, the styles are not included. The HR element remains, but feed readers may strip several of the classes that they aren’t using. This is similar to how email clients process HTML email.

Each feed reader makes its own decisions about this. The web version of Feedly includes the HR as a strong solid line with the wp-block-separator class intact. Feedly’s Android app appears to hide it entirely.

I’ve taken quick looks at Feedbin, Inoreader, Newsblur, and NetNewsWire and they all treat HR similarly: various shaded styles of a solid line.

Really, the only problematic one of these is Feedly’s Android app. Removing the hard line modifies the contextual display of each note. A reader may be confused when one line having to do with apples is suddenly another discussing beer.

One answer could be to replace HR elements in the feed output with an image that represents the break, but that seems a little silly. I like what Phil Gyford does with his week notes. Each starts with a § character that also acts as an anchor for direct linking. It’s probably more helpful to pursue an approach like that instead of altering the HTML just for the feed.

Another goofy example is emojis. WordPress provides full support for the capture and storage of emojis as well as a compatibility layer using the Twemoji project. This layer replaces raw emojis in content with hosted images on The pizza emoji becomes this in the feed:

<img src="" alt="{actual pizza emoji}" class="wp-smiley" style="height: 1em; max-height: 1em;" />

The alt text has an actual pizza emoji in it, but if I put it there, it gets replaced with an image, so that code blurb becomes its own mini pizza recursion.

What’s cute about this is when a feed reader (or other source) tries to find an image that it can display alongside an article. If the only image in the article is this emoji, then things appear in an interesting way.

A screenshot of this site’s feed in Newsblur.

I’m not sure yet what to do about this. I’ll probably try to disable the emoji replacement in the feed to see what happens. I think in general it will be okay, though it does rely on the feed reader storing the data properly and on peoples’ browsers and devices supporting emoji. The biggest impact this has is probably on Windows browsers, though it seems like support is generally available now.

That’s all I have for now. I’m sure there are more. I just need to keep adding elements to blog posts and watching for the effects. 🙂

Trying out

Services like should spend more time telling everyone about features like “oh, by the way, we have a dedicated discovery page for posts about pizza“. 🍕

That kind of pitch and I would have signed up for an account 2 years ago.

Here I am discovering new things though.

I got here because of a series of articles. I started reading “Twitter to decentralize… something” after having it open in a tab for a few days. And while I nodded along to that quite a bit, there was a link to another post titled “Open gardens” that I really nodded along to.

The issue isn’t that Twitter doesn’t care. It’s instead a design flaw in the platform. Because tweets don’t exist outside of Twitter, when you’re banned from Twitter, you need to start over with a new format or on a new social network. For this reason, and because their business depends on a large user base, Twitter is hesitant to throw anyone off their service. They’re unwilling to tend the garden for fear of pulling too many weeds.

– Manton Reece, Open gardens

That paragraph had me hooked, but it still wasn’t until the middle of the post when the author mentioned the Kickstarter that I connected the dots to whom I was reading. Paragraphs like those are the gotchas when you’ve heard about a service but haven’t paid enough attention and now you know you really should check it out.

It’s not over.

At the end of that article was a link to yet another, “The way out“, linked to as “the way forward“, an exceptional play on title and URL that caused me to open the link twice because I wasn’t sure I had clicked the right thing.

This one talks more about in the context of content ownership and hones in on a good difference between it and things like Mastadon: (emphasis mine)

Mastodon helps by encouraging smaller social networks, distributing the task of moderation, but doesn’t prioritize content ownership. An account on an instance like has no more ownership of its content than an account on Twitter. Both let you export your data but both live at someone else’s domain name.

– Manton Reece, “The way out

A link then drops to “Starting a new photo blog“. At this point I’m thinking to myself how excellent of a series of perfectly placed links this has been because here I am on blog post four and I’ve read every post and often when this happens those tabs sit unread for weeks!

That post is great and it was cool to see how easy it is to import past Instagram posts into using the MacOS app. There’s also a nice looking Sunlit app for iOS that I won’t be able to use, but I’m definitely interested in giving this all a shot.

When I left Instagram, one of the final triggering events was my discovery of the open-source and hosted service pixelfed. I setup an account and immediately declared it was the replacement I would use. I posted a few photos, followed a couple people, added the site as a home screen bookmark so that it would be app like, and then…

Forgot to login after a few days.

The browser cookies expired and I had to login again, and I had that ownership question poking in my brain—If I start adding photos here, how long will it be before I have to move them somewhere else.

Still a little upset about URL shorteners in general and especially 2009, the year I used for everything 😞

Me, on Twitter a few weeks ago

Of course there’s more history.

Way way back in 2009, Posterous ( was a thing. A year before Instagram came around, a lot of people had photo blogs and Posterous made it easy to post via email or web. In 2012, the team was acquired by Twitter, and in 2013 the service was shut down.

A custom domain at Posterous made it easy for me to move to self hosted with working 301 redirects. Happy for that. Own your stuff.

Me, on Twitter almost 7 years ago

Luckily, Posterous was cool in that you could point a domain of your own to your account so that was really When they shut down, I was able to export all of my data and have control over the redirects. I imported everything into WordPress, setup redirects to posts and now I can still go back and see how absolutely horrid a Blackberry Pearl’s camera was 10 years ago.

Here we are several years later.

Even though I’ve seen how these cycles go, I’ve published a whole bunch of content so that if I move it somewhere else, I break every reference to it.

Instagram was never web friendly anyway, so there are barely any references—you couldn’t even link to photos within the app.

Twitter, on the other hand—even though it’s perfectly fine to treat it as an ephemeral stream and just delete it all—has also been a log of work, feelings, annoyances, experiences, and all kinds of junk that becomes fun to look back at every once and a while.

That’s going to suck when Twitter shuts down or everyone stops using it.

So. I should learn that lesson a bit here while also being open to trying new hosted services that seem to be driven by good people. I setup a account and pointed a sub-domain at it. Thanks to my HSTS configuration on this root domain (, I need to wait just a bit… 🛌

Ok. I’m back to finish the post, and only two weeks later!

It was getting late and I had to request an HTTPS certificate for from the team. Manton actually replied early the next morning and had the cert and domain all configured for me. I also received a very welcoming set of replies to my first post from the community. All great touches!

I then got busy with not being busy for the holiday and left all these tabs and this post open with the intention of finishing every day since.

I’m going to figure out the right way to incorporate this into my flow now. I think I’ll start by trying to import my Instagram archive. Then I’ll need to work out a mobile solution and determine how this may all fit as a separate piece from my main site.

In an ideal world, if this all works out, most of my tweets will originate at and then syndicate out to Twitter according to some criteria. Or I’ll find some entirely new use for it that takes me away from Twitter for good. Let’s see what happens!