<feed xmlns='http://www.w3.org/2005/Atom'>
<title>otpGarmin/test, branch v0.8.0</title>
<subtitle>OTP Wallet for Garmin Connect IQ: offline one-time passwords and barcodes.</subtitle>
<id>https://git.cirakg.xyz/otpGarmin/atom?h=v0.8.0</id>
<link rel='self' href='https://git.cirakg.xyz/otpGarmin/atom?h=v0.8.0'/>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/'/>
<updated>2026-10-21T01:55:10+00:00</updated>
<entry>
<title>test(build): add make watchdog, the glance memory budget and the glance screenshot</title>
<updated>2026-10-21T01:55:10+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-21T01:55:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=56e0c351bb95cfdf63aa76ab8c5d725a694bad63'/>
<id>urn:sha1:56e0c351bb95cfdf63aa76ab8c5d725a694bad63</id>
<content type='text'>
- make watchdog (in make ci): a stress build encodes, packs, turns into
  runs and draws the largest code of every 2D symbology at two steps per
  event on the Forerunner 255S and 70; it fails on a watchdog trip, and
  the last code left on the screen must decode (bitmap path on the 70).
- make memtest checks the glance (DIAG glance, budget 70 % of 64 KB).
- screenshots.sh launches the app again after the flow and compares the
  glance with the favourite's code (glance_code.png on 7 watches); the
  About goldens show 0.8.0.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(glance): show the favourite code in the glance (opt-in)</title>
<updated>2026-10-21T01:55:10+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-21T01:55:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=5e8ac1e2f5a660e55ea132996e1d5730cfa4fa64'/>
<id>urn:sha1:5e8ac1e2f5a660e55ea132996e1d5730cfa4fa64</id>
<content type='text'>
With "Show the favourite code in the glance" on, the glance shows the
code of the first favourite TOTP or Steam entry without the PIN, with a
countdown bar. The glance can't open the vault, so the About scan seals
that entry under "g" (device key, aad OTPW-GL-1) after every change, and
removes it when the option is off or no entry qualifies; the glance also
reads the option itself. HKDF moves to its own module so the glance loads
only the crypto it needs (37 % of its 64 KB). Manage entry gains "Mark as
favourite (glance)" and "Remove favourite", queued for locked entries
like the other changes. Lines are inset on round screens so the
Instinct 3's curved glance corner doesn't cut them.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(codes): bound every 2D encoding step under the watchdog; draw large codes from runs</title>
<updated>2026-10-21T01:55:01+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-21T01:55:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=88f1cac4fa530fc30fd6ef01970af11c7a959b8e'/>
<id>urn:sha1:88f1cac4fa530fc30fd6ef01970af11c7a959b8e</id>
<content type='text'>
M6's step sizes were estimates, only exercised with small codes. With the
largest inputs the app accepts, every 2D encoder tripped the watchdog on
the Forerunner 255S (and the biggest steps were far over the 768 KB
watches' limit), so a large code added from the phone would have stopped
the app during settings processing at every start.

- QR: resumable segmentation, Reed-Solomon, interleaving, function
  patterns and final mask; mask scoring on rows and columns packed 16
  modules per word (same penalties, checked against the per-module rules).
- Reed-Solomon: resumable field tables and generator, encoder shifting
  with native slice.
- Data Matrix, Aztec, PDF417: resumable encodation, stuffing, compaction,
  placement and build; Data Matrix's grid as a byte array (90 KB -&gt; 35 KB);
  PDF417 refuses text that can't fit the screen before compacting.
- Cache format 2 with 16-bit sizes (wide PDF417 was cached wrong); packing
  in steps; codes drawn as runs, and from a bitmap painted in steps when a
  frame can't draw all runs.
- The job runner does two steps per tick on 768 KB watches;
  gen_products --check verifies each product's watchdogCount fits that.
- CodeView renews full brightness (AMOLED) or the backlight (MIP) for up to
  a minute from its single ticker; a tap restarts the minute.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>perf(import): keep parsed items packed and the pasted text once</title>
<updated>2026-10-21T01:55:01+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-21T01:55:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=a69e23fb5266dd942d125239e7dcbe8a7c8ab956'/>
<id>urn:sha1:a69e23fb5266dd942d125239e7dcbe8a7c8ab956</id>
<content type='text'>
A parsed import item with its Entry took about 760 bytes as objects on the
Forerunner 255S; packed into one Codec ByteArray it takes about 110, and
the importer unpacks one item per store step (wiping the packed secret).
Aegis group names are resolved when unpacking, so no step repacks all
items. The JSON is parsed from the untrimmed text's bytes and the string
is dropped; an incomplete part is saved from those bytes. The form hash
is computed before the importer copies the text.

The peak of a 100-entry import on the 255S falls from 56 % to 45 %.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(settings): cover every form, symbology and Manage action; send the forms end to end in the UI flow</title>
<updated>2026-10-20T16:36:54+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-20T16:36:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=479d7ba2e843d5ea93979f2eed68f4d38d146c25'/>
<id>urn:sha1:479d7ba2e843d5ea93979f2eed68f4d38d146c25</id>
<content type='text'>
34 Monkey C tests (154 per device): validation messages, idempotency, the
queue, the About scan, "Encrypt names" and the properties contract. The
UI-test build fills in Add OTP, Add code and Manage like the phone; the flow
checks the new TOTP (309 848 at the frozen time), decodes the Code 128 card
and confirms the queued change to the locked entry with the PIN.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(codes): compare Aztec with aztec_code_generator, decode it and its screenshot</title>
<updated>2026-10-20T10:16:59+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-20T10:16:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=1ebc828f30698c1661055e17483e8d50a139ed45'/>
<id>urn:sha1:1ebc828f30698c1661055e17483e8d50a139ed45</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(codes): compare Data Matrix and PDF417 with references and decode them, also from screenshots</title>
<updated>2026-10-20T09:24:58+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-20T09:24:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=1251aab9f8f9f38aa5bdefd4fed1f58236166cf8'/>
<id>urn:sha1:1251aab9f8f9f38aa5bdefd4fed1f58236166cf8</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(codes): compare QR with segno, decode QR dumps and the QR screenshot</title>
<updated>2026-10-20T04:56:58+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-20T04:56:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=f455246fde086dda0cb61b92c84a5146a831a2bf'/>
<id>urn:sha1:f455246fde086dda0cb61b92c84a5146a831a2bf</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(codes): compare with zxing-cpp reference rows and decode encoder output and screenshots</title>
<updated>2026-10-20T00:43:08+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-20T00:43:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=fa9c695256de1c7fe007ba5d6bb9b28b1deb5a5a'/>
<id>urn:sha1:fa9c695256de1c7fe007ba5d6bb9b28b1deb5a5a</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(import): cover parsers, importer and a seeded fuzz corpus; import 100 entries in the UI flow</title>
<updated>2026-10-19T23:51:05+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-19T23:51:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=42f9331e693f5058fcfcd7aef5a92cabc04c20ee'/>
<id>urn:sha1:42f9331e693f5058fcfcd7aef5a92cabc04c20ee</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
