smooth-app
A collaborative, free and open database of ingredients, nutrition facts and information on food products from around the world
Track your gym workouts and fitness progress
AI summary · revised during review
HealthPython · HTMLGitHub @hirdoOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A gym-themed fitness tracking web application with real-time data sync, Keycloak authentication, and a bold dark-mode UI.Read the full 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