This File Transfer Does Not Use the Internet — Desimen (Optical QR File Transfer)

Aug 9, 2026 by 5 min read
Spread the love

📝 বাংলা সারসংক্ষেপ — Bengali Summary

এই টিউটোরিয়ালটি Desimen সম্পর্কে — একটি অসাধারণ 오পেন-সোর্স টুল যা সম্পূর্ণ ইন্টারনেট বা নেটওয়ার্ক ব্যবহার না করে এক ডিভাইস থেকে আরেক ডিভাইসে ফাইল পাঠায়। পদ্ধতিটি হলো “঑প্টিক্যাল ফাইল ট্রান্সফার” — এক ডিভাইসের স্ক্রিনে QR কোডের ঝড় flashing করে, আর অপর ডিভাইসের ক্যামেরা তা পড়ে ফাইলকে ব্যাক করছে। Desimen ব্যবহার করে “ফাউন্টেন কোডিং” (fountain coding) — প্রতিটি ফ্রেম মূল ফাইলের ছোট টুকরোর গাণিতিক মিশ্রণ, ফলে কোনো একটি ফ্রেম হারালেও সমস্যা নয়; রিসিভারকে কেবল যথেষ্ট সংখ্যক ফ্রেম পেলে হলো। এই ভিডিও ও নিবন্ধে আমরা দেখবো Desimen কীভাবে কাজ করে, এর প্রযুক্তিগত গাণিতিক সীমা, ফটো-টো-ফোন ও ল্যাপটপ-টো-ফোন-ভিত্তিক কর্মক্ষমতা, এবং কেন এটি এয়ার-গ্যাপ নেটওয়ার্কের জন্য আদর্শ। এই টিউটোরিয়াল শেষে তুমি জানবে কীভাবে Desimen ইন্সটল ও টিউন করা যায়, এবং কোন পরিস্থিতিতে এটি উপকা.


🎬 Watch the Video

Source: “This File Transfer Doesn’t Use the Internet At All” — Better Stack (YouTube)


🚀 What is Desimen?

Desimen (by developer Evan Cowley) is an open-source optical file-transfer tool that sends files from one device to another without using any network stack — no Wi-Fi, no Bluetooth, no cellular, no cables, and no USB sticks. Instead, it encodes a file as a rapid stream of QR-code-like frames displayed on one screen and decoded by another device’s camera.

This makes it one of the only practical ways to move data to and from an air-gapped (network-isolated) device without physically plugging in external hardware. If you have two devices where the only guaranteed capabilities are a screen and a camera, Desimen is your solution.

⚙️ How Desimen Works — The Engineering

1. Fountain Coding (the secret sauce)

Naively, you might expect the tool to send frame 1, then frame 2, then frame 3… and hope every single frame lands intact. That is fragile — real cameras drop frames, and screens refresh imperfectly. Desimen uses fountain coding instead:

2. Frame Format & Speed

The specific 2,953-byte chunk size corresponds to QR Code version 40 — the largest standard QR size, a 177×177 grid of individual modules packed into a single frame.

3. The Core Trade-Off

There is no free lunch. Cramming more data into each frame means fewer frames overall — but the receiving camera needs higher resolution, a steadier hand, and sharper focus to tell one module from the next. The whole system is a balancing act among three variables:

🧪 Real-World Test: Laptop → Phone

Testing with a laptop screen as the sender at a normal arm’s length is exactly how a real user would deploy it. With this setup, throughput bottomed out at roughly 3 KB per second — only 1–2% of transmitted frames were decoded; the rest were captured and discarded. There are three main obstacles:

Obstacle 1 — Frame-Rate Mismatch

The sender pushes 60 fps, but a typical phone camera captures at 30 fps. You cannot sample 60 distinct images with a sensor grabbing only 30 — and it’s even worse, because each frame’s exposure window straddles two different QR codes on screen, blending them into something that decodes to nothing.

Indeed, in the main.ts file there’s a documented note: iOS will silently deliver 30 fps even when the app explicitly asks the camera for 60 fps.

Obstacle 2 — Code Density vs. Camera Resolution

QR version 40 needs roughly 3–4 camera pixels per module for reliable decode, which works out to 600+ pixels across in sharp focus just for the code itself. A laptop screen at arm’s length rarely fills that much of a phone’s viewfinder. But phone-to-phone at close range fills the entire frame easily.

Obstacle 3 — Brightness & Contrast

Brightness is secondary — it helps the receiver’s binarizer threshold the image cleanly, but it cannot fix a frame-rate mismatch or an undشدensigned code.

📱 Tested: Phone → Phone (Close Range)

Switching the sender to a small, bright OLED screen held close — filling the receiving phone’s entire frame — yields dramatically better results:

This is the scenario under which the 128 KB/s number in the README was actually measured.

There’s also a genuinely useful detail in the receiver’s code: it reports capture FPS and decode FPS separately. This tells you whether the camera is physically seeing frames (capture) versus how many are usable (decode). When they pull apart — capture stays healthy while decode crashes — you’re seeing a mismatch between frame density and camera resolving power at that range.

🔧 Tuning Fix for Laptop → Phone

If your actual use case is laptop-to-phone, rebalance the three variables on the sender side:

  1. Drop bytes per frame down to 1,465 — corresponding to a coarser QR version with bigger, more forgiving modules.
  2. Drop the transmit rate to 24 fps — deliberately below the 30 fps ceiling — so frames get sampled cleanly one at a time instead of blending.

Lowering these numbers yields a much higher throughput than the default fail case, and clearly demonstrates that optical transfer is not one-size-fits-all.

🛠️ When Should You Use Desimen?

Note: for most normal mesh use, standard networking (LAN/SSH) is far faster — Desimen shines precisely where networking is impossible or undesirable.

✅ Checklist — Using Desiten Effectively


📚 Resources


About the Author: Apu Sarkar — Tech researcher and content creator. Founder of jacche.com, a platform dedicated to scientific research, AI education, and authentic knowledge sharing. Follow for more tech insights and tutorials.

🔗 jacche.com — Scientific Research & Knowledge

Related Posts