Skip to content

Rewrite the projections tutorial around gaffer - #5710

Merged
George-Payne merged 1 commit into
masterfrom
george/ui-1855-gaffer-first-projections-tutorial
Aug 13, 2026
Merged

Rewrite the projections tutorial around gaffer#5710
George-Payne merged 1 commit into
masterfrom
george/ui-1855-gaffer-first-projections-tutorial

Conversation

@George-Payne

@George-Payne George-Payne commented Aug 12, 2026

Copy link
Copy Markdown
Member

Rewrites the projections tutorial so it teaches projections with gaffer instead of hand-posting JavaScript to the HTTP API. Two thirds of the old walkthrough no longer worked on a default node: creating a projection over AtomPub and reading its result stream both need EnableAtomPubOverHttp, off by default since v20 and slated for removal, so a reader following the quick-start install hit a wall partway through.

  • tutorial.md - the projection now runs locally against a JSON fixture before any database exists, so the write-run-inspect loop takes seconds and the reader sees state after every event. Deploying is gaffer deploy against an environment in gaffer.toml, and state is read back over the management API rather than AtomPub. A closing section changes the projection and shows the change as a diff against what is deployed.
  • Engine V1 throughout, matching the server default, with V2 linked as the experimental alternative. Worth noting if this is cherry-picked: the V2 link and the sentence introducing it only make sense on branches that have engine-v2.md.
  • Keeps the shopping-cart sample data and the Xbox One S counter, so anyone who knows the old page recognises this one.
  • outputState() and result streams move to a note pointing at the projections API reference, since a curl walkthrough of them cannot work without AtomPub.
  • Documents that a logic change does not rebuild existing state, and how to opt into reprocessing. The old page never mentioned it.
  • Removes two embedded-UI screenshots that the rewrite orphaned. Nothing else referenced them.

The steps are also a companion repo, kurrent-io/projections-tutorial, one branch per step

The tutorial walked readers through creating a projection by posting
JavaScript to the HTTP API and clicking through the embedded UI, then
reading results back over AtomPub. Two of those three no longer work on a
default node: AtomPub has been off by default since v20 and is slated for
removal, so the "read the result stream" steps fail for anyone following
the quick-start install.

Rewrite it around gaffer, which authors and deploys projections and runs
the same JavaScript engine the server does:

- The projection now runs locally against a JSON fixture before any
  database exists, so the write-run-inspect loop takes seconds and the
  reader sees state after every event.
- Deploying is `gaffer deploy` against an environment in `gaffer.toml`,
  replacing the hand-written create and update calls, and state is read
  back over the management API rather than AtomPub.
- A closing section changes the projection and shows the change as a diff
  against what is deployed.
- Documents that a logic change does not rebuild existing state, and how
  to opt into reprocessing. The old page never mentioned it.

Keeps the shopping-cart sample data and the Xbox One S counter, so
readers who know the old page recognise this one. `outputState()` and
result streams move to a note pointing at the projections API reference,
since a curl walkthrough of them cannot work without AtomPub.

Engine V1 throughout, matching the server default. V2 is linked as the
experimental alternative.

The two embedded-UI screenshots the page carried are deleted with it -
nothing else referenced them.
@George-Payne
George-Payne requested a review from a team as a code owner August 12, 2026 14:59
@George-Payne George-Payne self-assigned this Aug 12, 2026
@George-Payne
George-Payne requested a review from a team as a code owner August 12, 2026 14:59
@linear-code

linear-code Bot commented Aug 12, 2026

Copy link
Copy Markdown

UI-1855

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying eventstore with  Cloudflare Pages  Cloudflare Pages

Latest commit: 72a5160
Status: ✅  Deploy successful!
Preview URL: https://d262b1c7.eventstore.pages.dev
Branch Preview URL: https://george-ui-1855-gaffer-first.eventstore.pages.dev

View logs

@qodo-code-review

Copy link
Copy Markdown
Contributor

PR Summary by Qodo

Rewrite projections tutorial to use gaffer (no AtomPub dependency)

📝 Documentation 🕐 20-40 Minutes

Grey Divider

AI Description

