<feed xmlns='http://www.w3.org/2005/Atom'>
<title>otpGarmin, branch v0.9.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.9.0</id>
<link rel='self' href='https://git.cirakg.xyz/otpGarmin/atom?h=v0.9.0'/>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/'/>
<updated>2026-10-25T22:51:52+00:00</updated>
<entry>
<title>chore(release): 0.9.0, the fixes from the first real-watch round</title>
<updated>2026-10-25T22:51:52+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T22:51:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=096eebab2add4faba4cd04ab81d325deca17af15'/>
<id>urn:sha1:096eebab2add4faba4cd04ab81d325deca17af15</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(ui): second UI scenario, and the fixes it found</title>
<updated>2026-10-25T22:51:52+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T22:51:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=b8addc87f804789368612bf8e1be31a2bf28efe1'/>
<id>urn:sha1:b8addc87f804789368612bf8e1be31a2bf28efe1</id>
<content type='text'>
A second UI-test build (uitest-extra.jungle) covers the legacy PIN and
the forced new PIN, Change and Reset PIN, a queued Require PIN, UPC-A,
Code 39, the code error screen, the encoding progress, auto-lock on a
barcode, the light theme and the glance without a code; the main flow
adds the Steam and Library details and the menu's text screens.

Fixed from what it found: Entry IDs tripped the watchdog with 110
entries; auto-lock didn't close a locked barcode; a queued Require PIN
showed "Confirm in menu"; locked barcodes lacked the padlock; the PIN
keypad's bottom row, the Reset PIN question, text-screen bottoms, the
glance title and the light-theme warning colour.

Goldens approved on all seven watches; only the Forerunner 70 was
re-verified after the version bump.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(codes): encoding progress follows the work</title>
<updated>2026-10-25T13:17:45+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T13:17:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=140a6660f63f88d05ba9aae0bf1c4b401bb6574d'/>
<id>urn:sha1:140a6660f63f88d05ba9aae0bf1c4b401bb6574d</id>
<content type='text'>
The QR percentage counted phases and the display froze at 90 % once
encoding ended, so the first opening sat at 90 % while the slow stages
ran. Each 2D symbology now weights its phases by measured cost,
interpolates inside the long ones, and the display splits encode,
pack and runs; a cached code counts its runs from 0.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: 4-digit PIN, the offline-guessing limit, Manage needs Apply</title>
<updated>2026-10-25T12:13:39+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T12:13:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=67e7ce3d496c34a30ff498eaff2074543350318a'/>
<id>urn:sha1:67e7ce3d496c34a30ff498eaff2074543350318a</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix(ui): vertical swipes and drags scroll the list and text screens</title>
<updated>2026-10-25T12:13:39+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T12:13:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=404b505a41362f340e79374ee3ad4dbd468da3e4'/>
<id>urn:sha1:404b505a41362f340e79374ee3ad4dbd468da3e4</id>
<content type='text'>
The Forerunner 70 sends no page behaviour for a swipe on a custom view,
so the list and info screens only scrolled with the buttons. Swipes and
drags now scroll them directly; one gesture scrolls once even when the
device also sends the page behaviour, and a drag's release opens no row.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(pin): exactly 4 digits, entered on the 4th digit</title>
<updated>2026-10-25T11:46:42+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T11:46:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=096b5a4d17c85fa5f87db3e72364e9c3506d1e64'/>
<id>urn:sha1:096b5a4d17c85fa5f87db3e72364e9c3506d1e64</id>
<content type='text'>
The keypad has no OK key; the 4th digit submits, so a tap that also
arrives as START can no longer submit a partial PIN (the likely cause
of "Wrong PIN" before the code opened). PINs set by earlier versions
still unlock and are then replaced by a 4-digit one. Opening an entry
ignores a second request from the same tap. A Require PIN sent from
the phone while the watch is locked now applies at the next PIN
instead of waiting for Confirm all. The linter skips .claude.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: record the settings spike and the Forerunner 70 benchmark</title>
<updated>2026-10-25T11:46:42+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T11:46:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=e0384274bbeab999279bdc35bdddbd8a3a451aeb'/>
<id>urn:sha1:e0384274bbeab999279bdc35bdddbd8a3a451aeb</id>
<content type='text'>
Spike (2026-10-21, Android): 8000 characters per field and 64,000 in
total arrive; URIs with &amp; save; the mixed special-character string is
refused, so the test strings now split it into one group each plus a
fake Aegis export. Benchmark: SHA-1 TOTP 18 ms, SHA-512 732 ms, PBKDF2
2,000 iterations per second.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: the Forerunner 70 is AMOLED; barcodes go to full brightness</title>
<updated>2026-10-25T10:56:23+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T10:56:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=6b17954f654d83c754cbdaae37f98689b9a4fcb7'/>
<id>urn:sha1:6b17954f654d83c754cbdaae37f98689b9a4fcb7</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: how a sideloaded build is removed from the watch</title>
<updated>2026-10-25T10:56:02+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-25T10:56:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=a20b77e4a67263b55b325dee5c7532022cd08570'/>
<id>urn:sha1:a20b77e4a67263b55b325dee5c7532022cd08570</id>
<content type='text'>
The watch removes the .prg after installing it; the app is removed from
the watch's own menu and its fr70.* storage files deleted by hand.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: your step-by-step guide to the on-watch tests before 1.0.0</title>
<updated>2026-10-21T17:58:51+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-21T17:58:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=bd2787c29c1e37d4683247dc7cf4e754f20754ad'/>
<id>urn:sha1:bd2787c29c1e37d4683247dc7cf4e754f20754ad</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
