Tutorial: How to deploy an app to production with an actual button

If you’re familiar with the deployment process, chances are you’re familiar with the set of repeated steps that have to be completed before you push to production. It’s not a process that would be described as “fun”, but it’s an important one nonetheless.

But what if we could deploy and release an application with the push of a real button? In this post, we’ll go over how to make your own “ship it” button to deploy a new release.

Ship it GIF


To follow along with this tutorial, you’ll need:

  1. An AWS IoT Dash button: To jumpstart, we’re going to use a premade IoT button that you can purchase on Amazon.
  2. An AWS account: Create an AWS account. You’ll need to create one even if you have an account. We’ll be using the AWS Lambda tool to call the GitHub API.

*Note: This service charges you for the data you use. You can also use a virtual dash button service from your mobile phone. And the code from our guide can be connected to any application—not just AWS._

  1. To set up your development environment: We’ll be using Node.js 6.10 when connecting with AWS Lambda. Download the latest node version—or just use Lambda for the development.
  2. A GitHub account: Create a GitHub account. It’s fast, easy, and of course, free.
  3. A GitHub API access token: A personal access token allows you to authenticate who you are when using GitHub through the API or otherwise programmatically. To generate one:
  • Navigate to
  • Click Generate new token
  • Select the scopes we’ll be using for the tutorial: repo_ deployment, write:packages, read:package

Once you’ve finished setting up all of the prerequisites, get started with the rest of the setup process.

Step 1: Writing the GitHub API calls

Use Node.js to call the GitHub API and the Octokit/rest.js library to wrap API calls. Octokit works like any other library and uses the GitHub REST API endpoints—but it also allows us to use await, async, promise, and callback wrappers all contained. Plus, we can authenticate at the beginning, then perform our calls.

Let’s take a look at the index.js file we’ll create.

Step 1a: Setting up Octokit

At the top of the file, we require our Octokit npm package:

const octokit = require('@octokit/rest')()

Step 1b: Authenticating

Then we authenticate with GitHub using our newly created personal access token:

       type: 'token',
       token: process.env.GH_TOKEN

Step 1c: Setting up the event handler

To use AWS Lambda, we need a handler to understand what to do when the button is clicked. We add the wrapper:

