Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
f163ff5
updated icons, and cleaned up minor things
TheAngryRaven Jun 21, 2026
13adffd
added icon for home screen
TheAngryRaven Jun 21, 2026
e2f099f
Merge pull request #264 from TheAngryRaven/feature/update-icons
TheAngryRaven Jun 21, 2026
33b7df6
Purple theme + LapWing header logo
claude Jun 21, 2026
b6c3d79
Merge pull request #266 from TheAngryRaven/claude/recolor-purple-logo
TheAngryRaven Jun 21, 2026
e654532
Mobile UI: logo returns home + safe-area insets
claude Jun 21, 2026
fb0714f
Merge pull request #267 from TheAngryRaven/claude/mobile-ui-cleanup-t…
TheAngryRaven Jun 21, 2026
e2bb526
Add image-based logger picker for "Download from logger"
claude Jun 21, 2026
dfdda19
Merge pull request #268 from TheAngryRaven/claude/download-logger-men…
TheAngryRaven Jun 21, 2026
18112c2
Fix home download button; add generic logger-connection layer
claude Jun 21, 2026
6443ada
Merge pull request #269 from TheAngryRaven/claude/download-logger-men…
TheAngryRaven Jun 21, 2026
45293dd
Add Privacy & Terms links to the sign-in page
claude Jun 21, 2026
cfa8343
Render the Credits trigger as a button
claude Jun 21, 2026
336fcdc
Clean up the landing page: split upload, trim native, rework footer
claude Jun 21, 2026
8faaac6
Make "Back to app" return to the previous page
claude Jun 21, 2026
943bf73
Merge pull request #270 from TheAngryRaven/claude/ui-cleanup-landing-…
TheAngryRaven Jun 21, 2026
88eade6
Document the DovesDataLogger BLE protocol as a portable wire spec
claude Jun 21, 2026
16c75e6
Show separate cloud + local storage bars in the profile
claude Jun 21, 2026
4fd1e25
Merge pull request #271 from TheAngryRaven/claude/bluetooth-tauri-doc…
TheAngryRaven Jun 21, 2026
c709769
Auto-deploy the beta-proxy Worker from CI
claude Jun 21, 2026
265e7a5
Merge pull request #272 from TheAngryRaven/claude/profile-storage-bar…
TheAngryRaven Jun 21, 2026
246c4e9
Fix login rate limiter locking out valid sign-ins
claude Jun 21, 2026
b0e7f6a
Merge pull request #274 from TheAngryRaven/claude/fix-login-rate-limiter
TheAngryRaven Jun 21, 2026
7bc44e9
Add deploy-version check independent of the service worker
claude Jun 21, 2026
ae786b3
Merge pull request #275 from TheAngryRaven/claude/app-version-updates…
TheAngryRaven Jun 21, 2026
9aa8c8c
Add password rules + realtime strength checker to sign-up
claude Jun 21, 2026
67d9797
Merge pull request #276 from TheAngryRaven/claude/registration-passwo…
TheAngryRaven Jun 21, 2026
0803bbd
Merge pull request #273 from TheAngryRaven/claude/beta-proxy-auto-deploy
TheAngryRaven Jun 21, 2026
d55eea0
Extend safe-area insets to drawer + full-page routes
claude Jun 21, 2026
8979079
Add native MyChron Wi-Fi file downloader
claude Jun 21, 2026
e2f9aea
Merge pull request #277 from TheAngryRaven/claude/native-safe-area-pa…
TheAngryRaven Jun 21, 2026
6f0e246
Translate MyChron download flow strings into all locales
claude Jun 21, 2026
4c55370
Merge remote-tracking branch 'origin/BETA' into claude/rebase-onto-be…
claude Jun 21, 2026
e38932e
Merge pull request #278 from TheAngryRaven/claude/rebase-onto-beta-ku…
TheAngryRaven Jun 22, 2026
7b890ad
Make MyChron Wi-Fi SSID prefix configurable in Settings
claude Jun 22, 2026
e2e5c80
Merge pull request #279 from TheAngryRaven/claude/rebase-onto-beta-ku…
TheAngryRaven Jun 22, 2026
3ec1a27
Landing/auth UI polish + native gating tweaks
claude Jun 22, 2026
be290f8
Logger picker: real photos, mobile layout, close button, trademark note
claude Jun 22, 2026
ef5deb0
Logger picker: restore inner padding + add mobile side gutter
claude Jun 22, 2026
fa7d624
Logger picker: "Coming soon" badge on MyChron (web only)
claude Jun 22, 2026
ef718b8
Merge pull request #280 from TheAngryRaven/claude/native-landing-ui-t…
TheAngryRaven Jun 22, 2026
d755008
Release 2.9.0: cut version, move GitHub links into About, refresh fea…
claude Jun 22, 2026
dbc6ae6
Changelog: note the About-dialog open-source links move
claude Jun 22, 2026
dc3f60b
Merge pull request #281 from TheAngryRaven/claude/release-2-9-0
TheAngryRaven Jun 22, 2026
33fcea4
Picker name tidy, delete-account header, drop landing tagline
claude Jun 22, 2026
e00c53a
Merge pull request #282 from TheAngryRaven/claude/picker-names-and-trim
TheAngryRaven Jun 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions .github/workflows/deploy-beta-proxy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Deploy beta-proxy