• Rewrites the projections tutorial to develop and test projections locally with gaffer fixtures.
• Updates deploy and inspection steps to use gaffer deploy plus the HTTP management API.
• Removes embedded-UI screenshot dependencies and documents logic-change reprocessing behavior.
Diagram

sequenceDiagram
  actor Dev as Developer
  participant G as "gaffer CLI"
  participant P as "Projection JS"
  participant F as "Fixture JSON"
  participant K as "KurrentDB (Docker)"
  participant H as "HTTP Mgmt API"

  Dev->>G: gaffer init / scaffold (engine v1)
  G->>P: create/edit projection files
  Dev->>G: gaffer dev --fixture carts
  G->>F: load events fixture
  G->>P: execute handlers per event
  G-->>Dev: print state after each event

  Dev->>K: docker compose up + seed events
  Dev->>G: gaffer deploy (plan + apply)
  G->>K: create/update projections
  Dev->>H: curl /projection/.../state (+partition)
  H-->>Dev: JSON state
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Keep curl-based tutorial and enable AtomPub/embedded UI
  • ➕ Minimal rewrite; retains familiarity for readers used to HTTP API walkthroughs
  • ➖ Requires EnableAtomPubOverHttp (off by default, slated for removal), so the tutorial breaks on default installs
  • ➖ Couples the walkthrough to screenshots/embedded UI flows that tend to rot
2. Use a client SDK (e.g., .NET/Java) for deploy/query examples
  • ➕ Aligns with common production interaction patterns
  • ➕ Can provide strongly-typed examples and auth handling
  • ➖ Adds language-specific complexity and fragments the tutorial
  • ➖ Does not provide the fast local projection iteration/testing loop that gaffer fixtures enable

Recommendation: Proceed with the gaffer-first approach. It removes reliance on AtomPub/embedded UI, provides a fast local edit-run-inspect loop via fixtures, and teaches a repeatable deployment workflow (gaffer deploy) while still demonstrating server behavior (engine v1, $by_category dependency, management API state reads).

Files changed (1) +281 / -100

Documentation (1) +281 / -100
tutorial.mdRewrite tutorial around gaffer local dev + deployment workflow +281/-100

Rewrite tutorial around gaffer local dev + deployment workflow

• Replaces the HTTP API + embedded UI walkthrough with a gaffer-based flow: scaffold projections (engine v1), run against local JSON fixtures, then deploy to a Docker-started KurrentDB via 'gaffer deploy'. Updates state inspection to use the management API, adds partitioned projection guidance and '$by_category' notes, and documents how logic changes affect existing state and how to opt into reprocessing.

docs/server/features/projections/tutorial.md

@qodo-code-review

Copy link
Copy Markdown
Contributor

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider

Great, no issues found!

Qodo reviewed your code and found no material issues that require review

Grey Divider

Tip of the day
💡 Did you know, you can enable the Remediation agent and Qodo fixes findings in a dedicated fix PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

@George-Payne
George-Payne requested a review from stktung August 12, 2026 15:20
@George-Payne
George-Payne merged commit 00fad23 into master Aug 13, 2026
3 checks passed
@George-Payne
George-Payne deleted the george/ui-1855-gaffer-first-projections-tutorial branch August 13, 2026 08:43

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 @George-Payne Failed to create cherry Pick PR due to error:

