Skip to content

Tunnel-Labs/localdev

Repository files navigation

localdev

An interactive TUI for local development.

A video of using localdev

Usage

Install the localdev-tui npm package using your favorite JavaScript package manager:

npm install --save-dev localdev-tui

Then, create a localdev.config.mjs file in the root of your project:

// @ts-check

/** @type {import('localdev-tui').LocaldevConfig} */
export default {
	servicesToLog: {
		'my-website': true,
	},
	services: {
		'my-website': {
			healthCheck: {
				port: 3001,
			},
			command: {
				string: 'npm run start',
			},
		},
	},
	localDomains: ['my-website.test'],
	proxyRouter(req) {
		const hostname = req.hostname;

		if (hostname === 'my-website.test') {
			return 'http://127.0.0.1:3001';
		}
	},
};

Then, add a dev script in your project's package.json file:

{
	"scripts": {
		"dev": "localdev"
		// ...
	}
}

Now, you can run npm run dev (or the equivalent for your package manager) to start localdev!

Motivation

Often times, developing a complex application involves running many separate services that interact with each other. During development, it's tedious to manually run every service in separate terminals every time. Instead, it's a lot easier to have one dev server that automatically manages multiple development processes.

However, building a dev server isn't as easy as simply running all programs concurrently and outputting all their logs. Many services output a significant amount of logging output (especially during debugging) that can quickly clutter a single terminal window.

Thus, an interactive solution is needed, and that's where building a TUI for local development comes into play.

Why not Kubernetes?

You might recognize that managing multiple services sounds similar to Kubernetes, and you wouldn't be mistaken. Kubernetes does solve a similar use case, which we heavily rely on for deployment.

However, during development, Kubernetes incurs significant performance and DX (developer experience) tradeoffs. Running development processes in a VM or Docker can be 10x slower than running the process on the host machine, not to mention the extra amount of disk space, CPU and memory a local Kubernetes cluster running minikube would take up.

Thus, we decided that we will instead focus on building a great developer experience by running development processes on the host machine.