gpakosz/.tmux

Oh my tmux! My self-contained, pretty & versatile tmux configuration made with πŸ’›πŸ©·πŸ’™πŸ–€β€οΈπŸ€

25,207
Stars
almost 14 years
Age
0
Published reviews
0
Questions

Reliability breakdown

What drives the reliability score

Component scores measured daily from GitHub activity (2026-07-15).

Continuity30% of headline18

Activity on 4 of 90 tracked days in the last 90 and 0 of 30 in the last 30.

Closure30% of headline22

Merged 0 of 2 PRs opened and closed 0 of 2 issues opened over the last 90 tracked days β€” PR flow carries 55% of this component, issue flow 45%.

Shipping20% of headline0

0 releases in the last 180 days, 0 in the last 90 and 0 in the last 30 β€” a steady cadence scores highest.

Liveness10% of headline100

Last push 36 days ago β€” freshness decays as pushes age (roughly halves every 83 days without a push).

Support burden10% of headline98

Open-issue load isn't tracked for this repo yet.

Adoption confidence47

Modeled β€” how confidently teams are adopting this repo. Stargazers

Maintenance quality34

Modeled from PR/issue responsiveness and upkeep signals. Activity pulse

Risk score38

Modeled β€” lower is better; adoption and continuity risk. Repository

Stays active (30d)12%

Modeled chance the repo stays active over 30 days. Activity pulse

Stays active (90d)39%

Modeled chance the repo stays active over 90 days. Activity pulse

Release rhythm (180d)0

Regularity of releases over the last 180 days. Releases

Maintainer bus risk (90d)77%

Modeled β€” lower is better; concentration of commits in few maintainers. Contributors graph

Topics

Explore related topics

Jump into the topic listings this repository belongs to.

Project Overview

.tmux β€” published under the banner "Oh my tmux!" β€” is a self-contained, batteries-included configuration for tmux, the terminal multiplexer. Instead of building a .tmux.conf line by line over months, you clone one repository, symlink one file, and immediately get a polished status line, sane keybindings, and clipboard integration. The whole thing is plain tmux configuration plus embedded shell helpers, which is why GitHub classifies the repo as Shell.

It is a configuration, not a program. That matters for how you evaluate it: there is no daemon to run, no binary to update, and the "API" is a documented set of variables you override in a separate .tmux.conf.local file. The project requires tmux 2.6 or newer and runs anywhere tmux runs β€” Linux, macOS, and the BSDs.

Use it when you want a strong default setup you can layer personal tweaks on top of. Skip it if you already have a heavily customized config you love β€” merging the two is manual work, and this project assumes it owns the base layer.

Key Challenges Addressed

A hand-rolled tmux setup fails in predictable ways. This config targets those failure modes directly:

  • Stock defaults are spartan. Out of the box, tmux gives you a bare status bar and keybindings that fight muscle memory. .tmux ships a full theme, h/j/k/l pane navigation, and splits on - and _ so you stop reaching for awkward default chords.
  • Dotfiles rot when updates require manual merges. The two-file design β€” .tmux.conf owned by the project, .tmux.conf.local owned by you β€” means git pull updates the engine without touching your overrides.
  • Clipboard integration breaks differently on every OS. Setting tmux_conf_copy_to_os_clipboard=true routes copy-mode yanks to the system clipboard using the right tool for your platform instead of leaving text stranded in tmux's internal buffer.
  • Status-line eye candy usually demands patched fonts. The powerline-style separators are plain variables, so you can swap them for ASCII characters if your terminal font lacks the glyphs.

Getting Started

Installation is four commands:

cd
git clone --single-branch https://github.com/gpakosz/.tmux.git
ln -s -f .tmux/.tmux.conf
cp .tmux/.tmux.conf.local .

Then start tmux. The symlink makes the project's .tmux.conf your live config; the copied .tmux.conf.local is yours to edit freely. From inside tmux, <prefix> e opens .tmux.conf.local in your $EDITOR and reloads the configuration when you save, and <prefix> r reloads manually.

Sharp edges you will hit in the first hour:

  • If your tmux is older than 2.6, the config will not load correctly. Run tmux -V before installing and upgrade through your package manager first.
  • If your terminal font lacks powerline glyphs, the status-line separators render as boxes or question marks. Install a powerline-patched or Nerd Font first, or set tmux_conf_theme_left_separator_main and its sibling separator variables to plain characters in .tmux.conf.local.
  • If you edit .tmux.conf instead of .tmux.conf.local, the next git pull wipes your changes. Treat .tmux.conf as read-only, always.
  • On Linux, copying to the OS clipboard silently does nothing without xsel or xclip installed. Install one of them before enabling tmux_conf_copy_to_os_clipboard=true.

Features and Use Cases

