https://codeberg.org/blast/blastqr

Hello! I've been working on blastQR for a couple of years now and I thought this community might find it useful. Feel free to try it and ask me anything!

blastQR is a fully open-source file transfer app and protocol that works completely offline. You can even use it in airplane mode. Data is transferred through sequences of QR codes displayed on a sender device and scanned by a receiver device's camera. It uses RaptorQ codes so the receiver can recover the file from any sufficiently large subset of frames.

Note that although I have made use of AI as a coding assistant I do not consider this to be a vibe-coded app and I do plan to continue improving it and supporting it in the future.

See video of blastQR in action: https://github.com/user-attachments/assets/038a2567-70c8-47c8-b165-dea858d1aef3

Here are some of the key features:

  • Works fully offline: No internet, Wi-Fi, Bluetooth or servers. Your data stays offline.
  • One-to-many distribution: Share the same file with multiple devices simultaneously using a single blastQR broadcast.
  • Cross-platform: Android, iOS, macOS, Linux and Windows, plus a command-line tool that can send from a terminal, even over SSH.
  • Password encryption: You can optionally encrypt files with an auto-generated password or a custom one.
  • Media compression: The app supports lossy image compression and video transcoding for quicker transfers.
  • Multiple codes on screen: Shows multiple QR codes at once for higher speed. With 8 codes at 60 fps, transfers peak at around 1.4 MB/s.
  • Send multiple files in one go: They're zipped into one transfer and unpacked into separate files on the receiver.
  • Sound feedback: The receiver plays a short tone when it has the whole file, and the sender stops automatically when it hears it.
  • Start scanning at any point: No need to catch every code, just keep the camera on the screen until it's done. Blurry or missed codes don't matter.
  • Regular QR scanner: You can also scan normal QR codes and save them.
  • Open protocol that other apps can implement
  • Built-in file manager

I'm trying to build a small community around the project so it can be improved and maintained and so it can reach more people in the future.

Downloads for all platforms can be found here: https://codeberg.org/blast/blastqr/releases/latest

top 99 comments

sorted by: hot top controversial new old
[–] 33 points 20 hours ago (1 child)

