aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorcirakg <cirakg@cirakg.xyz>2026-10-28 00:03:01 +0100
committercirakg <cirakg@cirakg.xyz>2026-10-28 00:03:01 +0100
commit9e5a85fe01e94489198a64a458f9b09584594f80 (patch)
tree9b3668b4c42dc30dbfe65db734987663de2bdfbb /docs
parente5172350151043050098d37b728054eb2e2be9f8 (diff)
chore(release): 1.0.0, with the Connect IQ Store listingv1.0.0
The second real-watch round on the Forerunner 70 passed: codes from otpauth:// links, the 4-digit PIN, touch scrolling and Aegis JSON import. Version 1.0.0 ships the fixes of the 0.9.0 review. - docs/STORE_LISTING.md: title, description and What's New for the Garmin developer page, with measured character counts. - docs/store/: hero (1440x720), cover (500x500) and seven round screen images, built by tools/store_assets.py from the fr70 goldens. - CHANGELOG 1.0.0, README status, TESTING round 2 results, YOUR_STEPS marked done, fr70 about.png golden at 1.0.0. make ci green on fr70. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'docs')
-rw-r--r--docs/STORE_LISTING.md84
-rw-r--r--docs/TESTING.md4
-rw-r--r--docs/YOUR_STEPS.md2
-rw-r--r--docs/store/cover-500.pngbin0 -> 21700 bytes
-rw-r--r--docs/store/hero-1440x720.pngbin0 -> 204975 bytes
-rw-r--r--docs/store/screen-1-list.pngbin0 -> 30257 bytes
-rw-r--r--docs/store/screen-2-otp.pngbin0 -> 26341 bytes
-rw-r--r--docs/store/screen-3-qr.pngbin0 -> 19145 bytes
-rw-r--r--docs/store/screen-4-glance.pngbin0 -> 35695 bytes
-rw-r--r--docs/store/screen-5-pin.pngbin0 -> 16904 bytes
-rw-r--r--docs/store/screen-6-pdf417.pngbin0 -> 16733 bytes
-rw-r--r--docs/store/screen-7-import.pngbin0 -> 23676 bytes
12 files changed, 90 insertions, 0 deletions
diff --git a/docs/STORE_LISTING.md b/docs/STORE_LISTING.md
new file mode 100644
index 0000000..8317138
--- /dev/null
+++ b/docs/STORE_LISTING.md
@@ -0,0 +1,84 @@
+<!--
+ Author: cirakg & claude ai
+ Summary: Text and images for the Connect IQ Store listing, ready to paste into the Garmin developer page.
+-->
+# Connect IQ Store listing
+
+Copy each block into the matching field of the app page on the Garmin developer site. The text inside each block is plain text: the Store shows line breaks but no Markdown. The character counts were measured when the text was written: title 32, description 2385, What's New 755.
+
+## Title (max. 50 characters)
+
+```text
+OTP Wallet: 2FA Codes & Barcodes
+```
+
+## Description (max. 4000 characters)
+
+```text
+Your two-factor codes and your loyalty cards on your wrist, with no phone and no network.
+
+OTP Wallet shows one-time passwords (TOTP, HOTP and Steam Guard) and stores barcodes and QR codes to show at a scanner. Everything is encrypted on the watch. There is no cloud, no account and no analytics, and the app requests no permissions, so it cannot use the network.
+
+ONE-TIME CODES
+- TOTP (SHA-1, SHA-256, SHA-512; 6 to 8 digits; any period), HOTP and Steam Guard.
+- A ring shows the seconds left; the next code is shown before the current one expires.
+- Optional glance with your favourite code.
+- Codes use the watch's clock. Keep the watch synced with your phone for the right time.
+
+BARCODES AND QR CODES
+- QR, Aztec, Data Matrix, PDF417, Code 128, Code 39, EAN-13, EAN-8, UPC-A, UPC-E, ITF and Codabar, all drawn on the watch.
+- Black on white with full brightness on AMOLED watches (backlight on MIP watches) for easy scanning.
+- The watch tells you if a code is too large for its screen.
+
+SECURITY
+- Secrets and codes are stored encrypted on the watch.
+- Optional 4-digit app PIN: entries marked "Require PIN" are encrypted with a key only the PIN opens.
+- Auto-lock, a growing wait after wrong PINs, and an option to erase the locked entries after 10 wrong PINs.
+- A 4-digit PIN stops someone using your watch, not someone who copies its storage to a computer.
+- Secrets only flow into the watch. The app never exports them.
+
+ADDING ENTRIES
+Open the app settings in Garmin Connect on your phone:
+- Paste otpauth:// links (from most authenticator apps' export or "show secret" screens).
+- Or paste an unencrypted Aegis export (JSON).
+- Or fill in the "Add OTP" and "Add code" forms by hand.
+The watch parses the text itself and shows an import report. Changes to entries marked "Require PIN" wait on the watch until you confirm them with your PIN.
+
+GOOD TO KNOW
+- App settings work with the Store version only.
+- Garmin Connect refuses text that contains a backslash. If an Aegis export is refused, replace every \/ with / in a text editor, or use otpauth:// links.
+- Encrypted Aegis exports and Google Authenticator export links are not supported.
+- Keep a backup of your secrets in your phone authenticator. The watch is not a backup.
+
+Needs a watch with Connect IQ API 5.0 or newer and enough app memory (72 models, including Forerunner, fenix, epix, Venu and Instinct models).
+```
+
+## What's New (max. 4000 characters)
+
+```text
+1.0.0: first public release.
+
+Tested on a Forerunner 70: one-time codes, the PIN, touch scrolling, otpauth:// import and Aegis JSON import.
+
+Since the beta (0.9.0):
+- On touch screens, START no longer submits an old-style PIN by accident.
+- "Change PIN" after an old-style PIN asks for the new PIN once, not twice.
+- Entering the PIN with many waiting phone changes no longer stops the app; the changes are applied in small steps.
+- Large waiting changes no longer stop the app at start.
+- A replacement secret or code is checked as soon as it arrives.
+- "Confirm all" and "Reject all" act only on the changes shown.
+- A full storage reports "Storage full" instead of stopping the app.
+- Pasting about 100 otpauth:// links at once no longer stops the app.
+```
+
+## Images
+
+Built by `python3 tools/store_assets.py` from the Forerunner 70 goldens (`test/golden/fr70/`) into [docs/store/](store/). Re-run it after the goldens change.
+
+| Store field | File | Size limit |
+| --- | --- | --- |
+| Hero image (1440 × 720) | [hero-1440x720.png](store/hero-1440x720.png) | 2048 KB |
+| Cover image (500 × 500) | [cover-500.png](store/cover-500.png) | 300 KB |
+| Screen images (390 × 390, round, transparent corners) | [screen-1-list.png](store/screen-1-list.png), [screen-2-otp.png](store/screen-2-otp.png), [screen-3-qr.png](store/screen-3-qr.png), [screen-4-glance.png](store/screen-4-glance.png), [screen-5-pin.png](store/screen-5-pin.png), [screen-6-pdf417.png](store/screen-6-pdf417.png), [screen-7-import.png](store/screen-7-import.png) | 150 KB each |
+
+All images show fake data only.
diff --git a/docs/TESTING.md b/docs/TESTING.md
index 6063740..14cd173 100644
--- a/docs/TESTING.md
+++ b/docs/TESTING.md
@@ -26,6 +26,10 @@ Test devices: the Forerunner 70 by default; with `ALL=1` (`TEST_DEVICES`): Forer
## Results
+### Real-watch round 2, 2026-10-27 (version 1.0.0)
+
+The owner tested 0.9.0 on the Forerunner 70: `otpauth://` entries added from the phone show the right codes, the 4-digit PIN works, touch scrolling works, and an unencrypted Aegis export imported on the watch. Settings spike test C, split: only `C3` (the backslash) is refused by Garmin Connect; the rest saved ([SETTINGS_SPIKE.md](SETTINGS_SPIKE.md#follow-up-for-test-c)). The refusal is accepted as a known limitation. No new failures, so 1.0.0 is released with the fixes of the 0.9.0 review below. `make ci` is green on the Forerunner 70; the Forerunner 70 `about.png` golden shows 1.0.0. The other devices' `about.png` goldens still show 0.8.0 and are re-approved at the next `ALL=1` run. One `make ci` run failed once on `entry_ids_next` (the list scrolled one line further than the golden) and passed unchanged on the next run: a timing flake in the scripted scroll, to watch.
+
### Review of 0.9.0, 2026-10-26 (unreleased)
An independent review of 0.9.0's changes (b8addc8, 096b5a4, 404b505, 140a666) and a watchdog test of the PIN unlock found and fixed:
diff --git a/docs/YOUR_STEPS.md b/docs/YOUR_STEPS.md
index 786515d..98da404 100644
--- a/docs/YOUR_STEPS.md
+++ b/docs/YOUR_STEPS.md
@@ -21,6 +21,8 @@ Total time: about 2.5 to 3 hours, which can be split across days at any part bou
| 7 | Uninstall check and clean-up | 10 min |
| 8 | Send me the results | 5 min |
+> **Done (2026-10-28).** Round 2 is recorded in [TESTING.md](TESTING.md#real-watch-round-2-2026-10-27-version-100) and 1.0.0 is released. What's left is the Store listing: [STORE_LISTING.md](STORE_LISTING.md) has the text and images to paste into the Garmin developer page, and `make package` builds `build/package/otp-wallet-1.0.0.iq` to upload. This page stays as the record of what was tested.
+
## Round 2: version 0.9.0 (after your results of 2026-10-21)
Your first round (parts 3 and 4, and 5.2) is recorded: the spike in [SETTINGS_SPIKE.md](SETTINGS_SPIKE.md#results), the benchmark in [PERFORMANCE.md](PERFORMANCE.md), and the fixes in the [changelog](../CHANGELOG.md) (0.9.0). Do this round next; then continue with the parts of round 1 you haven't done (5.3 onwards), on 0.9.0 instead of 0.8.0.
diff --git a/docs/store/cover-500.png b/docs/store/cover-500.png
new file mode 100644
index 0000000..4b3de22
--- /dev/null
+++ b/docs/store/cover-500.png
Binary files differ
diff --git a/docs/store/hero-1440x720.png b/docs/store/hero-1440x720.png
new file mode 100644
index 0000000..dcbf034
--- /dev/null
+++ b/docs/store/hero-1440x720.png
Binary files differ
diff --git a/docs/store/screen-1-list.png b/docs/store/screen-1-list.png
new file mode 100644
index 0000000..ad77a2f
--- /dev/null
+++ b/docs/store/screen-1-list.png
Binary files differ
diff --git a/docs/store/screen-2-otp.png b/docs/store/screen-2-otp.png
new file mode 100644
index 0000000..9c65987
--- /dev/null
+++ b/docs/store/screen-2-otp.png
Binary files differ
diff --git a/docs/store/screen-3-qr.png b/docs/store/screen-3-qr.png
new file mode 100644
index 0000000..472d714
--- /dev/null
+++ b/docs/store/screen-3-qr.png
Binary files differ
diff --git a/docs/store/screen-4-glance.png b/docs/store/screen-4-glance.png
new file mode 100644
index 0000000..c81a534
--- /dev/null
+++ b/docs/store/screen-4-glance.png
Binary files differ
diff --git a/docs/store/screen-5-pin.png b/docs/store/screen-5-pin.png
new file mode 100644
index 0000000..7d6ff00
--- /dev/null
+++ b/docs/store/screen-5-pin.png
Binary files differ
diff --git a/docs/store/screen-6-pdf417.png b/docs/store/screen-6-pdf417.png
new file mode 100644
index 0000000..e11db60
--- /dev/null
+++ b/docs/store/screen-6-pdf417.png
Binary files differ
diff --git a/docs/store/screen-7-import.png b/docs/store/screen-7-import.png
new file mode 100644
index 0000000..b5f81fb
--- /dev/null
+++ b/docs/store/screen-7-import.png
Binary files differ