npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@mbluemer_2/gittyup

v0.1.8

Published

Filesystem-driven CLI for managing bare git repositories and worktrees

Downloads

255

Readme

gittyup

gittyup is a filesystem-driven CLI for managing bare Git repositories and linked worktrees under a shared root such as ~/src.

Install

From npm:

npm install -g @mbluemer_2/gittyup

Or with pnpm:

pnpm add -g @mbluemer_2/gittyup

From a GitHub release tarball:

npm install -g "https://github.com/mbluemer/gittyup/releases/download/vX.Y.Z/gittyup-X.Y.Z.tgz"

Or with pnpm:

pnpm add -g "https://github.com/mbluemer/gittyup/releases/download/vX.Y.Z/gittyup-X.Y.Z.tgz"

That installs the gu binary from the packaged dist/ output attached to each GitHub release. The npm package exposes the same gu binary.

Requirements

  • git 2.17+
  • tmux for gittyup tmux ...
  • fzf for interactive worktree and tmux pickers

Root directory

By default, gittyup manages projects under ~/src.

  • Override it per command with --root ~/somewhere
  • Or set GITTYUP_ROOT=~/somewhere to make a different default

Layout

Each project is stored as:

~/src/myrepo/
  repo.git/
  main/
  feature-login/

repo.git is the canonical bare repository. Linked worktrees live beside it.

Commands

gittyup project list
gu pl
gittyup project doctor
gu pd
gittyup project init get myrepo
gu pg myrepo
gittyup project init set myrepo "pnpm install"
gu ps myrepo "pnpm install"
gittyup project init clear myrepo
gu px myrepo
gittyup project create myrepo
gu pc myrepo
gittyup project clone [email protected]:owner/myrepo.git
gu pcl [email protected]:owner/myrepo.git
gittyup project import ~/code/existing-repo existing-repo-managed
gu pi ~/code/existing-repo existing-repo-managed
gittyup project rename some-repo-managed some-repo
gu pr some-repo-managed some-repo

gittyup worktree list
gu wl
gittyup worktree list myrepo
gittyup worktree add
gu wa
gittyup worktree add myrepo feature/login --alias feature-login
gittyup worktree add myrepo fix/bug --from main
gittyup worktree remove
gu wr
gittyup worktree remove myrepo feature-login

gittyup status
gu st
gittyup status myrepo
gu s myrepo

gittyup tmux launch myrepo
gu tl myrepo
gittyup tmux launch
gu tl
gittyup tmux switch
gu ts

Shortcuts

gu supports flattened shortcuts for common commands:

p     -> project
pl    -> project list
pd    -> project doctor
pg    -> project init get
ps    -> project init set
px    -> project init clear
pc    -> project create
pcl   -> project clone
pi    -> project import
pr    -> project rename
w     -> worktree
wl    -> worktree list
wa    -> worktree add
wr    -> worktree remove
s/st  -> status
t     -> tmux
tl    -> tmux launch
ts    -> tmux switch

Options

gittyup --root ~/src
gittyup --json

Project diagnostics

gittyup project doctor inspects every directory under the managed root and reports both healthy projects and broken entries that are missing repo.git or have invalid worktree metadata.

Project init commands

You can configure a per-project shell command to run whenever gittyup worktree add creates a new linked worktree.

Example:

gittyup project init set gittyup "pnpm install"
gittyup project init get gittyup
gittyup project init clear gittyup
  • The command runs with the new worktree as its working directory.
  • If the init command fails, the worktree is kept and gittyup reports the error.
  • The command is stored in .gittyup.json inside the managed project root.

Interactive worktree add

gittyup worktree add can run interactively when arguments are omitted.

  • With no arguments, it opens fzf to select a project and then prompts for a branch name.
  • With only a project name, it prompts for the branch name.
  • The worktree alias is still derived automatically unless you pass --alias.

Example:

gittyup worktree add
gittyup worktree add myrepo

Interactive worktree remove

gittyup worktree remove can also run interactively when arguments are omitted.

  • With no arguments, it opens a single fzf picker showing worktrees as <project>:<worktree>.
  • With only a project name, it opens fzf for that project's worktrees using the same <project>:<worktree> format.
  • The canonical main worktree is protected and cannot be removed.

Example:

gittyup worktree remove
gittyup worktree remove myrepo

Interactive tmux launch

gittyup tmux launch can also run interactively when arguments are omitted.

  • With no arguments, it opens fzf for all linked worktrees as <project>:<worktree>.
  • With only a project name, it opens fzf for that project's worktrees using the same format.

Example:

gittyup tmux launch
gittyup tmux launch myrepo
gu tl
gu tl myrepo

Development

pnpm install
pnpm build
pnpm test
pnpm lint
pnpm dev --help
pnpm dev project list
pnpm dev -- project list

Both pnpm dev project list and pnpm dev -- project list are supported.

Releases

Updating package.json to a new version and merging that change to main automatically runs the release workflow.

  • CI runs first on the main push
  • Release only runs after that CI run succeeds
  • The workflow creates and pushes the matching vX.Y.Z tag
  • pnpm pack creates an installable tarball
  • GitHub Releases gets the tarball and SHA256SUMS.txt attached automatically
  • The same workflow publishes @mbluemer_2/gittyup to npm using the NPM_TOKEN repo secret

You can still create a release manually by pushing a tag like v0.1.0 yourself.

Version bump policy for agents is documented in AGENTS.md.

Local project bootstrap

gittyup project create <name> bootstraps a new local project by:

1. Creating repo.git
2. Seeding an initial empty commit on main
3. Creating the linked main/ worktree

That makes new local projects immediately usable with additional worktrees.

Import existing repos

gittyup project import <source> [name] creates a new managed project from an existing local non-bare Git repository.

Example:

gittyup project import ~/src/some-repo some-repo-managed

This does not rewrite the source repository in place. It creates a new managed project directory under your configured root with repo.git and main/.

Rename managed projects

gittyup project rename <project> <name> renames the managed project folder and repairs the linked worktree metadata for the new paths.