<feed xmlns='http://www.w3.org/2005/Atom'>
<title>otpGarmin, branch v0.1.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.1.0</id>
<link rel='self' href='https://git.cirakg.xyz/otpGarmin/atom?h=v0.1.0'/>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/'/>
<updated>2026-10-18T19:10:37+00:00</updated>
<entry>
<title>docs: add developer, testing and performance guides; record M0 results</title>
<updated>2026-10-18T19:10:37+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T19:10:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=b70cde45b67e1f6bb65d598d25c1a5184bdab520'/>
<id>urn:sha1:b70cde45b67e1f6bb65d598d25c1a5184bdab520</id>
<content type='text'>
- DEVELOPER_GUIDE: workflow, how the tooling works (verified simulator
  behaviour), conventions and how to add devices.
- TESTING and PERFORMANCE: test layers, M0 results and measured numbers.
- FEASIBILITY: what M0 verified (watchdog 120k/240k, 10 MB storage in
  device profiles, unreliable monkeydo exit code, icon sizes).
- README status, new make targets and layout; CHANGELOG 0.1.0.
- Author/Summary headers on every document, including the original brief.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(app): add minimal watch app with smoke test and per-size icons</title>
<updated>2026-10-18T19:10:37+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T19:10:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=773df56883b9961b607a1994920f5ef5299423b8'/>
<id>urn:sha1:773df56883b9961b607a1994920f5ef5299423b8</id>
<content type='text'>
The M0 placeholder app: AppBase entry point, home screen with name and
version, debug-only diagnostics (start-up time, memory) and a unit test
that runs in the headless simulator. Builds with strict type checking
and zero warnings for all 72 products; icons.jungle gives every product
a launcher icon of its exact size.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(tools): add screenshot, budget and product checks; enforce file headers</title>
<updated>2026-10-18T19:10:37+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T19:10:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=2292bf700d28ade39cf2d64b45509e6db21034bc'/>
<id>urn:sha1:2292bf700d28ade39cf2d64b45509e6db21034bc</id>
<content type='text'>
- sim_screenshot.py finds the device drawing in the simulator window,
  crops the screen and compares it with approved golden images.
- check_budgets.py reads key=value DIAG/HARNESS lines (the simulator
  console escapes quotes, so JSON was dropped).
- ciq_test_report.py accepts SDK 9.2.0's real summary line
  `PASSED (passed=N, failed=N, errors=N)`; a captured log is a fixture.
- gen_products.py checks all manifest products are watches with
  API 5.0+ and at least 512 KB for apps.
- lint_project.py rule HDR001: every file carries the Author/Summary
  header (JSON keys, PNG text chunks; generated package-lock exempt).
- make_icon.py --all draws one icon per launcher size in use.
- Golden screenshots for fr255s, venusq2, fr70 and fr965.
- 44 tests, warnings as errors, ruff and mypy --strict clean.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>build: complete the Docker pipeline for build, test, screenshots and packaging</title>
<updated>2026-10-18T19:10:37+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T19:10:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=85f1ecabd7f58f306b2a042376209ac8cf49ab9b'/>
<id>urn:sha1:85f1ecabd7f58f306b2a042376209ac8cf49ab9b</id>
<content type='text'>
- Container scripts now run from the mounted project (no image rebuild
  per script change): build-app.sh (strict -l 3, warnings fail),
  run-unit-tests.sh, screenshots.sh, app-diag.sh (perf/memory),
  lint.sh, package.sh and sim-vnc.sh (noVNC on 127.0.0.1:6080).
- Headless simulator helpers: wait for port 1234, remove the stale
  single-instance lock (~/Sim-dev) that made later starts hang, show
  the simulator log on failure.
- New targets: screenshots-approve, icons; `make lock` re-adds the
  requirements header; pytest treats warnings as errors.
