From 5ca80da721ae61d887119ee9e41a549edca884c0 Mon Sep 17 00:00:00 2001 From: Eric Dahl Date: Tue, 24 Mar 2026 14:34:15 -0400 Subject: [PATCH 1/7] Create neon_workflow.yml --- .github/workflows/neon_workflow.yml | 97 +++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 .github/workflows/neon_workflow.yml diff --git a/.github/workflows/neon_workflow.yml b/.github/workflows/neon_workflow.yml new file mode 100644 index 0000000..034b069 --- /dev/null +++ b/.github/workflows/neon_workflow.yml @@ -0,0 +1,97 @@ +name: Create/Delete Branch for Pull Request + +on: + pull_request: + types: + - opened + - reopened + - synchronize + - closed + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + +jobs: + setup: + name: Setup + outputs: + branch: ${{ steps.branch_name.outputs.current_branch }} + runs-on: ubuntu-latest + steps: + - name: Get branch name + id: branch_name + uses: tj-actions/branch-names@v8 + + create_neon_branch: + name: Create Neon Branch + outputs: + db_url: ${{ steps.create_neon_branch_encode.outputs.db_url }} + db_url_with_pooler: ${{ steps.create_neon_branch_encode.outputs.db_url_with_pooler }} + needs: setup + if: | + github.event_name == 'pull_request' && ( + github.event.action == 'synchronize' + || github.event.action == 'opened' + || github.event.action == 'reopened') + runs-on: ubuntu-latest + steps: + - name: Get branch expiration date as an env variable (2 weeks from now) + id: get_expiration_date + run: echo "EXPIRES_AT=$(date -u --date '+14 days' +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_ENV" + - name: Create Neon Branch + id: create_neon_branch + uses: neondatabase/create-branch-action@v6 + with: + project_id: ${{ vars.NEON_PROJECT_ID }} + branch_name: preview/pr-${{ github.event.number }}-${{ needs.setup.outputs.branch }} + api_key: ${{ secrets.NEON_API_KEY }} + expires_at: ${{ env.EXPIRES_AT }} + +# The step above creates a new Neon branch. +# You may want to do something with the new branch, such as run migrations, run tests +# on it, or send the connection details to a hosting platform environment. +# The branch DATABASE_URL is available to you via: +# "${{ steps.create_neon_branch.outputs.db_url_with_pooler }}". +# It's important you don't log the DATABASE_URL as output as it contains a username and +# password for your database. +# For example, you can uncomment the lines below to run a database migration command: + - name: Run Migrations + run: npm run db:migrate + env: + # to use pooled connection + #DATABASE_URL: "${{ steps.create_neon_branch.outputs.db_url_with_pooler }}" + # OR to use unpooled connection + DATABASE_URL: "${{ steps.create_neon_branch.outputs.db_url }}" + +# Following the step above, which runs database migrations, you may want to check +# for schema changes in your database. We recommend using the following action to +# post a comment to your pull request with the schema diff. For this action to work, +# you also need to give permissions to the workflow job to be able to post comments +# and read your repository contents. Add the following permissions to the workflow job: +# +# permissions: +# contents: read +# pull-requests: write +# +# You can also check out https://github.com/neondatabase/schema-diff-action for more +# information on how to use the schema diff action. +# You can uncomment the lines below to enable the schema diff action. +# - name: Post Schema Diff Comment to PR +# uses: neondatabase/schema-diff-action@v1 +# with: +# project_id: ${{ vars.NEON_PROJECT_ID }} +# compare_branch: preview/pr-${{ github.event.number }}-${{ needs.setup.outputs.branch }} +# api_key: ${{ secrets.NEON_API_KEY }} + + delete_neon_branch: + name: Delete Neon Branch + needs: setup + if: github.event_name == 'pull_request' && github.event.action == 'closed' + runs-on: ubuntu-latest + steps: + - name: Delete Neon Branch + uses: neondatabase/delete-branch-action@v3 + with: + project_id: ${{ vars.NEON_PROJECT_ID }} + branch: preview/pr-${{ github.event.number }}-${{ needs.setup.outputs.branch }} + api_key: ${{ secrets.NEON_API_KEY }} From 876f602301b5b2f94e3aa4a6e84383120751746d Mon Sep 17 00:00:00 2001 From: Eric Dahl Date: Tue, 24 Mar 2026 14:34:42 -0400 Subject: [PATCH 2/7] docs: use semi-technical copy instead of durable queue - Landing live flow and storage stat speak to builders in plain language - Architecture diagram bullet aligned with README Mermaid and step copy --- README.md | 4 ++-- app/page.tsx | 4 ++-- components/app/architecture-diagram.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a86eca8..121576e 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ flowchart LR subgraph internet ["☁️ Public Internet"] P["Provider\nGitHub · Stripe · Slack"] C["clawproxy\n(public endpoint)"] - Q[("Durable\nqueue")] + Q[("Safe\nstorage")] end subgraph private ["🔒 Your Private Network"] @@ -34,7 +34,7 @@ flowchart LR ``` 1. **A provider** (GitHub, Stripe, Slack, …) sends a webhook to your public clawproxy URL. -2. **clawproxy** accepts the request, validates it, and persists the event to a durable queue. +2. **clawproxy** accepts the request, validates it, and stores the event safely until your node connects. 3. **Your OpenClaw node** — running behind NAT or a private LAN — connects to clawproxy over an outbound connection, receives queued events, processes them locally, and acknowledges delivery. Your private node never needs an open port or firewall rule. diff --git a/app/page.tsx b/app/page.tsx index 0e3f365..772c4bf 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -164,7 +164,7 @@ export default function Home() { }, { title: 'Ingress accepted', - body: 'Request validated and persisted to the durable queue.', + body: 'Validated and saved safely until delivery to your node.', }, { title: 'Live push or pull', @@ -197,7 +197,7 @@ export default function Home() {

