Here's a full example using rebar3 escriptize: λ /tmp → rebar3 new escript hello ===> Writing hello/src/hello.erl ===> Writing hello/src/hello.app.src ===> Writing hello/rebar.config ===> Writing hello/.gitignore ===> Writing hello/LICENSE ===> Writing hello/README.md λ /tmp → cd hello → vim src/hello.erl λ hello → cat src/hello.erl -module(hello). %% API exports -export([main/1]). %% escript Entry point main(_Args) -> io:format("Hello World~n", []), erlang:halt(0). λ hello → rebar3 escriptize ===> Verifying dependencies... ===> Compiling hello ===> Building escript... λ hello → _build/default/bin/hello Hello World So what does this require? First of all, let's take a look at the rebar.config file: {deps, []}. {escript_incl_apps, [hello]}. {escript_main_app, hello}. {escript_name, hello}. {escript_emu_args, "%%! +sbtu +A0\n"}. the big deal is having the escript_main_app set to the application name I want to use. (here, hello) That application has a module with the same name (hello) that exports a function main/1 if your application has runtime dependencies, they should be declared in the applications tuple of your .app.src file (in src/) With these two things we can build an escript. The escript, as @fenollp said, ships without the Erlang VM and requires it to be installed. It makes Erlang become a scripting language the same way Python or Ruby would be, in some ways. It is still compiled and bundles its own code, but depends on a runtime environment being present. If you want to boot your application in the escript, then calling application:ensure_all_started(YourApp) is likely the best way to go, and a timer:sleep(infinity). will help things keep running. Let us know if you need more assistance.