diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/STORE_LISTING.md | 84 | ||||
| -rw-r--r-- | docs/TESTING.md | 4 | ||||
| -rw-r--r-- | docs/YOUR_STEPS.md | 2 | ||||
| -rw-r--r-- | docs/store/cover-500.png | bin | 0 -> 21700 bytes | |||
| -rw-r--r-- | docs/store/hero-1440x720.png | bin | 0 -> 204975 bytes | |||
| -rw-r--r-- | docs/store/screen-1-list.png | bin | 0 -> 30257 bytes | |||
| -rw-r--r-- | docs/store/screen-2-otp.png | bin | 0 -> 26341 bytes | |||
| -rw-r--r-- | docs/store/screen-3-qr.png | bin | 0 -> 19145 bytes | |||
| -rw-r--r-- | docs/store/screen-4-glance.png | bin | 0 -> 35695 bytes | |||
| -rw-r--r-- | docs/store/screen-5-pin.png | bin | 0 -> 16904 bytes | |||
| -rw-r--r-- | docs/store/screen-6-pdf417.png | bin | 0 -> 16733 bytes | |||
| -rw-r--r-- | docs/store/screen-7-import.png | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000..4b3de22 --- /dev/null +++ b/docs/store/cover-500.png diff --git a/docs/store/hero-1440x720.png b/docs/store/hero-1440x720.png Binary files differnew file mode 100644 index 0000000..dcbf034 --- /dev/null +++ b/docs/store/hero-1440x720.png diff --git a/docs/store/screen-1-list.png b/docs/store/screen-1-list.png Binary files differnew file mode 100644 index 0000000..ad77a2f --- /dev/null +++ b/docs/store/screen-1-list.png diff --git a/docs/store/screen-2-otp.png b/docs/store/screen-2-otp.png Binary files differnew file mode 100644 index 0000000..9c65987 --- /dev/null +++ b/docs/store/screen-2-otp.png diff --git a/docs/store/screen-3-qr.png b/docs/store/screen-3-qr.png Binary files differnew file mode 100644 index 0000000..472d714 --- /dev/null +++ b/docs/store/screen-3-qr.png diff --git a/docs/store/screen-4-glance.png b/docs/store/screen-4-glance.png Binary files differnew file mode 100644 index 0000000..c81a534 --- /dev/null +++ b/docs/store/screen-4-glance.png diff --git a/docs/store/screen-5-pin.png b/docs/store/screen-5-pin.png Binary files differnew file mode 100644 index 0000000..7d6ff00 --- /dev/null +++ b/docs/store/screen-5-pin.png diff --git a/docs/store/screen-6-pdf417.png b/docs/store/screen-6-pdf417.png Binary files differnew file mode 100644 index 0000000..e11db60 --- /dev/null +++ b/docs/store/screen-6-pdf417.png diff --git a/docs/store/screen-7-import.png b/docs/store/screen-7-import.png Binary files differnew file mode 100644 index 0000000..b5f81fb --- /dev/null +++ b/docs/store/screen-7-import.png |
