尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A gym-themed fitness tracking web application with real-time data sync, Keycloak authentication, and a bold dark-mode UI.檢視完整 README ↗A gym-themed fitness tracking web application with real-time data sync, Keycloak authentication, and a bold dark-mode UI.
| Layer | Technology | Description |
|---|---|---|
| Angular 19 | Standalone Components, Signals, zoneless-ready | |
| TypeScript 5.7 | Strict mode, type-safe throughout | |
| Tailwind CSS 4.3 | Dark theme, CSS-native @theme tokens | |
| Firebase 12 | Firestore real-time sync, onSnapshot subscriptions | |
| Keycloak 26 | OpenID Connect, PKCE S256, SSO-ready | |
| Vercel | Static SPA deployment, build-time env injection |
onSnapshot keeps data live across devices#f97316), green accent (#22c55e), OLED-friendlynpm install
cd docker
docker compose up -d
Keycloak will be available at http://localhost:8080
http://localhost:8080/admin (admin / admin)[email protected] / testpass123Update src/environments/environment.ts with your Firebase project credentials:
firebase: {
apiKey: 'YOUR_API_KEY',
authDomain: 'YOUR_PROJECT.firebaseapp.com',
projectId: 'YOUR_PROJECT_ID',
storageBucket: 'YOUR_PROJECT.firebasestorage.app',
messagingSenderId: 'YOUR_SENDER_ID',
appId: 'YOUR_APP_ID'
}
ng serve
Open http://localhost:4200
src/app/
core/
guards/ - Route protection (auth, admin)
interceptors/ - HTTP interceptors (bearer token)
models/ - TypeScript interfaces (Workout, User)
services/ - AuthService, FirestoreService, WorkoutService
shared/
components/ - Navbar, Footer, LoadingSpinner
pipes/ - Custom pipes
features/
admin/ - Admin panel (user management, stats)
dashboard/ - User dashboard (workout summary)
landing/ - Public landing page (hero, features, pricing)
membership/ - Membership plans & upgrade
profile/ - User profile settings
schedule/ - Weekly workout calendar
workouts/ - Workout CRUD
workout-create/ - Create/edit workout form
workout-detail/ - Single workout view
workout-list/ - All workouts list
Set these environment variables in Vercel project settings:
| Variable | Description |
|---|---|
KEYCLOAK_URL | Keycloak URL with /auth suffix if needed |
KEYCLOAK_REALM | Realm name |
KEYCLOAK_CLIENT_ID | Client ID |
FIREBASE_API_KEY | Firebase API key |
FIREBASE_AUTH_DOMAIN | Firebase auth domain |
FIREBASE_PROJECT_ID | Firebase project ID |
FIREBASE_STORAGE_BUCKET | Firebase storage bucket |
FIREBASE_MESSAGING_SENDER_ID | Firebase messaging sender ID |
FIREBASE_APP_ID | Firebase app ID |
CLOUDINARY_CLOUD_NAME | Cloudinary cloud name (for exercise image uploads) |
CLOUDINARY_UPLOAD_PRESET | Cloudinary unsigned upload preset name |
The build command npm run build:vercel runs scripts/set-env.js to inject these into the production environment at build time.
Note: Cloud-IAM uses the
/authpath prefix — setKEYCLOAK_URLtohttps://<instance>.cloud-iam.com/auth
Exercise image uploads use Cloudinary's free tier (25GB storage + 25GB bandwidth/month, no card required) instead of Firebase Storage, since Firebase Storage now requires the paid Blaze plan. Uploads go directly from the browser to Cloudinary via an "unsigned upload preset" — no backend or secret key needed.
src/environments/environment.ts under cloudinary: { cloudName, uploadPreset }.CLOUDINARY_CLOUD_NAME and CLOUDINARY_UPLOAD_PRESET in Vercel project settings (same place as the FIREBASE_* vars above).Both values are safe to embed in client code — an unsigned preset never exposes your Cloudinary API secret.
For production, you need a Keycloak server accessible via HTTPS.
Managed Keycloak-as-a-Service — no Docker, no server management, always online:
https://<your-instance>.cloud-iam.com/auth.KEYCLOAK_URL in Vercel to your Cloud-IAM URL (with /auth)| Option | Notes |
|---|---|
| Railway.app | Free trial credit, Docker support |
| Fly.io | Free tier VM with Docker |
| Render.com | Free tier (512MB RAM, cold starts) |
| Any VPS | Docker + quay.io/keycloak/keycloak:26.0 |
| Phase Two | Managed Keycloak with extensions (free tier) |
https://your-domain.vercel.app/*https://your-domain.vercel.app