Testnet only (Arkiv Tiramisu). OpenTrigger 0.1 has not had an outside audit.
OpenTrigger

Run a worker

Run an OpenTrigger worker with one command, on a server or a laptop.

A worker needs Node.js 22, its own wallet with a little test GLM, and ideally an Arkiv access key. It only makes outgoing connections, so it runs anywhere.

Make a wallet for it

npx arkiv-triggers new-key

This prints WORKER_KEY=0x… and the address. Never use your main wallet: the key lives on the server, so a breach should cost only a little test GLM.

Fund it

Send the address test GLM from the faucet. A worker pays for its claims, receipts and heartbeat; the worker refuses to start with a zero balance.

Configure it

Put the settings in a .env file in the folder you run it from (values already in the environment win):

WORKER_KEY=0x…            # required, secret
ARKIV_ACCESS_KEY=…        # recommended, secret
WORKER_MODE=any           # any | own
TG_TOKEN=…                # optional, secret: enables Telegram

Every setting is in the CLI reference.

Run it

npx arkiv-triggers
[OpenTrigger] worker running as 0x7f3… (mode any, actions 🔗 webhook, 🧾 receipt, ⏳ extend)
[OpenTrigger] balance 9.92 GLM · https://tiramisu.explorer.arkiv.network/address/0x7f3…
[OpenTrigger] seal key 0xb363…

Within a minute its heartbeat is on Arkiv and it shows up in listWorkers() and on the dashboard's Workers page.

Once the package is installed (npm install arkiv-triggers), the same command is also available as arkiv-triggers-worker.

Health check

Set PORT and the worker serves GET /healthz: 200 with its stats while its loop keeps moving, 503 once it has been stuck for 2 minutes.

{ "ok": true, "worker": "0x7f3…", "version": "arkiv-triggers/0.1.1", "rules": 12, "fired": 40, "failed": 0, "skipped": 1, "lastBlock": "712345" }

Stopping

SIGINT or SIGTERM finishes actions in flight, then exits. A second signal exits at once. A worker that stops mid-claim loses the claim when its 60-second lease lapses, and another worker takes over.

One process per wallet

Never run two workers with the same WORKER_KEY. They would collide on transaction nonces. On a hosting platform, set exactly one replica.

Prefer a container? See Docker. Embedding in your backend? See Run your own code.

On this page