# beta-proxy/ is the reverse-proxy Worker that serves beta.lapwingdata.com (it
# forwards to the lapwing `beta` branch preview). It is a SEPARATE Worker from
# the main app — Cloudflare's connected-repo CI builds the app but nothing
# deploys this proxy. This workflow does:
# • validate it on PRs that touch it (dry-run, no secrets — runs on forks too)
# • deploy it on BETA pushes that change it, or on demand (workflow_dispatch)
#
# Required repo secrets for the deploy job:
# • CLOUDFLARE_API_TOKEN — token with "Edit Cloudflare Workers" on the account
# • CLOUDFLARE_ACCOUNT_ID — the account that owns the lapwingdata.com zone

on:
push:
branches: [BETA]
paths:
- "beta-proxy/**"
- ".github/workflows/deploy-beta-proxy.yml"
pull_request:
paths:
- "beta-proxy/**"
- ".github/workflows/deploy-beta-proxy.yml"
workflow_dispatch:

permissions:
contents: read

# Pin the wrangler version used to both validate and deploy so runs are
# reproducible (beta-proxy has no committed lockfile).
env:
WRANGLER_VERSION: "4.103.0"

# Never let two deploys of the same ref overlap; queue rather than cancel so an
# in-flight deploy always finishes.
concurrency:
group: deploy-beta-proxy-${{ github.ref }}
cancel-in-progress: false

jobs:
# Bundle + config check for PRs. Needs no Cloudflare secrets, so it catches a
# broken wrangler.toml before it can reach BETA (and works for fork PRs).
validate:
if: github.event_name == 'pull_request'
name: Dry-run
runs-on: ubuntu-latest
defaults:
run:
working-directory: beta-proxy
steps:
- uses: actions/checkout@v4
- run: npx --yes wrangler@${{ env.WRANGLER_VERSION }} deploy --dry-run --config ./wrangler.toml

deploy:
if: github.event_name != 'pull_request'
name: Deploy Worker
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
workingDirectory: beta-proxy
wranglerVersion: ${{ env.WRANGLER_VERSION }}
command: deploy --config ./wrangler.toml
78 changes: 0 additions & 78 deletions .lovable/plan.md

This file was deleted.

125 changes: 125 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,131 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
> from git history and grouped by theme rather than exhaustive per-commit
> detail.

## [2.9.0] - 2026-06-22

