Skip to main content

Landing Requests

Landing Requests (LRs) are JJHub’s native replacement for Pull Requests. They’re built from the ground up for jj’s stacked changes model - stable Change IDs, first-class conflict tracking, and automatic rebasing.

Landing Requests vs Pull Requests

AspectPull Requests (GitHub)Landing Requests (JJHub)
IdentityTied to branch nameTied to stable Change IDs
Stacked changesPainful (rebase chains)First-class (--stack flag)
ConflictsBlock mergeTracked, work continues
RebaseChanges commit hashesChange IDs survive
Landing queueBasic merge queueProgrammable (TypeScript)

Create a Landing Request

jjhub land create --title "Add user authentication" --target main
Key flags:
FlagDescription
-t, --title <text>LR title
-b, --body <text>LR description
--target <bookmark>Target bookmark (default: main)
--change-id <id>Explicit change ID(s), repeatable
--stackInclude the full stack of changes

Landing a Stack

When you’re working with stacked changes, use --stack to include the entire chain:
# Create a stack of changes
jj new main -m "Add user model"
# ... make changes ...
jj new -m "Add auth middleware"
# ... make changes ...
jj new -m "Add login endpoint"
# ... make changes ...

# Push all changes
jj git push --all

# Create an LR for the whole stack
jjhub land create --title "User authentication" --target main --stack
The LR will show the stack_size and all change_ids in the stack.

List Landing Requests

# Open LRs (default)
jjhub land list

# All states
jjhub land list --state all

# Filter by state: open, closed, merged, draft
jjhub land list --state merged --limit 10

View a Landing Request

jjhub land view 42
Shows the title, body, state, change IDs, stack size, CI check status, and reviews.

Review

# Approve
jjhub land review 42 --approve --body "Looks good"

# Request changes
jjhub land review 42 --request-changes --body "Please add tests"

# Comment only
jjhub land review 42 --comment --body "Question about the approach"

Check CI Status

jjhub land checks 42
Shows the status of all CI checks associated with the landing request.

Merge

jjhub land merge 42
Merges the landing request into the target bookmark. The landing queue handles conflict detection and serialization.

Programmable Landing Queue

The landing queue is programmable via TypeScript workflows. By default, it serializes merges (one at a time), but you can configure custom merge strategies:
// .jjhub/workflows/landing-queue.ts
import { defineWorkflow, on, run } from "@jjhub/workflow";

export default defineWorkflow({
  name: "Landing Queue",
  triggers: [on.landingRequest.readyToLand()],
  steps: [
    run("validate", async (ctx) => {
      await ctx.exec("bun test");
      await ctx.exec("bun run build");
    }),
  ],
});

Lifecycle

  1. Create - Author opens an LR with jjhub land create
  2. Review - Team reviews with jjhub land review
  3. CI Checks - Automated workflows validate the changes
  4. Merge - Author or maintainer lands with jjhub land merge
LRs track conflicts automatically via jj. If a conflict arises, the LR shows it and work can continue on other changes while the conflict is resolved.