- Author/Summary headers on every build file.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(tools): add test-log judge, docs and policy checks with tests</title>
<updated>2026-10-18T18:28:09+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T18:28:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=2071e2beda763137416ac386d4bb953711ec995d'/>
<id>urn:sha1:2071e2beda763137416ac386d4bb953711ec995d</id>
<content type='text'>
- ciq_test_report.py: decides pass/fail from Run No Evil output instead
  of monkeydo's unreliable exit code; writes JUnit XML.
- check_docs.py: offline check of relative links and GitHub anchors.
- lint_project.py: project rules (headers, no logging outside Diag,
  no secret-like literals, no network APIs or permissions).
- check_budgets.py with budgets.json: perf and memory gates.
- make_icon.py: reproducible launcher icon.
- 31 pytest tests, including Hypothesis fuzzing of the log parser and
  integration checks against the real docs and sources; ruff and mypy
  (strict) clean.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>build: add Docker-only Makefile, SDK setup and product manifest</title>
<updated>2026-10-18T18:28:09+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T18:28:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=a9b1dc8bd9354973eabd72f56d82b2eab6f48d56'/>
<id>urn:sha1:a9b1dc8bd9354973eabd72f56d82b2eab6f48d56</id>
<content type='text'>
- Makefile: every target runs in a container as your UID/GID, with no
  capabilities, a read-only root filesystem, only the project folder
  mounted and no network except for image builds and `make sdk`.
  Serial even under `make -j`. `make nuke` removes containers, images,
  the dedicated buildx builder and .cache/ after confirmation.
- sdk-setup.sh: agreement acceptance pinned to the hash you read,
  password login (never stored), SDK 9.2.0 and device download, and
  the login token deleted afterwards.
- gen-key.sh: RSA-4096 developer key into .cache/keys, never
  overwritten, with backup instructions.
- manifest.xml: watch-app, minApiLevel 5.0.0, no permissions, and the
  72 watches with API 5.0+ and at least 512 KB for apps.
- .gitignore, lint configs and CHANGELOG.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>build(docker): add pinned dev and docs images</title>
<updated>2026-10-18T18:28:09+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T18:28:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=fe4ba63c0a12d9c914acbb0332d96924810b393b'/>
<id>urn:sha1:fe4ba63c0a12d9c914acbb0332d96924810b393b</id>
<content type='text'>
garmin-otp/dev: Ubuntu 22.04 (pinned by digest; the simulator needs
WebKitGTK 4.0), apt packages from a dated snapshot.ubuntu.com mirror,
OpenJDK 17, Xvfb/openbox/noVNC for the headless simulator, the
connect-iq-sdk-manager CLI v0.8.4 checked against its release SHA-256,
and Python tools installed from a hash-locked requirements file.

garmin-otp/docs: Node 22 (pinned by digest), Debian snapshot packages,
markdownlint-cli2 and mermaid-cli from package-lock.json, and the
headless Chrome build pinned by Puppeteer.

Locks only use releases published before 2026-10-01. The Garmin SDK,
device files and the developer key are never baked into an image.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: record final decisions, test watch and SDK login details</title>
<updated>2026-10-18T18:28:09+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T18:28:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=8b0e632526d9504c5c0e09bab72ab83db1c46f9b'/>
<id>urn:sha1:8b0e632526d9504c5c0e09bab72ab83db1c46f9b</id>
<content type='text'>
- README: Forerunner 70 is the test watch, the phone is Android, Docker
  access is settled; how `make sdk` logs in and why the browser login
  can't be used; the new `make products` and `make lock` targets.
- FEASIBILITY: final decisions D1-D5.
- Space out table separator rows and turn bold-only lines into
  headings so markdownlint passes.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Inital commit.</title>
<updated>2026-10-18T17:47:15+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T17:47:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=5396ace6a695ecf530c2ecc9793dfe01f523e70d'/>
<id>urn:sha1:5396ace6a695ecf530c2ecc9793dfe01f523e70d</id>
<content type='text'>
</content>
</entry>
</feed>
