Keep the light on for open work.
Get Ransom is a Nimiq Pay mini-app that puts a NIM bounty on any public GitHub issue. Hunters ship a pull request. When the keeper accepts a merged PR, they pay from their own Nimiq Pay wallet — on-chain, no Stripe, no paste-a-handle identity.
Live: get-ransom.vercel.app
Open in Pay: nimpay.app/miniapps/open/get-ransom.vercel.app
Open source work is full of hard bugs and thin motivation. Labels and “good first issue” threads do not move a maintainer’s worst ticket. A visible pot does.
Get Ransom makes that pot:
- Public — anyone can see the reward and who promised what
- Accountable — promises and GitHub identity are signed / OAuth-bound
- Honest about custody — today the creator pays on merge from their wallet; we do not run a hot escrow
GitHub issue → signed NIM promise → PR claim → merge → creator pays in Pay
| Who | What they do |
|---|---|
| Creator | Import issue → set NIM amount → sign promise → optional assignee lock → review PRs → Pay on merge |
| Hunter | Connect GitHub + payout NQ address → open PR → Claim with PR URL → get NIM |
| Anyone | Promise +N — grows the pot and shows under Contributions |
| Maintainer | Assign the issue on GitHub if you want an assignee-only lock |
- Nimiq Pay native —
listAccounts,sign(promises),sendBasicTransactionWithData(payouts) with native confirm dialogs - Cross-device accounts — Connect GitHub anywhere; payout wallet and history come back from the server
- Shared board — bounties, promises, and claims live in Redis, not one phone’s localStorage
- Claim modal — paste a PR URL; other submitted PRs listed underneath
- Markdown issue bodies — GitHub write-ups render as headings, lists, and code
| Currency | NIM (1 NIM = 100,000 Luna) |
| Promises | Signed messages, not locked coins |
| Payout | Creator’s wallet → hunter’s saved NQ address on accept of a merged PR |
| Platform custody | None — we never hold user NIM |
Why not prepaid on NIM L1: Nimiq has no general smart contracts (only vesting / HTLC / staking). A platform treasury would mean we custody funds. We chose not to.
Nimiq Pay also injects window.ethereum for Base, Polygon, and other EVM chains. Next we want a bounty escrow contract so pots lock on create and can only pay the hunter (or refund on timeout) — not a hot wallet.
Tracked in in-app Docs → Upcoming. Mini-app ERC-20 sends still need the chain’s gas token (no Pay gas abstraction), so dual-currency ships with the contract + keeper path, not as a half-feature.
- React 19 + Vite
@nimiq/mini-app-sdk- GitHub OAuth (httpOnly session)
- Upstash Redis + Vercel serverless API
npm install
npm run dev -- --hostOpen the Network URL in Nimiq Pay (same Wi-Fi) for wallet actions. Desktop browser is browse + GitHub connect; real NIM needs Pay.
Frontend:
VITE_GITHUB_CLIENT_ID=
VITE_GITHUB_REDIRECT_URI=https://get-ransom.vercel.appServer (Vercel):
GITHUB_CLIENT_SECRET=
SESSION_SECRET=
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=https://nimpay.app/miniapps/open/get-ransom.vercel.app
MIT © 2026 Jr-kenny
Lamp true. Pots honest.