Meow. A process manager for development.
Tags: showdev, webdev, tooling, productivity
Published: 2021-05-23 18:28:31

Meow is a pure shell program that manages booting and killing any given amount of processes for your development workflow. It gives you the ability to boot/kill these processes in different terminal tabs automatically. Scroll to the bottom to see a quick visual representation on how Meow reads and organizes your processes. To see everything Meow has to offer checkout its repo. https://github.com/LoganBresnahan/meow

As a web developer, I feel elated at the current state of web development. It continues to grow more vibrant and exciting everyday! There are so many wonderful tools to make a web dev's life easier and more productive. Personally, I do a ton of work with Rails, Webpack, and Elixir! The creators behind these tools and frameworks have made spinning up a new website easier than ever....but can it get even easier?

My normal development setup consists of a booting up a backend, frontend, and cache server. So now we have 3 processes to boot-up somehow. Not a problem! There are some really cool tools out there such as Overmind and the Foreman family of tools that manage Procfile based applications. Essentially reading commands off of the Procfile and running them. Each tool respectively has it's own features that really shine, but I found they didn't do exactly what I wanted.

As a Rails developer I use the `pry` gem a lot for debugging. `pry` is a repl (read evaluate print loop) which allows you to input text into the terminal within the context of your application similar to using `debugger` in JavaScript. When using Foreman to boot up my servers for development I noticed that `pry` doesn't work as expected. It "works" but you simply can't see what you're typing. Foreman wasn't made to receive input. Overmind on the other hand is closer to what I want but still misses the mark. Like foreman, it doesn't handle receiving input when using a repl. However, Overmind is built with tmux. You can simply open a new tab and connect it to your desired process that was started with Overmind and huzzah! My `pry` session is working and I can see what I'm typing. HOWEVER, I'm too lazy for this approach. I don't want to open up a new tab and handle closing it. I just want everything to be setup with one simple command.

Enter Meow. I created Meow as simple development tool that would let me add commands to a single file, similar to a Procfile, but also give me the ability to boot these commands into a different terminal tab without having to do it manually. All the while, making sure that debugging tools, such as `pry`, would just work. Not only that, I wanted the option to fine tune how and when processes would die. With Meow you can tell a newly spawned terminal tab to "expire" or "endure" when the main process is terminated. Check out the Readme from the link above to learn all the options available with Meow. Below is an example config file Meow reads from to manage your commands.

```shell
# Hi I'm a comment. I must start at the beginning of a line.

--start-config

# For an explanation of these config options check out the Readme.
writable-relative-directory=tmp
auto-check-updates=true
apple-tab-spawn-delay=0.75
unix-shell=bash
kill-signal=15

--end-config

# To execute these commands just type "meow" in your terminal
# If you want to execute just one or a selection of these groups 
# you can give Meow command line arguments "meow 0 2". 
# This will only boot the commands listed in the first and
# last groups.
--start-commands

# I'm the first command of a group so I exist in the foreground
bundle exec rails server
# Commands after the first exist in the background.
yarn start:dev

--new-tab-expire
# New tab expire means it closes when you terminate the first group.

# We can change directories!
-cd $HOME/my_project_two

# I'm the foreground command of this new terminal tab.
iex -S mix
# I'm off to the background.
npx webpack --mode=development --watch=true

--new-tab-endure
# New tab endure means these commands do not exit when you
# kill the first group.

redis-server

--end-commands
```