Storage

-

Durable queue

+

Safe until delivery

Ideal for

diff --git a/components/app/architecture-diagram.tsx b/components/app/architecture-diagram.tsx index 3bde9ee..a4bf4c6 100644 --- a/components/app/architecture-diagram.tsx +++ b/components/app/architecture-diagram.tsx @@ -159,7 +159,7 @@ export function ArchitectureDiagram() { accent label="clawproxy" sublabel="Public cloud" - items={['Accepts & validates', 'Stores in durable queue', 'Manages delivery state']} + items={['Accepts & validates', 'Saves events until delivery', 'Manages delivery state']} /> From 4bf0a11792ab618dae7b5c3a308f11f8030cdaf4 Mon Sep 17 00:00:00 2001 From: Eric Dahl Date: Tue, 24 Mar 2026 14:38:24 -0400 Subject: [PATCH 3/7] Update neon_workflow.yml --- .github/workflows/neon_workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/neon_workflow.yml b/.github/workflows/neon_workflow.yml index 034b069..3296dfd 100644 --- a/.github/workflows/neon_workflow.yml +++ b/.github/workflows/neon_workflow.yml @@ -56,7 +56,7 @@ jobs: # password for your database. # For example, you can uncomment the lines below to run a database migration command: - name: Run Migrations - run: npm run db:migrate + run: yarn db:migrate env: # to use pooled connection #DATABASE_URL: "${{ steps.create_neon_branch.outputs.db_url_with_pooler }}" From c745ee8821ce4c00489402c6374a419ff32cb4e0 Mon Sep 17 00:00:00 2001 From: Eric Dahl Date: Tue, 24 Mar 2026 14:41:28 -0400 Subject: [PATCH 4/7] Update neon_workflow.yml --- .github/workflows/neon_workflow.yml | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/.github/workflows/neon_workflow.yml b/.github/workflows/neon_workflow.yml index 3296dfd..d3e9b1a 100644 --- a/.github/workflows/neon_workflow.yml +++ b/.github/workflows/neon_workflow.yml @@ -24,9 +24,11 @@ jobs: create_neon_branch: name: Create Neon Branch + permissions: + contents: read outputs: - db_url: ${{ steps.create_neon_branch_encode.outputs.db_url }} - db_url_with_pooler: ${{ steps.create_neon_branch_encode.outputs.db_url_with_pooler }} + db_url: ${{ steps.create_neon_branch.outputs.db_url }} + db_url_pooled: ${{ steps.create_neon_branch.outputs.db_url_pooled }} needs: setup if: | github.event_name == 'pull_request' && ( @@ -35,9 +37,13 @@ jobs: || github.event.action == 'reopened') runs-on: ubuntu-latest steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Get branch expiration date as an env variable (2 weeks from now) id: get_expiration_date run: echo "EXPIRES_AT=$(date -u --date '+14 days' +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_ENV" + - name: Create Neon Branch id: create_neon_branch uses: neondatabase/create-branch-action@v6 @@ -47,19 +53,30 @@ jobs: api_key: ${{ secrets.NEON_API_KEY }} expires_at: ${{ env.EXPIRES_AT }} + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: yarn + + - name: Enable Corepack (Yarn from packageManager) + run: corepack enable + + - name: Install dependencies + run: yarn install --immutable + # The step above creates a new Neon branch. # You may want to do something with the new branch, such as run migrations, run tests # on it, or send the connection details to a hosting platform environment. # The branch DATABASE_URL is available to you via: -# "${{ steps.create_neon_branch.outputs.db_url_with_pooler }}". +# "${{ steps.create_neon_branch.outputs.db_url_pooled }}". # It's important you don't log the DATABASE_URL as output as it contains a username and # password for your database. -# For example, you can uncomment the lines below to run a database migration command: - name: Run Migrations run: yarn db:migrate env: # to use pooled connection - #DATABASE_URL: "${{ steps.create_neon_branch.outputs.db_url_with_pooler }}" + #DATABASE_URL: "${{ steps.create_neon_branch.outputs.db_url_pooled }}" # OR to use unpooled connection DATABASE_URL: "${{ steps.create_neon_branch.outputs.db_url }}" From 4ff2c7afa8cc4799b1d3726f9087774c50c1ccd1 Mon Sep 17 00:00:00 2001 From: Eric Dahl Date: Tue, 24 Mar 2026 14:42:55 -0400 Subject: [PATCH 5/7] Update neon_workflow.yml --- .github/workflows/neon_workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/neon_workflow.yml b/.github/workflows/neon_workflow.yml index d3e9b1a..b5a9cac 100644 --- a/.github/workflows/neon_workflow.yml +++ b/.github/workflows/neon_workflow.yml @@ -73,7 +73,7 @@ jobs: # It's important you don't log the DATABASE_URL as output as it contains a username and # password for your database. - name: Run Migrations - run: yarn db:migrate + run: yarn db:push env: # to use pooled connection #DATABASE_URL: "${{ steps.create_neon_branch.outputs.db_url_pooled }}" From f53e843b8b5111b08d2c9561cdc8093f752def09 Mon Sep 17 00:00:00 2001 From: Eric Dahl Date: Tue, 24 Mar 2026 14:43:58 -0400 Subject: [PATCH 6/7] Update neon_workflow.yml --- .github/workflows/neon_workflow.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/neon_workflow.yml b/.github/workflows/neon_workflow.yml index b5a9cac..bce200c 100644 --- a/.github/workflows/neon_workflow.yml +++ b/.github/workflows/neon_workflow.yml @@ -53,17 +53,17 @@ jobs: api_key: ${{ secrets.NEON_API_KEY }} expires_at: ${{ env.EXPIRES_AT }} - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: yarn + # - name: Setup Node.js + # uses: actions/setup-node@v4 + # with: + # node-version: 22 + # cache: yarn - - name: Enable Corepack (Yarn from packageManager) - run: corepack enable + # - name: Enable Corepack (Yarn from packageManager) + # run: corepack enable - - name: Install dependencies - run: yarn install --immutable + # - name: Install dependencies + # run: yarn install --immutable # The step above creates a new Neon branch. # You may want to do something with the new branch, such as run migrations, run tests From 7a678ce24fa3f7ae80ddcbf05387e8189a3f11e9 Mon Sep 17 00:00:00 2001 From: Eric Dahl Date: Tue, 24 Mar 2026 14:45:05 -0400 Subject: [PATCH 7/7] Update neon_workflow.yml --- .github/workflows/neon_workflow.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/neon_workflow.yml b/.github/workflows/neon_workflow.yml index bce200c..b5a9cac 100644 --- a/.github/workflows/neon_workflow.yml +++ b/.github/workflows/neon_workflow.yml @@ -53,17 +53,17 @@ jobs: api_key: ${{ secrets.NEON_API_KEY }} expires_at: ${{ env.EXPIRES_AT }} - # - name: Setup Node.js - # uses: actions/setup-node@v4 - # with: - # node-version: 22 - # cache: yarn + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: yarn - # - name: Enable Corepack (Yarn from packageManager) - # run: corepack enable + - name: Enable Corepack (Yarn from packageManager) + run: corepack enable - # - name: Install dependencies - # run: yarn install --immutable + - name: Install dependencies + run: yarn install --immutable # The step above creates a new Neon branch. # You may want to do something with the new branch, such as run migrations, run tests