# retiqr — An alternative reticulum QR+HID interface

_Showcase · started by metrafonic on Fri, May 22, 2026 4:54 PM_

Tags: Tutorial, Showcase

---

## Original post

**metrafonic** · Fri, May 22, 2026 4:54 PM

# retiqr 

https://github.com/metrafonic/retiqr 

I have spent the last couple of days putting together a way to connect to the reticulum network in situations where the only way to access the internet is via some form of internet kiosk. So no wifi, ethernet etc. 

retiqr allows you to access the network by bridging a TCP connection via the kiosk browser. Packets are received by your device by visually observing incomming packets encoded as QR codes on the screen. These are decoded and sent to your local rns instance. Packets are transmitted back via an emulated keyboard on an ESP32S3 connected to the kiosk USB port (linked to us via BLE). 

Typical throughput: ~3 kB/s down (QR), ~500 B/s up (HID). Enough for messaging and Nomad Network.

Let me know what you think! Open to feature requests.

Also check out my [guide on running reticulum over DNS](https://github.com/markqvist/Reticulum/discussions/1002) (captive portal situations etc)

---

## Reply 1

**Mark** · Fri, May 22, 2026 5:07 PM

Holy cow. *This* is pretty danged cool. What an awesome, and surprisingly effective idea metrafonic :)

Love the name as well :)

---

## Reply 2

**Mark** · Fri, May 22, 2026 5:11 PM

It would be awesome to have the camera part running on the ESP32 as well. Not sure if it's fast enough to do the actual QR decoding in real-time, but at least it could just forward to captured images to the host for QR decode there. Then again, QR decode is not too expensive, if I remember correctly, so could probably be done. Then you'd have a self-contained dongle that's easy to place in front of the screen, plugged into the USB port, acting as a full bridge to Reticulum.

---

## Reply 3

**metrafonic** · Fri, May 22, 2026 5:20 PM

**Mark** wrote:
> It would be awesome to have the camera part running on the ESP32 as well. Not sure if it&#039;s fast enough to do the actual QR decoding in real-time, but at least it could just forward to captured images to the host for QR decode there. Then again, QR decode is not too expensive, if I remember correctly, so could probably be done. Then you&#039;d have a self-contained dongle that&#039;s easy to place in front of the screen, plugged into the USB port, acting as a full bridge to Reticulum.

Thats a great idea! Initially my idea was to use components that people have at home. But i realise now that most people dont have an esp32s3 at home haha, so might as well go for one with a camera! That would be a super smooth setup! Could even try to make it piggyback on the ble interface torlando created.

---

## Reply 4

**Yule Cat** · Fri, May 22, 2026 9:47 PM

Damn, what a sick idea. I absolutely love these sorts of off-the-wall projects. Bookmarked for sure.

---

## Reply 5

**KenAKAFrosty** · Sat, May 23, 2026 2:48 AM

oh DANG this is really really clever!! That reminds of something adjacent rolling around in the back of my head. I'm gonna clone it and see if I can't hack a lil something, will report back the outcome regardless 🫡

---

## Reply 6

**Mark** · Sat, May 23, 2026 12:40 PM

Saw your RRC appearance through retiqr. That was just a great moment to behold :)

---

## Reply 7

**KenAKAFrosty** · Sat, May 23, 2026 6:24 PM

oh man I got COMPLETELY nerdsniped by this and went down a few paths haha, let me share:


Core idea: There's a WebHID API in browsers. If you look at caniuse (https://caniuse.com/?search=webhid) it looks a little grim, but I thought, "Most Kiosks in the wild are probably running Windows, and therefore very likely to be running either Chrome or Edge, both of which are where support is quite good!".  I figured if you can get through via USB with the HID trick in the first place, then the same kiosk is likely to allow the browser API too.

Three benefits: much higher bandwidth becomes possible, it's a bit more discrete (someone looking over your shoulder wouldn't see a bunch of QR codes. Not a huge deal but just something to note), and the consuming device doens't need a camera anymore either.

