There’s got to be a better way to do this. Actually, I know there’s a better way to do this, because Minecraft already does it in Java Edition.

How to try out snapshots in Minecraft Java Edition:

  • Change the version in the launcher.

How to go back to the stable version:

  • Change the version in the launcher.

How to try out betas in Minecraft Windows 10 Edition:

  • Log in as someone who Microsoft knows is an adult, because Xbox Insider only allows 18 and up.
  • Sign up for Xbox Insider
  • Sign up for the Minecraft beta in Xbox Insider
  • Download updates on your Microsoft Store apps and hope it installs the beta.

How to go back to the stable version:

  • Leave the beta in Xbox Insider
  • Download updates on your Microsoft Store apps and hope it goes back to the other version.
  • Back up your saved games, which are buried deep in a hidden folder with cryptic names. Seriously, they’re in $homedir\AppData\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\
  • Uninstall Minecraft from every account on the computer, which will also erase all of your saved worlds, which is why you needed to back them up first. (oops.)
  • Reinstall Minecraft
  • Restore your saved games

There’s a known issue where leaving the beta doesn’t always work — especially if there are multiple accounts on the computer that have Minecraft installed. The only reliable fix so far is to uninstall every copy of Minecraft (Bedrock edition) on the computer, in every user’s account.

I’m just glad I found out that uninstalling the app deletes all your worlds before having to uninstall it on the kid’s login!

Oop Store

The Microsoft Store for Windows really feels a lot more fragile to me than either the standard run-an-installer paradigm or the Linux style package manager. I haven’t dug into its inner workings, but it seems like something that came out of the mobile and console ecosystems…and hasn’t been completely adapted to running on a general computer.

For example: Applications are only accessible for the user who installed them, like on Android. But sometimes it downloads the app all over again, and sometimes it doesn’t. It’s not even clear how much is stored system-wide vs. per-user.

As near as I can tell, the Microsoft Store will only download the application if it’s newer than a version that’s already on the computer. So if the beta is newer than the stable release, and the beta still exists somewhere on the computer (like in another user’s account), it’ll just use that one instead of re-downloading it.

Unsaved

But regardless of how it handles multiple installations on the same computer, it’s inexcusable that there is literally no way to reinstall a broken copy of the game and keep your potentially years of progress on a world without first digging into a hidden folder, then through seven levels of folders with generic or cryptic names just to find your saved games and manually copying your saved games before you uninstall and reinstall the game.

It shouldn’t delete your games (at least not without asking).

And it should keep them somewhere you can find more easily.

Update March 2023: If you want to cross-post from something supported by brid.gy, I recommend using that service since it’s a lot simpler to set up. But if you want to pull from an RSS/Atom feed, or anything else that brid.gy doesn’t support, or customize features like post visibility, this will let you connect just about anything.

*****IMPORTANT UPDATE NOVEMBER 29, 2022: I gave the wrong directions on what to put in the Application Website field in Mastodon. It just needs to be https://ifttt.com. It isn’t used for identifying the source to your Mastodon server as I thought it was, but appears as a link when the post is viewed by itself on the web. If you followed on my mistake, I highly recommend (1) removing the URL from your Mastodon config and just putting in ifttt.com and (2) going into your Webhooks settings at IFTTT and generating a new key. I feel horrible that I messed this up, and I am so sorry to everyone I steered wrong.
******

I finally managed to hook up IFTTT to Mastodon to auto-post from another site! I use IFTTT as glue for linking several services together including sharing interesting links from Pocket when I’m offline: I can add a tag in the app on my tablet, and then when it syncs that tag up to the cloud, IFTTT will pick it up and create the share post on whichever service I’ve tagged it for.* I also use it to post from RSS and WordPress to publish new blog posts to services that aren’t available in Jetpack.

My main source was this post by @raucao@kosmos.social. It’s a bit out of date, but it pointed me in the right direction.

Note: I’ve updated this article several times (most recently November 2022, when I finally added screenshots and some troubleshooting tips) to add more information, clarify some issues, respond to changes in IFTTT’s layout, and make additional suggestions.

