尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Golf back care: 3D swing lab, symptom-to-exercise planner, guided routines, injury prevention
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Golf back care in the browser. A 3D swing lab, a symptom-to-exercise planner, guided warm-up and cool-down routines, an exercise library, an injury prevention guide, and a round-by-round pain log.
No build step is needed to run it. Open index.html or serve the folder:查看完整 README ↗Golf back care in the browser. A 3D swing lab, a symptom-to-exercise planner, guided warm-up and cool-down routines, an exercise library, an injury prevention guide, and a round-by-round pain log.
No build step is needed to run it. Open index.html or serve the folder:
python3 -m http.server 8765
# then open http://localhost:8765
js/lab3d.js). A golfer in three.js r147: 24 articulated vertebrae with discs, ribcage, pelvis, shoulder girdle and skull inside a holographic body, with IK-driven arms, legs and club. The skeleton is built procedurally so it renders instantly; after first paint the lab fetches assets/anatomy/spine.bin and swaps real BodyParts3D bones onto the same 24 joints. If that asset is slow, missing or corrupt the procedural skeleton simply stays, and nothing else changes. The swing is keyframed; trunk rotation is distributed across hips, thoracic spine, lumbar spine and shoulder girdle according to how compliant each is. Toggling stiff hips, a stiff mid back or a reverse spine angle pushes rotation into the lumbar spine, which lights up as it goes past its roughly 13 degrees of capacity. Click any body part to start a plan for it.Everything is saved in the browser with localStorage. Nothing leaves your device — except a
feedback message, if you write one and press Send.
#feedback in the app, feedback.html on the web (also the App Store support URL). Both post
the same JSON to POST /api/feedback, a Cloudflare Pages Function in functions/api/feedback.js
that forwards it to an e-mail relay. The endpoint is called with an absolute URL so it works
from inside the iOS wrapper, where the page is served from a custom scheme and the request is
cross-origin with a null Origin.
The destination address is never in this repository, in the app bundle or on the site. It lives in a Pages secret and is read only inside the Function:
npx wrangler pages secret put FEEDBACK_TO --project-name backswing # destination address
npx wrangler pages secret put WEB3FORMS_KEY --project-name backswing # preferred relay
Two relays, chosen at runtime. WEB3FORMS_KEY wins when it is set: it authenticates with a key,
so it does not care what IP the request comes from. Without it the Function falls back to
FormSubmit, which rate-limits by source IP — and since every Cloudflare Worker shares an egress
IP, that path answers {"ok":false,"reason":"relay_rate_limited"} in practice. Setting the
Web3Forms key is the whole fix; no code change is needed.
Nothing about the sender is added on the way through: no IP, no user agent, no headers. Only the message, the category, and — if the golfer ticks the box — one line naming the app version and the device family.
index.html shell and 3D lab markup
css/styles.css design tokens (dark and light), layout, components
js/data.js exercises, routines, planner content, faults, injuries, habits
js/figures.js 2D pose drawings for the exercise cards
js/anatomy.js loader/decoder for the BodyParts3D spine asset
js/lab3d.js the three.js swing lab
js/app.js router, views, planner, player, log
build.js bundles everything into dist/index.html (single file)
tools/build-anatomy.mjs build-time extractor for assets/anatomy/spine.bin
assets/anatomy/ the real anatomy: spine.bin plus its licence
assets/anatomy/spine.bin is a separate 168 KB binary, fetched lazily rather than inlined: base64
would add a third to its size and put it on the critical path, and the lab does not need it to
work. Regenerate it with node tools/build-anatomy.mjs against a local human-atlas checkout.
Run node build.js to produce dist/index.html, a single self-contained file (fonts and three.js still load from their CDNs).
The site is static. Any static host works. For Cloudflare Pages with direct upload:
node build.js && npx wrangler pages deploy dist/site --project-name backswing
There is also a GitHub Actions workflow in .github/workflows/deploy.yml that deploys on every push to main. It needs two repository secrets: CLOUDFLARE_API_TOKEN (a token with the Cloudflare Pages edit permission) and CLOUDFLARE_ACCOUNT_ID.
The exercises and guidance are general, physio-informed advice for recreational golfers. They are not a diagnosis. The app is explicit about red-flag symptoms that need a doctor or physiotherapist, and it says so on every plan.
The anatomical geometry is BodyParts3D, © The Database Center for Life Science, licensed under
CC BY 4.0 — commercial use is permitted with
attribution, which the app carries on screen beneath the swing lab. The pipeline it came through
is Human Atlas (MIT). The full notice, including what was modified and the third-party licence
texts, is in ATTRIBUTION.md, which build.js copies into dist/site/ so it has
a public URL. build.js also fails the build if that credit ever disappears from the shipped HTML.