### Added
- **Password strength rules + a realtime checker on sign-up.** The registration
form now enforces stronger passwords (at least 8 characters, with a lowercase
letter, an uppercase letter, a number, and a symbol) and shows a live strength
meter with a per-rule checklist that updates as you type. The check is fully
offline (`lib/passwordStrength.ts`).
- **"Update available" check that doesn't rely on the service worker.** The app
now also compares the running build against a build-emitted `version.json`
fetched fresh from the server, so a stale tab reliably surfaces the "Update
ready" prompt even when the service worker's own update detection stalls behind
HTTP/CDN caching. The Refresh button hard-reboots onto the new build.
- **Separate cloud + local storage bars in the profile.** When signed in, the
profile now shows two storage meters — one for cloud quota and one for on-device
(local) storage — instead of just the cloud one. The local bar carries an (i)
bubble explaining that the device's real free space isn't visible to the app, so
the bar is marked against an arbitrary 10 GB and can be safely ignored (local
storage has no limit).
- **Generic logger-connection layer.** Downloads now go through one
`LoggerConnection` interface (`listLogs` / `downloadLog` / `disconnect`) in
`src/lib/loggers/`, with `createFledglingConnection()` adapting the Web Bluetooth
transport. This is the seam future loggers plug into — MyChron over the native
(Tauri) shell, Alfano over BLE — without the download UI having to branch on
transport. `DeviceContext` now tracks the connected `loggerKind`.
- **Logger picker.** "Download from logger" now opens an image-based chooser of
supported loggers instead of jumping straight to Bluetooth: **PerchWerks
Fledgling** (DIY, Bluetooth), **AiM MyChron 5 / 5S / 2T** (Wi-Fi, native app
required), and **Alfano 6 / 7** (Bluetooth, coming soon). The Fledgling runs the
existing Bluetooth download flow; MyChron and Alfano open explanatory dialogs for
now (MyChron's copy differs between the native app and the web). Placeholder
artwork lives in `public/loggers/` for easy swap-out. New `logger` i18n namespace.
- **Download from a MyChron over Wi-Fi (native app).** In the native (Tauri) app,
the MyChron tile in the logger picker now runs a real download: it connects to the
logger over Wi-Fi (on Android it prompts you to pick the MyChron in the system
Wi-Fi dialog), lists the sessions on the device, and downloads + opens the one you
choose — mirroring the existing Bluetooth flow. The web app is unchanged (browsers
can't reach the logger's Wi-Fi) and still shows the explanatory dialog. Built on a
new `createMychronConnection()` adapter behind the existing `LoggerConnection`
interface; the native Tauri IPC (`@tauri-apps/api`) is lazy-loaded so it never
enters the web bundle. A native-only **Settings → MyChron** field lets you set the
Wi-Fi name prefix the system picker filters on, in case your logger broadcasts a
different name.
- **Safe-area padding on native / installed PWA.** Every full-screen surface now
respects the device's safe-area insets (status bar / notch) via
`env(safe-area-inset-*)` and `viewport-fit=cover`, so chrome no longer sits under
the phone's status bar — the app shell + landing, the full-page routes
(login/register/admin/legal), and the file-manager drawer (its garage/profile/
device header). A no-op on browsers and desktops without a safe area.
- **Privacy / Terms links on the sign-in page.** The login screen now links to the
Privacy Policy and Terms of Service.
- **"Back to app" returns you where you were.** The back button on the Privacy and
Terms pages now steps back to the page you came from (e.g. the sign-in or register
screen) instead of always jumping to the home screen.

### Changed
- **Picker/landing polish.** Logger names shortened to "AiM MyChron 5+" and
"Alfano 6+" (single-line, and future-proof for newer models); the account-
deletion page picked up the shared sticky brand header; and the landing
"Telemetry Data Viewer" tagline was removed for now.
- **Open-source links moved into About.** The GitHub repository links left the
landing page and now live in the About dialog under "Free & Open Source", above
the feature list. The About feature list was also refreshed with the headline
additions from the last month (7 languages, native Android app + MyChron Wi-Fi
download, phone-as-logger GPS timing, optional cloud sync, AI driving coach).
- **Logger picker polish.** Real product photos replace the placeholder art, and
the picker is now mobile-friendly: compact horizontal cards on phones (instead of
full-height ones that filled the screen), a height cap so it scrolls within the
viewport, native safe-area padding, an explicit Close button on mobile, and a
trademark/ownership note for the MyChron and Alfano brands.
- **Sticky headers across the landing and auth/legal pages.** The landing banner
is now pinned to the top of the screen, so the Login button is always reachable
and content scrolls cleanly under the status bar on mobile. The login, register,
privacy, and terms pages share one sticky, clickable brand header (`BrandHeader`)
that returns you home — and the privacy/terms pages now carry the mobile
safe-area padding the rest of the app has.
- **Native build hides paid-plan UI.** On the native app (where paid plans aren't
sold per Google Play policy), the registration page no longer shows the pricing
cards at all — just the free sign-up form. (Profile billing buttons were already
hidden on native.)
- **"Download from logger" relabel.** The file-manager button previously labelled
"Download from DovesDataLogger" is now "Download from logger" and opens the new
logger picker.
- **Logger picker is now eager.** The picker menu was split out of the lazy
Bluetooth chunk into a lightweight host (`LoggerDownload`), so the home-screen
"Download from logger" button opens the menu instantly instead of waiting on (and
silently failing when) the BLE chunk stalls. The heavy BLE flow still loads lazily
— only once the Fledgling is picked.
- **Device tab is Fledgling-gated.** The drawer's Device tab (settings / tracks /
firmware) now shows a "Fledgling only" notice when the connected logger isn't a
Fledgling, groundwork for MyChron/Alfano connections that don't expose those
surfaces.
- **Landing page upload is now a 50/50 split.** The big drag-and-drop dropzone now
shares the top of the home screen with an equal-billing "Download from logger"
panel, since most users pull logs straight off a logger rather than dragging files
in. The separate "Download from logger" tile was removed (its action moved into the
split).
- **Landing footer / link cleanup.** Privacy Policy and Terms of Service moved out of
the mid-page link row: on the stable build they now flank the operated-by / version
block in the footer (Privacy left, Terms right). Credits moved up next to the
Browser Compatibility button.
- **Leaner native landing page.** On the native (Android/Tauri) shell the landing
page now hides the marketing hero, the feature roadmap, the GitHub repo links and
the sponsor button — the user has already installed the app. The "Build your own
logger" tile stays.
- **Header logo returns to the home screen.** Tapping the LapWing logo (top-left)
in an open session now closes the session and returns to the landing page.
- **Purple theme + new logo.** The brand accent moved from teal to **purple**
(`--primary` and its mirrors `--ring`/`--sidebar-primary`/`--sidebar-ring`, in
both light and dark), and the gauge glyph in the app/page headers is replaced
with the new **LapWing logo** (`web-logo.png`, via a shared `BrandLogo`
component). Pairs with the refreshed app icons and favicon. Data-viz colors
(speed/telemetry scales) are unchanged.

### Fixed
- **External links opened inside the native app.** Links like "Build your own
logger" now reliably open in the system browser on the native (Tauri) app
instead of navigating the in-app WebView, by routing through Tauri's opener
plugin when the shell hasn't wired the `__HTT_NATIVE__` bridge (`platform.ts`).
- **Login rate limiter locked out valid sign-ins.** The limiter counted *every*
sign-in attempt — successes included — as a failure on a pre-login check, so
after five tries an IP was locked for an hour even with the correct password.
It now only counts genuine failures, clears the counter on a successful login,
and ages failures out over a 15-minute sliding window.

## [2.8.0] - 2026-06-20

### Added
Expand Down
Loading
Loading