16 Commits
Author SHA1 Message Date
Zack Sheppard 69952688fa Human rewrite on the README 2026-10-08 11:50:02 +01:00
Zack SheppardandClaude Sonnet 5.5 229077980e Declare the apex frameloader.com as a custom domain in wrangler.jsonc (#8)
wrangler deploy treats the custom_domain routes as the full set for the Worker and detaches any domain not listed, so the apex (added in the dashboard) was removed on every deploy while www survived.

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 11:14:05 +01:00
Zack SheppardandClaude Opus 5.5 0a7d47cf14 Fix headset discovery against SteamOS's mDNS responder (#7)
* Fix headset discovery against SteamOS's mDNS responder

SteamOS answers a _steamos-devkit._tcp browse with only the PTR record,
not the SRV/TXT it points to, so browse() dropped every headset. It now
asks for SRV and TXT, falls back to <name>.local:32000, re-asks over three
rounds (responders skip records multicast in the last second, and an idle
headset's Wi-Fi adds latency), and remembers addresses between scans. The
test's fake headset now answers the same way SteamOS does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Scan for headsets once per visit, and harden the discovery cache

- The connect screen scans once when it opens instead of every 5 s. If
  nothing answers it shows "No headset found" with a "Click to try
  again" button; when headsets are found, a "Search again" link.
- Discovery only remembers addresses for names it asked about, and
  connecting never falls back to a remembered address: connection
  targets always come from a live answer (security review on #7).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
v0.0.5 v0.1.0
2026-10-08 00:24:12 +01:00
Zack SheppardandClaude Opus 5.5 2cbc333477 Use the new logo in the app header and on the website (#6)
- App: the logo replaces the old blue mark in the home top bar and on
  the connect screen
- Website: logo in the nav of every page, PNG favicon and Apple touch
  icon, and screenshots regenerated so they show the new header

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 23:26:37 +01:00
Zack SheppardandClaude Opus 5.5 4a300ed5fa Let electron-builder find the signing identity in signed Mac builds (#5)
CSC_IDENTITY_AUTO_DISCOVERY=false was set for every Mac build. With it,
electron-builder imports CSC_LINK into its keychain but won't look the
identity up, so the v0.0.3 build skipped signing and failed the signature
check. It's now set only for unsigned builds.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
v0.0.4
2026-10-07 23:01:44 +01:00
Zack SheppardandClaude Opus 5.5 cd8f3b7671 Pin electron-builder to ^26.17 to fix macOS signing on macos-26 runners (#4)
electron-builder before 26.16.1 passes the .p12 password to
`security set-key-partition-list -k`, which expects its temporary
keychain's password. macOS 26 runners enforce that check, so signed
release builds failed with "SecKeychainUnlock: The user name or passphrase
you entered is not correct" (electron-builder#10066). 26.17.0 passes the
keychain password. npm's `latest` tag still points at 26.15.3, so the
range is pinned explicitly.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
v0.0.3
2026-10-07 22:42:56 +01:00
Zack SheppardandClaude Opus 5.5 0693668b08 Set the author to Traveler Dev Ltd <hi@traveler.dev> in every package.json (#3)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
v0.0.2
2026-10-07 22:20:32 +01:00
Zack SheppardandClaude Opus 5.5 26872c7396 Sign and notarize macOS release builds (#1)
* Sign and notarize macOS release builds

Release builds of the Mac app now run in the protected release-signing
environment (approval required, v* tags only), are signed with the
Developer ID certificate, notarized with the App Store Connect key, and
checked with codesign, spctl and stapler before upload. Push and PR
builds stay ad-hoc signed and never see the secrets.

- electron-builder config moved to electron-builder.config.cjs, which
  switches between ad-hoc and Developer ID signing based on CSC_LINK
- Hardened runtime entitlements for Electron
- Local network usage description and Bonjour services in Info.plist
  for the macOS 15+ local network prompt
- README: signing setup and current "Open Anyway" steps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Only export signing variables for signed Mac builds

electron-builder treats an empty CSC_LINK as a certificate path, so PR
builds failed with "apps/desktop not a file". The variables are now
exported only by the signing step, which also checks every secret is
present.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep Mac signing secrets inside the build step

They were exported through GITHUB_ENV, which makes them visible to every
later step and action in the job (artifact upload, post steps). They now
live only in the build step's environment, and the notarization key file
is deleted when the step exits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Build pull requests once, not once per push and once per PR

Push builds now run only for main; branch commits are built through their
pull request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 22:12:19 +01:00
Zack SheppardandClaude Opus 5.5 c6f1c8b203 Add the app icon and put the logo at the top of the README (#2)
build/icon.icns is the macOS version (Apple's rounded-square grid with
padding and shadow); build/icon.png is the full-bleed square electron-builder
uses for Windows and Linux.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 22:09:24 +01:00
Zack SheppardandClaude Opus 5.5 db639ff569 Build releases when they're published instead of cutting them from a workflow
Publishing a vX.Y.Z release on GitHub now builds that tag as version
X.Y.Z and attaches the installers to the release. The version-bump
commit to main is gone, so releases work with branch protection. The
update checker only announces a release once its installers are attached.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.0.1
2026-10-07 21:08:37 +01:00
Zack SheppardandClaude Opus 5.5 c2c7f9bf5b Drop the @frameloader scope from workspace package names
The Linux AppImage derived its executable name from "@frameloader/desktop"
and electron-builder rejects the @ and /. Packages are now
frameloader-desktop, frameloader-web and frameloader-tokens, and the
Linux executable is named frameloader explicitly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 20:52:10 +01:00
Zack SheppardandClaude Opus 5.5 0568df501a Host the website on Cloudflare Workers
- wrangler.jsonc at the repo root: a static-assets Worker serving
  apps/web/dist on www.frameloader.com, workers.dev off, previews on
- _headers with a strict CSP, security headers and immutable caching
  for hashed assets; a 404 page
- Root-absolute asset paths and the clean /terms URL (app links too)
- Wrangler as a root dev dependency, with preview:web and deploy:web
- README section with the Workers Builds settings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 09:57:52 +01:00
Zack SheppardandClaude Opus 5.5 f05066c37c Rename titles in Steam, add settings, update checks and CI
- Rename devkit titles in the Steam library after registration (via the
  Steam client's DevTools port on the headset) so they no longer show as
  "Devkit Game: <id>"
- Stage a lone dropped program by itself instead of uploading its folder
- Hide logs and the activity log behind Settings > Developer tools, and
  stream them into a persistent pane instead of re-rendering the app
- Check GitHub releases for a newer version (switchable in Settings)
- Atomic config writes, a navigation guard, OBB upload progress, and
  serialized APK parsing
- Build workflow for every push and PR, plus a release workflow that
  publishes main as a version and bumps to the next patch
- Ad-hoc sign macOS builds; drop TERMS.md in favor of the site's terms page
- Start versioning at 0.0.1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 09:40:10 +01:00
Zack SheppardandClaude Opus 5.5 2c7afac144 Move to a pnpm workspace and add the frameloader.com site
- apps/desktop: the Electron app, now bundling all runtime deps into
  dist/main.cjs so packaged builds need no node_modules; Electron pinned
  for electron-builder; screenshot script for the website
- apps/web: static landing page (Vite) and terms of use, using real app
  screenshots in light and dark
- packages/tokens: shared color/type/shape tokens used by both
- Terms of use (TERMS.md, /terms.html), linked from the app's connect
  screen
- Canonical URLs, social tags, robots.txt and sitemap for
  www.frameloader.com

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 01:04:53 +01:00
Zack SheppardandClaude Opus 5.5 bfcccef92a Initial Frameloader desktop app
Electron + TypeScript app that sideloads APKs, Windows apps, and Linux
ARM64 builds onto a Steam Frame through Valve's SteamOS devkit protocol:
devkit pairing or password SSH, mDNS headset discovery, upload and
registration via Valve's vendored devkit-utils scripts, Lepton logcat
streaming, and a light/dark UI with a browser mock for previews.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 01:04:53 +01:00
Zack Sheppard 057cc03ae8 Initial commit 2026-10-07 01:03:20 +01:00