Big News!  Tilt is joining Docker
mish in action

mish: cruise control for developers

Our next Windmill experiment is live. mish is a terminal app that automates your development loop. mish watches your files, reruns commands, and displays the output. Refining the commands as your workflow changes is easy and ergonomic.

mish is cruise control for developers. It takes minutes to start using it. It automates the repetitive so you can focus on the important. Keep your eyes on the road/code. Stay in Flow.

Why Automate

Navigating through shell history isn’t hard, but it is unnecessary. Our commands are repeated because we’re in an edit-compile-test(-restart-etc.) loop. Contorted key combos, even when etched in muscle memory, take effort and steal attention in the best case.

In the worst case, they waste time. Like when you spend 5 (15? 30?) minutes figuring out why your code is having no effect, only to realize you were building the wrong binary.

Computers perform rote steps accurately and quickly. mish makes you more productive during the day, and less exhausted at the end of it.

What’s New

Autorunning tools exist, but the number of people who use them rounds to 0. (Heck, I don’t use them.) Why is mish different?

It recognizes that your workflow is dynamic: you futz with a flag or change the set of packages under test. Autorunning tools are meant to keep you in Flow, but refinement requires stopping, editing an invocation, and restarting. Cruise control needs a dial that can be tuned after ignition.

mish can be tuned by editing a file instead of a command-line. A Millfile is easy and fun to refine because it’s a program in the Mill language.

Mill: a Language for Refinement

Mill is a dialect of Python (built with[skylark](, a great Python interpreter) that makes scripting dev workflows easy. A new configuration language can be intimidating. Let’s look at a useful Millfile:

sh("go test -v ./pkg/foo") # run a unit test

That’s it!

The README describes growing your Millfile. You can run multiple commands, or watch/ignore files that trigger runs.

Because Mill deals with commands, not libraries, it works with any language, testing framework, or backend.

It’s Dangerous to Go Alone; Take Mi(chel)

Bonjour! Je m’appelle MichelBonjour! Je m’appelle Michel

Adopting a new tool, especially a CLI, is intimidating because so many are so inscrutable. mish means to break that trend. It offers a contextual help bar in the footer. And a mascot!

mish is also short for “Michel”. Every hermit crab has to find a shell to live in; Michel picked yours. Over time, expect Michel to make more appearances; DevTools don’t have to be soulless. We hope Michel makes you smile, and they make your workflow more enjoyable. (yes, “they”; mish is a binary but Michel is non-binary)

The Earliest of Days

We started coding mish 2 weeks ago. We’re sharing it this early because our mission is fast feedback. We think this primordial state can get you fast feedback about your code. And we hope it can get us fast feedback about our hypothesis.

Sounds compelling? Or mildly intriguing? Or even totally wrong-headed? Great!

  • Get mish from github

  • 15 minutes of setup

  • A day or two of developing as it runs in the background

  • 20 minutes to tell us how it feels. Better? Worse? Bugs getting in the way of the vision? Let us know.

Originally posted on the Windmill Engineering blog on Medium


Already have a Dockerfile and a Kubernetes config?

You’ll be able to setup Tilt in no time and start getting things done. Check out the docs! 

Having trouble developing your servers in Kubernetes?