The day-to-day wins are ergonomic, not flashy:

  • A status line with useful telemetry. Battery level, date and time, and username@hostname display β€” with awareness of SSH sessions, so you can tell a remote tmux from a local one at a glance. This alone prevents the classic mistake of killing a window on the wrong machine.
  • Mouse support on a toggle. <prefix> m flips mouse mode on and off. Keep it off for fast keyboard-driven work, flip it on when you need to resize panes or scroll with a trackpad.
  • Pane and window ergonomics. Maximize the current pane into its own window with <prefix> + and restore it the same way. Set tmux_conf_new_window_retain_current_path=true so new windows open where you are instead of in your home directory.
  • Vi-style copy mode. <prefix> Enter drops you into copy mode with vi-flavored bindings, and yanks can go straight to the system clipboard once you enable the clipboard variable.

The most realistic deployment scenario: you keep .tmux.conf.local in your dotfiles repo and clone .tmux onto every server you SSH into. Because the project is self-contained and needs nothing beyond tmux and a shell, the same setup works identically on your laptop and a bare VM.

Ecosystem and Dependencies

Plugin support comes through tpm, the standard tmux plugin manager, which .tmux integrates with directly: declare plugins in .tmux.conf.local and control update behavior with tmux_conf_update_plugins_on_launch. You do not install tpm separately by hand the way you would on a stock config.

Theme packs like catppuccin/tmux and dracula/tmux target stock tmux and overlap with .tmux's own theming layer. Don't stack them β€” pick one theming system, because two systems writing the status line produces flicker and lost segments.

Hard dependencies are minimal by design: tmux 2.6+, a POSIX shell, and optionally xsel or xclip on Linux for clipboard support.

Architectural Overview

The architecture is a deliberate engine/data split. .tmux.conf is the engine: keybindings, theme machinery, and embedded shell helpers invoked through tmux's run-shell. .tmux.conf.local is the data: tmux_conf_* variables plus any raw tmux commands you append at the bottom. On startup, the engine reads your variables and generates the status line and behavior from them.

This split is why the project survives updates that destroy other dotfile setups. The upgrade path is git pull on the engine while your data file never changes. It also makes your customization reviewable: everything you did lives in one short file, not scattered through 600 lines of someone else's config.

The cost of the design is indirection. When something misbehaves, you debug generated configuration rather than lines you wrote, and the embedded shell helpers are dense reading.

Pros and Cons

Pros:

  • Two-minute setup that replaces months of incremental config tinkering.
  • Update-safe customization model β€” git pull never touches your overrides.
  • No runtime dependencies beyond tmux and a shell, so it deploys cleanly to servers.
  • Very wide usage (25,000+ stars as of 2026-06-12) means the issue tracker already covers most edge cases you'll hit.

Cons:

  • Opinionated keybindings: if you have existing tmux muscle memory, you will fight the defaults until you re-map them in .tmux.conf.local.
  • It owns the base layer. You cannot compose it with another full configuration; migrating an existing config into .tmux.conf.local is manual.
  • The generated, shell-driven status line is harder to debug than a flat config when a segment renders wrong.
  • Powerline aesthetics depend on font support; without the right glyphs the default theme looks broken.

Comparison and Alternatives

Measured 90-day trends for this project and its alternatives.

GitHub stars

Weekly star gains

333129-75
Full metrics details

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

.tmux

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue

Issues opened

Weekly total

33170
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

.tmux

GitHub API observation. Historical values render only when the source provides a real observation for that day.

131 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub API observation. Historical values render only when the source provides a real observation for that day.

142 observed daily rows. Missing days are not fabricated.

DateValue

Issues closed

Weekly total

1470
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

.tmux

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

131 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

142 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests opened

Weekly total

30150
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

.tmux

GitHub API observation. Historical values render only when the source provides a real observation for that day.

131 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub API observation. Historical values render only when the source provides a real observation for that day.

142 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests closed

Weekly total

19100
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

.tmux

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

131 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

142 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests merged

Weekly total

1790
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

.tmux

GitHub API observation. Historical values render only when the source provides a real observation for that day.

131 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub API observation. Historical values render only when the source provides a real observation for that day.

142 observed daily rows. Missing days are not fabricated.

DateValue

Open/closed pull request ratio

Weekly average

100500
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

.tmux

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue

Open/closed issues ratio

Weekly average

100500
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

.tmux

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue

Releases

Weekly total

110
Full metrics details

GitHub release published_at events bucketed by UTC day; drafts are excluded.

.tmux

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue
zellij

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue

Hotness score

Weekly average

100500
Full metrics details

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

