Tak

Git worktree management for Elixir/Phoenix development.

Tak (Dutch for "branch") helps you manage multiple git worktrees, each with isolated ports and databases for parallel development.

Tak demo

Requirements

Installation

  1. Add tak to your dependencies in mix.exs:

    def deps do
      [
        {:tak, "~> 0.4.2", only: :dev}
      ]
    end
  2. Add local config import to config/config.exs (this allows tak to create dev.local.exs in each worktree with isolated port and database settings, without modifying tracked files):

    # At the end of config/config.exs
    if File.exists?("#{__DIR__}/#{config_env()}.local.exs") do
      import_config "#{config_env()}.local.exs"
    end
  3. Add to .gitignore:

    /config/*.local.exs
    /mise.local.toml
    /trees/
  4. Run mix tak.doctor to verify your setup.

Usage

Create a worktree

$ mix tak.create feature/login
$ mix tak.create feature/login armstrong  # specify name
$ mix tak.create feature/login --no-db    # skip database setup

This will:

Tak writes .tak only after bootstrap succeeds. If bootstrap fails, it attempts best-effort cleanup of the partial worktree.

List worktrees

$ mix tak.list

Shows all worktrees with their branch, port, database, and running status.

Remove a worktree

$ mix tak.remove armstrong
$ mix tak.remove armstrong --force
$ mix tak.remove armstrong --keep-db

This will stop services, remove the worktree, delete the branch, and drop the database. Use --keep-db to preserve the database.

Check configuration

$ mix tak.doctor

Verifies your project is configured correctly for tak (gitignore, dev.local.exs import, etc.).

Configuration

Configure Tak in your config/config.exs:

config :tak,
  names: ~w(armstrong hickey mccarthy lovelace kay valim),
  base_port: 4000,
  trees_dir: "trees",
  create_database: true,
  endpoint: MyAppWeb.Endpoint,
  repo: MyApp.Repo

Options

Option Default Description
names~w(armstrong hickey mccarthy lovelace kay valim) Available worktree slot names
base_port4000 Base port (worktrees use 4010, 4020, etc.)
trees_dir"trees" Directory to store worktrees
create_databasetrue Whether to run mix ecto.setup on create
endpoint Inferred from app name Phoenix endpoint module
repo Inferred from app name Ecto repo module

How it works

Each worktree gets:

If mise is installed, a mise.local.toml is also created with the PORT env var to override any inherited environment.

mix tak.list and mix tak.remove read .tak first. Older worktrees without .tak still work through the legacy config-scraping fallback, so no migration is required.

Runtime API

If you want to call Tak from Elixir instead of only through Mix tasks, the supported runtime API is:

License

MIT