Now, because of conditional WebHID support, and quite frankly because the standard QR mode is *WAY cooler*, the thought was just to provide this as an optional mode to activate via the web page, especially since you need to approve the web page permission dialog for the WebHID anyway.


Got that working on Chrome for my Linux laptop (Chromium from snap didn't play well, but that's not really the target here). Couldn't help myself as I got into the optimziation flow, and got to a point where it was delivering ~300 Kbps goodput, basically bottlenecked by BLE instead. 

I saw 300Kbps on a 1M PHY and figured "yeah that's probably near the reaosnable limit".  I was about to get that wrapped up and then report back here.... but another thought popped into my head that I couldn't push out: 

"Wait, if bluetooth is the bottleneck, couldn't we switch to running this as a WiFi AP? Same 2.4 band, should work great. With any luck, the USB will become the new bottleneck".  esp32-s3 is full-speed USB which IIRC is like 10 Mbps PHY but practically probably 4-6Mbps, still a huge step function. Or, worst case, WebHID will have some througput limit and that's our hard ceiling. Worth the test.

I'm assuming something key: In a situation where you'd be doing this anyway, your wifi is probably *not* being used (if you had a valid AP to connect to with internet connectivity, you'd just use that instead of doing all this). So it seems very well aligned.

AFter sleeping on it, also realized, "maybe Wifi AP would be a really nice convenience factor even in the standard QR mode. We could just connect to our own sovereign little AP, which might make it even more accessible (no desktop BLE client, just a tcp connection). Might be a nice bonus regardless of the fast mode stuff".  


Alas, it was indeed WebHID as the hard ceiling, but WiFi AP mode can still get roughly 1.5x the goodput up to that ceiling, which is ~450Kbps


Gonna stop here for now or I'll end up losing weeks to this lmao, but this was such a fun exploration! I'll be sending over a PR, probably later today. If this is just purely antithetical to the project, by all means you can toss it all, no worries. But still wanted to give you that option.


Similar AI Disclosure as you: I'm also a dev by trade, similar YoE, and also used AI tooling throughout this.



PS: I could probably swing a lil dedicated server to run the backend side for the community to tinker with too, if you want. Just let me know!



**tl;dr:  Two new modes. For the transport mode, standrd qr or fast. For the user-side link, BLE or WiFi AP.  ~300 Kbps goodput in fast + BLE, ~450 Kbps in fast + WiFiAP.   Preparing PR and expect to have it submitted at some point today. Screenshot of using it on my machine: https://i.postimg.cc/0jKvB1f4/Screenshot-from-2026-05-23-13-16-21.png**

---

## Reply 8

**KenAKAFrosty** · Sat, May 23, 2026 11:20 PM

Holy cow I'm happy with how this has come along (just couldn't help myself, had to add a little more).   I have some more to share which I think everyone here will really like! But just to bury the lede for a moment, I also want to make sure image uploads work correctly here real fast before I write up the rest. So to tease it a bit as well as test: ![PXL_20260523_223558264.NIGHT.webp](/storage/forum/FSL3KLBInCP19uXnTfAufF1ptmgsiTA0fevd4n1j.webp)

---

## Reply 9

**KenAKAFrosty** · Sat, May 23, 2026 11:28 PM

Alright! so as you can see, the web page allows you to configure the dongle as well. You can flip between bluetooth and wifi, and on wifi set the ssid and password to your choosing. (Note right now this is still designed for single-session links; I'm noting that in the PR for high value future work to make it multi-client, so everyone in the area can benefit if they know the creds!). 

First up, showing that I see that valid hotspot on my phone, there it is! 'flybywifi' according to my settings on the web page.
![PXL_20260523_223637932.webp](/storage/forum/4meIyiUNVOsEnLzSLWHqyQ8EmMz2paIPADTzBBJu.webp)

And showing/proving it's not a real wifi connection, no internet. (Also note if any of you do this, make sure to  check the box and say yes; won't work until you do). 
 ![PXL_20260523_224311326.MP.webp](/storage/forum/AgU8YI65aVJj9nvRtHrQVh7as9vxukAtLEaHnwna.webp)


