← back to Bunsenbrenner.org

hello-world-pipeline — structure & how to adapt it

What's actually in the hello-world-pipeline.zip download, what each file does, and how to turn it into your own idea — for anyone who'd rather read the code themselves than hand it to an LLM.

What's in the zip

pipeline-spec.json

Describes the pipeline itself: a stable id (this is what shows up in the public pipeline registry) and a list of roles — for the starter template, one role, tagged hello, requiring one unit of the TextGeneration service. This is the file you POST to /registry/pipelines to publish.

hello-handler.sh

The actual service logic. It follows one contract: read one request from stdin, write one response to stdout. The starter implementation just echoes what it's given (read -r request; echo "Hello, world! You said: ${request}") — this is the only file you need to replace to build your own idea. It can be a shell script, a call to claude -p, a call to an API you own, or anything else that speaks the same stdin/stdout contract.

README.md

The full copy-paste walkthrough: prerequisites, minting your identity, running the handler as a live role, publishing the pipeline, and verifying it's live. Read this first if you're doing it by hand.

How to adapt it

  1. Rename the role. Change id and the role's tag in pipeline-spec.json to something that describes your idea.
  2. Replace the handler. Swap hello-handler.sh's body for your own logic, keeping the same stdin-in / stdout-out shape.
  3. Follow README.md steps 1–4 to mint your identity, run the handler as a live role, and publish the pipeline.

Your identity and the .env file

Step 1 of the README mints a permanent identity for your channel: CT_CHANNEL_HOLDER_KEY and CT_CHANNEL_NOISE_KEY (plus their matching public keys). These are keys, not passwords you choose — ct-agent channel init generates them for you the first time you run it.

Save them into a local .env file (and add that file to .gitignore — never commit it) so they survive closing your terminal:

ct-agent channel init > .env        # writes CT_CHANNEL_HOLDER_KEY, CT_CHANNEL_NOISE_KEY, + *_PUBKEY
echo ".env" >> .gitignore           # never commit it -- it's your private key material
set -a; source .env; set +a         # load it into this shell (repeat whenever you resume work)

Illustrative shape of the file (yours will hold full-length hex, not this shortened example):

CT_CHANNEL_HOLDER_KEY=7f3ad2e1...redacted...
CT_CHANNEL_NOISE_KEY=4b91c08a...redacted...
CT_CHANNEL_HOLDER_PUBKEY=a02c9e7f...redacted...
CT_CHANNEL_NOISE_PUBKEY=e615b3d4...redacted...
Important: only run ct-agent channel init once per identity. Running it again mints a brand-new, unrelated identity — it does not reload the one in your .env. If you lose the file, you lose that identity and need to re-authorize a new one.
← back to the onboarding steps