Welcome to Microplane
Microplane is the control plane for localhost.
Check out the repo for up-to-date docs & to share your feedback in a GitHub Discussion!
What does that mean? I'm glad you asked! Microplane allows automatically starting and stopping services on your development machine, allowing you to access them via a single configurable TLD, and automatically handles routing requests so all of your services can be accessed on ports 80 and 443.
Additionally, microplane sets up standard observability and process management stacks, so your local development environment can be as productive as production as possible.
Microplane is brought to you by Nerdsniped LCC, a small software consultancy based in Oakland, CA. Subscribe to microplane to support @segiddins and unlock access to upcoming pro features in microplane.
Installation
Homebrew
brew install nerdsniped/microplane/microplane
microplane install
and profit!
Example
This is an example microplane file that has several services.
Place it in ~/.microplane.yaml
and run microplane install
to get started.
# yaml-language-server: $schema=https://raw.githubusercontent.com/nerdsniped/microplane/main/dot-microplane.schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
tlds:
microplane: {}
test: {}
applications:
"junit-io":
enabled: true
name: junit.io
processes:
web:
launch_command:
- env
- -S
- ${SHELL}
- -lic
- |
set -eo pipefail
source .pumaenv
set -u
RAILS_LOG_TO_STDOUT=true exec bundle exec puma -C $CONFIG --tag microplane:$MICROPLANE_APP_NAME -w $WORKERS -t 0:$THREADS -b unix:$MICROPLANE_SOCKET
working_directory: "~/Development/github.com/segiddins/junit-io"
network_mode: socket
tailscale:
machine_name: junit-io
allowed_tailnets: [folk-dinosaur.ts.net, shark-crocodile.ts.net]
"rubygems-org":
enabled: true
name: rubygems.org
processes:
web:
launch_command:
- env
- -S
- ${SHELL}
- -lic
- |
set -eo pipefail
source .pumaenv
set -u
RAILS_LOG_TO_STDOUT=true exec bundle exec puma -C $CONFIG --tag microplane:$MICROPLANE_APP_NAME -w $WORKERS -t 0:$THREADS -b unix:$MICROPLANE_SOCKET
working_directory: "~/Development/github.com/rubygems/rubygems.org"
network_mode: socket
timeouts:
idle: PT60M
"microplane-dev":
enabled: true
name: microplane.dev
processes:
web:
launch_command:
- env
- -S
- ${SHELL}
- -lic
- |
set -euxo pipefail
RAILS_LOG_TO_STDOUT=true exec bundle exec puma -C $CONFIG --tag microplane:$MICROPLANE_APP_NAME -w $WORKERS -t 0:$THREADS -b unix:$MICROPLANE_SOCKET
working_directory: "~/Development/github.com/segiddins/microplane-dev"
network_mode: socket
tailscale:
enabled: true
machine_name: microplane-dev
allowed_tailnets: [folk-dinosaur.ts.net, shark-crocodile.ts.net]
"testserver":
name: testserver
processes:
server:
launch_command:
- env
- -S
- ${SHELL}
- -lic
- "exec ./testserver --port $PORT"
working_directory: "~/Development/github.com/segiddins/microplane/testserver"
network_mode: port
tailscale:
machine_name: microplane-test
allowed_tailnets: mine
"microplane-frontend":
name: microplane-frontend
processes:
web:
launch_command:
- env
- -S
- ${SHELL}
- -lic
- |
set -euxo pipefail
yarn dev --strictPort --port ${PORT} --host $MICROPLANE_APP_NAME.microplane
working_directory: "~/Development/github.com/segiddins/microplane/frontend"
network_mode: port
tailscale:
machine_name: microplane-frontend
allowed_tailnets: mine
"wedding":
processes:
next-dev:
launch_command:
- env
- -S
- ${SHELL}
- -lic
- |
set -euxo pipefail
yarn dev --port ${PORT}
working_directory: "~/Development/github.com/segiddins/hannah-and-sam.wedding"
network_mode: port
tailscale:
machine_name: wedding
allowed_tailnets: all