With that all set up, I opened up the fantastic Columba app and added a TCP client as normal

![PXL_20260523_224040637.MP.webp](/storage/forum/tuWU7cUmaGHTMiAqRR7ZSkEnad6lEsRSgwtxsD8x.webp)


The host and port are still hard-set for now, to these values
![PXL_20260523_224122461.MP.webp](/storage/forum/UXbkuV9F8kVSU4FgEkRxvS6DyGd3XGk0a0aQNfb4.webp)

Here you can see it's active, and it's the only interface active
![PXL_20260523_224152856.webp](/storage/forum/V70XAGB03CQqXDvSMcwIyrSRH1Ad75MlUhp86DCp.webp)


First moment of truth... before /after hitting announce: 
![PXL_20260523_224432053.webp](/storage/forum/kSudEqyOyGJCcXUD80hnO13DD00elxyejlhAa9wE.webp)

![PXL_20260523_224554593.webp](/storage/forum/Lqkt8GPwBM149MZZIOzWE4sacUmTf21K6qYMqKLH.webp)

There it is! Data's flowing from my phone! 


(Will continue; trying to keep these messages broken up in case too many image uploads cause issues)

---

## Reply 10

**KenAKAFrosty** · Sat, May 23, 2026 11:33 PM

Oh sorry short sidebar to clarify my setup: I have a powered USB hub, the red cable is the one connected to my Heltec V4, which is my would-otherwise-be-RNode-but-is-flashed-for-this. so that USB link is what's talking to the WebHID interface and the onboard S3 is running the AP (sorry sx1262, you get to rest for now).  

![PXL_20260523_225527970.webp](/storage/forum/swtYxas13KuP0Qq5B8meR2LGnkM5Pf0Jatk3e7fb.webp)

![PXL_20260523_225509666.webp](/storage/forum/RpU1saN1lLzfPbhNeQ1t3ooZHp554wzn4YWiCIIG.webp)

---

## Reply 11

**KenAKAFrosty** · Sat, May 23, 2026 11:39 PM

Ok back to the fun stuff. With Reticulum now running on my laptop, with only the local socket listening to the web server from retiQR, the two should be able to talk. And sure enogh, there's two announces flowing in the data, and you can see the Sideband app on my Laptop sees the announce (another before/after): 
![PXL_20260523_225543888.MP.webp](/storage/forum/uMnd1aALTKQ6mWI5QDszYoYsmCD9Vl0gyfOWjegR.webp)

![PXL_20260523_225548908.MP.webp](/storage/forum/4MY9VGC5YrRB2aNuHQkrMxJfJM7MDI7hcP2DP0yC.webp)


To isolate the other side real quick, here's sideband firing an announce and the green rx side showing hte data hit.  

![PXL_20260523_225656014.webp](/storage/forum/VppUzCFQOQWvsceFegrb45n8PU7DE26nGYfAw8SO.webp)


And here's Columba showing the announce!

![PXL_20260523_225707440.MP.webp](/storage/forum/sE9IiUXVoke0sUePSbfg0RMYbhyvLqe9spJoJQub.webp)

Alright, smoke test is good, concept proven. Now the fun part: moving some real data over this thing (coming in next post)

---

## Reply 12

**KenAKAFrosty** · Sat, May 23, 2026 11:51 PM

Clean convo history for clarity. Before:

![PXL_20260523_225758699.webp](/storage/forum/hAko9FcnlnnPs7hTZXSj95Asrd2rzmXRDHqwGh8r.webp)