So a fun use case you may not have considered is back country GPX sharing. A plugin for Osmand (a very popular FOSS mapping app for back country use) would be neat. Sharing when airplane mode between devices is always needed.

  • source
  • hideshow 1 child comment
  • [–] 29 points 22 hours ago (1 child)

    Is this the future version of holding two phones together to transmit files via infrared?

  • source
  • hideshow 1 child comment
  • [–] 42 points 1 day ago (4 children)

    Note that although I have made use of AI as a coding assistant this is not a vibe-coded app

    Can you elaborate more on how AI was used?

  • source
  • hideshow 4 child comments
  • [–] [S] 93 points 1 day ago (3 children)

    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

  • source
  • parent
  • hideshow 3 child comments
  • [–] 23 points 1 day ago (1 child)

    The CLI tool is the part that Claude has mostly written from scratch because it's not something I had experience in writing before.

    This seems like the perfect opportunity to learn something new in my opinion, CLIs aren’t difficult to make. And you may want to consider moving to GitHub because of Codeberg’s ToS.

  • source
  • parent
  • hideshow 1 child comment
  • [–] [S] 30 points 1 day ago*

    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:

    spoilerProjects 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.

  • source
  • parent
  • [–] 13 points 1 day ago

    Snow Crash here we come!

    J/k, cool idea.

  • source
  • [–] 13 points 1 day ago (5 children)

    Since you advertise it for Obtainium, would you mind adding the key for verification with AppVerifier? I didn't find it in the readme and release.

  • source
  • hideshow 5 child comments
  • [–] [S] 19 points 1 day ago (3 children)

    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.

  • source
  • parent
  • hideshow 3 child comments
  • [–] 5 points 23 hours ago (2 children)

    Dope, thank you very much!

    Two more questions: Is there a way to set 8 codes for sending in the flatpak version, or is that limited to 6? Any idea why a pixel 8 pro on graphene wouldn't allow 120/240 fps receiving? Highest I've been able to choose and test is 60fps. was thinking that it may be the resolution cap, but an iPhone comparison ran at 240fps with the same res (I think).

  • source
  • parent
  • hideshow 2 child comments
  • [–] [S] 9 points 23 hours ago (1 child)

    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.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 13 points 1 day ago (2 children)

    Super cool! I could totally see this being an integral plot point in a show or movie. Crowds of people suddenly aiming their phones at the screens in Times Square to get the latest elicit data dump or some such 😎

    Thanks for all the hard work, I can't wait to play around with it!

  • source
  • hideshow 2 child comments
  • [–] 11 points 14 hours ago
    [–] 11 points 16 hours ago (1 child)

    Does this mean an IP cam pointing to a monitor can compromise an air gap? I guess it always could, just at 1.4mbps now

  • source
  • hideshow 1 child comment
  • [–] 9 points 21 hours ago (6 children)

    I started working on something like this years ago, but I didn’t have the coding skills to pull it off. This is really awesome.

  • source
  • hideshow 6 child comments
  • [+] -16 points 18 hours ago (5 children)
  • [–] 5 points 17 hours ago

    It's not that hard. Loop the QR, index the frames without the QR payload, do it ~10fps so you account for camera error, then when all frames/packets are completed, you're good. There's a ton of QR scanning libraries out there already.

  • source
  • parent
  • [–] 1 point 15 hours ago* (last edited 8 hours ago) (3 children)

    Yeah, we get it, he used AI. You anti-AI absolutists aren't actually changing anyone's minds with this behavior, and it actually seems to be annoying a lot of people in to the opposite direction.

  • source
  • parent
  • hideshow 3 child comments
  • [–] 2 points 7 hours ago (1 child)

    The tech or "tool" as you guys like to call it is the issue. Even if you use it the best way you could you still used a tool created by stealing. You guys can't see past the next 2 years. I will be laughing my ass up in 5 years when all of you are forced to pay 1k a month just to function.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 2 points 1 hour ago

    You all sound like the vegans that show up every time someone mentions a burger that yell "meat is murder!!!", then run off giggling thinking "I got em". Even if you have a point, and people would otherwise agree with you, you're annoying and no one in the real world is taking you seriously.

  • source
  • parent
  • [–] 1 point 7 hours ago

    Literally just "leftists are right but annoying so I'm a fascist now :(" enabler behavior applied to AI.

    Being angry also works better in real life in my experience. I think the people who constantly ask others to soften up are opps

  • source
  • parent
  • [–] 8 points 23 hours ago (1 child)

    What was your testing environment?

    First thing I thought about is how well smartphone can handle it. After fps mismatch that you contributed on, there is also cameras matrix' resolution, probable obstacles and image distortion.

    After that, I'm interested in how able a smartphone to scan a max res QR like in the OP gif. Or eight of them. 25 times a second, with a CPU overhead of error correction algorhitm. I know modern phones are beasts, but basic apps I used struggled with QRs that vere too busy, and even if not, they still took a second before popping up a link.

    Btw, do you use standard QR by specs, or a custom 2d encoding method? I don't see rectangular orientation marks on your images, so it's something new. Since you are not sticking to QRs, have you thought of using colors, since your usecase is capturing color displays?

  • source
  • hideshow 1 child comment
  • [–] [S] 14 points 23 hours ago* (last edited 22 hours ago)

    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.

  • source
  • parent
  • [–] 7 points 1 day ago (4 children)

    Interesting, though what if the receiver fails to scan the codes quicly enough?

  • source
  • hideshow 4 child comments
  • [–] [S] 20 points 1 day ago* (3 children)

    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!

  • source
  • parent
  • hideshow 3 child comments
  • [–] 7 points 1 day ago (1 child)

    How many pictures does it show per second? And do I understand that right, it cycles through the data until it hears the sound? I assume that makes sending large files difficult, since it has to wrap around all the data, right?

  • source
  • parent
  • hideshow 1 child comment
  • [–] [S] 10 points 1 day ago*

    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.

  • source
  • parent
  • [–] 6 points 4 hours ago (1 child)

    I wonder if this can be arranged with two bidirectional telescopes (or maybe two telescope and 2 projectors on walls:how many qr-codes you can stuff on a square meter to be seen in long distance?) for some sort of wifi; not for a good ping but some sort of cheap/quick wireless connectivity

  • source
  • hideshow 1 child comment
  • [–] [S] 2 points 3 hours ago

    that sounds like a really fun experiment! the protocol would need some tweaking to be able to continuously stream data. other than that it would probably work fine if the image is clear enough!

  • source
  • parent
  • [–] 19 points 15 hours ago

    A very interesting take on a new malware distribution method.

  • source
  • [–] 5 points 20 hours ago (1 child)

    A couple of months ago I searched for a tool like this, there are a few but all with some flaws: the most polished one did not cycle the codes, the most usable one failed to initiate file download from web UI they had. Have you researched existing implementations?

    Also, maybe an app is better for stability, but have you thought about having a web UI, too, so that one can use it to receive or send the file (the page itself would be pretty lightweight, considering it doesn't send or receive the data itself)? Such a UI could also be served from localhost

  • source
  • hideshow 1 child comment
  • [–] [S] 7 points 19 hours ago

    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.

  • source
  • parent
  • [–] 5 points 23 hours ago (2 children)

    Nice, but what is the use case?

  • source
  • hideshow 2 child comments
  • [–] [S] 18 points 23 hours ago* (last edited 22 hours ago) (1 child)

    Some of the use cases I thought about:

    • Regular file transfers: It works well as long as the files are not too big. I use it often between my phone and laptop.
    • Sensitive information: You can transfer files without relying on cloud services or network infrastructure. There's a password encryption feature for that. If you don't enable that someone could decode the information from the QR codes.
    • Broadcast on a large screen so multiple devices can receive data without requiring an internet connection during internet outage/government internet crackdown.
    • Air-gapped systems: Transfer files to and from devices that are not connected to a network.

    Hopefully people will find new and interesting use cases for it too.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 6 points 18 hours ago*

    Very cool project!

    Thinking how this would be useful for me at work: a simplified use case is to get encrypted error logs from a kiosk device when it has no network connection

  • source
  • parent
  • [–] 5 points 18 hours ago (3 children)

    Reminds of removedat, odd but apparently used in india because their goverment is lowkey evil again?

  • source
  • hideshow 3 child comments
  • [–] 4 points 16 hours ago

    Dammit you beat me to it especially if you make it nfc capable too. Wink wink hint hint

  • source
  • [–] 7 points 1 day ago

    Now use steganography to hide files in the qr code images. Maybe even make those hidden file qr codes.

  • source
  • [–] 3 points 21 hours ago

    Interesting idea, but I feel that creating a hotspot and turning on FTP server is going to be easier and much less error-prone. (Not offline though.)

  • source
  • [–] 3 points 3 hours ago

    This seems like re-inventing the IR Blasters we had on our laptops and phones in 2005 (think some game handhelds also)

  • source
  • [–] 2 points 10 hours ago (1 child)

    Have you considered an RGB mode?

  • source
  • hideshow 1 child comment
  • [–] 2 points 8 hours ago (2 children)

    I am thinking that maybe adding color would allow you to condense a lot more information into a QR code. It would be good if we can have entire programs and media reconstructed just from scanning QRs.

  • source
  • hideshow 2 child comments
  • [–] [S] 16 points 7 hours ago* (last edited 7 hours ago)

    For those asking about RGB, there are a few reasons why QR codes work better for now:

    • Black and white still reads fine in bad lighting or on cheap cameras. Phones are very optimized for scanning QRs so it's more reliable and less error prone.
    • Video compression, colors shifting with white balance, screen type, all of those make it harder to tell colors apart so you need more aggressive error correction. The real gain ends up smaller than it sounds.

    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

  • source
  • parent
  • [–] 5 points 17 hours ago (5 children)

    Note that although I have made use of AI as a coding assistant I do not consider this to be a vibe-coded app

    1. What KIND of AI did you use? Was it a local model or a cloud sourced one?

    2. Where exactly and what exactly was the AI used on?

  • source
  • hideshow 5 child comments
  • [–] 2 points 16 hours ago (4 children)
  • [–] -4 points 16 hours ago (3 children)

    Not sure if I'm okay with it, then. Cloud models tend to suck up data, so they probably have some kind of idea of how it works. This is why I tend to only be okay with stuff that was vibe-coded with Local LLMs.

  • source
  • parent
  • hideshow 3 child comments
  • [–] 3 points 20 hours ago (8 children)

    I don’t see a lot of use cases where blastQR beats LocalSend. The ones I do see are mostly about surreptitious data exfiltration against the will of device and/or data owners, and those are still complicated by the need to install your client on the sending side.

  • source
  • hideshow 8 child comments
  • [–] 10 points 17 hours ago (2 children)

    If you're in an environment where turning on your cell radios could compromise you then you'd like something that operates through something other than radio. Two people sharing data at a protest for example.

  • source
  • parent
  • hideshow 2 child comments
  • [–] 2 points 15 hours ago (1 child)

    LocalSend uses wifi rather than cell but you’re right that a protest could be a good place not to turn on any radios. It’s also a good place not to bring a phone at all, even if you’ve thought in advance to install a visual data transfer program like this. But you have a good point.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 4 points 14 hours ago

    There's a wide range of threat levels someone could be managing at a protest. Lots of people don't feel particularly at risk from being grabbed and having their phone cracked, but still don't want to be added into a database of people opposed to a regime because an automated mass surveillance system sniffed their radio signature. If you're not expecting a personal assault phones can be useful for documenting police, promoting the event afterward, and accessing emergency services.

    I don't think the "don't bring a phone to a protest" advice is good unless you think it's likely you could be in a position to lose control of it. The tradeoffs for that level of safety don't make it worth doing for random citizen protesters. I do think concealing your face and turning off your radios is a good idea, because those are very realistic threat vectors for a generic citizen protester. Of course you could have the best of both worlds by getting a burner phone, but I don't think many people are that prepared.

  • source
  • parent
  • [–] 2 points 15 hours ago (3 children)

    Could be for airgapped devices

  • source
  • parent
  • hideshow 3 child comments
  • [–] 0 points 15 hours ago (2 children)

    Sure, that’s covered by my commentary about data exfiltration against the wishes of data or device owners, and about the difficulty of installing the client on the airgapped device.

    I believe there are a few legitimate use cases that don’t have a faster/better alternative, but they’re very niche.

  • source
  • parent
  • hideshow 2 child comments
  • [–] 5 points 10 hours ago (1 child)

    I'm talking about intentional data transfer between airgapped devices. Airgapped usually just means no networking. Often people will still need a way to occasionally transfer data to/from the device. A common one is USB, but USB has tons of security issues (BadUSB). Using a camera + QR codes is an interesting alternative.

    So you're effectively choosing between the security of networking stack or the camera stack.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 2 points 5 hours ago

    you do know that that claude figured way to do this to talk to other llm and what you are doing will give them more routes to talk

  • source
  • [–] 1 point 3 hours ago (2 children)

    That’s a very clever idea - good job! I am aware of Luby Transform and Raptor codes but not RaptorQ codes - that’ll make for some interesting reading later.

    I particularly like the idea of visual filesharing with no network transmission that could be intercepted - although a determined nation-state actor would just compromise hardware & OSes instead. For ultra-private comms there’s also Van Eck phreaking to consider, but we’re going a bit too deep down the rabbit hole here!

    Very cool project. If you’re going to patent it or publish a paper on the subject, don’t wait too long.

  • source
  • hideshow 2 child comments
  • [–] 1 point 4 hours ago (2 children)

    Amazing Idea, can this be done with audio as well?

  • source
  • hideshow 2 child comments
  • [–] 1 point 14 hours ago (3 children)

    Seems finicky. Keeping the camera and screen aligned during the transfer. Someone should research if it's possible for two phones to send data acoustically. Then they don't need to be kept perfectly aligned. Hell, they could even transfer data over a phone call or something.

  • source
  • hideshow 3 child comments
  • [–] 1 point 20 hours ago (3 children)

    Hmm I'm not sure about the usecase. The same problem has been around for nearly 2 decades and the only other information exchange method that screens are used for (except human readable stuff) are normal QR codes.

    Nothing else sticked around.

    If you want to sync larger amount of files reguarily you usually take something like WebDAV, Syncthing, Cloud Storage...

    If you want to just drop files once then there is USB or wireless transmission like NFC or Bluetooth.

    Or you just scan some QR code that relays you to a download site.

    Your app needs to be present on both devices and that's a big requirement because it is not out of the box there - especially in air gapped environments.

    It might fit a niche but that niche will be extremely small.

  • source
  • hideshow 3 child comments
  • [–] 2 points 15 hours ago

    you could install it onto the airgapped machine befpre taking it offline, or transfer the apk to the airgapped machine via usb, and then remove the usb port.

    USB and Wifi have had vulnerabilities, so airgapped environments often disable them. This of course shifts the attack surface to the app, but it might be a smaller attack surface.

  • source
  • parent
  • [–] -3 points 23 hours ago (2 children)

    lemme guess it's vibecoded

  • source
  • hideshow 2 child comments
  • [–] -1 points 1 day ago (7 children)

    Seems easier to just grab a USB flash drive.

  • source
  • hideshow 7 child comments
  • [–] [S] 9 points 1 day ago* (5 children)

    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 a bunch of phones during a digital blackout where the government has cut off internet. Also useful for air-gapped systems!

  • source
  • parent
  • hideshow 5 child comments
  • [–] 4 points 1 day ago* (4 children)

    Wouldn’t any security camera potentially be able to steal the information by inputting the QR codes though? It’s not truly airgapped when someone can view or also be able to see the information that’s being sent.

  • source
  • parent
  • hideshow 4 child comments
  • [–] [S] 10 points 1 day ago* (last edited 1 day ago) (3 children)

    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.

  • source
  • parent
  • hideshow 3 child comments
  • [–] -3 points 1 day ago* (2 children)

    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.

    Which also includes the information not being seeing or taking, it’s kinda one of the main points. Your program is not even remotely similar to being airgapped and you shouldn’t be saying or even implying that feature. Especially in a comm like this. Why would you want to transfer without being connected to a network or a “physical” connection? For privacy and security, and lots of airgapped system still utilize networks and lines.

  • source
  • parent
  • hideshow 2 child comments
  • [–] [S] 6 points 1 day ago

    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.

  • source
  • parent
  • [–] 2 points 15 hours ago

    Why would you want to transfer without being connected to a network or a “physical” connection?

    If you don't trust the network stack to be secure. This use case definitely counts as airgapped imo. Even in airgapped environments people use usb to transfer data. But USB also has huge security issues like BadUSB. So this app shifts the attack surface to the camera and the app. Not necessarily more secure but still an option I haven't seen explored much.

  • source
  • parent
  • [+] -12 points 6 hours ago

    New conduit for kiddy pics.

  • source
  • load more comments
    view more: next ›