
DynQRIS
DynQRIS is an open-source Flutter library that converts a static QRIS into a fully compliant Dynamic QRIS completely offline. It was born from a real problem faced by many Indonesian developers: payment providers often supply only static QRIS without offering APIs for generating dynamic QRIS. DynQRIS eliminates that dependency by handling EMV TLV manipulation, transaction amount insertion, and CRC16 checksum calculation directly on the device.
- Role
- Creator & Maintainer
- Client
- Open Source
- Duration
- 2 Weeks
- Team
- Solo
- Year
- 2026
- Category
- Library
- Status
- completed
Stack
What it moved.
100%
Offline
No backend required
1
Function Call
Simple developer API
EMV
Compatible
QRIS Specification
MIT
License
Open Source
The problem.
Many QRIS providers only distribute static QRIS and do not provide APIs for generating Dynamic QRIS.
Integrating dynamic QRIS usually requires partnering with payment gateways or commercial providers, which increases cost and implementation complexity.
While developing Flutter payment systems, I encountered this limitation myself, and many fellow developers experienced the same frustration.
What I built.
Designed a lightweight Dart library capable of converting a static QRIS into a valid Dynamic QRIS entirely offline.
Implemented a complete EMV TLV parser and builder that safely modifies QRIS payloads without relying on external services.
Automatically inserts or updates the transaction amount (Tag 54), ensures required fields are present, and recalculates the CRC16-CCITT checksum.
Exposes a single, developer-friendly API so integration only requires one function call.
How it fits together.
DynQRIS is a pure Dart package that performs all QRIS manipulation locally. No backend, payment gateway, or internet connection is required.
Flutter Application
Applications provide a static QRIS string and transaction amount before displaying the generated QR code.
QRIS Engine
Parses the EMV TLV structure, updates required tags, reconstructs the payload, and prepares it for validation.
Validation
Generates a new CRC16-CCITT checksum to ensure the modified QRIS remains valid according to the EMV specification.
What it does.
Offline Dynamic QRIS
Generate Dynamic QRIS without requiring any server or payment gateway API.
Automatic CRC16 Calculation
Recalculates the checksum automatically whenever the QRIS payload changes.
EMV TLV Processing
Safely parses, updates, and rebuilds QRIS payloads according to the EMVCo specification.
Simple API
Generate Dynamic QRIS using a single function call: QrisHelper.modifyQRIS().
Flutter Friendly
Designed specifically for Flutter applications and compatible with popular QR rendering packages.
Open Source
Released under the MIT License for both personal and commercial projects.
A look at the code.
Generate Dynamic QRIS
CRC16-CCITT
Where it got hard.
Understanding EMV QRIS
What broke
QRIS payloads follow the EMV TLV specification, making manual modifications error-prone and difficult to implement correctly.
How it was fixed
Built a reusable parser capable of reading and reconstructing EMV TLV structures while preserving field integrity.
Maintaining QR Validity
What broke
Any modification to a QRIS payload invalidates its checksum, causing payment applications to reject the QR code.
How it was fixed
Implemented the CRC16-CCITT algorithm to automatically generate a valid checksum after every modification.
Removing Provider Dependency
What broke
Most existing solutions rely on proprietary APIs or payment gateways to generate Dynamic QRIS.
How it was fixed
Designed DynQRIS to work entirely offline using only the original static QRIS string.
What I owned.
Designed the library architecture.
Implemented the EMV TLV parser and builder.
Developed the CRC16-CCITT checksum algorithm.
Designed the public Dart API.
Published and maintained the GitHub repository.
Created documentation and integration examples.
How it ran.
Research
Week 1
Studied the EMV QRIS specification and reverse-engineered the required TLV structure.
Core Development
Week 1
Implemented the parser, payload builder, transaction amount injection, and CRC generation.
Testing
Week 2
Validated generated QRIS with multiple Indonesian payment applications to ensure compatibility.
Open Source Release
Week 2
Published DynQRIS on GitHub with complete documentation and integration examples.
What I took from it.
The best open-source projects often come from solving real developer pain points.
Understanding a technical specification deeply enables building solutions without proprietary APIs.
Keeping APIs simple significantly improves developer experience and adoption.
Offline-first architectures reduce infrastructure costs and increase reliability.
What I'd do next.
Publish the package on pub.dev.
Support additional EMV tags and advanced QRIS customization.
Provide QRIS validation and debugging utilities.
Improve automated testing and benchmark performance.
Next case study
DARFIN
DARFIN — A Modern, Multi-threaded Desktop Download Manager built with Golang & Wails.
