I build payment infrastructure on Stellar / Soroban: x402 and MPP payment rails, service discovery, and non-custodial treasury automation. This account is the personal contributor identity behind three real projects — Periplo, Nirium, and Contextio — plus the upstream fixes and bug reports that came out of building them.
Most of my public work is either a protocol implementation I maintain or a bug I found in something I depend on and then sent a patch for. Everything below links to the actual issue, PR, or running service — no claim here that you can't click and check yourself. Where something is still open or unmerged, it's marked as such, not implied to be done.
Both cards are rendered live from the GitHub API by github-stats-extended, so the numbers move on their own rather than being typed in here (checked live 2026-08-31, still serving). Some caveats worth stating, since several of these figures look like they disagree and don't:
- The counts above include my own repositories. The tables further down count only repositories I don't own, so those numbers are smaller by design.
- Commits and contributions are different metrics. The card's Total Commits (last year) counts public commits only. The number on my GitHub profile page is the contribution total, which adds pull requests, issues and reviews on top of commits — and private-repo activity too, which GitHub lets you surface as a count without exposing the repositories. A much larger number there is the two metrics measuring different things, not an error in either.
- Contributed to (last year) on the card is a twelve-month count over every contribution type. The per-project tables below are all-time and count only repositories where I opened a PR or an issue.
- Language shares are measured across my non-forked repositories, not across every commit I've pushed somewhere else.
| Project | What it actually is |
|---|---|
| Periplo · periplo.xyz | An x402 payment facilitator for Stellar with a "Bazaar" discovery catalog, so an agent can find a payable service it has never seen before. Facilitator is live on stellar:testnet — GET /supported responds without setup. Apache-2.0, TypeScript + Soroban. |
| Nirium · nirium.xyz | Autonomous treasury and machine-to-machine payments on Stellar — Soroban contracts in Rust, an x402 + MPP payment layer, and MCP integration. Non-custodial: the client's wallet signs, or a scoped RebalanceManager role that by contract design can't withdraw or move funds; Nirium itself never holds a key that can. Apache-2.0. |
| nirium-sdk | The TypeScript and Python packages plus CLI behind Nirium — x402 pay/serve, MPP session budgets, IPFS audit anchoring. Also where Nirium runs its own GrantFox bounty program (see below). Apache-2.0. |
| Contextio · contextio.xyz | An AI agent that moves treasury and payroll funds for companies in Brazil, Argentina, and Colombia, binding every action to a verifiable Legal Context Protocol (LCP) document. Live on Stellar testnet (full autonomy) and mainnet (deliberately narrower: read-only data plus self-custody actions only, invitation-only while contracts await external audit). SEP-53 wallet sign-in. Originally a Stellar PULSO Hackathon submission, now aimed at the SCF Integration Track. Migrated from a personal repo to the contextio org. |
| nirium-pollar-adapter · npm | Adapter that lets a wallet onboarded through the Pollar SDK pay x402 requests and anchor audit receipts. Published to npm, running against Stellar mainnet. MIT. |
Snapshot below is a live re-check as of 2026-08-31; the search links at
the bottom always supersede it. Full first-hand narrative with transaction
hashes and reproduction steps lives in
Eras256/Periplo's own README.
| PR | Repo | Merged |
|---|---|---|
#3228 — scope EVM/SVM client signer derivation to the selected --families, fixing a crash in the official e2e conformance suite |
x402-foundation/x402 |
2026-08-31, by @phdargen. Closes #3187. An earlier attempt, #3219, was closed unmerged and superseded by this one. |
#103 — point ECOSYSTEM_CARDS copyValue at raw content, not GitHub's blob HTML page |
stellar/stellar-dev-skill |
2026-08-28, by @kaankacar |
| PR | Repo | Fixes |
|---|---|---|
| #3215 — derive one wildcard pattern per namespace, not one per registration | x402-foundation/x402 |
#3172 |
| #3138 — use the raw resource URL as canonical for opaque-origin schemes | x402-foundation/x402 |
#3121 |
#3098 — upto scheme implementation spec for Stellar |
x402-foundation/x402 |
#3097 |
| #1672 — walk every CAP-71 delegate node, not just the top level | stellar/js-stellar-sdk |
#1655. Blocked/mergeable pending review; nudged 2026-08-31 that this is no longer theoretical now that v17.0.0/v17.0.1 made CAP-71 v2 the default on both ends of the auth flow. |
| #844 — drop the Lazy-mode expiration check that validates the wrong value | OpenZeppelin/stellar-contracts |
#840 — this one is Nirium's, not Periplo's; see the Nirium section below |
| #97 — production patterns for x402 + MPP | stellar/stellar-dev-skill |
Nirium's, not Periplo's; see below |
#4960 — bump heck 0.3 → 0.5 to drop the unbounded edition2024 landmine |
otter-sec/anchor |
Unrelated dependency fix, not tied to either product |
- x402#3171 —
paymentRequirementsMatchAcceptedthrew on a missing/nullpayload.accepted. I found and reported it; the code fix was written by @JasonColapietro in #3180, merged 2026-08-17. The merged patch is his work, not mine — my part was the report. - x402#3270 —
HTTPFacilitatorClient.settle()/verify()decoded theEXTENSION-RESPONSESheader and then discarded it. I fixed this on Periplo's own side the same day rather than waiting on upstream. The finding then rippled into three independent upstream fixes, none written by me, all still open and unmerged as of 2026-08-31: #3278 (TypeScript, @Bartok9), #3301 (Go, @wnjoon), and PhilBot402/x402#4 (Python, draft, @PhilBot402, opened against a fork, not yet against the upstream repo). - eas-sdk#132 —
getUIDsFromAttestReceipttrusted logtopic0without checking the emitter address. Closed as completed. (General dependency finding, not tied to a specific product below.)
x402-foundation/x402 — #3121, #3148, #3169; stellar/js-stellar-sdk — #1681, #1683; OpenZeppelin/stellar-contracts — #839 (CAP-71 delegated auth trap hit while building Periplo's smart-account extension).
| Item | Repo | Status |
|---|---|---|
| #96 — add Nirium to community skills | stellar/stellar-dev-skill |
Merged 2026-08-15 |
| #97 — production patterns for x402 + MPP | stellar/stellar-dev-skill |
Open. An earlier version, #14, was closed unmerged and superseded by this one |
| #844 — fix(fee-abstraction): drop Lazy-mode expiration check that validates the wrong value | OpenZeppelin/stellar-contracts |
Open, fixes #840. Mergeable and CI-green since Aug 24; nudged for review 2026-08-31 |
| #47 — mainnet sponsor/relayer account silent 510+ hours | OpenZeppelin/relayer-plugin-x402-facilitator |
Open. As of 2026-08-31 this is three independent integrators (Nirium's own fee-payer, AgentPayments.fi, and NovaCorpAI) converging on the same finding from three directions, with no OZ response yet |
| #58 — allow an external SEP-43 signer instead of a raw secret key | stellar/stellar-mpp-sdk |
Open |
#30 — Nirium x402 adapter demo (apps/nirium) |
pollar-xyz/pollar-apps |
Open, awaiting Pollar's own review as of 2026-08-31 |
This is Nirium's own repo, so these are bounties Nirium posted, not upstream contributions Nirium made elsewhere. Full live audit as of 2026-08-31: 44 issues across three campaigns (Official Campaign, FWC26, Third Campaign). 42 of those are real bounty asks (the other 2 are unlabeled resource suggestions, not bounties). Of the 42 bounty asks:
- 20 delivered, each with a merged PR inside
nirium-sdkitself. - 2 delivered externally, as real PRs against the target repo, both still open and awaiting that project's own review: #75 → Fundable-Protocol/fundable-sdk#8 and #76 → wejoona/api#23. Both were opened by the same bounty contributor, @Santia2004 — not by this account.
- 4 were closed and administratively recreated under a later campaign, same ask, new issue number: #29→#43, #30→#44, #31→#45, #32→#46.
- 16 closed without any delivery.
A few of the stronger merged deliveries, cited by bounty issue alongside the PR that closed it, since that's better evidence than a bare PR link:
| Bounty issue | Delivering PR |
|---|---|
| #39 — harden the Python WebSocket signals client | #47, merged |
#44 — nirium CLI pay/serve commands |
#62, merged |
| #45 — resilient reconnecting WebSocket signals client | #61, merged |
| #51 — GitHub Action to verify a Nirium audit-CID in CI | #80, merged |
| #65 — audit trail forensic export bridge | #69, merged |
One more worth naming separately because it isn't a bounty at all: #81 was a real fail-open vulnerability in the Next.js x402 example (any X-PAYMENT header granted access, valid or not), reported by an outside party and fixed the same way as everything above — a merged PR, #84.
Separately, nirium-pollar-adapter#1 (deferred wallet funding) merged 2026-08-29, and nirium-sdk#68 (restore viem as a direct dependency) merged 2026-08-26 — both real fixes by this account, not bounty deliveries.
Contextio moved from a personal repo (Eras256/Contextio) to its own org,
contextio — Eras256/Contextio now resolves to
contextio/Contextio. The planner
logic behind its treasury/payroll rebalance decisions was extracted into a
separate private repo, contextio/contextio-agent-planner, consumed by the
main repo as a private git dependency.
Contextio also runs a bounty-style program, though not GrantFox-labeled
like Nirium's: five open issues in contextio/Contextio, all opened by this
account, none delivered yet —
#1 (Python client parity),
#2 (Go client parity),
#3 (standalone offline LCP
conformance verifier),
#4 (GitHub Action to
verify a published LCP document in CI), and
#5 (CONTRIBUTING.md).
Issue #5 already has two competing external submissions, both open and
unreviewed: #6 by
@mayankbohara0-dev and #7
by @CharoenwitKunna.
Upstream, to stellar/stellar-dev-skill (not owned by Contextio): three
merged PRs adding and refining the Contextio SDK's community-skill listing —
#98,
#101, and
#102, all merged
2026-08-15.
Beyond that, I found no upstream contribution from this account to any other external repo specifically for Contextio. Said plainly rather than padded: Contextio's public footprint on this account is its own repo plus that one skill listing, not a wider trail of dependency fixes the way Periplo and Nirium have.
Found using these libraries for one of the three projects above, but not clearly attributable to a single one:
- Creit-Tech/Stellar-Wallets-Kit#105 —
signMessage()'s JSDoc says SEP-43 hex, Freighter returns base64. Open. - foundry-rs/foundry#16209 —
cast wallet new <name>still fails with a bare account name. Open.
Protocols — x402, MPP (Charge and Channel), SEP-41 / SAC, SEP-43, SEP-53, CAP-71 delegated auth, MCP Chains — Stellar / Soroban primarily; some EVM and Solana work
- Small PRs, one root cause each, with the reproduction in the description.
- If I file a bug in a dependency, I try to open the fix alongside it when I can — #3187 → #3228, #840 → #844. When someone else beats me to the fix, I say so and name them — #3171 → #3180 by @JasonColapietro, #3270 → #3278/#3301/PhilBot402#4 by three other contributors.
- When I'm not sure whether it's my bug or theirs, I say so in the issue rather than asserting a diagnosis I can't back (#839 is an example).
- Every contract I ship is non-custodial by construction: the client signs, or a role that by contract design can't move funds — never a key of ours that can.
Snapshot above is accurate as of 2026-08-31; these always supersede it: all my PRs · all my issues · nirium-sdk's full bounty board · Contextio's open issues
Open an issue on any repo above, or start with periplo.xyz · nirium.xyz · contextio.xyz

