{"id":19266209,"url":"https://github.com/qifi-dev/qrs","last_synced_at":"2026-01-12T05:42:33.636Z","repository":{"id":257811729,"uuid":"865923645","full_name":"qifi-dev/qrs","owner":"qifi-dev","description":"Stream data through multiple series of QR codes","archived":false,"fork":false,"pushed_at":"2025-05-08T09:12:54.000Z","size":879,"stargazers_count":1464,"open_issues_count":6,"forks_count":90,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-12-14T11:52:11.818Z","etag":null,"topics":["qrcode","transfer-files"],"latest_commit_sha":null,"homepage":"https://qrss.netlify.app/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qifi-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"LittleSound"}},"created_at":"2024-10-01T11:01:10.000Z","updated_at":"2025-12-09T14:42:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"1142b27a-a1ec-4132-985d-44716b17e922","html_url":"https://github.com/qifi-dev/qrs","commit_stats":null,"previous_names":["qifi-dev/qrs"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/qifi-dev/qrs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qifi-dev%2Fqrs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qifi-dev%2Fqrs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qifi-dev%2Fqrs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qifi-dev%2Fqrs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qifi-dev","download_url":"https://codeload.github.com/qifi-dev/qrs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qifi-dev%2Fqrs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28335226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T00:36:25.062Z","status":"online","status_checked_at":"2026-01-12T02:00:08.677Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["qrcode","transfer-files"],"created_at":"2024-11-09T20:01:19.086Z","updated_at":"2026-01-12T05:42:33.631Z","avatar_url":"https://github.com/qifi-dev.png","language":"TypeScript","readme":"\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg height=\"150px\" src=\"public/logo.svg\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eQrs\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\nStream data through multiple QRCodes\n\u003c/p\u003e\n\n\u003cblockquote align=\"center\"\u003e\n\u003cp\u003ea bit like this meme:\u003c/p\u003e\n\u003cimg alt=\"Install Windows using QR Codes\" src=\"public/install-windows-using-a-qr-code.jpeg\" width=\"250px\"\u003e\n\u003c/blockquote\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/sponsors/LittleSound\"\u003e\n    \u003cimg src=\"https://cdn.jsdelivr.net/gh/littlesound/sponsors/sponsors.svg\"/\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  This project is made possible by all the sponsors supporting my work \u003cbr\u003e\n  You can join them at my sponsors profile:\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003ca href=\"https://github.com/sponsors/LittleSound\"\u003e\u003cimg src=\"https://img.shields.io/static/v1?label=Sponsor\u0026message=%E2%9D%A4\u0026logo=GitHub\u0026color=%23fe8e86\u0026style=for-the-badge\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\n## Try it\n\n[Live demo](https://qrss.netlify.app/)\n\n## Sub-packages\n\n- [QiFi CLI](./packages/cli) - CLI for streaming QR code file transmission\n- [luby-transform](./packages/luby-transform) - Luby Transform encoding and decoding\n- [@qifi/generate](./packages/generate) - Stream Generated QR Codes for data transmission\n\n## Knowledge\n\n\u003c!-- 这种流式播放二维码传输数据的情况。类似“二进制抹去通道（Binary Erasure Channel, BEC）”，这是一种通信模型。在这个模型中，发送方发送二进制数据（0或1），接收方有一定概率无法接收到某些数据位，这些位会被标记为“抹去”或“丢失”。换句话说，接收方知道哪些位丢失了，但不知道它们的具体值。这个模型用于研究和设计能够在数据丢失情况下仍能有效传输信息的编码技术。\n\n科学家对于如何在 BEC 中高效传输数据已经有了非常成熟的研究成果，其中一种方法是使用“喷泉码（Fountain Codes）”。喷泉码是一种纠错码，它可以在数据丢失的情况下仍然有效地传输信息。本项目使用了 Luby Transform 编码。它是喷泉码（Fountain Codes）的一种。基本原理是将原始数据分成多个小块，然后通过编码生成无限数量的编码块。接收方只需收到足够多的编码块（通常比原始块稍多）就可以重建原始数据。 --\u003e\n\nThis situation of streaming QR code data transmission is similar to the \"Binary Erasure Channel (BEC),\" which is a communication model. In this model, the sender transmits binary data (0 or 1), and the receiver has a certain probability of not receiving some data bits, which are marked as \"erased\" or \"lost.\" In other words, the receiver knows which bits are lost but does not know their specific values. This model is used to study and design coding techniques that can effectively transmit information even in cases of data loss.\n\nScientists have already achieved very mature research results on how to efficiently transmit data in BEC, one of which is using \"Fountain Codes.\" Fountain Codes are a type of error-correcting code that can effectively transmit information even in the case of data loss. This project uses Luby Transform coding, which is a type of Fountain Code. The basic principle is to divide the original data into multiple small blocks and then generate an unlimited number of encoded blocks through encoding. The receiver only needs to receive enough encoded blocks (usually slightly more than the original blocks) to reconstruct the original data.\n\n## Demo\n\n\u003cvideo src=\"https://github.com/user-attachments/assets/b4f8a122-02c7-4754-9ec0-121e42f8b22d\"\u003e\u003c/video\u003e\n\n## Build \u0026 run\n\n**1. Install Dependencies**\n\nYou need install [Node.js](https://nodejs.org) first.The project uses `pnpm` as its package manager. First, ensure you have `pnpm` installed:\n\n```bash\nnpm install -g pnpm\n```\n\nThen, install the project dependencies:\n\n```bash\npnpm install\n```\n\n**2. Build the Project**\n\nBuild the project using the command specified in the `package.json` and `netlify.toml`:\n\n```bash\npnpm run build\n```\n\nThis will generate the output in the `.output` directory.\n\nAlternatively, if you want to run the development server to test changes:\n\n```bash\npnpm run dev\n```\n\n**3. Serve the Project Locally**\n\nif your target environment have `Node.js`, you can copy entire `.output` directory to where you want.You can preview this build using:\n\n```bash\nnode .output/server/index.mjs\n```\n\nif your target environment don't have `Node.js`, you cat just host those static files.\n\n```bash\ncd .output/public\npython -m http.server\n```\n\nYou will usually encounter the following errors.\n\n```\nFailed to load module script: Expected a JavaScript module script but the server responded with a MIME type of \"text/plain\". Strict MIME type checking is enforced for module scripts per HTML spec.\n```\n\nyou need a custom web server, Run in the `.output/public` directory:\n\n```python\n# python custom_http_server.py\nfrom http.server import SimpleHTTPRequestHandler, HTTPServer\n\nclass CustomHandler(SimpleHTTPRequestHandler):\n    def end_headers(self):\n        self.extensions_map.update({\n            \".js\": \"application/javascript\",\n        })\n        super().end_headers()\n\nADDR = '0.0.0.0'\nPORT = 8000\nwith HTTPServer((ADDR, PORT), CustomHandler) as httpd:\n    print(f\"Serving on http://{ADDR}:{PORT}\")\n    httpd.serve_forever()\n```\n\n## Reference\n\n### Fountain Codes\n\n- [Fountain codes and animated QR](https://divan.dev/posts/fountaincodes/)\n- [LT codes -- a design and analysis epiphany](https://youtu.be/C4qi_oJoUrE)\n- [gofountain](https://github.com/google/gofountain)\n\n### QR Codes\n\n- [Anthony's QR Toolkit](https://github.com/antfu/qrcode-toolkit)\n","funding_links":["https://github.com/sponsors/LittleSound"],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqifi-dev%2Fqrs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqifi-dev%2Fqrs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqifi-dev%2Fqrs/lists"}