{"id":21976936,"url":"https://github.com/shunkakinoki/st2","last_synced_at":"2025-06-14T14:04:14.017Z","repository":{"id":264934096,"uuid":"881043170","full_name":"shunkakinoki/st2","owner":"shunkakinoki","description":null,"archived":false,"fork":false,"pushed_at":"2024-10-30T23:15:51.000Z","size":327,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-13T03:50:35.578Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shunkakinoki.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-30T20:15:52.000Z","updated_at":"2024-10-30T20:16:11.000Z","dependencies_parsed_at":"2024-11-27T03:18:39.363Z","dependency_job_id":null,"html_url":"https://github.com/shunkakinoki/st2","commit_stats":null,"previous_names":["shunkakinoki/st2"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/shunkakinoki/st2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shunkakinoki%2Fst2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shunkakinoki%2Fst2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shunkakinoki%2Fst2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shunkakinoki%2Fst2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shunkakinoki","download_url":"https://codeload.github.com/shunkakinoki/st2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shunkakinoki%2Fst2/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259827506,"owners_count":22917709,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-29T16:12:45.801Z","updated_at":"2025-06-14T14:04:13.962Z","avatar_url":"https://github.com/shunkakinoki.png","language":null,"readme":"\u003ch1 align=\"center\"\u003e\n   \u003cimg src=\"./assets/banner.png\" alt=\"st\" width=\"35%\" align=\"center\"\u003e\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003e\n   Yet another tool for managing stacked PRs locally and on GitHub, built on\n   \u003ca href=\"https://crates.io/crates/git2\"\u003e\u003ccode\u003elibgit2\u003c/code\u003e\u003c/a\u003e\n   and\n   \u003ca href=\"https://crates.io/crates/octocrab\"\u003e\u003ccode\u003eoctocrab\u003c/code\u003e\u003c/a\u003e.\n\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/clabby/st/actions/workflows/rust_ci.yaml\"\u003e\u003cimg src=\"https://github.com/clabby/st/actions/workflows/rust_ci.yaml/badge.svg?label=ci\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-Beerware-green.svg?label=license\u0026labelColor=2a2f35\" alt=\"License\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#what-are-stacked-prs\"\u003eWhat are Stacked PRs?\u003c/a\u003e •\n  \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e •\n  \u003ca href=\"#why\"\u003eWhy?\u003c/a\u003e •\n  \u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\n\u003c/p\u003e\n\n\u003chttps://github.com/user-attachments/assets/4aa0d8a3-9876-4d8b-ae23-c0337866a41b\u003e\n\n\n## Installation\n\n\u003e \\[!WARNING\\]\n\u003e `st` was written on a weekend for my own personal use, and may not be entirely stable. You're welcome to use it\n\u003e in its current state, though don't get mad at me if the tool messes up your local tree. I'll remove this warning once\n\u003e I feel that it's stable for my own usecase.\n\nYou can install `st` with:\n\n```sh\ngit clone https://github.com/clabby/st \u0026\u0026 \\\n   cd st \u0026\u0026 \\\n   cargo install --bin st --path . --force\n```\n\n## What are Stacked PRs?\n\n[stacking.dev](https://www.stacking.dev/) is a great to-the-point resource.\n\n## Usage\n\n```sh\nst is a CLI application for working with stacked PRs locally and on GitHub.\n\nUsage: st [OPTIONS] \u003cCOMMAND\u003e\n\nCommands:\n  sync      Sync the remote branches with the local branches [aliases: rs, sy]\n  submit    Submit the current PR stack to GitHub [aliases: s, ss]\n  checkout  Checkout a branch that is tracked with `st` [aliases: co]\n  create    Create and track a new branch within the current stack [aliases: c]\n  delete    Delete a branch that is tracked with `st` [aliases: d, del]\n  restack   Restack the the current stack [aliases: r, sr]\n  log       Print a tree of all tracked stacks [aliases: l, ls]\n  status    Show the status of the current stack on GitHub [aliases: st, stat]\n  track     Track the current branch on top of a tracked stack node [aliases: tr]\n  untrack   Untrack the passed branch [aliases: ut]\n  config    Configure the st application [aliases: cfg]\n  help      Print this message or the help of the given subcommand(s)\n\nOptions:\n  -v...          Verbosity level (0-4)\n  -h, --help     Print help\n  -V, --version  Print version\n```\n\n## Why?\n\nI'm a long-time user and lover of [Graphite](https://github.com/withgraphite). I never quite used the graphite ecosystem\nas intended - only the CLI. My biggest gripe with Graphite is that they decided to disallow opting into the periphery\nservices that cost them money to operate, making the CLI dependent on their API and unusable in organizations without\npaying $99/month (_for 5 seats_).\n\n```text\nERROR: Your team's Graphite plan has expired. To continue using Graphite in \u003corganization\u003e, upgrade your\nplan at https://app.graphite.dev/settings/billing?org=\u003corganization\u003e\n```\n\nAdmittedly, this error message prompted the creation of this project. This tool aims to be dependent only on the\nGitHub API, and to contain a minified version of the Graphite CLI's featureset. `st` is not a _service_, it is just a\n_tool_. It's also free software - go crazy. If you enjoy using this tool, consider\n[buying me a beer if we ever meet](./LICENSE.md).\n\n\u003e \\[!NOTE\\]\n\u003e\n\u003e This tool is meant for the common-{wo}man working on open source projects, not for enterprise customers.\n\u003e\n\u003e If you're looking for a more feature-rich ecosystem for stacked PRs that has a support team,\n\u003e andressen-horowitz funding, etc., I do recommend checking out Graphite. They'll actually fix your bugs promptly,\n\u003e I might not. The Graphite team is great, and they've built something very special - so much so that `st` emulates its\n\u003e featureset. I just wish I could opt-out of the fancy stuff and not pay for work that the GitHub API can do for free!\n\u003e\n\u003e If you're someone who doesn't care about features like AI code review, web interfaces, etc., and you just want\n\u003e to be able to manage PR stacks, this could be the tool for you.\n\n### Why not [`git-branchless`](https://github.com/arxanas/git-branchless)?\n\nToo complicated. The tool is far from focused on PR stacks, with tons of other features. Good tool, not for me. Graphite\nfeels good because it leads users into the [_pit of success_](https://blog.codinghorror.com/falling-into-the-pit-of-success/).\n`git-branchless` is like `git`, in that it has so many features, it's highly likely its users don't even know about\nall of them.\n\n### Why not [`charcoal`](https://github.com/danerwilliams/charcoal)?\n\nVery close to what I want, but:\n\n1. Looks unmaintained. It's a fork of the formerly-open-source Graphite without dependencies on the propietary\n   and pay-walled Graphite API, which I sung praises for above. However, it doesn't inherit some of the nice new\n   features that I enjoy.\n2. Doesn't have ergonomic aliases.\n3. Doesn't support the comments on GitHub PRs that direct reviewers around the stack.\n4. Similar to `graphite`, painfully slow. It's written in TypeScript and pings its API quite a bit, making even\n   operations like `gt ls` take \u003e 500ms. I like my CLI tools snappy!\n\n![gt_ls_bench](./assets/gt_ls_bench.png)\n\n### Why not [`spr`](https://github.com/ejoffe/spr)?\n\nMainly because it's restrictive. I don't like the idea of 1 commit = 1 PR - it makes the workflow feel less fluid.\nAgain, nice tool, just not for me.\n\n### Why not _yet-another-stacked-pr-tool_\n\nBecause I want to control my own destiny. We can end the conversation here...\n\n![standards](./assets/standards.png)\n\n## Contributing\n\nContributions are welcome. Feel free to [submit an issue](https://github.com/clabby/st/issues/new) or open a PR with\nyour changes.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshunkakinoki%2Fst2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshunkakinoki%2Fst2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshunkakinoki%2Fst2/lists"}