RequestError [HttpError]: Merge conflict
   at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
   at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
 status: '409',
 headers: {
   'access-control-allow-origin': '*',
   'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
   'content-length': '127',
   'content-security-policy': "default-src 'none'",
   'content-type': 'application/json; charset=utf-8',
   date: 'Thu, 13 Aug 2026 08:43:58 GMT',
   'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
   server: 'github.com',
   'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
   vary: 'Accept-Encoding, Accept, X-Requested-With',
   'x-accepted-github-permissions': 'contents=write',
   'x-content-type-options': 'nosniff',
   'x-frame-options': 'deny',
   'x-github-api-version-selected': '2022-11-28',
   'x-github-edge-region': 'iad',
   'x-github-media-type': 'github.v3; format=json',
   'x-github-request-id': 'F440:30F394:18D8CED:532E117:6A7D83CD',
   'x-ratelimit-limit': '5000',
   'x-ratelimit-remaining': '4995',
   'x-ratelimit-reset': '1786614233',
   'x-ratelimit-resource': 'core',
   'x-ratelimit-used': '5',
   'x-xss-protection': '0'
 },
 request: {
   method: 'POST',
   url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
   headers: {
     accept: 'application/vnd.github.v3+json',
     'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
     authorization: 'bearer [REDACTED]',
     'content-type': 'application/json; charset=utf-8'
   },
   body: '{"base":"cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v24.10-0ab73c8b-7597-4667-a727-35d9c1a8544c","commit_message":"Merge 72a5160b9171af88650a61e83857731d004c4034 into cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v24.10-0ab73c8b-7597-4667-a727-35d9c1a8544c [skip ci]\\n\\n\\nskip-checks: true\\n","head":"72a5160b9171af88650a61e83857731d004c4034"}',
   request: { agent: [Agent], hook: [Function: bound bound register] }
 },
 documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}

🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683350090

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 @George-Payne Failed to create cherry Pick PR due to error:

RequestError [HttpError]: Merge conflict
   at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
   at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
 status: '409',
 headers: {
   'access-control-allow-origin': '*',
   'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
   'content-length': '127',
   'content-security-policy': "default-src 'none'",
   'content-type': 'application/json; charset=utf-8',
   date: 'Thu, 13 Aug 2026 08:44:04 GMT',
   'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
   server: 'github.com',
   'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
   vary: 'Accept-Encoding, Accept, X-Requested-With',
   'x-accepted-github-permissions': 'contents=write',
   'x-content-type-options': 'nosniff',
   'x-frame-options': 'deny',
   'x-github-api-version-selected': '2022-11-28',
   'x-github-edge-region': 'iad',
   'x-github-media-type': 'github.v3; format=json',
   'x-github-request-id': 'F440:30F394:18DB088:53358A6:6A7D83D3',
   'x-ratelimit-limit': '5000',
   'x-ratelimit-remaining': '4984',
   'x-ratelimit-reset': '1786614233',
   'x-ratelimit-resource': 'core',
   'x-ratelimit-used': '16',
   'x-xss-protection': '0'
 },
 request: {
   method: 'POST',
   url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
   headers: {
     accept: 'application/vnd.github.v3+json',
     'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
     authorization: 'bearer [REDACTED]',
     'content-type': 'application/json; charset=utf-8'
   },
   body: '{"base":"cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v25.0-e6912d6c-1a17-4c5d-9b6a-ee27a5744ab9","commit_message":"Merge 72a5160b9171af88650a61e83857731d004c4034 into cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v25.0-e6912d6c-1a17-4c5d-9b6a-ee27a5744ab9 [skip ci]\\n\\n\\nskip-checks: true\\n","head":"72a5160b9171af88650a61e83857731d004c4034"}',
   request: { agent: [Agent], hook: [Function: bound bound register] }
 },
 documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}

🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683350090

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 @George-Payne Failed to create cherry Pick PR due to error:

RequestError [HttpError]: Merge conflict
   at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
   at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
 status: '409',
 headers: {
   'access-control-allow-origin': '*',
   'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
   'content-length': '127',
   'content-security-policy': "default-src 'none'",
   'content-type': 'application/json; charset=utf-8',
   date: 'Thu, 13 Aug 2026 08:44:09 GMT',
   'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
   server: 'github.com',
   'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
   vary: 'Accept-Encoding, Accept, X-Requested-With',
   'x-accepted-github-permissions': 'contents=write',
   'x-content-type-options': 'nosniff',
   'x-frame-options': 'deny',
   'x-github-api-version-selected': '2022-11-28',
   'x-github-edge-region': 'iad',
   'x-github-media-type': 'github.v3; format=json',
   'x-github-request-id': 'F440:30F394:18DD986:533E108:6A7D83D8',
   'x-ratelimit-limit': '5000',
   'x-ratelimit-remaining': '4971',
   'x-ratelimit-reset': '1786614233',
   'x-ratelimit-resource': 'core',
   'x-ratelimit-used': '29',
   'x-xss-protection': '0'
 },
 request: {
   method: 'POST',
   url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
   headers: {
     accept: 'application/vnd.github.v3+json',
     'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
     authorization: 'bearer [REDACTED]',
     'content-type': 'application/json; charset=utf-8'
   },
   body: '{"base":"cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v25.1-e5e411f4-0f89-420d-9336-7289db85cf8a","commit_message":"Merge 72a5160b9171af88650a61e83857731d004c4034 into cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v25.1-e5e411f4-0f89-420d-9336-7289db85cf8a [skip ci]\\n\\n\\nskip-checks: true\\n","head":"72a5160b9171af88650a61e83857731d004c4034"}',
   request: { agent: [Agent], hook: [Function: bound bound register] }
 },
 documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}

🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683350090

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 @George-Payne Failed to create cherry Pick PR due to error:

RequestError [HttpError]: Merge conflict
   at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
   at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
 status: '409',
 headers: {
   'access-control-allow-origin': '*',
   'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
   'content-length': '127',
   'content-security-policy': "default-src 'none'",
   'content-type': 'application/json; charset=utf-8',
   date: 'Thu, 13 Aug 2026 08:44:14 GMT',
   'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
   server: 'github.com',
   'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
   vary: 'Accept-Encoding, Accept, X-Requested-With',
   'x-accepted-github-permissions': 'contents=write',
   'x-content-type-options': 'nosniff',
   'x-frame-options': 'deny',
   'x-github-api-version-selected': '2022-11-28',
   'x-github-edge-region': 'iad',
   'x-github-media-type': 'github.v3; format=json',
   'x-github-request-id': 'F440:30F394:18DF94A:5344C6D:6A7D83DD',
   'x-ratelimit-limit': '5000',
   'x-ratelimit-remaining': '4960',
   'x-ratelimit-reset': '1786614233',
   'x-ratelimit-resource': 'core',
   'x-ratelimit-used': '40',
   'x-xss-protection': '0'
 },
 request: {
   method: 'POST',
   url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
   headers: {
     accept: 'application/vnd.github.v3+json',
     'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
     authorization: 'bearer [REDACTED]',
     'content-type': 'application/json; charset=utf-8'
   },
   body: '{"base":"cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v26.0-a4580286-8ec5-43c0-ba45-0c6b05603983","commit_message":"Merge 72a5160b9171af88650a61e83857731d004c4034 into cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v26.0-a4580286-8ec5-43c0-ba45-0c6b05603983 [skip ci]\\n\\n\\nskip-checks: true\\n","head":"72a5160b9171af88650a61e83857731d004c4034"}',
   request: { agent: [Agent], hook: [Function: bound bound register] }
 },
 documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}

🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683350090

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 @George-Payne Failed to create cherry Pick PR due to error:

RequestError [HttpError]: Merge conflict
   at /home/runner/work/_actions/kurrent-io/Automations/master/cherry-pick-pr-for-label/node_modules/@octokit/request/dist-node/index.js:66:23
   at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
 status: '409',
 headers: {
   'access-control-allow-origin': '*',
   'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset, Warning',
   'content-length': '127',
   'content-security-policy': "default-src 'none'",
   'content-type': 'application/json; charset=utf-8',
   date: 'Thu, 13 Aug 2026 08:44:18 GMT',
   'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
   server: 'github.com',
   'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
   vary: 'Accept-Encoding, Accept, X-Requested-With',
   'x-accepted-github-permissions': 'contents=write',
   'x-content-type-options': 'nosniff',
   'x-frame-options': 'deny',
   'x-github-api-version-selected': '2022-11-28',
   'x-github-edge-region': 'iad',
   'x-github-media-type': 'github.v3; format=json',
   'x-github-request-id': 'F440:30F394:18E1D2E:534C5C2:6A7D83E2',
   'x-ratelimit-limit': '5000',
   'x-ratelimit-remaining': '4948',
   'x-ratelimit-reset': '1786614233',
   'x-ratelimit-resource': 'core',
   'x-ratelimit-used': '52',
   'x-xss-protection': '0'
 },
 request: {
   method: 'POST',
   url: 'https://api.github.com/repos/kurrent-io/KurrentDB/merges',
   headers: {
     accept: 'application/vnd.github.v3+json',
     'user-agent': 'octokit-core.js/3.3.2 Node.js/24',
     authorization: 'bearer [REDACTED]',
     'content-type': 'application/json; charset=utf-8'
   },
   body: '{"base":"cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v26.1-5e9b1f2d-bf9d-4796-afdf-6616b2f5bd9e","commit_message":"Merge 72a5160b9171af88650a61e83857731d004c4034 into cherry-pick-cherry-pick/5710/george/ui-1855-gaffer-first-projections-tutorial-release/v26.1-5e9b1f2d-bf9d-4796-afdf-6616b2f5bd9e [skip ci]\\n\\n\\nskip-checks: true\\n","head":"72a5160b9171af88650a61e83857731d004c4034"}',
   request: { agent: [Agent], hook: [Function: bound bound register] }
 },
 documentation_url: 'https://docs.github.com/rest/branches/branches#merge-a-branch'
}

