Publish a Module

Signed handler bundles that add new providers or capabilities. Free by default; flip one flag to sell them with offline-verified licenses.

Module anatomy

A module is three files under ~/.railcall/station/modules/<slug>/. The loader verifies the Ed25519 signature before importing the handler — a bad signature refuses to load.

text
~/.railcall/station/modules/your-handle/example/
├── module.json         # manifest — slug, commands, license flag
├── handlers/
│   └── handler.py      # your handler code
└── module.sig          # Ed25519 signature over the bundle

module.json

The manifest declares the commands your handler exposes and whether the module is gated behind a license. Keep it minimal.

json
{
  "slug": "your-handle/example",
  "version": "0.1.0",
  "description": "Short one-liner shown on the listing.",
  "commands": [
    { "name": "do_thing", "description": "What this command does." }
  ],
  "license_required": false
}

Signing & publishing

railcall market publish signs the bundle with your publisher key and uploads it. Users install the same way they install workflows.

shell
railcall market claim your-handle/example
railcall market publish
# ↳ writes module.sig
# ↳ uploads to railcall-marketplace-lggm.onrender.com

Flip license_required: true in module.json. The loader then refuses to import the handler unless a valid entitlement is present for this install.

json
{
  "slug": "your-handle/example",
  "version": "0.1.0",
  "license_required": true
}

Licenses are minted by the RailCall license service (railcall-license.onrender.com), bound to the buyer's install pubkey, and verified offline against the pinned issuer public key. Seven-day grace past expiry so a flaky network doesn't break production.

Live example: sami666/salesforce

Thirteen commands across leads, contacts, accounts, opportunities, and cases. OAuth 2.0 refresh flow via railcall connect salesforce. $199/mo. That's the reference shape for a paid connector.

Live example: sami666/hubspot

Two commands (create_contact, log_note), Bearer token auth, free. That's the reference shape for a free connector.

What buyers do

shell
railcall market install your-handle/example
railcall license activate your-handle/example    # only if license_required
railcall license verify                          # offline
Signature discipline
Never publish a module by hand-editing module.sig. The publish command re-signs on every upload; a stale or forged signature bounces at load time and users see the failure.

Revenue

RailCall takes 5% at checkout. Wallet-and-payout model — earnings accumulate in your marketplace wallet and you withdraw when you're ready.