Before we go any further, if you’re hooking up something that’s totally automatic, rather than something triggered by your own actions on another site — especially if you don’t plan on posting to the same account manually — I’d recommend looking for a bot-friendly Mastodon instance like BotsIn.Space. That’s where I set up @SpeedForce@BotsIn.Space to post every time there’s a new blog entry on Speed Force.

1. Set up IFTTT’s Webhooks

On IFTTT, go to Webhooks. Activate it by clicking on the Connect button.

2. Set up Mastodon to allow IFTTT as an application

Go to Preferences/Development/Your Applications on your Mastodon instance (ex: on mastodon.social it’s here). Click on New Application. Enter the following:

Name: IFTTT
Website: https://ifttt.com

UPDATE November 2022: When I first posted this article, I thought you only needed maker.ifttt.com to match the source of the API calls. In April/June 2022, I updated the article under the mistaken impression that Mastodon now needed the full URL generated by the IFTTT webhook service, like IFTTT needs the API key from Mastodon. This was wrong. I didn’t test it properly, and didn’t notice that this field isn’t for authentication, it’s exposed in a link when a post is viewed by itself on the web. If you followed on my mistake, I highly recommend (1) removing the URL from your Mastodon config and just putting in ifttt.com and (2) going into your Webhooks settings at IFTTT and generating a new key.

Thank you so much to @h3rb1 for pointing out my mistake.

Scopes: write:statuses

Screenshot of the write:statuses box checked.

Submit the app.

Now open the new app you’ve created and look up the access token for the next step.

Screenshot of Mastodon app settings including Client key, Client secret and Your access token. You want the last one.

3. Create an IFTTT app!

Go back to IFTTT and create a new app. For example, I created an app triggered by Pocket, whenever an item is tagged share-mastodon. You could also set it up to autopost every time you blog with a specific tag, or every new item in an RSS feed, or all kinds of things. Even cross-post from Facebook or “the birdsite” (Twitter).

Since IFTTT has rearranged their site to make it easier to use pre-built recipes — sorry, apps — here are the steps to get to the point where you can build your own.

  1. Click on the “Get More” button at the top of the IFTTT page.
  2. The first bar should say “Make more Applets from scratch.” Click on the “IfThisThenThat” button in that bar.
  3. Click on “This” in “If +This Then That”
  4. Search for the type of service you want to hook up — RSS for a feed, or Pocket, or Facebook, etc. and choose the type of event you want to use (ex. “New feed item” or “New item tagged…”)
  5. Enter the info needed for the event — your feed URL, the tags you’re looking for, etc, and click on “Create Trigger.”
  6. Click on “That” in “If [rss] Then +That”
  7. Search for Webhooks and click on it.
  8. Choose “Make a Web Request”

And now you’re ready to configure how IFTTT will actually talk to your Mastodon app. Enter the following settings:

URL: (replace mastodon.example.com with your server)

https://mastodon.example.com/api/v1/statuses

Method:

POST

Content Type:

application/x-www-form-urlencoded

Additional Headers: (replace 1234567890 with the access token you got from Mastodon, and make sure there’s only a space between “Bearer” and the token.)**

Authorization: Bearer 1234567890

Body:

status=Whatever you want to post

Screenshot of IFTTT webhook action, repeating the text above.

Screenshot of the message body, repeating the text examples below.

For example, to share a link from Pocket you might want the body to be

status=<<<{{Title}}>>> <<<{{Url}}>>>

Or for posting from WordPress, you might want it to be

status=New blog post: <<<{{PostTitle}}>>>
<<<{{PostUrl}}>>>

Or from an RSS feed, you could use

status=New post: <<<{{EntryTitle}}>>>
<<<{{EntryUrl}}>>>

The “ingredients” available (Title/PostTitle/etc.) will depend on the source you’re using, and you can get them from the IFTTT user interface. RSS feeds will have EntryTitle, EntryUrl, etc., WordPress will have PostTitle and PostUrl, and so on. You can click on the “Add ingredient” button to see what’s available.

