Open comments for this post
Bug Patching (SES-2.1)
This will be my last patch of the day.
Bug
-
Styled Micro QR codes render wrong: Both the PNG and SVG renderers assume the standard 3-finder layout when deciding what counts as a “finder square” (for shape/color overrides). Micro QR only has one finder (top-left), so modules near the top-right and bottom-left corners get incorrectly forced into squares / finder-color under custom styling.
This isnt fully fixed, Im having some hard time figuring out whats the main core issue. It is somewhat fixed.
Open comments for this post
Bug Patching (SES-1)
Ran more tests and got feedback from ~15 people. Made them test the commands and try to find bugs. There were many bugs people were available to find. This is session focuses on fixing some of them
Bugs that were fixed
-
Micro QR silently corrupts data near capacity limits: In
encoder.py, the capacity check treats every Micro QR data codeword as a full 8 bits — but for M1 and M3 symbols, the last data codeword is only a 4-bit nibble per spec. The checker accepts data that’s 4 bits too big, and the extra bits get silently truncated at render time.
-
.logo() crashes every time: core.py builds a logo_info dict with a key "padding", but matrix.py leads logo_info["padding_px"] , instant KeyError the moment anyone calls .logo(...).
-
Terminal
--terminal-style compact output has padding bugs asymmetric left/right padding and a stray extra row, so piping it anywhere that cares about exact dimensions breaks.
There are some more bugs that will be fixed in the next session.
Open comments for this post
Mega Lock-In
The 9 hours was logged in span of the last week. Didn`t get to devlog due to internet outage here in Sri Lanka.
Bugs Fixed
in core.py
-
_hex_to_rgb 3-char hex crash:#000, #FFF, #F00 etc. caused invalid literal for int() with base 16: ''. Added expansion of 3-char to 6-char before parsing
.- logo() crash: 'QR' object has no attribute '_version_size'``logo() tried to compute size_px = int(self._version_size * ratio) but _version_size doesn’t exist on the QR object at call time (the matrix hasn’t been built yet). Fixed to compute size_px lazily inside _get_logo_info() from module_count × box_size × ratio.
-logo(border=True) crash: invalid literal for int() with base 16: 'Tr'The _logo_border attribute stores a bool, but was passed directly as border_color to embed_image() which called _hex_to_rgb(True) → _hex_to_rgb("True") → crash. Fixed to pass "#000000" if self._logo_border else None.
-
image_ops.py + animation.py — _hex_to_rgb None guard
Added if not c: return (0, 0, 0) guard so passing None as a color never crashes.
- The
_color() validator didn’t strip surrounding shell-added quotes from color strings like “#FF0000”, causing # to be split off the hex digits. Fixed to strip " and ' before processing.
Changes
- Corrected Micro QR capacity table (all 8 version/ECC combos with accurate numeric/alpha/byte limits)
- Fixed
logo() parameter docs (border is bool, not int)- Fixed double ```bash` in installation section
- Corrected SMS encoding protocol note (sms: not smsto:)
Docs
- Added a more detailed info about MicroQR codes to
README.md and DOCUMENTATION.md- Made a landing site with help of Claude.
Open comments for this post
Publishing
Did some final stuff and published to PyPi.
- Add
SECURITY.md and `CONTRIBUTION.md
- Fix workflow to auto-publish to PyPi.
- Working a landing website.
- Added a release
- Published to PyPI
Now install via
pip install vokul --upgrade
Open comments for this post
Locked TF in
I wasnt able to do any devlogs cause my internet was out and yeah.
I did alot of work during the 8 hours,
- Rewrote the entire vault.py script to optimize the encryption and saving passwords.
- Used the
rich library to enhance the GUI. (took the longest)
- Researched more about other similar tools and made a work plan for future updates.
- Setting up workflows for auto publishing.
- Wrote a proper documentation and an attractive readme.
Open comments for this post
Locking in
Bug hunting has started. I have been looking for any bugs in the hidden corners and have found many of them. Like the embedded logo QR codes throw an error , microQR m4 type just crashes everything,etc. I also have used the library in actual code to test as well.
Landing Page
Used my front-end skills to to the best and locked in and designed a good looking website for BetterQR. Looks fine for now. Will do some changes later. Made it a single page website cause easier load for Github Pages.
(v2 is not out, expect it earlier this week)
Open comments for this post
Prepping for shipping
I initially planned to release this today, but realized something. The embedded logo thing and microqr is now failing on me. and Im lazy to fix this now so I’ll be fixingit tomorrow.
Making a website
So I thought why not make a website. So Im have been working on a small landing website with vanilla html and probably host it on GitHub Pages as well.
Open comments for this post
Prepping to ship
Doing stuff related to publishing the new version. Im noy going to be going in details cause Im at school 
Open comments for this post
Debugging
So i did few changes with the main vault.py to optimize the script. Like making it load only few saves lists and load them when they’re searched for. And alot of backend optimization. Im currently dont have ideas to add new stuff but lets see
Open comments for this post
Alot of things (forget to sync the hackatime folder)
I moved some files and forgot to sync it to hackatime so the hours is kind of high sorry.
This session was mostly debugging and testing and nothing much. Did some security patches and got feedback from some people.
Open comments for this post
Fixing failed tests
I have ran multiple CI/CD tests and have noted that most animations and data type qr codes fail. I think its mostly from wrong placements.
-
CLI Redirect: Redirect
data -> output when a helper flag is active.
-
SMS Protocol: Use
sms: not smsto:.
_write_format_info function bugs
The _write_format_info function as two major bugs.
-
Top-Right: uses
bit_idx=i in write_bit (which applies 14-i) but should write (fmt >> i) & 1 (vbit). The bit indices are swapped.
-
Bottom Left: Only writes 7 rows (missing row
size-8) ad uses wrong bit indices.
These are only like 1/4 of the bugs. These were the easiest to document so listed them here.
Open comments for this post
Testing and Fixing
After running the new CI/CD Tests most pass but some fail. I traced back the issues and fixed half of them.
Some issues I found
1, Micro QR auto-version: _min_version doesn’t enforce mode compatibility (M1=numeric only, M2=no byte, etc.) and uses wrong mode-indicator bit count in the needed formula.
2. WiFi/Geo/SMS/Phone/Email/VCard: The helper objects need to be passed as str() to QR() — the test is likely calling them directly. The __str__ methods need to produce correct strings, and some may have format issues.
3. Animations: GIF decode — need to verify each frame.
4. small_border: border=1 means only 4px quiet zone which may confuse decoders.
(i have been fixing them but not produce a result yet)
Open comments for this post
More features and fixing
Fixing Commands
Fixed some existing commands on how they handle errors. Fixed some ghost bugs in it as well.
Quick CLI preview edit
Added a purple ASCII art to make it look polished
Fix recovery
Fixed the auto-recovery function for the vault. (<– not fully confident if it works properly, but yeah)
Open comments for this post
New Commands and Features
Added some new commands and upgraded already existing commands as well.
Commands
-
--memorable flag: Added this flag to vokul generate to make the generated string a memorizable string. (in this case, words)
-
vokul edit: I have vokul add and get. So i added vokul edit so you edit passwords or update your TOTP.
-
vokul delete: A simple command to remove a service entry entirely.
-
vokul export: Allow the user to export their vault to a plain-text JSON file (after re-entering the Master Password). This is a “Right to Leave”—users feel safer using a tool if they know they can easily get their data out of it.
Features
-
Dry-Run/Validation: Before committing a
save() to the file, added a verification check. If the vault file is corrupted during a write operation (e.g., power failure), Vokul will detect it on the next launch and attempt to restore from the last valid .bak file automatically.
-
Lockdown on Error: If a user enters the wrong master password, added a “Cooldown” timer. After 3 failed attempts, force the process to sleep for 5 seconds, increasing exponentially to prevent brute-force attacks on the vault file.
(⚠️: Some of these are still in a WIP stage, will update them later. This is the skeleton that i’ll be building around)
Open comments for this post
CI/CD
Writing the test scripts from scratch cause the last CI/CD pipelines are kind of glitched. Used claude a little this time to structure it.
More Debugging
Trying to fix some bugs, scrolling through stack overlay rn (yes stack overflow and not ai, IM NOT A BOOMER trust)
Open comments for this post
Fixing time
I have identified all of the bugs (hopefully) and marked everything that has to be fixed.
Fixed Stuff
- Current bit-stream builder in
build_matrix writes all bits including the full 8-bit last data CW, then starts ECC. For M1/M3, the correct order is: 10 data CW (80 bits) + 4-bit partial + 6 ECC CW (48 bits). The current code writes all 17 CW as bits sequentially which gives the WRONG bit order.So I fixed the bit placement in build_matrix for M1/M3
- fixed
encode_data to use zero padding for Micro QR and handle the M1/M3 last-4-bit rule.
Need to be fixed
- I need to
fix _apply_mask to use Micro QR mask conditions (indices 1,4,6,7 of standard) for micro QR, and add a separate _MICRO_MASK_CONDITIONS list.
- Need to fix the
_min_version capacity checker, which has the same wrong cc_bits values
Open comments for this post
The Base Features
So I have developed most of the base features that should be in a password manager. Like adding , viewing , deleting passwords. Searching for the added services , and proper hashing and salting.
Adding TOTP
Half made a TOTP service where it can generate your 2FA codes without any other external authenticates. It currently works but has some backend issues.
Backup system
Also half-made. Added a function where it will save a cache copy of the vault before a service is added. So if the vault gets corrupted the cached vault will replace the corrupted vault. Also added an corrupt-check when starting the script itself. Added more hashing and salting for the cache vault as well to prevent leakings.
Assets and Logos (not tracked)
I made some logos for the app cause why not. I didnt lapse it so It isnt included in the total hours but it took ~1.5 hours.
Open comments for this post
Debugging 2
Finding errors in tables.py
As my last devlog I identified that there is some errors in matrix and table files. I started looking through the table data and found some errors.
-
bs.append(mode, 4) — always writes a 4-bit mode indicator. But for Micro QR, mode indicators are 1–4 bits depending on the version, not always 4 bits
-
The _data_placement_order function skips col 6 (standard QR timing column). For Micro QR, col 0 is the timing column that should be skipped. But since col 0 and row 0 are already marked as reserved via timing pattern placement, the if not reserved[row][c] check already handles it. The col == 6 skip is only needed because in standard QR col 6 is a function column that isn’t individually reserved — but since we now properly reserve col 0 for Micro QR, it’s already handled. The issue is the function always skips col 6, which in Micro QR is a valid data column.
- The Micro QR format info table has duplicate dict keys, so versions
M1-M3 silently get clobbered by M4’s values.
I’m still going through the code to find the errors first, Then I’ll start to fix them one-by-one cause I’m tired of fixing one and get another 2 bugs out of nowhere.
Open comments for this post
First Devlog for vokul!!
What is this?
This is a local-first password manager made in Python. Im planning on making this cross-device compatible with extension , app for windows/mobile and a CLI too. So this will be a big project.
The Plan
First I’m going to be making the CLI version which will also act as the backbone for other versions.
Next the chrome extension and so and on.
Progress
Currently build the absolute skeleton for the CLI with basic password saving functions. Passwords are properly salted as well. But will improve the security in the future.