BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A clean full-stack starter running on vinext, with optional Cloudflare D1 and Drizzle support.
• Node.js >=22.13.0
• Linux with flock, curl, and GNU timeout
The Sites lifecycle CLI runs the locked dependency install before returning this checkout. Edit the source under app/, then checkpoint when a coherent milestone is ready to inspect or share. The remote Sites builder runs npm run build against the pushed commit. Do not repeat install or build as a normal pre-checkpoint step.
This starter does not use wrangler.jsonc.README 전문 보기 ↗A clean full-stack starter running on vinext, with optional Cloudflare D1 and Drizzle support.
>=22.13.0flock, curl, and GNU timeoutThe Sites lifecycle CLI runs the locked dependency install before returning this checkout. Edit the source under app/, then checkpoint when a coherent milestone is ready to inspect or share. The remote Sites builder runs npm run build against the pushed commit. Do not repeat install or build as a normal pre-checkpoint step.
This starter does not use wrangler.jsonc.
install:ci is intentionally a single, non-retrying npm ci. It refuses a concurrent install for the same project, consumes a matching image-seeded npm cache with --prefer-offline while retaining registry fallback for a missing cache object, otherwise downloads and verifies the complete vinext tarball recorded in package-lock.json, limits npm to one socket, and terminates a stalled install. build applies a short timeout. These helpers target Linux and use GNU timeout; they are not native macOS scripts.
Scripts that need writable project-scoped home, npm, XDG, and temporary paths use scripts/sites-env.sh. The dev and start scripts honor the caller's runtime environment and keep Wrangler logs inside the checkout. The generated .sites-runtime/ directory is disposable and ignored by Git.
app/app/chatgpt-auth.ts provides optional dispatch-owned ChatGPT sign-in helpers.openai/hosting.json declares optional Sites D1 and R2 bindingsvite.config.ts simulates declared bindings for local developmentdb/index.ts reads the D1 binding from the Cloudflare Worker environmentdb/schema.ts starts intentionally emptyexamples/d1/ contains an optional D1 example surfacedrizzle.config.ts supports local migration generation when neededOpenAI workspace sites can read the current user's email from oai-authenticated-user-email.
SIWC-authenticated workspace sites may also receive oai-authenticated-user-full-name when the user's SIWC profile has a non-empty name claim. The full-name value is percent-encoded UTF-8 and is accompanied by oai-authenticated-user-full-name-encoding: percent-encoded-utf-8.
Treat the full name as optional and fall back to email when it is absent:
import { headers } from "next/headers";
export default async function Home() {
const requestHeaders = await headers();
const email = requestHeaders.get("oai-authenticated-user-email");
const encodedFullName = requestHeaders.get("oai-authenticated-user-full-name");
const fullName =
encodedFullName &&
requestHeaders.get("oai-authenticated-user-full-name-encoding") ===
"percent-encoded-utf-8"
? decodeURIComponent(encodedFullName)
: null;
const displayName = fullName ?? email;
// ...
}
Import the ready-to-use helpers from app/chatgpt-auth.ts when the site needs optional or required ChatGPT sign-in:
getChatGPTUser() for optional signed-in UI.requireChatGPTUser(returnTo) for server-rendered pages that should send anonymous visitors through Sign in with ChatGPT.<a href={chatGPTSignInPath(returnTo)} target="_top">. The auth helper module is server-only; do not import it into a Client Component.fetch, XHR, a client-side router, or a framework link that can prefetch the sign-in route. SIWC must start as a top-level navigation./signin-with-chatgpt route must start the SIWC flow.chatGPTSignOutPath(returnTo) for browser sign-out links or actions.returnTo path for the destination after sign-in or sign-out. The helper validates and safely encodes it.export const dynamic = "force-dynamic" because they depend on per-request identity headers.Dispatch owns /signin-with-chatgpt, /signout-with-chatgpt, /callback, the OAuth cookies, and identity header injection. Do not implement app routes for those reserved paths. Routes that do not import and call the helper remain anonymous-compatible.
SIWC establishes identity only; it does not prove workspace membership. Use the Sites hosting platform's access policy controls for workspace-wide restrictions, or enforce explicit server-side membership or allowlist checks.
Use SIWC for account pages, user-specific dashboards, saved records, and write actions tied to the current ChatGPT user. Leave public content anonymous.
npm run install:ci: perform the one bounded lockfile installnpm run dev: start the Vite/Vinext development servernpm run build: build the deployable Sites artifactnpm run start: start the built Vinext applicationnpm test: build and verify the rendered development-preview metadatanpm run db:generate: generate Drizzle migrations after schema changesUse build commands for targeted diagnosis after a remote failure, not as part of the normal checkpoint path.
The timeout defaults can be overridden for a controlled canary with SITES_INSTALL_TIMEOUT, SITES_INSTALL_KILL_AFTER, SITES_BUILD_TIMEOUT, and SITES_BUILD_KILL_AFTER. A timeout fails the command; the helpers never retry an unchanged install or build.