exports.handler = (event, context, callback) => {
  console.log(`Received event: ${event}`)
  let tag_name
  const owner = process.env.GH_LOGIN
  const repo = process.env.GH_REPO

Step 1d: Retrieving and creating the latest release

Inside the exports.handler function, you’ll find releases. The GitHub Releases API is a hidden gem housed under the Repository API. You can create a draft, prerelease, set up the branch to release from, and more from one API call.

For this scenario we’ll get the latest release and increment it by one. Then we’ll publish a new release each time the button is clicked.

Both of the methods below are Promises and will create a new release once the latest release has been retrieved. To do so, we need our GitHub username, the repo we want to release to, and a tag_name when creating it. There are several optional details we can add, but here are the basics:

    }).then(result => {
    tag_name = (parseInt( + 1.0).toString() + '.0'

      }, (error, result) => {
        if (error) throw new Error()
        if (result) console.log(`Created Release: ${JSON.stringify(result)}`)

Step 1e: Creating a deployment

In addition to creating a release, we’re going to start a deployment by calling upon the GitHub Deployments API. We can do this by specifying the login, repo, branch we want to deploy from, and optionally, a description:

      ref: 'master',
      description: `Deploying ${tag_name} version`
    }, (error, result) => {
      if (error) throw new Error()
      if (result) console.log(`Created Deployment: ${JSON.stringify(result)}`)

Once the release and deployment methods are inside the event handler, the code is almost set. We’re using Node.js, so make sure to run npm init and npm install @octokit/rest to ensure the environment is setup.

A repository has been created with the entire setup process and you can find the link in Step 3 when we need to call on the code. To actually run the code, let’s first configure the new AWS IoT button.

Step 2: Configuring the AWS IoT button

To set up the button, follow the AWS quickstart guide or download the AWS IoT Button Dev app, available on iOS or Android.

Once your button is configured with WiFi, feel free to test out the example lambda functions like sending a text or email. Next we’ll create a new function.

Step 3: Setting up an AWS Lambda function

Once we set up our lambda function, we’re ready to release! Navigate to the AWS Lambda Function Console.

Step 3a: Creating the function

In orange, you’ll see a “Create Function” button, whether you’re viewing your dashboard or functions. Below are detailed steps to walk through the process. If you get stuck, try watching this video walkthrough.

  • Click Create Function and Author from Scratch.
  • Enter a “Name”.
  • Ensure the runtime is Node.js 6.10.
  • Under “Role”, select Create new role from template(s).
  • Enter a “Role Name”. It can be the same as “Name”.
  • Under “Policy Templates”, select AWS IoT Permissions.

Step 3b: Adding the button trigger

Once your function is created, you’ll see it has a number of different settings we can configure. We’ll edit the “Designer”, “Function Code”, and “Environment Variables” aspects of the function. Let’s begin with “Designer”.

  • Add the AWS IoT Trigger in “Designer”. The “Configure Triggers” box should appear.
  • Select IoT Button as the IoT Type.
  • Enter the Device Serial Number located on the back of the button.
  • Make sure to check Enable the Trigger, then click Add.

Step 3c: Uploading the code

Now that we have set up the button trigger, we need to make sure the code is correct. We’ll take the code from Step 2 and upload the zip file.

If you would like to use the code you wrote earlier, zip the package to the root of the folder with zip -r ./* or you’ll receive a cannot find /index.js error. Otherwise, clone the contents of the repository with git clone Make sure the file is cloned with the contents.

Once you have your zip file:

  • Reveal the “Function Code” box by pressing the “Function Name” box in “Designer”.
  • Scroll to “Function Code”.
  • Under “Code Entry Type” select Upload a .zip file
  • Once you upload your file, click Save. You should now have the ability to “Edit Code Inline”.

Step 3d: Adding in the environment variables

  • Scroll to “Environment Variables”
  • Create GH_LOGIN, GH_REPO, and GH_TOKEN for your environment variables and add your login, the repository you want to release to, and the personal access token you created in the prerequisites.

Step 3e: Test

Now we’re ready to test our button with the following steps:

  • Click Test, a button that pops up with a “Configure Test Event”.
  • Select the Hello World Event Template (Default).
  • Enter in an “Event Name”.
  • Click Create.

When you click Test you should be able to see new releases on your repository as they are created and the logs with Created Deployment and Created Release. Note: The release will only work if there is already a release present in a number format (1.0, for example).

You can check to see if your new release was created at your repositoryURL/release. Check the logs to make sure no errors were thrown. If you are seeing {message: not found} or {message: bad credentials} check your Personal Access Token permissions.

Step 4: Clicking the button

Now return to the “Configure Trigger Stage” and make sure your button is set. You should be able to click the button and get the same results you got when you tested it.

Next we’ll go into more detail on how to incorporate the GitHub events you just triggered within different workflows.

Step 5 (optional): Integrating within your workflow

Clicking the button will trigger a release and deployment—but what do you do with this information? At this point, you can configure it to your workflow or deployment process. The diagram below outlines how to communicate between the button or “Tooling”, GitHub, and our server.

+---------+             +--------+            +-----------+        +-------------+
| Tooling |             | GitHub |            | 3rd Party |        | Your Server |
+---------+             +--------+            +-----------+        +-------------+
     |                      |                       |                     |
     |  Create Deployment   |                       |                     |
     |--------------------->|                       |                     |
     |                      |                       |                     |
     |  Deployment Created  |                       |                     |
     |<---------------------|                       |                     |
     |                      |                       |                     |
     |                      |   Deployment Event    |                     |
     |                      |---------------------->|                     |
     |                      |                       |     SSH+Deploys     |
     |                      |                       |-------------------->|
     |                      |                       |                     |
     |                      |   Deployment Status   |                     |
     |                      |<----------------------|                     |
     |                      |                       |                     |
     |                      |                       |   Deploy Completed  |
     |                      |                       |<--------------------|
     |                      |                       |                     |
     |                      |   Deployment Status   |                     |
     |                      |<----------------------|                     |
     |                      |                       |                     |

There are several deployment services and providers to choose from. At GitHub we use Heaven to deploy directly with our chat bot, Hubot. Some companies have even adapted it into their flow. There are also applications in GitHub Marketplace that specifically help developers with fast and easy deployment.

In order to deploy an application, we use Probot, a tool for creating GitHub Apps and automating your workflow in a quick and easy way. In this case, it acts as a third party to listen for deployment events and send back deployment statuses by creating issues.

Step 5a (optional): Homemade deployment server with Probot

The application is based on the GitHub delivering deployments guide but modified to Node.js in order to use Probot.

In this scenario, the bot listens for particular GitHub events, meaning when someone presses the button to create a deployment, the application knows to create and push the new build—and provide a deployment status. The button deploys to Heroku—their Build and Release API allows us to push the GitHub release package and deploy instantly from a single POST request.

If you want to take a look or try it yourself, learn more in the Deployment Status Bot repository.


While you might not physically click a button to deploy your application to product regularly, you can always trigger these GitHub events to mix up a repetitive deployment process.

If you need any additional resources or help, feel free to go through the Building a GitHub App quickstart guide. Or sign up for the GitHub Developer Program, and post on the GitHub Platform Forum.

Create a 13 kB JavaScript game in 30 days with js13kGames

js13kGames logo

What is js13kGames?

Js13kGames is a month-long JavaScript coding competition organized by @end3r. Running since 2012, it challenges participants to create a game in 13 kilobytes or less of JavaScript based on a theme that’s announced at the start of the competition.

Bonus: This year there’s a WebXR category meaning web developers can experiment with virtual reality experiences for the competition. For this category, you’ll have the same file size limit of 13 kilobytes, but you’ll get A-Frame or Babylon.js for free!

Developers of all skill levels are welcome to participate. It’s a great excuse to learn or level up your JavaScript, learn or improve upon game development skills, and have fun sharing your ideas. The theme for this year’s competition will be announced on August 13 at 13:00 CEST.

Tools and techniques to make the most of 13kB

With final package sizes having to be 13kB or less—and most JavaScript game engines and libraries being much larger—the size limit does pose an interesting challenge. Thankfully, past participants have shared some of the micro game engines they’ve created specifically for js13kGames. Rather than starting from scratch, check out and use some of these engines:

Create a simple sprite and game loop in just a few lines of code using Kontra.js:

Kontra.js code example

var sprite = kontra.sprite({
  x: 100,        // starting x,y position of the sprite
  y: 80,
  color: 'red',  // fill color of the sprite rectangle
  width: 20,     // width and height of the sprite rectangle
  height: 40,
  dx: 2          // move the sprite 2px to the right every frame

var loop = kontra.gameLoop({  // create the main game loop
  update: function() {        // update the game state

    // wrap the sprites position when it reaches
    // the edge of the screen
    if (sprite.x > kontra.canvas.width) {
      sprite.x = -sprite.width;
  render: function() {        // render the game state

loop.start();    // start the game

Minify your JavaScript

It’s definitely not cheating to submit minified version of your code to make it fit within 13kB. It’s almost a necessity. Tools like @xem’s s miniMinifer and @google’s Closure Compiler are heavily used by participants to minify code.

Don’t worry too much about names, or golfing. The best way to make an entry is to concat everything in one file, minify, zip and use advzip (to save an extra 1kb over regular zipping)!” - @xem

Tip: You can keep the original, unminified source code in your repository and work the minification into your build process or manually upload the minified version during the competition submission process.

Optimize every bit and byte of your images

Your game probably won’t have many images given the size constraints. Whether you’re taking existing assets from websites like, or creating your own using something like Piskel or Poxi, you’ll want to compress them as much as possible. Be sure to run your images through optimization tools like @catid’s Zpng or @voordmedia’s TinyPng.

Be smart with sound

Adding audio to your game can quickly raise your total project size, but it definitely adds to its appeal. Luckily there are some great tools and techniques you can use to generate your own audio.

Generate all sorts of weird blips and bleeps using @grumdrig’s jsfxr, or hit the music studio with @Mbitsnbites’s HTML5 synth music tracker/editor SoundBox. @xem’s miniMusic even lets you draw your masterpiece!

miniMusic example

And play it back:
with(new AudioContext)[4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,23].map((v,i)=>{with(createOscillator())v&&start(e=[7,8,9,10,11,12,13,14,15,16,17,18,19,26,27,28,29,30,31,43,44,45,46,47,48,49,50,51,56,65,7,8,9,10,11,12,13,14,15,16,17,18,19,24,25,26,27,28,29,30,31,37,38,42,43,51,56,57,64,65,12,13,24,25,26,27,31,38,51,56,57,62,63,12,13,23,24,25,38,50,51,56,57,61,62,12,13,23,24,38,48,49,50,56,57,60,12,13,23,24,38,45,46,47,48,56,57,59,12,13,23,24,38,44,45,46,47,48,56,57,58,12,13,23,24,25,26,27,28,29,30,38,48,49,56,57,12,13,23,24,25,26,27,28,29,30,31,38,49,50,56,57,12,13,30,31,32,38,50,51,56,57,58,7,8,12,13,31,32,38,51,56,57,58,59,60,7,8,12,13,31,32,38,51,56,57,60,61,7,8,12,13,31,32,38,51,56,57,62,63,7,8,9,12,13,31,32,38,51,56,57,64,65,7,8,9,10,11,12,13,31,32,38,51,56,57,65,66,7,8,9,10,11,12,13,31,32,38,49,50,51,56,57,66,67,8,9,10,11,12,22,23,24,25,26,27,28,29,30,31,32,37,38,44,45,46,47,48,49,56,57,67,22,23,24,25,26,27,28,29,30,37,38,56,57,67,68,56,57,68,68][i]/5,connect(destination),frequency.value=988/1.06**v)+stop(e+.2)})

Learn from others

After the competition ends, some developers publish retrospectives—fantastic resources on what to do and what not to do to maximize your productivity (and your game’s playability) within the constraints of 30 days and 13kB.

If playing the games, viewing the source, and reading the developers’ retrospectives from last year’s event would be helpful, here are five of our favorites:

A Day in the Life

A Day in the Life screenshot

A Day in the Life is a minimalist endless runner controlled by just one button. It was created by @MattiaFortunati using Kontra.js, TinyMusic, and PixelFont–a novel way to squeeze a font into an entry.

View the source
Play the game
Read the postmortem


LOSSST screenshot

In LOSSST by @xem, you’re a puzzle-solving snake looking for a lost kid. Warning: the game is very addictive and the postmortem contains everything from the thought process coming up with the design to focused game implementation details.

View the source
Play the game
Read the postmortem


Greeble screenshot

In Greeble by @Rybar, you control a space-mining bot searching for enough fuel and parts to repair and explore.

View the source
Play the game
Read the postmortem

Lost Packets

Lost Packets screenshot

@ElementalSystemsLost Packets is an abstract puzzle game where you help lost packets reach their destination—very impressive work for only 40-50 hours of work on nights and weekends.

View the source
Play the game
Read the postmortem


Vernisage screenshot

In Vernissage by @Platane you’re lost in a museum showcase low resolution works of art as a series of colored dots. Explore the world in VR or in browsers thanks to A-Frame–a web framework for building virtual reality experiences. The postmortem includes great detail on the genetic algorithm used to generate the art pieces.

View the source
Play the game
Read the postmortem

More tips and tutorials

The js13Kgames website lists even more resources and retrospectives that should prove useful. If there’s something you’d like to add, please create an issue (or better yet, a pull request) on

Join in on the fun

Follow @jsk13kGames on Twitter or visit the website on August 13 at 13:00 CEST (4am PT/7am ET) to find out what the theme will be. You can also use the hashtag #js13k to see how others are doing and to share your progress.

How the Nintendo Entertainment System lives on in open source - Game Bytes

Welcome to the July edition of Game Bytes, a monthly series focused on the game developer community. This month, we take a look at the legacy of the Nintendo Entertainment System (NES) in open source.

The NES was released 35 years ago today. While official NES games haven’t been released in over 20 years, a “homebrew” scene exists where developers are still creating NES games (playable on the original hardware or on emulators) in the original 6502 Assembly Language.

Whether you grew up playing NES games, or your parents did, you’re bound to find something of interest—either in the gameplay or in the code—for some of these games below.

Open source homebrew NES games

Super Tilt Bro

Super Tilt Bro screenshot

Super Tilt Bro is a game inspired by Super Smash Bros–a two-player fighting game where you must knock a friend (or the computer) off of a platform. The latest release introduces a new stage and mysterious orb that gives one player incredible strength.

Pwn Adventure Z

Pwn Adventure Z screenshot

Pwn Adventure Z is a zombie survival game made to be hacked. It was originally released as a physical cartridge at CSAW (Cyber Security Awareness Week), the largest student-run cyber security event in the world, for the 2015 CTF (Capture the Flag) competition.

Nova the Squirrel

Nova the Squirrel screenshot

Nova the Squirrel is a platform game featuring a squirrel by the name of Nova Storm. Help her uncover new abilities and save the strange new world that she’s found herself in.


Thwaite screenshot

In Thwaite, you must protect a small town from destruction by taking out incoming missiles with fireworks. Defend it for seven nights to win the game.


Falling screenshot

Not much is known about why our hero is “Falling” from the sky, but they must collect as many coins as possible while avoiding all platforms. This was @tragicmuffin’s first time creating a game from scratch and working with Assembly.


Sprilo screenshot

Sprilo is a small, time-attack racing game. Test your ability to drive a tiny car around a track as fast as you can in over three unique courses. Created in less than 30 days for last year’s GitHub Game Off competition, this was @cbrwn’s first time creating a game using Assembly for any sort of console. It was created in less than 30 days for last year’s GitHub Game Off competition.

Interested in building your own NES game? This guide to 6502 Assembly from @skilldrick is an excellent place to start.

Little bits

SuperTux: help wanted

SuperTux screenshot

You might not know 6502 Assembly Language, but if you have some experience with C++ then the SuperTux team are looking for people to assist with continuing development of the classic platform game. Contribute to the core gameplay or contribute content through the integrated level editor.

Js13kgames starts next month

The seventh annual js13kgames–a JavaScript coding competition for HTML5 game developers–kicks off next month. If you don’t know 6502 Assembly Language or C++, but are comfortable around HTML/CSS/JS, @end3r’s month-long game jam to create a JavaScript game in less than 13 kilobytes might be for you!

See the website for more details.

New desktop app in beta client app beta

The latest version of the desktop app is in open beta. The Electron-based app is available for download on Windows, macOS, or Linux. You can use it to browse, download and stay up to date with the latest indie games on Take it for a spin and be sure to report any bugs you find. Nice work @fasterthanlime!

Dear Weather Guy

Dear Weather Guy screenshot

Dear Weather Guy was created for the recent Godot Community Jam. Thanks to a nice little integration with the Open Weather Map API, you can have fun trying to guess the real temperature of world cities. It works on Windows, macOS and Linux. Beautiful work, Emilio and Andre Mari Coppola!

Join us in August for the next edition of Game Bytes!

Release Radar · June 2018

Release Radar June 2018 Edition

From code style to Minecraft, we’ve got another round of releases that caught our attention. Here’s a small sample of all the great open source releases that were published on GitHub in June.

PocketMine-MP 3.0

PocketMine-MP is a server for Minecraft Pocket Edition written in PHP. It lets you rule your own Minecraft universe by running multiple worlds, plugins, and gameplay customizations. The latest release features a new dependency aimed at improving performance, and fixes for many gameplay bugs. For example, Minecraft gardeners will be pleased to know that “saplings now take light level into account when trying to grow.” Read the release notes for details.

Did you know? If you search deep enough in our code mines, you’ll discover a treasure chest of Minecraft mods, plugins, and more to do things like generate colonies, disguise yourself as Hubot, and even visualize and manage your Docker containers. View the #minecraft topic to discover more.

OpenLayers 5.0

OpenLayers is a JavaScript library that helps you put maps on the web using tiles, vector data, and markers from any source including OpenStreetMap, Bing, MapBox, and others. The version 5.0 release of OpenLayers has been restructured to remove the Closure Compiler as a dependency, improving compatibility with popular JavaScript module bundlers and fixes a bunch of bugs. Check out the OpenLayers 5.0.0 release notes for more.

Did you know? Null Island is very popular for a place that doesn’t exist. (Get it?)

Neofetch 5.0

Neofetch in action

Want to show off your system’s specs? Then you might want to give Neofetch a try. It’s a command line tool that summarizes your operating system, software, and hardware in a style fit for a screenshot. Neofetch 5.0 had a significant internal rewrite, cleaning up a lot of code along the way. This release also adds support for several new operating systems, adds a new output format (JSON), and improves the performance of image handling. See the release notes on GitHub for a detailed breakdown of what’s changed.

Did you know? The Neofetch source contains an impressive collection of ASCII art operating system logos.

PouchDB 7.0

PouchDB is a database that runs in the browser and syncs with CouchDB. The latest release, version 7.0, trims the library’s size by dropping support for the deprecated Web SQL API and its own Promises polyfill. The release also ships new behavior for determining revisions, reducing the likelihood of conflicts when syncing, and lots of bug fixes. Check out the release announcement for more information.

Did you know? PouchDB is based on Apache CouchDB, an open source NoSQL document database.

ESLint 5.0

ESLint is a static analysis tool that checks your JavaScript source for stylistic errors and suspicious code for the pedant in all of us. ESLint 5.0 adds new rules, improvements to existing rules, and several bug fixes. This release does have some changes that break compatibility with past versions, so you might want to look at the migration guide in addition to the release blog post.

Did you know? The original lint program was invented at Bell Labs in 1978 by Stephen Curtis Johnson.

GitHub for Unity 1.0

GitHub for Unity is joining the 1.0 club with its latest release. GitHub for Unity brings GitHub, Git Large File Storage, and file locking to game developers as a Unity editor extension. The latest release lets you choose your own diffing tools, has a smaller package size, a Git action bar for essential tasks, and numerous bug fixes. Take a look at this blog post for the complete story.

Did you know? The game shown above, and in the Unity for GitHub website, uses a game called Throwback created by @Gipzo for last year’s Game Off competition.

Neural Network Libraries 1.0

Congratulations are in order to Neural Network Libraries, which also joined the 1.0 club in June! Living up to its name, Neural Network Libraries make it easier to work with neural networks. The latest release improves compatibility with different operating systems and Python versions. What’s more, the project has improved performance and has added support for Nvidia Tensor Cores. See the project’s release announcement for a summary of what’s changed.

That’s just a handful of releases you shipped last month. If you’ve got a release that should be on our radar, send us a note.

Preserving and playing classic point-and-click adventure games with ScummVM

Welcome to Game Bytes: a monthly blog series about the game developer community on GitHub. This month, we take a look at a project that enables you to play classic point-and-click adventure games and catch up on a few new releases.

ScummVM 2.0

If you grew up playing video games in the 80s and 90s, you may have spent hours on end playing point-and-click adventure games that defined the genre, like Sam & Max Hit the Road, Full Throttle, and Day of the Tentacle (which was released 25 years ago today).

Those games were developed and published by LucasArts (formerly “Lucasfilm Games”) using a proprietary game engine called SCUMM, which stands for “Script Creation Utility for Maniac Mansion”. Those games weren’t designed to run on today’s hardware and playing them now would be a challenge. ScummVM, a collection of interpreter implementations for 2D adventure games, was created to enable gamers to discover and play these classic games. Originally developed for SCUMM-based games, ScummVM now supports many more engines. It is free and open source under the GPL (GNU General Public License).

ScummVM 2.0.0 launcher screenshot

Download and install

ScummVM is highly portable and is available for download on many platforms including Windows, macOS, Linux, Android, Raspberry Pi, AmigaOS, Dreamcast, PalmOS, PocketPC, PSP, PS2, SymbianOS, and more.

Download the latest 2.0.0 release


If you don’t have your old floppy disks still lying around (or a machine to read them), the ScummVM website is a great resource for demos of the classic games and freeware and commercial games that you can download or purchase.

For recommendations, check out the critically acclaimed cyberpunk/science-fiction game Beneath a Steel Sky, or one of the Secret of Monkey Island demos and try to become a pirate.

Animation of Guybrush Threepwood entering and exiting the Scumm Bar in the Secret of Monkey Island

Did you know? The “Scumm Bar” featured in the first three Monkey Island games was named after the technology used to build the game. In a later edition of the game, the local pirates’ watering hole was renamed “Lua Bar”. Can you guess why?

It’s worthing noting that the ScummVM project has a zero tolerance policy for software piracy and a number of protections are built into the code to reject known cracked versions of classic games.

Get involved

ScummVM is open source on GitHub and already has over 200 contributors. In addition to code contributions, the project is always looking for help on their user manual and with translations. Check out their developer documentation for information on how to get involved.

They are also mentoring students through Google’s Summer of Code program and you can follow along with their progress.

Animation showing sprite  scaling in Star Trek: 25th Anniversary

Did you know? GSoC student @drenn1 is adding support for the engine used in Star Trek: 25th Anniversary and Star Trek: Judgement Rites. They have also uncovered and fixed 25-year-old bugs, and explained scaling and animation optimizations in the transporter room–a place you definitely don’t want to encounter bugs or performance issues.

Little bits

Here’s other news coming from the game developer community.

Phaser 3.10 released

The latest version is the biggest Phaser 3 release to date and introduces multi-touch support, a brand new gamepad system, new input plugins, and more. The API documentation has also been updated, but is still conveniently formatted in Markdown for easy editing.

Read more

100+ Godot Community Game Jam Entries

The Godot Community Game Jam, a weekend-long competition to build free and open source games with Godot Engine, took place earlier in June.

Play and rate the games

GitHub for Unity 1.0 shipped

GitHub for Unity 1.0 is now available in Unity Asset store and incorporates file locking improvements, diffing support, and improved Git LFS support—all thanks to community contributions and feedback from early access beta testers.

Read more




Discover new ways to build better

Try Marketplace apps free for 14 days

Learn more