

That is a fenomenal idea! I hadn’t thought about it and these are the exact kind of situations it could solve well. I’ll definitely add it to the roadmap. Thank you


That is a fenomenal idea! I hadn’t thought about it and these are the exact kind of situations it could solve well. I’ll definitely add it to the roadmap. Thank you


Yes, over the years I’ve tried many solutions. The latest popular one being Decimen and others mentioned in the readme.
Since it seems you are interested in the field I’d be very happy if you tried it and told me how it compares to the rest. blastQR is still a work in progress so any feedback would be very helpful!
A web UI is also possible. I’m not working on it right now but it’s something the project should support in the future.


You bring up great points!
Here are some benchmarks including videos (Note that these are best case conditions but should be achievable): https://codeberg.org/blast/blastqr#real-world-benchmarks
Most of the testing I did with my now 7 years old Galaxy S10e. It only scans at 30FPS but it can handle 6 codes at once which is a pretty decent 420 kB/s. During testing on the iPhone 17 which can scan at 60 or 120fps I think the CPU did not become the bottleneck until around 8 codes at more than 90fps. That is something I still need to test and document more thoroughly though.
I do use standard QR codes. By default Version 40 which can store almost 3 KB. It is configurable in the app’s settings.
Regarding color, libcimbar (https://github.com/sz3/libcimbar) is a project that does exactly that although the speeds are not quite as high yet. Additionally, one of the cpu optimizations in blastQR (and qr scanners in general) is to drop color so that each frame that gets copied in memory is smaller. It makes a difference when you’re processing at high fps.


The app is limited to 6 right now but I’ll work on increasing it! The CLI tool does allows up to 12. Make sure you use Ghostty or Kitty for high frame rates if you do decide to try it.
A lot of phones cap the camera preview at 30fps actually so 60fps is quite good already. From the devices I tested only the iPhone let me select 60,120,240. You can see some benchmarks here: https://codeberg.org/blast/blastqr#real-world-benchmarks I don’t think you are missing out on performance if you can scan at 60fps. I recall at 120 the cpu was starting to be the bottleneck but I’ll have to do some more testing to confirm.


Some of the use cases I thought about:
Hopefully people will find new and interesting use cases for it too.


Thank you for the suggestion!
dev.blastapps.blastqr 60:E3:A6:C0:63:1D:C3:A0:0C:78:E4:C9:E4:89:B3:03:4F:A9:7D:49:D0:B9:3E:CF:56:B2:33:A8:C3:DD:F6:83
it’s been added to the readme as well.


As explained in the readme you should enable password encryption when transferring sensitive data. I’m not claiming the program itself is air-gapped, just that transferring files between air-gapped systems is a legitimate use case.


You can tweak the FPS from the send page UI. it’s set to 25 fps by default for broader compatibility (most devices capture at 30fps) but if you have a more powerful device they can capture at 60 or 120fps and you can adjust the sender accordingly. Each frame carries around 3kB of data per frame (with the default settings) so at 25fps that’s 75kB/s. You can multiply the speed by showing more than one code. So two codes would give you 150kB/s
The completion tone is optional. It basically just tells the sender that it can stop and t’s more for convenience. I want to expand it in the future so the receiver tells the sender what FPS to send at through sound tones.
Regarding large files it can take a long time yes! The app includes lossy compression turned on by default when you send pictures or videos (similar to what all chat apps do) so it can send those quite fast. With default settings and showing 2 codes it can send 5 pictures in around 10 seconds for example or a 2MB video in the same time.


Yes, absolutely! anyone who can capture the QR codes could reconstruct the data. That’s why blastQR also lets you password encrypt any transfer. It depends on your usecase. You might not care if you’re already intentionally publicly broadcasting to multiple devices.
Air-gapping refers to network isolation not necessarily confidentiality. It means you can transfer data to and from devices that are completely disconnected from any network.


Indeed but nowhere as fun ;)
it is most useful when you don’t want to connect anything or need to broadcast data to multiple devices simultaneously. For example transmitting info to multiple devices during a digital blackout where the government has cut off internet. Also useful for air-gapped systems!


I totally agree and I’m very open to welcome anyone who wants to rewrite that part or I might go for it myself in the future. The reason I went for it is that I really wanted to be able to use the CLI tool right away and the AI produced a good result so I left it in the project for now.
About Codeberg I did read their blog post and I didn’t think my project falls into any of the cases they mention:
Projects that are created by LLM “agents” in autonomous ways Projects written and maintained with heavy use of LLMs Projects where the amount of resources (e.g. storage, CI/CD) is significantly larger than what the involved amount of people could have created by hand Projects heavily tied to the LLM ecosystem, e.g. LLM-written tools to ease LLM usage Users sending LLM contributions in violation of project’s custom policies
If they ever consider it infringing their ToS I could move it to GitHub where there’s already a mirror of the repo.


The cool part is that codes are generated indefinitely so basically you can keep scanning until you receive the data. You don’t need to capture every frame or scan in any particular order.
This is made possible by raptorQ (https://github.com/cberner/raptorq) the fountain code encoding used by blastqr.
Feel free to try it out!


For context, I’m a software developer with around 15 years of experience. Most of it writing Android and iOS apps in Java, Kotlin, Swift and lately Dart (Flutter) + Rust which is what this project is written in.
Although I did start the project from scratch I have lately been using Claude Code as a coding assistant. I write code myself but I also let it write or refactor parts of it. The CLI tool is the part that Claude has mostly written from scratch because it’s not something I had experience in writing before. That being said I also review all the code that Claude writes.
Thanks for asking! there’s also some disclosure about this in the readme file
For those asking about RGB, there are a few reasons why QR codes work better for now:
You can already transfer entire (small) programs and media with blastQR btw! Feel free to try and report back. The limit is around 4 GB files but that would take ages.
That said, there is a project called libcimbar that is improving and does work with colors: https://github.com/sz3/libcimbar