{"id":"6a0a53abe29488c37478052e","title":"2026 05 17 Issue 272","path":"how-to/committee/release-notes/2026-05-17-issue-272","contentMarkdown":"# 17-May-2026 — Generate a contributor environment for your group [ref #272](https://github.com/nbarrett/ngx-ramblers/issues/272)\n\n## [build 647](https://github.com/nbarrett/ngx-ramblers/actions/runs/26005601269) — [commit 1ec7640](https://github.com/nbarrett/ngx-ramblers/commit/1ec7640dba6c22bdc8321fc5100430571b86c18f)\n\n_____\n\nA site admin can now hand a developer everything they need to run the full NGX-Ramblers stack on their own machine, working against this group and no other. You generate a downloadable bundle from the admin area, send it to the contributor, and they are running locally with a single command.\n\nThe bundle is deliberately narrow. It points at this site's MongoDB server and carries a freshly generated `AUTH_SECRET`. It includes nothing else: no staging configuration database, no shared platform keys, and no other group's data.\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/6674f34a-1caf-4448-a324-f5ae30c09f80.jpeg)\n\n## What a contributor environment is\n\nNGX-Ramblers normally runs from a central configuration database that holds the settings for every group. A developer helping with one group should never need that database, and should never hold credentials that reach beyond the single group they are working on.\n\nA contributor environment solves this. The bundle you generate contains three things, all scoped to your group alone:\n\n- **A secrets file** with the database connection, the S3 image bucket, and a fresh `AUTH_SECRET` generated just for this bundle.\n- **An environments manifest** that names the environment so the contributor can start it by name.\n- **A README** explaining how to unpack and run it.\n\nWhat the bundle leaves out matters just as much: no staging configuration database, no Fly.io or Cloudflare account keys, and no other group's secrets, bucket or data. If a value would let the holder touch a second group or the live platform, it is not included.\n\n## Generating a bundle\n\nOpen the admin menu and choose **Contributor Environment**, or go straight to `/admin/contributor-environment`. You will see the form shown above.\n\n### Name the environment\n\nThe **Environment name** is how the contributor starts the stack locally, with `ngx-cli local dev <name>`. Enter it in kebab-case: lower case, with words joined by hyphens. The field tidies whatever you type into that shape when you click away, so `Pang Valley` becomes `pang-valley`.\n\n## Choosing the database\n\nThe bundle always uses this site's MongoDB server. You decide which data the contributor works against:\n\n- **Develop against the current database** - the contributor reads and writes the group's existing database directly. Choose this when you want them working with live content and you are comfortable with their changes being real.\n- **Clone the current database into a new schema** - a new schema is created on the same server and populated with a copy of the current data. Choose this when you want the contributor to experiment freely without affecting anything in use.\n\nChoosing the clone option reveals a **Schema** field, pre-filled with a suggested name. This is the new schema that will be created alongside the original.\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/bdfb4b9a-7669-43a7-9d23-e9ca856b6aee.jpeg)\n\n## Generating and downloading\n\nClick **Generate developer environment**. The bundle is built and downloaded to your machine as a zip file named `contributor-environment-<name>.zip`.\n\nA green confirmation appears once it is ready, repeating the command the contributor needs to run. Send them that zip file - that is the whole handover.\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/65e0281d-6a31-4ba9-bb73-1cc2824b9693.jpeg)\n\n## Getting the code\n\nThe bundle is unpacked into a checkout of NGX-Ramblers on the contributor's machine, so the contributor needs that checkout first. How they get it depends on whether they only want to run the code or also want to send changes back, and the second case is the one to set up for from the start.\n\nThe way to contribute to NGX-Ramblers is to fork the repository and submit changes as a pull request from that fork. A contributor has no write access to the project repository, and nobody outside the maintainers does, so they cannot clone it and push to it directly. They work on their own fork instead.\n\n1. On GitHub, open [github.com/nbarrett/ngx-ramblers](https://github.com/nbarrett/ngx-ramblers) and click **Fork**. This creates the contributor's own copy at `github.com/<their-username>/ngx-ramblers`, which they have full write access to.\n2. Clone that fork - not the project repository:\n\n```\ngit clone https://github.com/<their-username>/ngx-ramblers.git\ncd ngx-ramblers\n```\n\n3. Add the project repository as a second remote, so the fork can be brought up to date as the project moves on:\n\n```\ngit remote add upstream https://github.com/nbarrett/ngx-ramblers.git\n```\n\nThere are now two remotes: `origin` is the contributor's fork, where they push, and `upstream` is the project repository, where they fetch updates from. To bring the fork up to date later: `git fetch upstream`, then rebase the work onto `upstream/main`.\n\nThis clone is the checkout referred to below. The `non-vcs` folder from the bundle is unpacked into its root.\n\n## Running the environment locally\n\nThe zip already carries the folder structure the files need:\n\n```\nnon-vcs/secrets/secrets.<name>.env\nnon-vcs/secrets/environments.local.json\nREADME-contributor-environment.txt\n```\n\nUnpack it so the `non-vcs` folder from the zip sits at the **root of the NGX-Ramblers checkout**. Done correctly, the two secrets files end up exactly here:\n\n```\n<checkout>/non-vcs/secrets/secrets.<name>.env\n<checkout>/non-vcs/secrets/environments.local.json\n```\n\nWatch out for one trap. Double-clicking the zip extracts it into a folder named after the zip, with the `non-vcs` folder inside that. Do not copy that whole folder into the project. If the files end up one level too deep, at `<checkout>/contributor-environment-<name>/non-vcs/secrets/...` rather than `<checkout>/non-vcs/secrets/...`, the stack will not find them and will not start. Lift the `non-vcs` folder out of the extracted folder and place it at the checkout root, keeping its contents in place.\n\nThen start the stack with:\n\n```\n./bin/ngx-cli local dev <name> --no-docker-worker\n```\n\n`--no-docker-worker` skips the background scraping worker, which most contributors do not need. The environment resolves entirely from the bundle, with no staging access, so it runs even when the central configuration database is unreachable.\n\n### Seeing your changes\n\nWith the stack running, the contributor does not need to do anything to pick up the edits they make. Both halves reload themselves: editing an Angular component, template or service recompiles the frontend and the browser refreshes through hot module replacement, and editing a server file restarts the Node backend. Save the file and the result is there in a second or two, with no stopping, rebuilding or restarting the stack by hand.\n\n## Contributing changes back\n\nOnce a change is working locally, the route to getting it into the project is the same fork and a pull request:\n\n1. Make the change on a branch and commit it. Run `npm run setup:hooks` once beforehand - the git hooks enforce the commit-message format and lint rules on the contributor's own machine.\n2. Push the branch to the fork: `git push origin <branch-name>`.\n3. On GitHub, open a pull request from the fork against `nbarrett/ngx-ramblers`. A maintainer reviews it and integrates it onto `main`.\n\nFor anything beyond a small fix, raise a GitHub issue first so the approach can be agreed before the work starts. NGX-Ramblers is developed trunk-based - the maintainers commit straight to `main`, with no internal pull requests - so an external contributor's pull request is the one reviewed way in, and that is deliberate.","contentHtml":"<h1>17-May-2026 — Generate a contributor environment for your group <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/272\">ref #272</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/26005601269\">build 647</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/1ec7640dba6c22bdc8321fc5100430571b86c18f\">commit 1ec7640</a></h2>\n<hr>\n<p>A site admin can now hand a developer everything they need to run the full NGX-Ramblers stack on their own machine, working against this group and no other. You generate a downloadable bundle from the admin area, send it to the contributor, and they are running locally with a single command.</p>\n<p>The bundle is deliberately narrow. It points at this site&#39;s MongoDB server and carries a freshly generated <code>AUTH_SECRET</code>. It includes nothing else: no staging configuration database, no shared platform keys, and no other group&#39;s data.</p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/6674f34a-1caf-4448-a324-f5ae30c09f80.jpeg\" alt=\"\"></p>\n<h2>What a contributor environment is</h2>\n<p>NGX-Ramblers normally runs from a central configuration database that holds the settings for every group. A developer helping with one group should never need that database, and should never hold credentials that reach beyond the single group they are working on.</p>\n<p>A contributor environment solves this. The bundle you generate contains three things, all scoped to your group alone:</p>\n<ul>\n<li><strong>A secrets file</strong> with the database connection, the S3 image bucket, and a fresh <code>AUTH_SECRET</code> generated just for this bundle.</li>\n<li><strong>An environments manifest</strong> that names the environment so the contributor can start it by name.</li>\n<li><strong>A README</strong> explaining how to unpack and run it.</li>\n</ul>\n<p>What the bundle leaves out matters just as much: no staging configuration database, no Fly.io or Cloudflare account keys, and no other group&#39;s secrets, bucket or data. If a value would let the holder touch a second group or the live platform, it is not included.</p>\n<h2>Generating a bundle</h2>\n<p>Open the admin menu and choose <strong>Contributor Environment</strong>, or go straight to <code>/admin/contributor-environment</code>. You will see the form shown above.</p>\n<h3>Name the environment</h3>\n<p>The <strong>Environment name</strong> is how the contributor starts the stack locally, with <code>ngx-cli local dev &lt;name&gt;</code>. Enter it in kebab-case: lower case, with words joined by hyphens. The field tidies whatever you type into that shape when you click away, so <code>Pang Valley</code> becomes <code>pang-valley</code>.</p>\n<h2>Choosing the database</h2>\n<p>The bundle always uses this site&#39;s MongoDB server. You decide which data the contributor works against:</p>\n<ul>\n<li><strong>Develop against the current database</strong> - the contributor reads and writes the group&#39;s existing database directly. Choose this when you want them working with live content and you are comfortable with their changes being real.</li>\n<li><strong>Clone the current database into a new schema</strong> - a new schema is created on the same server and populated with a copy of the current data. Choose this when you want the contributor to experiment freely without affecting anything in use.</li>\n</ul>\n<p>Choosing the clone option reveals a <strong>Schema</strong> field, pre-filled with a suggested name. This is the new schema that will be created alongside the original.</p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/bdfb4b9a-7669-43a7-9d23-e9ca856b6aee.jpeg\" alt=\"\"></p>\n<h2>Generating and downloading</h2>\n<p>Click <strong>Generate developer environment</strong>. The bundle is built and downloaded to your machine as a zip file named <code>contributor-environment-&lt;name&gt;.zip</code>.</p>\n<p>A green confirmation appears once it is ready, repeating the command the contributor needs to run. Send them that zip file - that is the whole handover.</p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/65e0281d-6a31-4ba9-bb73-1cc2824b9693.jpeg\" alt=\"\"></p>\n<h2>Getting the code</h2>\n<p>The bundle is unpacked into a checkout of NGX-Ramblers on the contributor&#39;s machine, so the contributor needs that checkout first. How they get it depends on whether they only want to run the code or also want to send changes back, and the second case is the one to set up for from the start.</p>\n<p>The way to contribute to NGX-Ramblers is to fork the repository and submit changes as a pull request from that fork. A contributor has no write access to the project repository, and nobody outside the maintainers does, so they cannot clone it and push to it directly. They work on their own fork instead.</p>\n<ol>\n<li>On GitHub, open <a href=\"https://github.com/nbarrett/ngx-ramblers\">github.com/nbarrett/ngx-ramblers</a> and click <strong>Fork</strong>. This creates the contributor&#39;s own copy at <code>github.com/&lt;their-username&gt;/ngx-ramblers</code>, which they have full write access to.</li>\n<li>Clone that fork - not the project repository:</li>\n</ol>\n<pre><code>git clone https://github.com/&lt;their-username&gt;/ngx-ramblers.git\ncd ngx-ramblers\n</code></pre>\n<ol start=\"3\">\n<li>Add the project repository as a second remote, so the fork can be brought up to date as the project moves on:</li>\n</ol>\n<pre><code>git remote add upstream https://github.com/nbarrett/ngx-ramblers.git\n</code></pre>\n<p>There are now two remotes: <code>origin</code> is the contributor&#39;s fork, where they push, and <code>upstream</code> is the project repository, where they fetch updates from. To bring the fork up to date later: <code>git fetch upstream</code>, then rebase the work onto <code>upstream/main</code>.</p>\n<p>This clone is the checkout referred to below. The <code>non-vcs</code> folder from the bundle is unpacked into its root.</p>\n<h2>Running the environment locally</h2>\n<p>The zip already carries the folder structure the files need:</p>\n<pre><code>non-vcs/secrets/secrets.&lt;name&gt;.env\nnon-vcs/secrets/environments.local.json\nREADME-contributor-environment.txt\n</code></pre>\n<p>Unpack it so the <code>non-vcs</code> folder from the zip sits at the <strong>root of the NGX-Ramblers checkout</strong>. Done correctly, the two secrets files end up exactly here:</p>\n<pre><code>&lt;checkout&gt;/non-vcs/secrets/secrets.&lt;name&gt;.env\n&lt;checkout&gt;/non-vcs/secrets/environments.local.json\n</code></pre>\n<p>Watch out for one trap. Double-clicking the zip extracts it into a folder named after the zip, with the <code>non-vcs</code> folder inside that. Do not copy that whole folder into the project. If the files end up one level too deep, at <code>&lt;checkout&gt;/contributor-environment-&lt;name&gt;/non-vcs/secrets/...</code> rather than <code>&lt;checkout&gt;/non-vcs/secrets/...</code>, the stack will not find them and will not start. Lift the <code>non-vcs</code> folder out of the extracted folder and place it at the checkout root, keeping its contents in place.</p>\n<p>Then start the stack with:</p>\n<pre><code>./bin/ngx-cli local dev &lt;name&gt; --no-docker-worker\n</code></pre>\n<p><code>--no-docker-worker</code> skips the background scraping worker, which most contributors do not need. The environment resolves entirely from the bundle, with no staging access, so it runs even when the central configuration database is unreachable.</p>\n<h3>Seeing your changes</h3>\n<p>With the stack running, the contributor does not need to do anything to pick up the edits they make. Both halves reload themselves: editing an Angular component, template or service recompiles the frontend and the browser refreshes through hot module replacement, and editing a server file restarts the Node backend. Save the file and the result is there in a second or two, with no stopping, rebuilding or restarting the stack by hand.</p>\n<h2>Contributing changes back</h2>\n<p>Once a change is working locally, the route to getting it into the project is the same fork and a pull request:</p>\n<ol>\n<li>Make the change on a branch and commit it. Run <code>npm run setup:hooks</code> once beforehand - the git hooks enforce the commit-message format and lint rules on the contributor&#39;s own machine.</li>\n<li>Push the branch to the fork: <code>git push origin &lt;branch-name&gt;</code>.</li>\n<li>On GitHub, open a pull request from the fork against <code>nbarrett/ngx-ramblers</code>. A maintainer reviews it and integrates it onto <code>main</code>.</li>\n</ol>\n<p>For anything beyond a small fix, raise a GitHub issue first so the approach can be agreed before the work starts. NGX-Ramblers is developed trunk-based - the maintainers commit straight to <code>main</code>, with no internal pull requests - so an external contributor&#39;s pull request is the one reviewed way in, and that is deliberate.</p>\n"}