Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added public/img/pos-demo.mov
Binary file not shown.
54 changes: 54 additions & 0 deletions public/img/user-logos/paycode.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
105 changes: 105 additions & 0 deletions src/app/blog/paycode/page.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { BlogPostLayout } from '@/components/BlogPostLayout'

export const post = {
draft: true,
author: '',
date: '2026-03-26',
title: 'iroh for payments',
description:
'How Paycode used iroh to connect payment terminals to point of sale systems at highway toll booths, with no additional servers and full compliance.',
}

export const metadata = {
title: post.title,
description: post.description,
openGraph: {
title: post.title,
description: post.description,
images: [{
url: `/api/og?title=Blog&subtitle=${post.title}`,
width: 1200,
height: 630,
alt: post.title,
type: 'image/png',
}],
type: 'article'
}
}

export default (props) => <BlogPostLayout article={post} {...props} />

When people think about next generation payment infrastructure, they usually
think fancy iPads, flashy apps, Bluetooth, and paperless receipts. But the
reality for most of the world is more humble. You’re more likely to be
presented with Windows 7, proprietary printers, and ethernet cables.

In this blog post, we highlight PayCode, a team deploying iroh in remote
environments in Mexico. Their most recent project involved connecting payment
terminals and point of sale systems to bring tap-to-pay technology to highway
toll booths. They needed a way for highway toll software to talk directly to the
point of sale devices, so the cashier can create a charge, pass the device to
the user in the car/truck, and receive the payment.

Their work offers a compelling look at what it takes to modernize legacy systems
to reduce cloud costs and improve connectivity & reliability, without replacing
old hardware.
Why peer to peer payments?

Paying for things can be frustrating if technology breaks. Slow or inoperable
point of sale systems can cause massive delays, lines, and ultimately lost
revenue. Connectivity at all times isn’t always guaranteed, especially for
mobile devices that move out of range of access points or move in and out of
cellular dead zones, or if the cloud service is down. Every second saved at the
point of sale people can get on with their lives instead of waiting for the
loading spinner. There are many ways to solve connectivity issues, including
adding a server to the local WiFi network that brokers data flow between
devices, using a classic HTTP server or MQTT.

However, this server/broker-based approach can be expensive to maintain in the
long term, by requiring more on-site hardware as well as on-the-ground
technicians to service that hardware. Additionally, the original problem never
fully goes away: the central point of failure just shifts from the cloud to the
local server. In contrast, with peer-to-peer connectivity, no server is needed.
The payment terminal syncs encrypted payloads directly between the point of sale
device and payment devices directly. One of the most critical requirements for
PCI-compliant payment systems is that the raw payment data can never flow
through anything other than the official compliant software. In this way,
peer-to-peer connections can act as a blind command and control channel between
devices; the raw payment data remains on the payment terminal, and any resulting
transaction data is encrypted into a secure payload before being sent off the
payment device to other non-compliant devices. This separation ensures that even
as connectivity improves, compliance and security boundaries remain intact.

### Legacy Hardware, Modern Protocols

PayCode is one example of a digital transformation company that chooses iroh to implement peer-to-peer connectivity between devices in the field — payment terminals, point of sale systems, and highway toll software. Existing constraints on hardware and budget made server-based options impossible, so a peer-to-peer approach was the only way forward. The environment itself is far from modern:
- Touch-based Windows 7 machines
- Dual-core Intel CPUs with up to 8GB of RAM
- A mix of Ethernet (on terminals) and Wi-Fi (across the tollway system)

Despite these constraints, the team successfully integrated iroh by bundling the rust library inside a .NET 6 SDK.

Quote box> “iroh was super easy to use… I started hacking and was able to integrate it into our Kotlin PoS app and have a published .NET NuGet package for our client to use in that month.”

### How it works

A terminal scans the QR code, registers the remote node as a static provider, and establishes a connection through gossip-based discovery.

Each QR code encodes an “iroh ticket,” which contains the endpoint information needed to connect to a remote node. A terminal scans the QR code, registers the remote node as a static provider, and establishes a connection through gossip-based discovery.

The terminal is then able to receive commands and send information back through the gossip channel. One such command is the start transaction request: the terminal receives the data required to charge the user, executes the transaction within the PCI-compliant flow, and then sends the outcome back through the channel.

Because the communication is direct between devices, transactions avoid unnecessary intermediaries, which reduces latency and makes the process highly reliable. At the same time since all data is end-to-end encrypted we ensure that even the most sensitive data remains protected throughout the entire transaction lifecycle.

### Final thoughts

This deployment highlights something important: innovation doesn’t always happen
in greenfield environments. In many cases, the most impactful innovation happens
when you can modernize legacy systems to reduce cloud costs and improve
connectivity & reliability, without replacing old hardware. This is why it's so
important to have tools like iroh that can work on any device, and why we built
iroh to be flexible enough to meet the needs of a wide range of use cases, from
cutting-edge applications to legacy modernization projects like this one. We’re
excited to see what other creative solutions teams will build with iroh in the
future!

11 changes: 11 additions & 0 deletions src/app/page.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,17 @@ export default function Page() {
</div>
</div>
</Link>
<Link href="/solutions/pos" className="block">
<div className="grid md:grid-cols-3 gap-6 items-center p-6 border border-irohGray-300 dark:border-irohGray-700 rounded-lg hover:border-irohPurple-500 transition-colors">
<div className="md:col-span-2">
<p className="text-xl font-medium text-irohGray-800 dark:text-irohGray-100 mb-2">Point of Sale Payments</p>
<p className="text-irohGray-600 dark:text-irohGray-300">Connect payment terminals directly to point of sale systems over Bluetooth, LAN, or Wi-Fi with full PCI compliance and no additional servers.</p>
</div>
<div className="flex items-center justify-center">
<img src="/img/user-logos/paycode.svg" alt="Paycode logo" className="object-contain max-h-16" />
</div>
</div>
</Link>
</div>
</section>

Expand Down
29 changes: 21 additions & 8 deletions src/app/solutions/page.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@ const solutions = [
href: "/solutions/delta-chat",
logo: "delta_chat",
},
{
category: "Payments / Point of Sale",
company: "Payments",
headline: "PCI-Compliant Peer-to-Peer Payments",
description: "Connect payment terminals directly to point of sale systems with no additional servers and full PCI compliance.",
href: "/solutions/pos",
logo: "paycode",
logoExt: "svg",
},
]

export default function SolutionsPage() {
Expand Down Expand Up @@ -72,14 +81,18 @@ export default function SolutionsPage() {
</p>
</div>
<div className="flex items-center justify-center p-8">
<ThemeImage
alt={`${solution.company} logo`}
darkSrc={`/img/user-logos/${solution.logo}.png`}
lightSrc={`/img/user-logos/${solution.logo}.png`}
width={300}
height={150}
className="object-contain max-h-32"
/>
{solution.logo ? (
<ThemeImage
alt={`${solution.company} logo`}
darkSrc={`/img/user-logos/${solution.logo}.${solution.logoExt || 'png'}`}
lightSrc={`/img/user-logos/${solution.logo}.${solution.logoExt || 'png'}`}
width={300}
height={150}
className="object-contain max-h-32"
/>
) : (
<p className="text-4xl font-bold text-irohGray-300 dark:text-irohGray-600">{solution.company}</p>
)}
</div>
</div>
</Link>
Expand Down
Loading
Loading