After:
![PXL_20260523_225805763.MP.webp](/storage/forum/rDSagGkzgaksZfwq8PBdWmOB5218VwLY4ewED7Ar.webp)
![PXL_20260523_225815577.webp](/storage/forum/BXGtkrTs7aM52qD4VNQ4r71PLwaTvqUUXhmrg7a3.webp)

Messages sending! I figure we ought to see some larger data move though, to help show the bandwidth we're working with here: 
![PXL_20260523_225913916.webp](/storage/forum/AQpyqFeBBb3IFwQ6DwR1gZw25k9iMyP2drpPd69G.webp)

(note the displayed bitrate above wasn't really the complete picture yet because we only sent a short text. Remember that, I'll come back to that in a sec). Anyhoo, latest picture was of my washer, so I figured it's as good as any to fire over
![PXL_20260523_225926467.webp](/storage/forum/d2EbQ43Fnf6XlhdFMmonEy78bhq9b5o1cSAKStRe.webp)

Success!!!! A nice medium quality image firing over what felt like effectively immediately, from when I hit send to when it showed on the laptop's Sideband. 

Also here was a `cat` of my reticulum config, showing the settings and also showign/proving it was the only live interface ![PXL_20260523_230023075.webp](/storage/forum/83qi36uuLc5AyuSo0o7UaHtbzBiXE4wTeoEmK7OZ.webp)



I figured let's push it a bit, so I bumped the quality up to send it again. PLUS, note here how now the bitrate shows our real effective limit after that first image sent ![PXL_20260523_230208270.webp](/storage/forum/NSXfTJeJhNUNRtQEIHnmRduewVMLU9tqGtoKuye0.webp)

Just showing the size before send, ~330KB. 

![PXL_20260523_230220567.MP.webp](/storage/forum/bmdHyliARYxh6vcscrqIZUvZeeF9GEUzhAtIuXbR.webp)

So this one took the ~10 seconds it estimated.

