It starts as a script on your laptop
Python, shell or Node, as it is. One command publishes the folder, and the parts in braces become inputs. Files the script writes come back as downloads.
npm install -g @reminix/cli
Publish a script and your team gets a form for it. Your software and your agents can run it too. You decide which runs wait for a person to approve them.
Scripts› Refund a customer
Refund a customer v2
Refunds an order's payment through Stripe.
refund-customer
Run
This runs version 2, the published one, with the inputs below.
Order pi_3Q8xLr2eZvKYlo2C
Reason (optional) requested_by_customer
Recent runs
See the latest runs of this script, however they started.
| Started | Status | Via | Duration |
|---|---|---|---|
| Nov 8, 2026, 9:41 AM v2 | Awaiting approval | Agent · token Claude | |
| Nov 8, 2026, 9:38 AM v2 | Running | API · key billing | |
| Nov 8, 2026, 9:12 AM v2 | Succeeded | App | 1.2 s |
| Nov 8, 2026, 8:55 AM v2 | Succeeded | CLI | 1.1 s |
See all runs →
Python, shell or Node, as it is. One command publishes the folder, and the parts in braces become inputs. Files the script writes come back as downloads.
import argparse, json, requests
parser = argparse.ArgumentParser()
parser.add_argument("order_id")
parser.add_argument("--reason", default="requested_by_customer")
args = parser.parse_args()
# No key here: Reminix adds it to requests to api.stripe.com.
refund = requests.post(
"https://api.stripe.com/v1/refunds",
data={"payment_intent": args.order_id, "reason": args.reason},
).json()
print(json.dumps({"id": refund["id"], "amount": refund["amount"]})) $ ls refund.py requirements.txt $ python refund.py pi_3Q8xLr2eZvKYlo2C # works, but only here, and only for you $ reminix login $ reminix publish \ --command "python refund.py {orderId} [--reason {reason}]"
Paste this prompt into Claude Code or Codex. It reads Reminix's agent skill and lists your scripts. Pick one, and it prepares it, tests a draft, and publishes only when you say so.
Read https://reminix.com/docs/skill/SKILL.md and follow it. List the scripts in this project that people run by hand, one line each, and wait for me to pick one to publish to Reminix.
Each way checks the same inputs and shows up in the same list of runs. Share a script with your whole workspace or only with certain teams. Other members don't see it at all, not even through the API.
Run
Order pi_3Q8xLr2eZvKYlo2C
await reminix.run("refund-customer", { orderId: invoice.paymentIntent, reason: "requested_by_customer", });
{
"name": "refund_customer",
"inputSchema": {
"type": "object",
"required": ["orderId"],
"properties": {
"orderId": {
"type": "string",
"title": "Order"
},
"reason": {
"type": "string",
"title": "Reason"
}
}
}
} $ reminix run refund-customer \ --log --input \ '{"orderId":"pi_3Q8xLr2eZvKYlo2C"}'
Every night
Every day at 2:00 (Europe/London) · next Nov 9, 2026, 2:00 AM
Enabled
Nightly sync failed
On run.failed script.slug = nightly-sync
Enabled
Support gets a form. Your billing app calls the API. Claude or ChatGPT sees it as a tool. Other scripts run on a timetable, or when something happens. Each one checks the same inputs and shows up in the same list of runs.
Share a script with your whole workspace or only with certain teams. Other members don't see it at all, not even through the API.
Run
Order pi_3Q8xLr2eZvKYlo2C
const run = await reminix.run("refund-customer", { orderId: invoice.paymentIntent, reason: "requested_by_customer", });
{
"name": "refund_customer",
"inputSchema": {
"type": "object",
"required": ["orderId"],
"properties": {
"orderId": {
"type": "string",
"title": "Order"
},
"reason": {
"type": "string",
"title": "Reason"
}
}
}
} $ reminix run refund-customer \ --input '{"orderId":"pi_3Q8xLr2eZvKYlo2C"}' --log
Schedules
A schedule runs this script at set times, with the inputs you choose.
Every night
Every day at 2:00 (Europe/London) · next Nov 9, 2026, 2:00 AM
Enabled
Triggers
A trigger runs this script when something happens in the workspace, such as another script's run failing.
Nightly sync failed
On run.failed script.slug = nightly-sync
Enabled
Support, operations and finance ask Claude, ChatGPT or the agent they already use. It finds the script, asks for the inputs, and waits for a person to approve anything that changes data.
Refund order 1234 in full. The customer paid twice.
I found refund-customer in Acme Ops. Runs from an agent need an approval, so I've asked for one. I'll refund order 1234 as soon as it's approved.
Waiting for approval: refund-customer, order 1234
You save the Stripe key in Reminix once. When the script calls api.stripe.com, Reminix adds the key to that request on the way out. It blocks any host the script didn't list, and every request lands in the run's log. The script can read a key only if you turn that on for it.
{
"command": "python refund.py {orderId} [--reason {reason}]",
"inputSchema": {
"type": "object",
"required": ["orderId"],
"properties": {
"orderId": { "type": "string", "title": "Order" },
"reason": { "type": "string", "title": "Reason" }
}
},
"hosts": ["api.stripe.com"],
"secrets": {
"STRIPE_KEY": {
"host": "api.stripe.com",
"header": "Authorization",
"format": "Bearer {secret}"
}
}
} → POST api.stripe.com/v1/refunds 200 (412 ms) → GET api.example.net/collect — blocked: Host not allowed: api.example.net — declare it in reminix.json "hosts"
Set a script so runs started by an AI agent wait for an owner or admin. The person sees exactly what the agent asked for, then approves or denies it. On Business, every run can wait for approval.
Approval request
Run a script Waiting for a decision
Requested by Claude on behalf of Sam Rivera in Acme Ops.
What will happen
Run refund-customer (version 2)
Inputs
{
"orderId": "pi_3Q8xLr2eZvKYlo2C",
"reason": "requested_by_customer"
}
Reminix records who ran it, from where, with which inputs, what it printed and any files it wrote. If a run prints a key it had access to, the log shows [secret] instead. The record stays. Logs and files last 7 days on Free, 30 on Pro and 90 on Business.
Every change is a new version, and runs keep using the published one until someone publishes another. Rolling back is publishing the one before.
Runs› Refund a customer
Refund a customer v2 Succeeded
Output
{
"id": "re_3Q8xM02eZvKY",
"amount": 4000
} Log
→ POST api.stripe.com/v1/refunds 200 (412 ms)
Each of these has a guide in the docs. Using something else today? See how Reminix compares.
unlock-account Support unlocks a customer's account from a form. Guide monthly-report Finance gets last month's revenue as a CSV file on the 1st. Guide nightly-sync A script copies the day's orders from the shop to the warehouse every night. Guide refund-customer An agent refunds an order after a person approves it. Guide alert-on-failure When the nightly sync fails, Slack gets the error. Guide Free has room for 1 publisher and 5 people who only run scripts. You get 500 runs a month, and you don't need a card. Pro is $29 a month for the whole workspace.