{"id":51178351,"url":"https://github.com/rivet-dev/jj-forklift","last_synced_at":"2026-06-27T05:30:28.086Z","repository":{"id":363181685,"uuid":"1258664446","full_name":"rivet-dev/jj-forklift","owner":"rivet-dev","description":"jj-native stacked PR workflow tool","archived":false,"fork":false,"pushed_at":"2026-06-19T02:28:35.000Z","size":395,"stargazers_count":3,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-19T03:22:50.110Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rivet-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-03T19:52:54.000Z","updated_at":"2026-06-19T02:28:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rivet-dev/jj-forklift","commit_stats":null,"previous_names":["rivet-dev/jj-forklift"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rivet-dev/jj-forklift","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rivet-dev%2Fjj-forklift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rivet-dev%2Fjj-forklift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rivet-dev%2Fjj-forklift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rivet-dev%2Fjj-forklift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rivet-dev","download_url":"https://codeload.github.com/rivet-dev/jj-forklift/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rivet-dev%2Fjj-forklift/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34843146,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":"2026-06-27T05:30:27.539Z","updated_at":"2026-06-27T05:30:28.078Z","avatar_url":"https://github.com/rivet-dev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/rivet-dev/jj-forklift\"\u003e\n    \u003cimg src=\"./.github/media/logo.png\" alt=\"Forklift for Jujutsu\" height=\"200\"\u003e\n  \u003c/a\u003e\n  \u003cbr/\u003e\n  \u003ch3\u003eA Jujutsu-native stacked PR workflow.\u003c/h3\u003e\n  \u003cp\u003eFast local stack submit, sync, merge, and handoff for GitHub.\u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"#install\"\u003eInstall\u003c/a\u003e •\n    \u003ca href=\"#quickstart\"\u003eQuickstart\u003c/a\u003e •\n    \u003ca href=\"#fundamentals\"\u003eFundamentals\u003c/a\u003e •\n    \u003ca href=\"#related-tools\"\u003eRelated tools\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\nForklift for Jujutsu is a small, low-intrusive Rust CLI for a Jujutsu-native\nstacked PR workflow, inspired by [Graphite](https://graphite.dev). It assumes\nyour jj changes form a single bottom-to-top stack, where each change becomes\none pull request.\n\n- **Fast:** get out of the developer's way with the bare minimum of waiting. Merges land directly, with no merge queues by design.\n- **Jujutsu-friendly workflow:** focus on editing existing revisions, no extra bloat.\n- **Collaboration:** built for clear collaboration. Freeze changes you don't own and keep editing your existing stacks safely.\n- **GitHub-friendly:** print friendly information for navigating from GitHub.\n\n## Prerequisites\n\n- [Jujutsu (`jj`)](https://github.com/jj-vcs/jj) installed and a colocated repo.\n- [GitHub CLI (`gh`)](https://cli.github.com) installed and authenticated\n  (`gh auth login`).\n\n## Install\n\nInstall from Git:\n\n```text\ncargo install --git https://github.com/rivet-dev/jj-forklift.git\n```\n\n## Quickstart\n\nThe core loop:\n\n1. **`jj new`** to start a new change on top of your stack.\n2. **Make your edits**: jj tracks the working copy automatically.\n3. **`jj describe`** to set the change's message.\n4. **`forklift submit`** to push your stack as pull requests.\n5. **`forklift merge`** to land your stack.\n\nTwo other commonly used commands:\n\n- **`forklift get \u003ctarget\u003e`** to fetch an existing stack to work on.\n- **`forklift sync`** to pull in the latest changes and rebase onto main as work\n  lands around you.\n\n## Coming from Graphite\n\nIf you already know the Graphite CLI (`gt`), here is how its commands map to\njj and Forklift for Jujutsu:\n\n| Graphite (`gt`)          | jj / Forklift      |\n| ------------------------ | ------------------ |\n| `gt create`              | `jj new`           |\n| `gt checkout`            | `jj edit`          |\n| `gt move` / `gt restack` | `jj rebase`        |\n| `gt modify -m`           | `jj describe`      |\n| `gt get`                 | `forklift get`     |\n| `gt sync`                | `forklift sync`    |\n| `gt submit`              | `forklift submit`  |\n| `gt merge`               | `forklift merge`   |\n\n**What you gain:**\n\n- **Instant merges:** stacks land directly by fast-forwarding trunk, with no merge queue to wait on.\n- **Automatic restacks:** jj rebases your whole stack for you; no manual `gt restack` after every change.\n- **Fast, conflict-free rebases:** jj records conflicts in the commit instead of halting the rebase, so restacks always finish and you resolve on your own time.\n- **Edit in place:** edit any revision directly with `jj edit`; descendants restack automatically.\n- **Undo anything:** `jj undo` and the operation log reverse any command, including merges and rebases.\n- **Open source:** no proprietary SaaS, no login, no per-seat billing.\n\n**What you give up:**\n\n- **Merge queues:** there is no hosted, stack-aware merge queue; merges land locally by fast-forward.\n- **The Graphite dashboard:** no web UI for browsing or reviewing stacks; you navigate from GitHub instead.\n\n## Fundamentals\n\n### Jujutsu fundamentals\n\nYou build and edit stacks with plain jj. Forklift for Jujutsu never replaces\nthese.\n\n**`jj new \u003crev\u003e`**\nStart a new change on top of `\u003crev\u003e`.\n\n**`jj edit \u003crev\u003e`**\nMove into an existing revision to edit it.\n\n**`jj rebase ...`**\nRestructure or move changes.\n\n**`jj describe \u003crev\u003e`**\nSet a change's message.\n\n### Forklift Commands\n\n**`forklift get \u003ctarget\u003e`**\nGet or fetch an existing stack locally. The target can be a PR number (`123`), a\nPR URL, an exact PR head branch, or a jj change-id prefix embedded in a stack\nbranch.\n\n**`forklift sync`**\nFetch the latest changes and rebase onto main.\n\n**`forklift submit`**\nPush your changes as pull requests.\n\n**`forklift merge`**\nMerge your changes, starting from the current rev.\n\n**`forklift pr`**\nOpen the current PR in your browser.\n\n### Freezing\n\nFreezing prevents you from clobbering other users' changes. You cannot edit\nrevisions owned by other users, and imported or collaborator-owned changes are\nfrozen automatically.\n\n**`forklift freeze`**\nManually freeze a revision.\n\n**`forklift unfreeze`**\nManually take ownership of a frozen revision you can push to.\n\n## Related tools\n\nForklift for Jujutsu targets shared stacks: it merges a whole stack from the CLI\nby fast-forwarding trunk and freezes revisions you don't own, with no merge\nqueue. How the jj-native tools compare:\n\n| Tool | Merge | Speed | Multi-PR | Collaboration\\* | Auth |\n| ---- | ----- | ----- | -------- | --------------- | ---- |\n| **Forklift for Jujutsu** | **CLI, FF trunk** | **fast; no queue or CI gate** | **whole stack, one command** | **ownership freeze + handoff** | **`gh`, no token** |\n| [jj-spr](https://github.com/jennings/jj-spr) | CLI, squash via API | fast; local squash | one at a time, manual rebase | none | token, `repo` scope |\n| [jjpr](https://github.com/michaeldhopkins/jjpr) | CLI, forge API | medium; waits on CI | bottom-up | targets a coworker's branch | `gh`/`glab` or token |\n| [jj-ryu](https://github.com/dmmulroy/jj-ryu) | GitHub web UI | fast submit, manual merge | merge each PR yourself | none | `gh`/`glab` or token |\n| [jj-vine](https://codeberg.org/abrenneke/jj-vine) | GitHub web UI | fast submit, manual merge | not built yet | none | token in config |\n| [keanemind/jj-stack](https://github.com/keanemind/jj-stack) | GitHub web UI | fast submit, manual merge | merge bottom, then rerun | none | `gh` or token |\n\n\\* *Collaboration* = a managed ownership model for shared stacks: import a\nteammate's stack and keep their revisions frozen until you explicitly take them\nover. **none** = no such model; jj's default only marks untracked remote\nbookmarks immutable, which stops protecting once you track the branch.\n\nIn the Git world, the analogous tools are [Graphite](https://graphite.dev),\n[spr](https://github.com/ejoffe/spr), and\n[ghstack](https://github.com/ezyang/ghstack).\n\n## License\n\nLicensed under the Apache License, Version 2.0. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frivet-dev%2Fjj-forklift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frivet-dev%2Fjj-forklift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frivet-dev%2Fjj-forklift/lists"}