🚨👉 Check https://github.com/kurrent-io/KurrentDB/actions/runs/31683350090

George-Payne added a commit that referenced this pull request Aug 13, 2026
* Rewrite the projections tutorial around gaffer

Backport of #5710. This branch has no projections engine V2 page, so the
paragraph explaining --engine-version 1 names 26.1 as where V2 arrives
instead of linking the page, and the next-steps bullet for it is gone.

* Mention the projection tooling in the projections docs

Backport of #5711. This branch has no intro.md, so the tooling section
lands in README.md, which carries that content here. The debugging
section replaced is the browser walkthrough, so its screenshots go too.
George-Payne added a commit that referenced this pull request Aug 13, 2026
* Rewrite the projections tutorial around gaffer

Backport of #5710. The tutorial content is taken verbatim from master;
this branch's engine-v2 page exists, so the V2 references carry over
unchanged.

* Mention the projection tooling in the projections docs

Backport of #5711. The debugging section replaced here is the browser
walkthrough this branch still carries, rather than the short Gaffer
paragraph master had, so its three screenshots go with it.
github-actions Bot pushed a commit that referenced this pull request Aug 13, 2026
Backport of #5710. This branch has no projections engine V2 page, so the
paragraph explaining --engine-version 1 names 26.1 as where V2 arrives
instead of linking the page, and the next-steps bullet for it is gone.
github-actions Bot pushed a commit that referenced this pull request Aug 13, 2026
Backport of #5710. This branch has no projections engine V2 page, so the
paragraph explaining --engine-version 1 names 26.1 as where V2 arrives
instead of linking the page, and the next-steps bullet for it is gone.
github-actions Bot pushed a commit that referenced this pull request Aug 13, 2026
Backport of #5710. This branch has no projections engine V2 page, so the
paragraph explaining --engine-version 1 names 26.1 as where V2 arrives
instead of linking the page, and the next-steps bullet for it is gone.
George-Payne added a commit that referenced this pull request Aug 14, 2026
* Rewrite the projections tutorial around gaffer

Backport of #5710. This branch has no projections engine V2 page, so the
paragraph explaining --engine-version 1 names 26.1 as where V2 arrives
instead of linking the page, and the next-steps bullet for it is gone.

* Mention the projection tooling in the projections docs

Backport of #5711. This branch has no intro.md, so the tooling section
lands in README.md, which carries that content here. The debugging
section replaced is the browser walkthrough, so its screenshots go too.

---------

Co-authored-by: George Payne <georgepayne@hotmail.com>
George-Payne added a commit that referenced this pull request Aug 14, 2026
* Rewrite the projections tutorial around gaffer

Backport of #5710. This branch has no projections engine V2 page, so the
paragraph explaining --engine-version 1 names 26.1 as where V2 arrives
instead of linking the page, and the next-steps bullet for it is gone.

* Mention the projection tooling in the projections docs

Backport of #5711. This branch has no intro.md, so the tooling section
lands in README.md, which carries that content here. The debugging
section replaced is the browser walkthrough, so its screenshots go too.

---------

Co-authored-by: George Payne <georgepayne@hotmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants