Commit Graph
31 Commits
Author SHA1 Message Date
spoopyghosty0 9149eaecd7 Patch reference: scripts/patch_docs.py generates docs/PATCHES.md (every patch and game setting, anchors per id) and the site's id map; --check test, catalog PRs regenerate it 2026-10-11 00:58:51 -04:00
spoopyghosty0 62728dc562 Site: Cloudflare and Google analytics, with a cookie choice
Cloudflare Web Analytics (cookieless) runs when the CF_ANALYTICS_TOKEN repo
variable is set. Google Analytics (GA_MEASUREMENT_ID) loads only after the
visitor clicks Allow on a small card with equal Allow/Decline buttons; the choice
is remembered, Cookie settings in the footer asks again, Decline removes the
_ga cookies and Global Privacy Control counts as Decline. Downloads are counted
as file_download events. New privacy page. Without the variables the site has
no analytics.
2026-10-10 17:56:37 -04:00
spoopyghosty0 a4f73a88b7 Merge origin/main into site
Conflicts kept main's features with the site branch's wording: the uninstall
dialog's new delete-saves option, hardware video decoding and last-session help,
new Game settings (plain labels), agent 73 (main's 72 plus the Take screenshot
command from v66). Main's new texts follow docs/STYLE.md (for example, patch/setting
instead of fix). Pages rebuilds on docs changes and daily; the CNAME file is
gone (the domain is a Pages setting).
2026-10-10 17:18:37 -04:00
spoopyghosty0 6bfaaf788f Site: What's new page and section from GitHub releases
/changelog/ shows every release's What's new part (the same parts the app's
changelog shows): the dev build as Coming next, the latest release large,
then a timeline; the home page shows the latest changes. Release jobs
restart the pages workflow so a new release appears on the site.
2026-10-10 16:41:42 -04:00
spoopyghosty0 07da1c27a3 Site: shorter, consistent copy, served at frameport.app
Plain words on every page, one label per action, no jargon on the home
page. The site moves to the custom domain frameport.app (CNAME, no
/frameport base); the setup line is curl -sL frameport.app/s | bash.
2026-10-10 16:34:22 -04:00
spoopyghosty0 35462324bb Docs: shorter, consistent copy
README is a short overview that links to the install guide; repeated
sections are said once; Share working recipe everywhere; the setup
script names the real buttons; a shorter notice, the same as the site's.
2026-10-10 16:34:19 -04:00
spoopyghosty0 d5b5b7751e Project page: /setup, the setup line in Install, the trial's connect flow
- /setup: the three steps (Start setup on the PC, the line on the Frame with Copy, Allow), a terminal that plays what
  the script prints, what it changes, and every other way (setup command, USB cable, Valve's pairing, address).
- The site serves bootstrap/setup.sh as /s and /setup.sh (copied at build time; the workflow rebuilds when it changes).
- Install step 2 starts with a "Setup page" tab; the trial's Steam Frame page and guided tour use the same flow
  (the Frame asks, matching code, Allow).
2026-10-10 00:23:08 -04:00
spoopyghosty0 f99aded40e Project page round 4: VR worlds through the portal, live screens, a page that reacts
- Hero, Frame side: the card is gone; the game opens into an abstract VR world (three.js, look around by dragging or
  tilting the phone) or into particles that gather into a shape for the game. A TEMPORARY toggle under the scene
  switches between the two for comparison. three.js loads only when the hero is on screen.
- A Steam Frame you can turn (the logo's visor, extruded) next to "Connect the Frame".
- No pictures of the app on the page: the carousel's slides are live copies of its screens (type, drop a file, end a
  process, switch themes), the video tiles play short silent loops (made at build time with ffmpeg), the install
  button is a live control.
- Scroll story: the hero flies toward its portal, the install log completes line by line, section lines draw in.
- Everything reacts: a portal light follows the pointer, clicks on empty space ripple blue then orange, headings rise
  in word by word and light up under the pointer, labels unscramble, numbers count up, each icon moves its own way.
2026-10-09 23:15:21 -04:00
spoopyghosty0 f631e5fc1b Project page round 3: docs pages, contributors, carousel, a fuller app demo
- Hero: the Frame-side card is the game running in the headset (one view per eye, the scene moving), switching on
  as it lands while its frame rate climbs to 72 and the pacing line draws.
- App demo: working search, right-click menu, select several and install them (queued), install from a link (the
  app's link rules), Screenshots tab with a viewer, Settings with the real themes switching live, Files that take
  real files from the desktop (they never leave the tab), process table with End, Live view quality, launch-test
  result, technical patch ids, toasts; Wi-Fi or USB cable when connecting. Progress ticks no longer rebuild the page.
- Screenshots: a carousel (arrows, keys, swipe, thumbnails, autoplay that pauses for the reader, full screen).
- Compared: four headline differences (free and open source first), every difference as user questions behind
  "Show all differences"; the README says the same.
- Wi-Fi or USB cable said everywhere; the setup command explains itself part by part; first-start steps per system.
- Field notes removed, the notice kept in its own band.
- Built on: contributors wall (code, pull requests, issues; scripts/contributors.mjs, saved list as fallback).
- Docs: user-facing docs/*.md as pages (links rewritten, GitHub heading ids, contents with scroll position, copy
  buttons).
- Games board rows open to show the recipe; the install log replays with another tested game.
2026-10-09 22:29:55 -04:00
spoopyghosty0 1c158930cd Project page: an Astro site for GitHub Pages, and the install button's landing page
site/ (Astro 7, static, served at spoopyghosty0.github.io/frameport/) takes the Portal look of the UI refresh:
- Hero: a catalog game crosses the logo's tilted portal, from an APK on the PC's (blue) side to a game in the
  Steam library on the Frame's (orange) side; reduced motion holds it halfway, like the logo.
- How it works as one real recipe's install log (PC stages blue, Frame stages orange), the showcase tour and
  screenshots (synced from docs/ at build time, never by hand), field notes on what doesn't work, install steps,
  credits.
- Games board from catalog/games: prebuilt at build time, then refreshed in the browser from main (one contents
  API call, only changed files fetched, 6 h localStorage cache); any failure keeps the built list.
- /install/?manifest=…|?url=…: where an "Install with FramePort" button lands; opens frameport://install, and if
  FramePort didn't take it, says how to get it (download for this OS, try again, copy the link). Link rules mirror
  deeplink.check_url; node tests cover them and the board's rows.

.github/workflows/pages.yml builds and deploys on main (Settings → Pages → Source: GitHub Actions, once).
2026-10-09 20:22:26 -04:00
spoopyghosty0 a069c79c73 Showcase: any number of videos (docs/showcase/videos/<name>.yaml), plus an install tutorial
- record_video.py replaces record_tour.py: one storyboard per video with its output, a start state (demo or
  fresh profile, Frame connected or not, start page, live or frozen stream), setup steps before filming, filmed
  scenes and instruction cards (eyebrow, heading, numbered steps, a command, a note) for what happens outside
  FramePort. --changed-since records the videos whose storyboard (or the recorder) changed; several videos record
  in separate processes.
- videos/install.yaml: download, first start, the welcome screen's tool download, the setup command, the command
  on the Frame (card), connected, scanning a folder, installing and playing a game (81 s).
- demo_home profile "fresh": FramePort's first start (empty library, welcome screen, nothing on the Frame); its
  games wait for the pretend folder scan. Fakes for a first start: no Frame discovery on the real network, the setup
  command shows the docs' example address, a pretend tool download, steps hooks first_run and pairing_done.
- CI records changed (or named) videos; releases attach every docs/media/frameport-<name>.mp4 as
  FramePort-<name>.mp4. INSTALL.md and README link the tutorial; SHOWCASE.md documents the storyboard format.
- Cards are opened by their title in both videos (a card's middle is its Install button).
2026-10-09 10:37:22 -04:00
spoopyghosty0 21d72e51ef showcase workflow: verification on ui-refresh done (3 runs: screenshots identical to the committed ones, tour recorded cleanly); main only again 2026-10-09 01:17:36 -04:00
spoopyghosty0 222633e462 Showcase: nav step (sidebar click checked against the page that shows; falls back to opening the route when a click's handler died in a Flet update race seen on CI); CI renders with Python 3.12 2026-10-09 01:08:16 -04:00
spoopyghosty0 429899d6fc showcase workflow: one verification run on ui-refresh (temporary) 2026-10-09 00:40:52 -04:00
spoopyghosty0 e35170d4f9 Showcase: CI workflow, release asset, docs; screenshots and the tour rendered from the demo library
.github/workflows/showcase.yml renders the docs screenshots on UI pushes to main (and the tour when its storyboard or
scripts change, or on Run workflow), keeps every render as an artifact and opens/updates the PR showcase/update
when a picture visibly changed. Releases attach the tour as FramePort-tour.mp4. docs/SHOWCASE.md explains running
it, the step language and the CI flow; README opens with the teaser (link to the full MP4). Renders refuse
placeholder art (--allow-missing-art). tests/test_showcase.py: demo library, privacy scan, image threshold,
manifests (every docs image has a shot), step validation, element picking, pointer paths, ffmpeg graphs.
scripts/demo_record.py is replaced by the tour.
2026-10-09 00:37:39 -04:00
spoopyghosty0 c3522a05bb macOS: keep the entitlements when ad-hoc signing (re-signing stripped them; Scan a folder failed with ENTITLEMENT_NOT_FOUND, GitHub #63) 2026-10-06 13:06:35 -04:00
spoopyghosty0 f2cf7db507 Dev builds on demand: CI "Run workflow" (dev ticked, optional notes for testers) publishes the rolling dev pre-release with version <next patch>.dev<run>; Settings → Updates → "Install the latest dev build…" installs it like an update (automatic checks still ignore it; the next release is offered normally) 2026-10-05 08:30:05 -04:00
spoopyghosty0 6ed95684dc FramePort 0.6.1: Linux ARM64 build (CI ubuntu-22.04-arm, PyInstaller one-folder fallback; the updater picks FramePort-linux-arm64.tar.gz on ARM); tested games list docs/GAMES.md generated from the catalog (scripts/compat_list.py) 2026-10-03 12:05:59 -04:00
spoopyghosty0 65369f154c Release notes: a short install footer (packaging/release-footer.md) instead of all of docs/INSTALL.md from First launch; the update dialog shows these notes 2026-10-02 23:07:03 -04:00
spoopyghosty0 23a47880e0 Lines within 120 columns everywhere (CI lints without exceptions); community and licence files; docs updated
- reflowed long lines (texts unchanged; generated launcher/PowerShell/README texts byte-identical)
- CONTRIBUTING, SECURITY, CODE_OF_CONDUCT, THIRD_PARTY_NOTICES; pyproject metadata (SPDX licence, authors, urls,
  classifiers, keywords)
- maintainer-only notes moved to a git-ignored CLAUDE.local.md; CLAUDE.md facts updated
- README: what kinds of apps run and how; INSTALL: PC VR and Files wording, new labels
2026-10-02 14:18:41 -04:00
spoopyghosty0 60efbbe7a9 Tooling: ruff (lint + import order) and pytest-timeout; CI lints and tests every push to main
Fixes ruff found: loop variables bound in callbacks, zip(strict=True), clearer names than 'l', unused loop
variables, f-strings instead of % formatting.
2026-10-02 13:19:11 -04:00
spoopyghosty0 b4ae5e0023 CI: macOS bundle on macos-26 (newer Xcode); PyInstaller fallback runs non-interactively 2026-10-02 11:33:13 -04:00
spoopyghosty0 4ba148908a CI: pin the macOS bundle job to macos-15 2026-10-02 11:20:22 -04:00
spoopyghosty0 bc40325c2d Updater: start the Windows swap script in a hidden console and check it runs; Linux bundle built on Ubuntu 22.04
Found in the end-to-end test (0.3.1 -> 0.3.2): PowerShell started with DETACHED_PROCESS from the packaged app exits
without running the script, so the app quit and nothing was updated. apply() now waits until the script logs that it
runs and raises otherwise. The smoke test uses the same non-waiting launch as the app. The Linux bundle built on
24.04 needed GLib 2.80.
2026-10-02 01:01:37 -04:00
spoopyghosty0 ba68dc76c8 Self-update for the app and the CLI
FramePort finds new GitHub releases by itself and updates in one click: sidebar card + Library bar, a dialog with
the release notes, "Update and restart" (download, SHA256SUMS check, Windows signer check, swap script, relaunch),
optional automatic installs at the next start. CLI: --version, `frameport update [--check] [--yes]` and a
once-a-day hint. One version source (_version.py); releases also ship the CLI wheel and "What's new" from the
annotated tag; CI runs an update smoke test with each OS's archive.
2026-10-01 22:59:56 -04:00
spoopyghosty0 dfb4fc4ffd Share working configs and diagnostics bundles via GitHub issues
- "Share working config…" (game menu, `frameport share-recipe`): saves the recipe as known-good and opens a
  prefilled working-config issue form; labelling it `catalog-accepted` runs catalog-from-issue.yml, which
  validates the YAML (scripts/catalog_from_issue.py) and opens a PR adding catalog/games/<pkg>.yaml
- "Collect logs" / "Report a problem…" (game menu, Settings, failure pop-up, `frameport diag collect|report`):
  redacted diagnostics zip (app + job logs, library entry, recipe, launch logs + re-triage, APK/ELF/PE listings
  instead of game files, Frame launcher/settings/Lepton/logcat/XRService logs via agent v21 `collect_diag`) and
  a prefilled bug-report issue to attach it to; `frameport diag inspect <zip>` re-triages a bundle offline
- diag/redact.py scrubs IPs, MACs, host/user names, home dirs, Steam ids, data and dump folders
- App log (<data>/logs/app.log) and saved GUI job logs (<data>/logs/jobs/)
- catalog.entry_from_library shared by "Save as known-good" and sharing; docs/DIAGNOSTICS.md
2026-09-30 14:14:00 -04:00
spoopyghosty0 5233fffdfe Release pipeline: self-signed Windows code signing, ad-hoc macOS signing, build attestations, GitHub Release 2026-09-29 10:53:37 -04:00
spoopyghosty0 2e95844b44 CI: macOS bundle for arm64, PyInstaller fallback if flet build fails 2026-09-29 00:02:47 -04:00
spoopyghosty0 a5b06d596d CI: pin setup-uv v10.2.0 (no floating major tag) 2026-09-28 23:45:00 -04:00
spoopyghosty0 8fe2f57870 CI: non-interactive flet build (--yes, plain output, UTF-8), newer actions, flet-cli dev dependency 2026-09-28 23:44:19 -04:00
spoopyghosty0 0470a2910a FramePort: modular Quest → Steam Frame porting app
Python core + Flet GUI + CLI that turns the manual Steam Frame porting work
into a pipeline: scan dumps, analyze, suggest patches (overport + Frame fixes,
catalog of 34 verified recipes), build, static-validate, install over SSH via
a Frame-side agent, add Steam shortcuts with artwork, headless launch test and
log triage. Includes the native sources (FrameBridge adapter, VrApi bridge
patches, GL shim), prebuilt artifacts, docs (playbook, runtime notes) and a
parity harness (34/34 games reproduce the known-good builds).
2026-09-28 21:00:29 -04:00