Tap into trust

Tap. Pay. Done.

A Stellar wallet you pay with by tapping an NFC card. Each card gets its own x402 agent that signs the tap — no unlock, no app, no confirmation.

Beta 1.0.0 · Stellar Testnet · Android APK · Release notes · Google Play coming soon

Settlement
~5s ledgers
Network
Stellar
Contracts
3 on Soroban

Paying should be invisible. Noir debits the moment your tag touches the terminal — built for transit turnstiles, campus canteens, event gates and retail checkout, where every second in the queue counts.

  • No app to open
  • No screen to unlock
  • No confirmation to tap

How it works

From tap to settlement in three steps.

  1. 01

    Link a card

    Hold an NFC card, sticker or wearable to your phone and sign once. Soroban’s device_registry records its hashed ID against your wallet.

  2. 02

    Set its agent and fund it

    Each card gets an agent key with a policy you sign: one asset, a per-payment cap and an optional expiry. Fund its escrow; your main balance stays untouched.

  3. 03

    Tap

    payment_escrow.authorize checks the policy on-chain and moves funds to the merchant, who claims in batch. Stellar confirms in seconds.

Features

Built for zero-friction commerce.

Open contracts, self-custody and sub-cent fees — without asking anyone to change how they pay.

  • Zero-interaction payments

    Tap an NFC card, sticker or wearable (NTAG213) to pay. No unlock required.

  • x402 tap-to-pay

    The tap carries an x402 payment request; the card’s agent signs it and the escrow contract settles it.

  • Constrained agents

    One agent per card, limited on-chain to one asset, a per-payment cap and an optional expiry.

  • Three Soroban contracts

    device_registry, agent_registry and payment_escrow — open, MIT-licensed, on Testnet.

  • Self-custody

    Owners sign their own registrations and policies via require_auth. Keys never leave the phone.

  • Built to integrate

    TypeScript SDK, REST API with API keys, and signed webhooks for every on-chain event.

Security

Simple to use. Robust by design.

Lose a tag and unlink it — the agent loses its authority and the card’s escrow returns to your wallet.

  • Hashed device identity

    Tag UIDs are SHA-256 hashed on the phone. Only the hash is ever written on-chain.

  • Blast-radius limits

    A card can only spend its own escrow, within its cap, asset and expiry — never your main funds.

  • Replay protection

    Every authorization carries a strictly increasing nonce; the contract rejects duplicates.

  • Encrypted on the phone

    Wallet keys are sealed behind your wallet password; phone unlock is opt-in. Backups are disabled.

  • Scoped API keys

    The Noir API stores only key hashes, scopes each key, rate-limits it, and never holds signing keys.

Architecture

Hardware tap to on-chain settlement.

  1. 01

    Tag

    NTAG213 card, sticker or wearable

  2. 02

    Phone

    Reads the tag and SHA-256 hashes its UID

  3. 03

    Soroban contracts

    device_registry
    Binds the SHA-256 hash of an NFC tag to the wallet that owns it.
    agent_registry
    Stores each device’s agent policy: which key may spend, which asset, how much per payment, until when.
    payment_escrow
    Holds each device’s pre-funded balance; authorizes taps within policy and lets merchants claim in batch.
  4. 04

    Stellar

    Consensus and settlement in seconds

  5. 05

    Merchant

    Batch claim of everything pending

Function-level reference and live Testnet IDs: Contracts documentation.

Developers

Accept Noir taps in your app.

Everything the wallet does is open on-chain. Use the SDK from JavaScript, or call the REST API from any language with an API key.

checkout.ts
import { NoirAgentClient } from '@noir-wallet/agent-sdk'

const noir = new NoirAgentClient() // Stellar Testnet

const check = await noir.checkPayment({ deviceHash, agent, asset, amount: 10_000_000n })
if (check.ok) await noir.authorizePayment({ agent: agentSigner, deviceHash, merchant, asset, amount: 10_000_000n })

Five-minute quickstart · Source on GitHub

Compared

What a card tap can’t do.

Every venue that hates checkout queues — transit, canteens, event gates, retail — is a Noir venue.

FeatureEMV tapPhone walletNoir
No phone unlock neededYes—Yes
Self-custody of funds——Yes
Sub-cent transaction fees——Yes
Stickers and wearables——Yes
Per-device on-chain limits——Yes
Open smart contracts + API——Yes

Demo

Watch it tap and go.

Two minutes on the ground: the x402 tap-to-pay flow, per-device agents and the full app.

Watch the original demo on X

FAQ

Questions, answered.

What is Noir?

Noir is an open-source Stellar wallet for Android that lets you pay by tapping an NFC card, sticker or wearable. Each linked card is bound to a payment agent with on-chain limits, so a tap can pay without unlocking your phone.

What happens if I lose a card?

Revoke it from the app. The agent stops being able to spend immediately, and the card’s remaining escrow is returned to your main wallet. A card can never spend more than its per-payment cap, in its one asset, before its expiry.

Can other apps accept Noir payments?

Yes. The TypeScript SDK (@noir-wallet/agent-sdk) and the self-hostable REST API with API keys let any app read card policies, check a payment, run tap-to-pay, and receive signed webhooks.

Is Noir on mainnet?

Not yet. Noir runs on Stellar Testnet as a reference implementation funded by the Stellar Community Fund. Contracts, app and SDK are MIT-licensed.

Stack

  • Stellar
  • Soroban · Rust
  • React Native
  • Expo
  • TypeScript
  • NativeWind
  • Zustand
  • @stellar/stellar-sdk
  • react-native-nfc-manager
  • Vitest
  • Next.js

Team

  • Richie Christian De GuzmanFullstack developer
  • Johnrick RabaraBackend developer
  • Jefferson TuparanUI/UX designer

A world where paying is invisible.

Your wallet is your identity. Payments happen without friction. Settlement is instant.

Download for AndroidGoogle Play · Coming soonExplore the repo

Beta 1.0.0 · Stellar Testnet · Android APK · Release notes

View the pitch deck