Last updated 14 April 2020
A stack is an operating system image that is curated and maintained by Heroku. Stacks are typically based on an existing open-source Linux distribution, such as Ubuntu. Heroku applications target a specific stack, and buildpacks are responsible for transforming an app’s source code into an executable package that is compatible with that stack.
Heroku currently provides two stacks (Heroku-16 and Heroku-18), along with the ability to use Docker containers.
Heroku’s officially supported buildpacks work with all current stacks. Custom buildpacks are not guaranteed to work with all stacks.
The default stack for all newly created Heroku apps is Heroku-18.
|Stack Version||Base Technology||Supported through|
|Heroku-18 (default)||Ubuntu 18.04||April 2023||Learn more|
|Heroku-16||Ubuntu 16.04||April 2021||Learn more|
*Containers do not include the curated and maintained operating system of the other Heroku stacks. You are responsible for selecting and maintaining the base layer of containers you deploy.
Ubuntu Packages on Heroku Stacks lists packages available on each stack.
Viewing which stack your app is using
You can determine which stack your app is using with the
heroku apps:info CLI command:
$ heroku apps:info -a example === example ... Stack: heroku-16 ...
Migrating to a new stack
You can view available stacks for an app with the
heroku stack CLI command:
$ heroku stack
You might need to make code changes when you move an app to a different stack. The
stack:set CLI command tells Heroku which stack to use, but it is your responsibility as the application developer to make any required changes to your code.
This article describes how to upgrade to the latest stack.