neuromast/ code. Fork Axol, or push just neuromast/ to a fresh repo.neuromast/ to your own GitHub repoSkip if you forked Axol. Otherwise seed a fresh repo:
cp -r neuromast /tmp/my-neuromast
cd /tmp/my-neuromast
git init -b main
git add .
git commit -m "seed neuromast"
gh repo create my-neuromast --private --source=. --push
Dashboard → New → Web Service → connect the GitHub repo → pick your neuromast repo.
Settings: Runtime Node, Build Command npm install && npm run build:node, Start Command npm start. If you forked the whole Axol repo, set Root Directory to neuromast.
Dashboard → New → Key Value. Pick a region matching your web service's. Render assigns an internal hostname like red-abc123.
Web service → Environment → Add Environment Variable → Add from Database → pick the Key Value instance → select Internal Redis URL. Render names it REDIS_URL by default, which is exactly what neuromast's storage factory auto-detects.
Still in Environment, mark each as a secret:
ADAPTER=node — tells Astro to build for Node, not Cloudflare.POLL_TOKEN — bearer for /pull + /ack. openssl rand -hex 32.SHARED_SECRET (optional) — ?key= fallback.HOOK_SCHEME_<SOURCE> + HOOK_SECRET_<SOURCE> per signed source.Web service → Manual Deploy → Deploy latest commit. First build takes ~2–3 min (installs deps, runs build:node, starts the Node server).
export AXOL_CLOUD_URL=https://<your-service>.onrender.com
export POLL_TOKEN='the-bearer-you-set'
export SHARED_SECRET='the-shared-key-you-set'
curl -X POST "$AXOL_CLOUD_URL/app/api/hooks/smoke?key=$SHARED_SECRET" \
-H 'content-type: application/json' \
-d '{"title":"hello","body":"from render"}'
If you're on the free tier and the service has been idle, the first request may hang for 20–30 s while Render wakes the dyno. Subsequent requests are instant until the next idle window.
AXOL_CLOUD_URL="$AXOL_CLOUD_URL" \
AXOL_POLL_TOKEN="$POLL_TOKEN" \
./lateral-line/install.sh
git push. Render watches the branch and deploys automatically.
Dashboard → service → Environment → edit → Save. Render restarts the service on save.
Render's free web services spin down after 15 min idle. The local forwarder's 15 s polling keeps the service warm during your work day — free-tier idle windows only happen overnight. If you want zero cold starts, upgrade the web service to the $7/mo plan.
If you forked the whole Axol repo, set Root Directory to neuromast. Without it, Render tries to build from the repo root (no package.json) and fails.
The build ran Cloudflare's adapter by default. Confirm ADAPTER=node is set in Environment, then trigger a new deploy.
Double-check REDIS_URL is linked to your Key Value instance, and pick the Internal URL (not External) — the external URL has auth requirements the internal one skips.
401 on every request
POLL_TOKEN or SHARED_SECRET mismatch. Confirm exact values in Environment match the forwarder plist (~/Library/LaunchAgents/com.axol.lateral-line.plist).
Free-tier cold start. Expected. Upgrade the plan or accept the lag.