Skip to main content
Version: dev

Developer Containers and Codespaces

Adding a developer container configuration file to your Noir project is one of the easiest way to unlock coding in browser.

What's a devcontainer after all?

A Developer Container (devcontainer for short) is a Docker image that comes preloaded with tools, extensions, and other tools you need to quickly get started or continue a project, without having to install Nargo locally. Think of it as a development environment in a box.

There are many advantages to this:

  • It's platform and architecture agnostic
  • You don't need to have an IDE installed, or Nargo, or use a terminal at all
  • It's safer for using on a public machine or public network

One of the best ways of using devcontainers is... not using your machine at all, for maximum control, performance, and ease of use. Enter Codespaces.

Codespaces

If a devcontainer is just a Docker image, then what stops you from provisioning a p3dn.24xlarge AWS EC2 instance with 92 vCPUs and 768 GiB RAM and using it to prove your 10-gate SNARK proof?

Nothing! Except perhaps the 30-40$ per hour it will cost you.

The problem is that provisioning takes time, and I bet you don't want to see the AWS console every time you want to code something real quick.

Fortunately, there's an easy and free way to get a decent remote machine ready and loaded in less than 2 minutes: Codespaces. Codespaces is a Github feature that allows you to code in a remote machine by using devcontainers, and it's pretty cool:

  • You can start coding Noir in less than a minute
  • It uses the resources of a remote machine, so you can code on your grandma's phone if needed be
  • It makes it easy to share work with your frens
  • It's fully reusable, you can stop and restart whenever you need to
info

Don't take out your wallet just yet. Free GitHub accounts get about 15-60 hours of coding for free per month, depending on the size of your provisioned machine.

Tell me it's actually easy

It is!

Github comes with a default codespace and you can use it to code your own devcontainer. That's exactly what we will be doing in this guide.

8 simple steps:

1. Create a new repository on GitHub.

2. Click "Start coding with Codespaces". This will use the default image.

3. Create a folder called .devcontainer in the root of your repository.

4. Create a Dockerfile in that folder, and paste the following code:

FROM --platform=linux/amd64 node:lts-bookworm-slim
SHELL ["/bin/bash", "-c"]
RUN apt update && apt install -y curl bash git tar gzip libc++-dev
RUN curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash
ENV PATH="/root/.nargo/bin:$PATH"
RUN noirup
ENTRYPOINT ["nargo"]

5. Create a file called devcontainer.json in the same folder, and paste the following code:

{
"name": "Noir on Codespaces",
"build": {
"context": ".",
"dockerfile": "Dockerfile"
},
"customizations": {
"vscode": {
"extensions": ["noir-lang.vscode-noir"]
}
}
}

6. Commit and push your changes

This will pull the new image and build it, so it could take a minute or so

8. Done!

Just wait for the build to finish, and there's your easy Noir environment.

Refer to noir-starter as an example of how devcontainers can be used together with codespaces.

How do I use it?

Using the codespace is obviously much easier than setting it up. Just navigate to your repository and click "Code" -> "Open with Codespaces". It should take a few seconds to load, and you're ready to go.

info

If you really like the experience, you can add a badge to your readme, links to existing codespaces, and more. Check out the official docs for more info.