Watch out for ampersands and single quotes, because the API handler treats them as separators. Even if they’re in the source material! When I first set this up, I ran into problems where single quotes in the original post would cause the Mastodon post to break. Wrapping the ingredient like this <<<{{Title}}>>> will prevent that.

Be sure to include the status= at the beginning! You can also add optional parameters for the Statuses method of the Mastodon API to add spoiler text, mark it as sensitive content, change the visibility (public, followers-only, etc), and so on.

To post an excerpt in a CW that doesn’t show up in local/federated timelines or hashtag searches, you would do something like this:

spoiler_text=Link: <<<{{Title}}>>>&visibility=unlisted&status=<<<{{Url}}>>> <<<{{Excerpt}}>>>

Or you could auto-generate a private draft, which you can go back to manually and fine-tune using Mastodon’s “Delete and re-draft” feature.

visibility=direct&status=<<<{{Title}}>>> "<<<{{Excerpt}}>>>" <<<{{Url}}>>>

Unfortunately, this method can’t post images because uploading images to Mastodon is a two-step process***. You can use something like brid.gy (Twitter, Instagram, Tumblr, Flickr and more) or moa.party (Twitter/Mastodon). And if you want to go full Rube Goldberg, you can hook up a chain like Instagram→ IFTTT→ Twitter→ Moa→ Mastodon.

Click on “Create action.”

Add a title and click on “Finish.”

4. Test it out!

Go and post something that should trigger the rule, then come back and click “Check Now” on the IFTTT applet. Make sure it comes through the way you want it to. Adjust it as needed, using “Check Now” to verify each change, until it’s working the way you want it.

If you get a 422 Error in the IFTTT logs, that means something in the message body is wrong. Make sure you

  • Included status=
  • Didn’t post something too long for your instance. (Usually 500 characters)
  • Used <<<>>> around any ingredients that might have apostrophes, or ampersands, etc. in them.

If you get a 401 Error in the IFTTT logs, it’s probably an authorization issue. Check that

  • Your IFTTT app has the right access token
  • There’s only a space and not an actual line break or a double-space between “Bearer” and your token. IFTTT’s narrow layout makes this hard to see because it always wraps, and if you copy the entire line from Mastodon, it’ll sometimes introduce an extra space at the beginning.
  • Your Mastodon app config allows write:statuses

Once you’re done, let it go! Over time, IFTTT will adjust its checking frequency based on how often you post to the source feed. I’ve got some that it usually catches within 10 minutes, and others that it takes a few hours.

You can follow me on Mastodon at @kelsonv@wandering.shop. If you’re not on Mastodon, but would like to check it out, start at JoinMastodon.org. It’s a quick overview of what Mastodon is, how it’s different from Twitter, how different instances work (think of them as different servers on an MMO game, or different email services), and how to pick an instance that suits you.

*The day after testing the Pocket-to-Mastodon connection with a few links, I discovered something interesting about IFTTT when it re-posted one of those links to Buffer. Apparently IFTTT doesn’t know which tags are new, only which bookmarks have been updated and what the current tags are. My new Pocket-to-Mastodon applet picked up the share-mastodon tag I’d just added, and my Pocket-to-Buffer applet picked up the old share-buffer tag that had been on there since I first shared it last month.

**Previously the authorization token would be appended to the URL, like this:
https://mastodon.example.com/api/v1/statuses?access_token=1234567890
My recipes using that method still work, but maybe that’s because the tokens are older. (Thanks for the update, Sven!)

***The Mastodon API needs the image to be uploaded first. It sends back the image’s ID, and then you attach that ID when you make the post. Multi-action IFTTT apps aren’t really chains – every action has the same set of ingredients from the trigger, and you can’t add the result from one action to the input on another.

I finally discovered why my phone has been vibrating on most incoming messages since upgrading to Android Oreo, even when sound is on: It’s now a per-conversation setting, so even though I have Messenger set to sound only, that only applies to new senders. I had to go through my saved text messages and turn vibrate off in every. single. saved. conversation.