Then, after compltion, the confirmation it all sent, plus the data bars in the background showing all that time it occupied (and the asymmetry where one side is sending a large file and one isn't)
![PXL_20260523_230232550.webp](/storage/forum/MMTiBKLNaS8UQfHZN2gHhUAutFzoiOSB8A04hOCe.webp)



Including this one as well just to clearly see some of metrics showing on the page

![PXL_20260523_230241955.webp](/storage/forum/3kHCKg4QMu3PzbfqL8Vp7IH2Sw0nAeHSMVOTY73p.webp)





Then with my laptop as a transport node, I connected to a few community gateways, and now you can see Columba on my phone showing those distant announces now

![PXL_20260523_230553295.webp](/storage/forum/XisPgaKzyqJC0B8IgtvR83VmmoOedkiileQprTMd.webp)





Here's the interfaces again and some more announces: 
![PXL_20260523_230803292.MP.webp](/storage/forum/Ho4nv8Jd2TWJ4WCGU5k4eBXV3ujlnPKjKWUVBJwl.webp)



To wrap this up, I fired an announce out there on those community nets; if you saw "Ken a.k.a. Frosty" then that was me! (LXMF destination hash a6ac...62a2). Feel free to say hey, I'll leave this up and running for a little while now. 


Thanks for letting me flood this thread for a moment. This was cool as hell to work on. THanks again to metrafonic for such an AWESOME idea and a great baseline to build on. I'll get that PR over to ya shortly

---

## Reply 13

**KenAKAFrosty** · Sun, May 24, 2026 12:19 AM

OH, quick followup! The fast mode can be toggled on/off and even in realtime. You can see here where I turn it off, then the general flow (with the cool as hell QR code system flowing behind it as everything stays connected)

![PXL_20260524_001221002.MP.webp](/storage/forum/Bzk5BchrgmwSrWMRaGYczyKg7qW2liGBBwcnS0I1.webp)


![PXL_20260524_001237195.MP.webp](/storage/forum/MLWm5hXc9BYoZF3T6IAUf99QpcNFKkTcLUsZj8fM.webp)


![PXL_20260524_001243284.MP.webp](/storage/forum/NUHTBE0qlmeWayglSzwKF3WhhSBs0CkpOM6QFXXk.webp)




Then finally just showing now I've approved the dialog and switched back to fast mode, it keeps goin. 

![PXL_20260524_001303788.webp](/storage/forum/nBUjjkH8RuLemy3upgZjdDqIsucDrn4WqaDFBIni.webp)

---

## Reply 14

**KenAKAFrosty** · Sun, May 24, 2026 1:19 AM

PR submitted! available here: https://github.com/metrafonic/retiqr/pull/1

---

## Reply 15

**KenAKAFrosty** · Sun, May 24, 2026 2:44 AM

Okay lmao I - yet again - couldn't help myself. Got a little deploy running with this.  Anyone can grab the firmware from my fork/PR if you want to try it fully. But even if not, you'll still get a nice "visual downlink" of QR codes flowing through: 

https://retiqr.up.railway.app/

It's pointed at spicy.hellfirehacking.club:4242 just because it had good reliability and recency based on https://rns.wirebase.org/  

If there's a better or more preferred node just lemme know!

PS: Also made it a template on Railway, so anyone else can deploy one pretty quick and easy. Bus factor, and all that.  (right now it's pointed to my fork & branch, but if PR is merged I'll point it back at upstream)

https://railway.com/deploy/6hrAMZ

---

## Reply 16

**metrafonic** · Sun, May 24, 2026 7:49 AM

Hey @KenAKAFrosty
What a great idea with the WebHID fast mode! I also really love the wifi connection part, as now we have a way to make it work without a client side app, just a simple TCP setup making phone setups work too!

Ive also been thinking about changes on the gateway side. If it is possible to let the user choose which reticulum tcp endpoint they want to uplink to, instead of having it set at startup. Im thinking of starting with a dropdown of predefined server-port combos first as there are some security concerns in allowing the bridge to connect to _anything_.

I am eager to merge in your changes. I think having a toolbox of multiple ways to connect is a killer feature!
Ill do some testing today and hopefully get it done by the end of the day (European time).

I also think a public online instance is a good idea. I was thinking of running it on an oracle free-tier instance i have, but if you have other good hosting alternatives we can look at that too. If you are comfortable with it then i could add your current link as a demo link on the main readme so people can try it out.

Again, awesome work! I love how fast we can go from idea to implementation.

---

## Reply 17

**KenAKAFrosty** · Sun, May 24, 2026 8:06 PM

**metrafonic** wrote:
> Hey @KenAKAFrosty
> What a great idea with the WebHID fast mode! I also really love the wifi connection part, as now we have a way to make it work without a client side app, just a simple TCP setup making phone setups work too!
> 
> Ive also been thinking about changes on the gateway side. If it is possible to let the user choose which reticulum tcp endpoint they want to uplink to, instead of having it set at startup. Im thinking of starting with a dropdown of predefined server-port combos first as there are some security concerns in allowing the bridge to connect to _anything_.
> 
> I am eager to merge in your changes. I think having a toolbox of multiple ways to connect is a killer feature!
> Ill do some testing today and hopefully get it done by the end of the day (European time).
> 
> I also think a public online instance is a good idea. I was thinking of running it on an oracle free-tier instance i have, but if you have other good hosting alternatives we can look at that too. If you are comfortable with it then i could add your current link as a demo link on the main readme so people can try it out.
> 
> Again, awesome work! I love how fast we can go from idea to implementation.

Thanks for the kind words! I'm sure there will need to be some tweaks and fixes still, this is just a starting point for all of us to work off of, so I appreciate your being so receptive to it!

As for putting the link as a demo on the main README: absolutely! Good thinkin. You can also include this snippet: `[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/6hrAMZ)` 
which looks like this:
[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/6hrAMZ)

to also make it really easy for others to spin this up (resiliency in mind).

---
