📝 বাংলা সারসংক্ষেপ — 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:
- Every transmitted frame is a mathematical blend of small pieces of the original file — not a specific chunk.
- This means no single frame is irreplaceable. The receiver does not need frame #47 specifically.
- The receiver just needs enough frames — whichever ones happen to land correctly.
- If the receiver misses half the stream, transmission simply continues until enough frames are collected.
2. Frame Format & Speed
- Default payload: 2,953 bytes per frame.
- Default rate: 60 frames per second (fps).
- Theoretical peak: ~177 KB per second.
- Real-world (with fountain-coding overhead): ~128 KB/s measured on phone-to-phone.
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:
- Frames per second you transmit
- How dense each frame is
- How good the receiving camera is at resolving that density
🧪 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:
- The camera can actually hit closer to its real frame rate.
- The code fills the frame at high resolution.
- No LCD ghosting to fight.
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:
- Drop bytes per frame down to 1,465 — corresponding to a coarser QR version with bigger, more forgiving modules.
- 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?
- Air-gapped transfers where you deliberately want no network connection.
- Older/embedded hardware that has no Wi-Fi or Bluetooth.
- Any situation where a screen and a camera are the only two things you can rely on.
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
- Start with tiny files to confirm sync between your screen & camera
- Monitor capture vs. decode FPS; if capture>>decode, reduce bytes/frame
- Keep transmit FPS below your camera’s max supported capture rate
- For laptop→phone, use ~1,465 bytes/frame & ~24 fps
- Hold devices close & steady for maximum resolution
- Test with OLED screens for best contrast and frame-rate behavior
📚 Resources
- jacche.com — Scientific Research & Authentic Knowledge
- 🎬 Watch the Full Video (YouTube, Better Stack)
- Desimen project by Evan Cowley — search “Dec pimen github” for source & docs
- Better Stack YouTube channel — @btdo what
- Wikipedia — QR code / QR version 40 spec reference
- Air-gapped data transfer guide (general networking reference)
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
