dozeGitHubGet doze
Download

Get doze. Keep your fans quiet.

doze is an app first: one window for every stack on your machine, with the command line inside it. Free, Apache-2.0, no account. We guessed your machine from your browser; the others are right beside it.

Looks like your Mac

Download doze for Mac

Doze.app for Apple silicon: the window, the bat in your menu bar, and doze on your PATH. Quit the app and your stacks keep running. What happens when you open it ↓

Download Doze-0.2.0.dmg
Version 0.2 · [0.2 release date][MB]Apple silicon
Or with Homebrew
$ brew install --cask doze-dev/tap/doze
Every stack in one Library, with a switch each
Tiles, List or Map: see what's awake
⌘K across every stack

Linux

x86_64 and arm64. The CLI runs on any glibc distribution. The app's packages are built and being tested on real desktops. [deb and rpm at launch: confirm]

App.deb.rpm
CLI.tar.gzHomebrew
$ curl -fsSL https://doze-dev.com/install.sh | sh
[install.sh: placeholder, not built yet]Linux files on GitHub →

Just the command line

For servers, CI and terminal people. Same doze, no window. Install the formula or the cask, not both: they conflict.

Homebrew
brew install doze-dev/tap/doze
mise
mise use -g ubi:doze-dev/doze
Tarball or sourceArchives and checksums.txt on GitHub releases. From source: clone the repo, then make build (Go 1.27+ and bun). go install is not a way in: the module carries a replace for a patched Wails.
First launch

Open it. One password, once.

The installer copies the app and puts doze on your PATH, and asks nothing. The one question comes from the app, when you open it, and you can say no.

  1. The Library opens.Home for every stack on this Mac. On a fresh one: three steps (open a project, bring it up, connect to it) and two ways in, drop a project folder or start empty. The bat joins your menu bar and stays when the window closes.
  2. The Machine line offers Set up (one password).It gives every service a name like gateway.larder.doze, so two projects can both use 5432. It is the same setup as doze doctor --fix, behind macOS’s own administrator prompt (polkit’s, on Linux), and it adds the two things listed below. Skip it and everything still runs, on 127.0.0.1 with ports.
  3. Nothing starts until you flip Up.Opening a folder never starts it. A folder with no doze.hcl shows what doze found and three ways to start, and each only writes the file.
  4. A second prompt only for your own domain.If a stack declares domains, doze trust (or the stack’s banner in the app) routes them and trusts a certificate authority of this machine’s own. Your own domain, over https →
Drawn from the app’s Library · capture pending

Will it run on mine?

macOS 14 Sonoma or laterOn Apple silicon (M1 and newer).
Linux, x86_64 and arm64glibc distributions. The app needs WebKitGTK 4.1.
No Intel MacThe engines are built for Apple silicon only. Use a Linux VM.
Windows via WSL2Install the Linux CLI inside WSL2.

Coming from 0.1.1?

Update doze first, then your modules. 0.1.1 can't read a module release's oldest-doze field, so doze modules upgrade on 0.1.1 could pick a release it can't run.

$ brew upgrade doze
$ doze modules upgrade
Your doze.hcl needs the new words, and doze says which line:postgres "db" {} becomes module postgres "db" {}idle_timeout becomes sleep, and the default is 2 minutes, not 5.
No surprises

What doze changes on your machine.

Two at install, one at first launch if you say yes, all listed here, all undone by four commands. No kernel extension, no telemetry. The app asks GitHub for a newer doze only when you open Settings › About.

1
Copies Doze.app to ApplicationsThe window and the bat in your menu bar.
2
Puts doze on your PATHA link to the binary inside the app, so the CLI and the app are always the same version.
3
At first launch, if you say yes: .doze namesSo a service gets a name like gateway.larder.doze (the gateway in our example project, Larder), and two projects can both use port 5432. On a Mac it adds two things:
  • /etc/resolver/doze, which sends the .doze zone to doze's resolver and nothing else.
  • dev.doze.netd, a small network daemon that gives each service a loopback address of its own.
On Linux: the doze-netd systemd unit and a drop-in for your DNS manager. Only doze uses it: doze AWS and doze Kafka, run on their own, listen on 127.0.0.1 and need none of this. Skip it and everything runs on 127.0.0.1.
+
Only if you declare your own domaindoze trust makes a certificate authority for this machine. Its key stays in ~/.doze/ca, readable by you alone.

Take it all back

Run these in order. The last one deletes every engine, every module and every project's data under ~/.doze, so keep it for when you mean it.

Still on 0.1.1? It installed none of the above:

$ brew uninstall doze
$ rm -rf ~/.doze
$ doze dns-setup --uninstall  # resolver file, daemon
$ doze trust --remove         # if you used domains
$ brew uninstall --cask doze
$ rm -rf ~/.doze              # all data
Trust, but check

Verify your download.

Every release on GitHub carries checksums.txt with the sha256 of each file. Doze.app is signed with a Developer ID and notarised by Apple, so it opens without a warning.

Engines and modules that doze downloads later are signed too, and checked before they run.

How signing works →
# in the folder you downloaded to
$ shasum -a 256 -c checksums.txt \
    --ignore-missing
Doze-0.2.0.dmg: OK
$ spctl -a -vv /Applications/Doze.app
# accepted
# source=Notarized Developer ID
# origin=Developer ID Application:
#   [team name]

Then

Your first stack, in the app.

The first Up downloads the engines the stack needs, so give it a minute. After that it starts in seconds, and works offline.

  1. 1

    Open doze

    The Library is home for every stack on this Mac. On a fresh one it shows three steps and two ways in, and the Machine line offers the one-password setup that gives your services names.

    Drawn from the app's own screen · capture pending
  2. 2

    Drop your repo folder on it

    doze reads the folder’s go.mod and Go imports, package.json, compose files, a Makefile and the variables the code asks for, like DATABASE_URL, and lists what it found and where. Here, Larder’s gateway, before it had a doze.hcl. Nothing starts. Set it up from this repo writes doze.hcl, with the reason above each block.

    Drawn from the app's own screen · capture pending
  3. 3

    Flip Up

    One switch brings the stack up, each service after what it needs; what nobody calls goes to sleep. Next time Up starts what you had up last time. The menu beside it offers Start everything or Choose what starts…: tick the apps you’ll work on, and what they need comes too.

    Drawn from the app's own screen · capture pending

Prefer the terminal? doze init && doze up in the folder does the same, and the app shows the stack either way.

From a terminal instead

The same three steps. doze init reads the repo the way the app does. Or borrow our example project, Larder, a made-up grocery service in Go, Python and TypeScript, and stock its shelves once.

$ cd your-project
$ doze init
$ doze up
$ git clone \
    https://github.com/doze-dev/doze-examples
$ cd doze-examples/larder
$ doze up
$ doze task seed-catalog
What's in each releaseNewest: doze 0.2, [0.2 release date].