.tmux

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 Γ— Hot today + 0.40 Γ— Hot week + 0.20 Γ— Breakout.

  • Same-day multiplier = stars 1d Γ· max(1, stars 7d Γ· 7)
  • Weekly multiplier = stars 7d Γ· max(1, stars 30d Γ· 30 Γ— 7)
  • Fortnight multiplier = stars 14d Γ· max(1, stars 90d Γ· 90 Γ— 14)
  • Hot today = clamp(70 Γ— log-scale(stars 1d, 1000) + 30 Γ— breakout-scale(same-day, 4))
  • Hot week = clamp(75 Γ— log-scale(stars 7d, 5000) + 25 Γ— breakout-scale(weekly, 3))
  • Breakout = clamp(35 Γ— breakout-scale(same-day, 4) + 40 Γ— breakout-scale(weekly, 3) + 25 Γ— breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score
zellij

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 Γ— Hot today + 0.40 Γ— Hot week + 0.20 Γ— Breakout.

  • Same-day multiplier = stars 1d Γ· max(1, stars 7d Γ· 7)
  • Weekly multiplier = stars 7d Γ· max(1, stars 30d Γ· 30 Γ— 7)
  • Fortnight multiplier = stars 14d Γ· max(1, stars 90d Γ· 90 Γ— 14)
  • Hot today = clamp(70 Γ— log-scale(stars 1d, 1000) + 30 Γ— breakout-scale(same-day, 4))
  • Hot week = clamp(75 Γ— log-scale(stars 7d, 5000) + 25 Γ— breakout-scale(weekly, 3))
  • Breakout = clamp(35 Γ— breakout-scale(same-day, 4) + 40 Γ— breakout-scale(weekly, 3) + 25 Γ— breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score

Reliability score

Weekly average

100500
Full metrics details

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

.tmux

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 Γ— Continuity + 0.30 Γ— Closure + 0.20 Γ— Shipping + 0.10 Γ— Liveness + 0.10 Γ— Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 Γ— (20% Γ— release ratio 30d + 30% Γ— release ratio 90d + 50% Γ— release ratio 180d); ratios are releases Γ· 2, 6, and 12, capped at 1
  • Support burden = 100 βˆ’ 2 Γ— open issues per 1,000 stars
  • Liveness = 100 Γ— exp(βˆ’pushed days ago Γ· 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score
zellij

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 Γ— Continuity + 0.30 Γ— Closure + 0.20 Γ— Shipping + 0.10 Γ— Liveness + 0.10 Γ— Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 Γ— (20% Γ— release ratio 30d + 30% Γ— release ratio 90d + 50% Γ— release ratio 180d); ratios are releases Γ· 2, 6, and 12, capped at 1
  • Support burden = 100 βˆ’ 2 Γ— open issues per 1,000 stars
  • Liveness = 100 Γ— exp(βˆ’pushed days ago Γ· 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score

The honest comparison set spans two categories: other ready-made tmux configurations, and tools that replace the need for one. tmux-sensible is the minimalist option β€” a small set of uncontroversial defaults you add to your own config rather than a full replacement. tmux-config is a comparable batteries-included configuration with its own theming and keybinding opinions. tpm is not a config at all but the plugin manager you'd use to assemble your own setup piece by piece. catppuccin/tmux covers just the theming slice. And zellij sidesteps tmux entirely β€” a separate multiplexer with usable defaults built in, at the cost of leaving the tmux ecosystem.

Project Repo Hotness (~6mo) PRs merged (~6mo) Star growth (~6mo)
.tmux https://github.com/gpakosz/.tmux 41.27 0 1667
tpm https://github.com/tmux-plugins/tpm metrics pending 0 72
tmux-sensible https://github.com/tmux-plugins/tmux-sensible metrics pending 0 metrics pending
tmux-config https://github.com/samoshkin/tmux-config metrics pending 0 metrics pending
catppuccin/tmux https://github.com/catppuccin/tmux metrics pending 0 metrics pending
zellij https://github.com/zellij-org/zellij metrics pending 0 634

The best overall alternative is tpm. It is the most mature and best-documented piece of the tmux ecosystem, and building your own config on tpm plus a few plugins gives you the customization .tmux abstracts away while staying on the standard upgrade path everyone else uses.

Conclusion

If you spend hours a day in a terminal but have never invested in a real tmux setup, install Oh my tmux! today β€” it is the fastest route from stock tmux to a configuration you'd actually keep. Start with the official README, which documents every tmux_conf_* variable you can override. Put every customization in .tmux.conf.local and nowhere else.

Do not edit .tmux.conf directly: the file is designed to be replaced wholesale by git pull, so any change you make there is silently lost on the next update. The same applies to forking the repo just to tweak the theme β€” the variables in .tmux.conf.local already cover it. Do this first: run tmux -V to confirm you're on tmux 2.6 or newer, then run the four-line install from the Getting Started commands above.

Join the conversation

Reviews Β· Questions Β· Posts

Share what you know about .tmux β€” write a review from your real experience, ask an implementation question, or publish a post about how you use it.

Share your experience

Write or update your review

Explain what worked, what broke down, and what another team should know before adopting .tmux.

Write your review now β€” it saves locally and publishes automatically after you sign in.

Rating
Positive attributes
Negative attributes

Project Q&A

Questions and answers

Browse implementation threads tied directly to gpakosz/.tmux. Each question links through to the full answer page.

Q&A No threads yet

Be the first to ask how teams run .tmux in production. Every question you post becomes a durable, searchable answer page other developers can find.

Ask the first question

Related posts

Posts tagged with the same topics

These posts come from the same topic surface as this repo, so readers can move from project evaluation into practical writeups and migration notes without leaving context.

Posts No topic-linked posts yet

Share how your team uses .tmux β€” a migration note, an architecture writeup, or a comparison. Your post reaches everyone browsing these same topics.

Write the first post
Get a weekly email with the hottest new projects in the Environment Management and Configuration world.
No Spam. Unsubscribe easily at any time.

Copyright 2018-2026 Awesome Open Source.  All rights reserved.