Deleting a conversation also makes it use the default setting the next time that person sends a message, so if you don’t want to save the existing texts, deleting them is faster.

Not terribly convenient, Google.

Of course, that only fixes it for Messenger.

Notification settings are per-app now, and it seems Oreo assumes you want it to vibrate along with the ringtone unless the app turns it off. And of course not all of them let you turn off vibration independently from sound. They haven’t needed to until now, after all.

Ironically, this includes Chrome. I’m trying out Mastodon (find me at @kelsonv @KelsonV@wandering.shop for general conversation and @kelsonv@photog.social for photos), and for now I’m using the embedded Chrome app. And I can’t fine-tune the notifications because Google’s own flagship browser doesn’t include the options it needs on the new version of their OS! 🤦

Samsung’s Android skin won’t let you tell it to forget a saved WiFi network unless it can see it right now. If it’s present, sure. If it’s out of range, it won’t let you tell it that no, you really don’t want it to automatically connect the next time you’re in range.

This is both annoying (your Galaxy S7 or Note 5 is going to keep looking for those networks all. the. time.) and a security risk (imagine someone sets up a rogue hotspot called “Starbucks WiFi” and you happen to park your car* or sit on a bench within range of it).

Note that the stock Android settings do allow you to fix this, with a Saved Networks section in the WiFi config. Samsung deliberately removed the feature** for some reason.

Apparently it used to be possible to remove saved networks using a third-party app, but new security protections in Marshmallow prevent that. (Ironic, that.)

Workaround (source):

  1. List all saved networks by going to Settings → Data Usage → More → Restrict networks. (This doesn’t let you remove them, just limit background transfers on them.) Take a screenshot if you have to.
  2. Remove the ones you don’t want anymore by tediously renaming your own WiFi hotspot to match each in turn [edit: you also need to match the security type (open vs WPA2)], removing them one by one in the regular WiFi settings, then renaming your hotspot back to its normal SSID.

It’s a pain, but at least it’s possible.

Update May 2017: The Android 7 update finally restores this capability directly in the Settings app, at least on the Galaxy Tab S2. You can now go to

Settings → Connections → Wi-Fi → Advanced → Manage networks

to remove saved networks of just turn off auto-reconnect on a case-by-case basis (so you can keep saved passwords). But for older Android versions, we’re still stuck doing it the long way.

*I once stopped at a Coffee Bean and left my tablet in the car. I don’t remember why I pulled it out when I got back in the car, but it had connected to the WiFi while I was grabbing my coffee. It couldn’t actually load anything but the login page because it was the real hotspot…but if it had been a fake hotspot, they could have intercepted or modified any non-encrypted traffic going on in the background.

**At best, Samsung forgot to include it when they wrote their own settings app years ago.

I use WP-CLI from time to time to do maintenance on my WordPress sites that I host on a DreamHost VPS. But today I tried to run the search-replace function and found that wp wouldn’t run. Instead I got this error:

Fatal error: Call to undefined function apply_filters() in /path/to/wp-includes/load.php on line 317

It didn’t take long to confirm that WordPress 4.6 had changed things around, breaking the version of WP-CLI on my server. As it turns out, WP CLI 0.24 fixes this, but DreamHost is running 0.24-alpha.

So I tried installing the current version locally on my account, only to get a different error:

Fatal error: Class 'Phar' not found in /path/to/wp-cli.phar on line 3

I found this article very helpful for enabling PHAR support on a DreamHost VPS. I went into ~/.php/5.6/phprc (create this file for your version of PHP if you don’t have it) and added:

extension=phar.so
phar.readonly = Off
phar.require_hash = Off
suhosin.executor.include.whitelist = phar

Once I verified that it would work by running /usr/local/bin/php-5.6 wp-cli.phar --info, I took the opportunity to (a) override the wp command with the local one and (b) make sure it used php 5.6 by adding the following alias to my .bash_profile:

alias wp='/usr/local/bin/php-5.6 ~/bin/wp-cli.phar'

This won’t be needed once DreamHost updates their WP-CLI package, but for now, it solves my problem faster than waiting for a response from tech support.