Pregătești
You choose the content of the code, or the file you want to send.
Instrumente în browser Instrument public
MEGA QR includes a code generator and an optical transfer tool. You create a code for a link, a Wi-Fi network or a contact; for transfer, one screen shows a succession of codes that the other device's camera rebuilds into a file.

MEGA QR
You choose the content of the code, or the file you want to send.
The generator produces the QR image. Optical transfer shows one frame after another.
The camera reads the code, or gathers frames until it can rebuild the file.
Link, Wi-Fi, contact and other content types; export as PNG or SVG.
Data sent from a screen to a camera, with no network connection between the devices.
Generating and rebuilding both happen in the browser, with no user account.
Optical transfer depends on the camera, the light, the distance and the screen. The sending device receives no confirmation of receipt. A code shown in public can be read by anyone who can see it.
MEGA QR in detail
MEGA QR is two tools on the same domain, and the second one is nothing like the first. The generator makes QR codes for eight content types: link, text, WiFi, business card, WhatsApp, email, SMS, phone and coordinates. Optical transfer moves an entire file from a screen to a camera — no cable, no Bluetooth, no network between the two devices.
Both run entirely in the browser. The pages make no third-party requests, and the two WebAssembly binaries the transfer depends on are served from public/wasm/, not from a CDN — otherwise the promise that nothing leaves the device would be false. A WiFi password typed into the generator never reaches a server.
The idea worth grasping about the transfer: a screen emits light, a camera reads it, and the receiver has no way to ask for anything back. There is no return channel. Everything else follows from that — the frames describe themselves, their order is irrelevant, any large enough subset rebuilds the file, and the sender can never know whether anything arrived.
Link, text, WiFi, vCard, WhatsApp, email, SMS, phone and geolocation. When you add a logo, the error-correction level is forced to H, the highest — a logo punches a hole in the data area and the code does not survive otherwise. The logo is capped at 35% of the surface, with a warning from 30% up. The export renders separately from the preview, so that a 4096 px PNG does not disturb what is on screen.
The generating library, qr-code-styling 1.9.2, converts its text with charCodeAt(i) & 0xFF and silently strips every Romanian diacritic and all of Cyrillic: "Ștefan Țurcanu" used to scan back as "tefan urcanu". We encode to UTF-8 ourselves before it ever sees the string, so its truncation has nothing left to cut. The WiFi and vCard payloads are escaped as well — a ";" in a password or a comma in a company name would otherwise corrupt the code, with nothing to show for it.
The file is wrapped in an envelope (name, MIME type, size, SHA-256), compressed with gzip if that comes out smaller, then put through RaptorQ (RFC 6330). Every frame carries a fixed 20-byte header and one or more packets. It is not about which frames you catch, it is about how many: any large enough subset rebuilds the file. Measured in genuinely rendered pixels, RaptorQ's overhead is 1.000x — the LT codes used by the reference projects need 1.15x.
The second sending mode is a fixed loop repeating endlessly, with no session and nobody to press start. The length of the loop travels inside every frame, so a passer-by pointing a camera knows from the first code caught how long the whole thing takes, instead of staring at a spinner. The reference configuration is 36 frames at 12 per second — a three-second loop carrying 25 KB out of a single plain black-and-white code. A whole menu, or the full timetable of a stop.
The number of codes on screen, colour, and the QR version are three different constraints and they are tuned separately. The density scale has 29 steps, from v10 on a single lane (7 KB/s at 30 frames per second) up to v39 on four lanes in colour (959 KB/s). There is also a complete colour-free scale, up to 320 KB/s, because a camera whose chroma dies should not be stuck on a single lane.
Data and operation
From exploration to deployment
A QR code leads to short content and, if it is a link, to a page you can change later — a printed code does not redirect itself. Optical transfer moves a file between two devices that are not allowed to, or cannot, talk over a network. They are different jobs, and confusing them is the commonest mistake.
For print: contrast, final size, quiet zone around it, tested at the size it will be stuck up at. For transfer: how large a module lands on the camera's sensor. Under a harsh lens model (chroma grid offset by one pixel plus a 3x3 blur) colour brings all three codes back at 4 device pixels per module and absolutely nothing at 2. That is the real boundary, and it is why colour is the operator's choice rather than the controller's.
Our suite runs a genuine camera chain — frames are written as YUV 4:2:0 and handed to Chrome as a fake webcam, so the chroma subsampling is real. What it lacks: a lens, reflections, motion, rolling shutter. Ten minutes with a real phone would give the first honest figure, and that is the next item on our work list, not a detail.
Through a simulated camera chain, at 10 frames per second, with the codes filling most of the image at 3-5 camera pixels per module, all four configurations came out with the hash verified: black-and-white on one lane 15.8 KB/s, black-and-white on four lanes 37.7 KB/s, colour on one lane 40.1 KB/s, colour on four lanes 115.7 KB/s. Colour on a single lane beats black-and-white on four. The miss rate was zero everywhere. Remember where the numbers come from: geometrically perfect frames, no lens and no motion. A real phone has not yet been put in front of them.
The camera is requested at 1920x1080 at 30 frames per second, with a preference for the rear one; if Android refuses the constraint, we fall back to any camera. Every captured frame is scaled down to 1280 px on its long side before decoding. What really counts is not resolution but how many sensor pixels land on one module: black-and-white needs roughly three, colour roughly twice that, because a phone's video chain usually delivers 4:2:0 and halves both colour planes in both directions. Fine colour detail is the first thing a real camera destroys.
Because the only thing the sending device can measure is how many symbols its own encoders produced against how many were asked of them — a statement about a processor, not about a camera a couple of hand-widths away. A laptop never misses a step, so a controller reading "zero misses" as "push on" climbs to the very top and puts four codes on screen changing thirty times a second, which nothing on earth can scan. That did ship once, and a person found it inside a minute. Automatic mode is now capped at one lane, black-and-white, version 26 and 15 frames per second. 15 is not a round number chosen for tidiness: a phone camera records at 30 and is not synchronised with the screen, so a frame has to stay up for two consecutive exposures — 67 ms — to be caught whole.
Nothing special, and that is the entire point. There are no sequence numbers to recover. The encoder produces repair packets at 2x the source symbols — measured on this code: at 60% frame loss, a set of roughly 2x K recovers 2 MB without the list ever being played a second time. The absolute ceiling is 60,000 packets; beyond that the sender simply replays the list more often, which costs time, not memory. If something does come out wrong, the SHA-256 catches it and the transfer fails openly instead of delivering a corrupt file.
No, and it is not an oversight. There is no return channel — a screen emits light, and light does not come back carrying receipts. Completion shows on the receiving device. Any interface claiming otherwise would be lying, and we already had a test that supplied exactly the proof the product can never have: the simulation computed its miss rate from what the simulated camera managed to resolve. That is a return channel. When a test and the shipped code disagree about what can be known, it is the test that is lying.
32 MB, refused at selection if it is larger. The limit does not come from the protocol but from the memory of a browser tab: RaptorQ materialises every packet at once, and a 50 MB file at a 2x ratio would mean 150 MB of live arrays, quite enough to kill a phone's tab. Encoding runs synchronously on the main thread, measured at 2.5 seconds for 32 MB on a computer. What actually travels is not the size of the file: the envelope is gzipped before RaptorQ, so a 1 MB spreadsheet is a few kilobytes of packets, while a 1 MB photograph is a megabyte of packets.
Neither. There is no account and no subscription. After the first visit the pages work with no network at all, because everything — the two WebAssembly binaries included — is served from our own domain. Worth saying what we learned along the way: a registered service worker does not mean offline support. On the first load the page and its assets are fetched before the worker takes control, so its handler never sees them. The page reports its own assets through the Performance API instead of assuming.
Illustrative example
A usage scenario, with no client data and no commercial results attributed.
A screen at a stop or in a shop window has to hand passers-by a file — the full timetable, the menu, a form — with no public WiFi, no account, and nobody pressing anything.
The screen runs a carousel: 36 frames at 12 per second, a three-second loop repeating endlessly. Density is fixed for the duration of the carousel, because a loop is only a promise if its length holds. The length of the loop travels inside every frame, so a phone catching the first code knows straight away how long the whole thing takes.
The passer-by films for three seconds and gets 25 KB rebuilt in their own browser, verified with SHA-256, out of a single plain black-and-white code. The screen never learns it was read, and has no way to.
Ce este necesar:Un ecran care poate ține un cadru afișat 83 ms fără sfâșiere, lumină în care codul nu e spălat de reflexii, și o cameră care rezolvă aproximativ trei pixeli de senzor per modul. Cifra de 25 KB e derivată din aceleași funcții pe care le folosește expeditorul, nu tastată de mână alături de ele.
Ways of working together
Codes giving access to public information, instructions or contacts; optical file transfer between compatible devices, with the institution's security policies assessed.
We define a pilot around one real process: users, data, integrations, costs and acceptance criteria. Expansion follows once the result has been assessed.
We establish the requirements for accessibility, hosting, data protection and interoperability. Any connection to services run by Moldova's e-Governance Agency (AGE) or its state information-technology service (STISC) requires eligibility, access and approvals to be validated.
These are adaptation scenarios, not statements about existing contracts or partnerships. The proposed capabilities are confirmed within the project's scope of work.
Discută un pilotonGDPR.md verifică suprafața publică a unui website: cookie-uri, trackere, formulare și documente de informare.
Platformă publicăMegaforms explorează colectarea de răspunsuri prin formulare conversaționale, inclusiv răspunsuri vocale și transcriere.
Dezvoltare & demonstrațiiConstruim o platformă pentru meniuri digitale și operațiuni accesibile prin QR.
Dezvoltare & demonstrațiiTell us about your process. Together we decide what is worth building, what we can connect, and how we check the result.