FitForge is a production-ready fitness subscription SaaS delivered as a real, fully connected web application — not a static UI mockup. Its product intent is to let everyday athletes discover workouts, follow structured programs, track progress and goals, read general nutrition education, participate in a community, and subscribe to Premium for the full catalog and advanced features.
The tagline is "Train Smarter. Get Stronger. Become Your Best."
The audience is a mass-market, mobile-first set of everyday athletes (roughly 18–45) who train at home or in a commercial gym and want motivation, momentum, and a visible sense of progression. The product must feel like a reward rather than a punishment: energising, pleasurable, and premium.
FitForge is explicitly not a medical product. It does not provide medical diagnosis or treatment, and all nutrition content is general education, not medical advice.
FitForge is a Next.js 15+ application with TypeScript, Tailwind CSS, shadcn/ui, Framer Motion, and Lucide Icons on the front end, backed by Next.js API routes/server actions, PostgreSQL via Prisma, secure authentication (email/password + Google OAuth + email verification + password reset), Stripe subscriptions, Resend email, cloud storage, and Vercel deployment. All secrets live in environment variables.
Current delivery includes:
Actors: Fitness Member (Free), Premium Subscriber, Administrator, and Community Participant. Stripe, Resend, Google OAuth, and cloud storage are external providers, not personas.
Narrow exclusions: no medical diagnosis or treatment; no exposure of passwords, private user information, API keys, or secret keys; no exposure of Stripe secret keys; progress photos remain private unless the user explicitly chooses to share them.
FitForge is delivered as a first-party application with application-owned identity. Visitors can browse public discovery surfaces anonymously. Self-service enrollment happens through signup (email/password or Google OAuth), followed by email verification and onboarding. Returning members verify through login. Protected member surfaces (dashboard, progress, goals, settings, community) require an established, verified identity. The admin surface requires admin authorization.
Subscription billing is provider-owned: Stripe Checkout, the Stripe Customer Portal, and Stripe webhooks handle checkout completion, subscription creation/update/deletion, and successful/failed invoices. FitForge stores the Stripe customer ID, subscription ID, status, plan, billing period, and trial status, and Premium access depends on actual subscription status synchronized from verified webhooks. Stripe secret keys are never exposed to the client.
Email delivery is provider-owned through Resend, using reusable templates. Cloud storage is provider-owned for uploaded media. If third-party services are not configured, clean integration layers and safe demo/mock data keep the application running locally.
All current requirements are in scope for this generation. No future-horizon features are defined in the authoritative source.
Not applicable — no reference directive declares content_source.
FR-01 — Production-ready fitness SaaS (explicit) As a visitor, I should experience FitForge as a real, production-ready fitness SaaS with fully connected frontend and backend functionality, not a static UI mockup.
FR-02 — Tech stack (explicit) As a developer, I should build FitForge on Next.js 15+, TypeScript, Tailwind CSS, shadcn/ui, Framer Motion, Lucide Icons, Next.js API/server actions, PostgreSQL + Prisma, secure authentication with email/password + Google OAuth + email verification + password reset, Stripe subscriptions, Resend email, cloud storage, and Vercel deployment, with all secrets stored in environment variables.
FR-03 — Premium athletic design (explicit) As a visitor, I should see a premium athletic SaaS design that is modern, clean, professional, motivational, and mobile-first, with a dark theme by default and optional light mode, near-black backgrounds, energetic green primary color, white text, charcoal cards, subtle borders, limited gradients, rounded cards, glass effects, shadows, smooth animations, progress bars, skeleton loaders, and toast notifications, kept clean and uncluttered.
FR-04 — Landing page (explicit)
As a visitor, I should see the landing page at / with the hero headline "Your Fitness Journey Starts Here.", a subheadline about personalized workouts, progress tracking, nutrition, and expert programs, CTAs "Start Free" and "Explore Programs", a fitness visual/video, statistics, features, how-it-works, popular programs, clearly marked demo testimonials, pricing, FAQ, and a final CTA.
FR-05 — Program library (explicit)
As a visitor, I should search and filter the program library at /programs by goal, difficulty, duration, equipment, and training type, with cards showing image, name, difficulty, duration, workout count, goal, description, and Free/Premium badge.
FR-06 — Program detail (explicit)
As a visitor or member, I should view full program details at /programs/[slug] including trainer, schedule, equipment, target areas, and workouts, and I should be able to start programs and save completed workouts.
FR-07 — Workout library (explicit)
As a visitor, I should search and filter workouts at /workouts by muscle group, difficulty, equipment, duration, calories, and workout type.
FR-08 — Workout detail and execution (explicit)
As a member, I should view a workout at /workouts/[slug] with video, trainer, duration, difficulty, equipment, target muscles, calories, and exercise list, where exercises include sets, reps, rest, and instructions, and I should use Start, Pause, Next, Previous, Rest Timer, and Complete Workout, with completion saved and a completion summary shown.
FR-09 — Trainers (explicit)
As a visitor, I should browse demo trainer profiles at /trainers and view trainer detail pages.
FR-10 — Nutrition education (explicit)
As a visitor, I should read general educational content at /nutrition covering protein, carbohydrates, healthy fats, hydration, meal planning, balanced eating, and pre/post-workout nutrition.
FR-11 — Recipes (explicit)
As a visitor, I should browse a recipe library at /recipes with image, ingredients, instructions, preparation time, tags, and optional nutrition information.
FR-12 — Public pages (explicit)
As a visitor, I should access /pricing, /community, /faq, /contact, /privacy, /terms, /cookie-policy, and /disclaimer.
FR-13 — Authentication pages (explicit) As a visitor, I should use login, signup, forgot-password, reset-password, and email-verification pages, with signup fields name, email, password, and confirmation.
FR-14 — Onboarding (explicit) As a new member, after signup I should complete onboarding asking primary goal, experience level, training location, available equipment, training days per week, workout duration, and preferred workout style, with goals strength, muscle building, fitness, mobility, and general wellness, and a personalized dashboard generated from onboarding data.
FR-15 — User dashboard (explicit)
As a member, I should see at /dashboard "Good morning, [Name]", today's workout, weekly goal, streak, completed workouts, training minutes, progress chart, weekly calendar, recent/recommended workouts, and quick actions.
FR-16 — Navigation (explicit) As a member, I should see a desktop sidebar with Dashboard, Workouts, Programs, Progress, Goals, Nutrition, Recipes, Community, and Settings, and a mobile bottom navigation with Home, Workouts, Programs, Progress, and Profile.
FR-17 — Premium upgrade modal (explicit) As a member, when I encounter a Premium-locked feature I should see a professional upgrade modal.
FR-18 — Progress tracking (explicit)
As a member, I should track at /progress weight, workout completion, training time, personal records, measurements, and private progress photos, with charts for trends, workout frequency, training minutes, and program completion.
FR-19 — Goals (explicit)
As a member, I should create goals at /goals with target, current progress, percentage, deadline, and completion status.
FR-20 — Free tier (explicit) As a member, I should access limited workouts/programs, basic tracking, and dashboard on the Free tier.
FR-21 — Premium tier (explicit) As a member, I should subscribe to Premium at $19.99/month for the full workout library, all programs, personalized plans, advanced tracking, nutrition content, workout history, and premium features.
FR-22 — Annual tier (explicit) As a member, I should subscribe to Annual at $149.99/year for all Premium features with annual billing.
FR-23 — Configurable prices (explicit) As an administrator, I should have prices configurable through database/environment settings.
FR-24 — Stripe integration (explicit) As a member, I should complete real Stripe Checkout, manage billing through the Stripe Customer Portal, and have webhook handling for checkout completion, subscription creation/update/deletion, and successful/failed invoices, with Stripe customer ID, subscription ID, status, plan, billing period, and trial status stored, and Premium access depending on actual subscription status.
FR-25 — Account settings (explicit)
As a member, I should manage at /settings profile, fitness preferences, subscription/billing, renewal date, notifications, password/security, logout-all-sessions, data export, and account deletion.
FR-26 — Admin dashboard (explicit)
As an administrator, I should access /admin with admin authorization, viewing total users, active users, Premium subscribers, revenue, growth, workout completions, and cancellations.
/admin requires admin authorization.FR-27 — Admin CRUD (explicit) As an administrator, I should perform CRUD on users, workouts, exercises, programs, recipes, nutrition articles, trainers, FAQs, and testimonials.
FR-28 — Community moderation (explicit) As an administrator, I should perform community moderation, reporting, and blocking.
FR-29 — Prisma models (explicit) As a developer, I should use Prisma models User, Profile, Subscription, Workout, Exercise, WorkoutExercise, Program, ProgramWeek, ProgramWorkout, WorkoutCompletion, ProgressEntry, ProgressPhoto, Goal, Recipe, NutritionArticle, Trainer, Post, Comment, Like, Notification, FAQ, and Testimonial with proper relationships, primary keys, foreign keys, indexes, createdAt, and updatedAt fields.
FR-30 — Exercise database (explicit) As a developer, I should store exercises with name, description, instructions, target muscles, equipment, difficulty, video, image, sets, reps, and rest, with categories chest, back, shoulders, arms, legs, glutes, core, full body, cardio, and mobility.
FR-31 — Community features (explicit) As a member, I should create posts, like, comment, follow, report, and block in the community, with admin moderation.
FR-32 — Global search (explicit) As a visitor or member, I should search globally across workouts, programs, exercises, recipes, articles, and trainers.
FR-33 — Notifications (explicit) As a member, I should receive notifications for workout reminders, milestones, completed goals, subscription updates, new programs, and community activity, both in-app and by email.
FR-34 — Security (explicit) As a system owner, I should implement secure password hashing, authentication, authorization, admin protection, API validation, rate limiting where appropriate, CSRF protection where applicable, input sanitization, secure file uploads, Stripe webhook signature verification, and database access control.
FR-35 — SEO, performance, accessibility (explicit) As a visitor, I should benefit from SEO metadata, Open Graph, X cards, sitemap, robots.txt, canonical URLs, and structured data; optimized images, videos, lazy loading, database queries, caching, pagination, and SSR where useful; and semantic HTML, keyboard navigation, accessible labels, focus states, alt text, ARIA where needed, and good color contrast.
FR-36 — Legal pages (explicit) As a visitor, I should read Privacy, Terms, Cookie Policy, and Disclaimer pages, including "Fitness content is provided for general educational and informational purposes. Users should consider their individual circumstances and consult a qualified professional when appropriate."
FR-37 — Email templates (explicit) As a member, I should receive reusable email templates for Welcome, email verification, password reset, subscription confirmation, payment receipt, payment failure, cancellation, workout reminder, and goal achievement.
FR-38 — Demo data (explicit) As a developer, I should seed 20 workouts, 10 programs, 50 exercises, 15 recipes, 10 nutrition articles, 5 trainers, 10 FAQs, and 6 demo testimonials, clearly separated from production data.
FR-39 — Quality requirements (explicit) As a user, I should have every major button and form perform a real action, with authentication, database operations, workout completion, progress saving, subscriptions, Stripe webhooks, Premium protection, and Admin CRUD working, plus loading, success, error, empty, 404, and 500 states and reusable modular components.
FR-40 — Local fallback (explicit) As a developer, if third-party services are not configured, I should have clean integration layers and safe demo/mock data so the application still runs locally.
FR-41 — Environment variables (explicit)
As a developer, I should have a .env.example containing DATABASE_URL, NEXTAUTH_SECRET, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_MONTHLY_PRICE_ID, STRIPE_YEARLY_PRICE_ID, RESEND_API_KEY, NEXT_PUBLIC_APP_URL, STORAGE_URL, STORAGE_ACCESS_KEY, and STORAGE_SECRET_KEY.
.env.example present with all variables.FR-42 — README (explicit) As a developer, I should have a complete README covering installation, features, tech stack, environment variables, Prisma/database setup, seed data, Stripe setup/webhooks, Google OAuth, email setup, development commands, Vercel deployment, and security.
FR-43 — Self-service enrollment (required_inference) As a visitor, I should self-enroll through signup to independently start my FitForge journey.
FR-44 — Returning verification (required_inference) As a returning member, community participant, Premium subscriber, or administrator, I should verify through login to resume my work.
FR-45 — Email verification before activation (required_inference) As a new member, I should verify my email before my account is fully activated.
FR-46 — Onboarding before dashboard (required_inference) As a new member, I should complete onboarding before my personalized dashboard is generated.
FR-47 — Admin authorization (required_inference)
As an administrator, I should pass admin authorization before accessing /admin.
FR-48 — Webhook synchronization (required_inference) As a system, I should synchronize verified Stripe webhooks before granting or removing Premium access.
FR-49 — Private-by-default photos (required_inference) As a member, my progress photos should be private by default, with explicit sharing required for visibility.
FR-50 — Backend persistence (required_inference) As a system, I should persist workouts, programs, completions, progress, goals, community records, notifications, and subscription state.
Product context: A visitor who signs up with email/password or Google, verifies email, and completes onboarding (goal, experience, location, equipment, days per week, duration, style) to get a personalized dashboard.
Primary goal: Train consistently with basic tracking on the Free tier.
Distinct accepted responsibilities: Browse the limited Free workout and program library; run workouts with Start/Pause/Next/Previous/Rest Timer/Complete; save completions; track basic progress and goals; read nutrition education and recipes; participate in community.
Relevant inputs or decisions: Onboarding answers; workout selection; progress entries; goal targets and deadlines; photo sharing decisions.
Interactions with other accepted participants: Sees demo trainers; interacts with Community Participants; encounters Premium upgrade modal; receives notifications.
Observable success: Consistent training with basic tracking on the Free tier.
Product context: A member who upgrades via Stripe Checkout to $19.99/month or $149.99/year.
Primary goal: Uninterrupted access to the full FitForge catalog and advanced progress analytics.
Distinct accepted responsibilities: Access the full workout library, all programs, personalized plans, advanced tracking, nutrition content, workout history, and premium features; manage billing through the Stripe Customer Portal; view renewal date and subscription status.
Relevant inputs or decisions: Plan selection (monthly vs annual); billing management; cancellation decisions.
Interactions with other accepted participants: Relies on Stripe (provider) for billing; receives subscription notifications; interacts with Community Participants.
Observable success: Premium access gated by actual subscription status; uninterrupted access.
Product context: An authorized admin who accesses /admin.
Primary goal: Maintain a healthy, moderated platform with accurate operational metrics and current content.
Distinct accepted responsibilities: View total users, active users, Premium subscribers, revenue, growth, workout completions, and cancellations; perform CRUD on users, workouts, exercises, programs, recipes, nutrition articles, trainers, FAQs, and testimonials; handle community moderation, reporting, and blocking.
Relevant inputs or decisions: Metric review; content edits; moderation decisions; blocking decisions.
Interactions with other accepted participants: Moderates Community Participants; manages all members; configures prices.
Observable success: Accurate metrics; current content; moderated community.
Product context: A signed-in member who engages in the community.
Primary goal: An engaged, safe community experience with visible activity and moderation recourse.
Distinct accepted responsibilities: Create posts, like, comment, and follow other members; report or block others; receive in-app and email notifications for community activity, milestones, and completed goals.
Relevant inputs or decisions: Post content; reactions; follow/report/block decisions.
Interactions with other accepted participants: Interacts with other members; subject to Administrator moderation.
Observable success: Visible activity; safe experience; moderation recourse.
/ and reads the hero headline "Your Fitness Journey Starts Here.", subheadline, and fitness visual/video./programs./programs/[slug] to view full details, trainer, schedule, equipment, target areas, and workouts./workouts, /trainers, /nutrition, or /recipes./dashboard./workouts and searches/filters by muscle group, difficulty, equipment, duration, calories, and workout type./workouts/[slug] and reviews video, trainer, duration, difficulty, equipment, target muscles, calories, and exercise list with sets, reps, rest, and instructions./dashboard or /progress./programs/[slug] and reviews trainer, schedule, equipment, target areas, and workouts./progress and adds weight, workout completion, training time, personal records, and measurements./goals and creates a goal with target, current progress, percentage, deadline, and completion status./dashboard./pricing./settings and views subscription/billing and renewal date./community and creates a post./admin./settings and edits profile and fitness preferences./dashboard.Muse: Karim Rashid — sensual pop minimalism for a fitness brand that feels like a reward, not a punishment. Rashid's organic curves, candy optimism, and glossy material language are re-cast in a graphite night-mode palette with a single electric green as the pulse.
Headline: Training as something you look forward to, not a chore.
| Role | Hex | Usage |
|---|---|---|
| Background | #0B0D0C | Near-black graphite ground |
| Surface | #161A18 | Charcoal capsule surfaces |
| Hairline | #2A322D | 1px borders |
| Text | #F4F7F4 | Body text at 92% opacity |
| Primary | #C6FF3D | Electric lime — CTAs, progress fills, streak flames, active nav, liquid hero form |
| Accent | #FF4FA3 | Bubblegum magenta — micro-moments only (badge dots, hover glints, Premium modal rim light, chart secondary series) |
| Muted | #7E8A82 | Labels and metadata |
| Role | Hex |
|---|---|
| Background | #F6F5F2 (pearl-white) |
| Text | #14161A (graphite) |
| Primary | #C6FF3D (full saturation) |
| Accent | #FF4FA3 (full saturation) |
Lime on graphite reads at 14:1 contrast. Magenta is never used behind body text. Neither lime nor magenta is used as a large flat field behind body text.
clamp(40px, 9vw, 132px) with 0.92 line-height and −0.02em tracking. Numerals (streaks, minutes, calories, PRs) set in Unbounded 700 at 2.2× surrounding body size.clamp(40px→132px); section heads clamp(30px→56px); tile numerals clamp(34px→64px).Organic capsule and blob geometry. Buttons are full pills (border-radius 999px). Cards are 28px-radius rounded rectangles with a 1px #2A322D hairline and a soft 0 18px 40px rgba(0,0,0,0.55) shadow. Section boundaries are shallow convex curves rather than hard rules. The lime hero form is a continuously deforming glossy blob — a liquid-metal dumbbell that morphs between a kettlebell silhouette and a ring. Progress bars are capsule tracks with a lime fill and a subtle glossy highlight along their top edge. Icons (Lucide) sit inside 44px circular chips. Nothing is square; nothing is sharp.
Mobile-first single-column with a desktop 12-column grid. Public marketing pages alternate full-bleed colour-block sections separated by curved dividers. The app shell uses a 260px desktop sidebar with capsule active states and a 5-item pill-shaped mobile bottom nav that floats 12px above the safe area with a glass blur. Dashboard is a bento of capsule tiles. Filters on /workouts and /programs are horizontally scrollable pill rows on mobile and a sticky left rail on desktop. Every card, tile, and control stays fully inside its container at 375px, 768px, and 1280px.
One crafted subject per surface, never stock gym photography. The hero is a real-time glossy 3D form (Three.js / React Three Fiber) — a liquid-metal dumbbell/kettlebell hybrid in lime and graphite with soft studio reflections. Workout and program cards use art-directed glossy 3D props (chrome kettlebell, matte-black hex dumbbell, lime resistance band coil, pink foam roller) on graphite grounds, rendered in a consistent studio light. Trainer portraits are duotone-treated — graphite shadows, lime rim light. Progress charts are soft, thick-stroke capsule lines with a lime-to-magenta gradient fill beneath. No gradient blobs, no generic abstract mesh wallpaper.
The Lime Colour Block Hero
The public entry (/) opens on a dark, full-bleed first screen that is not a centred SaaS stack. The left 6 columns carry the headline "Your Fitness Journey Starts Here." set in Unbounded 700 at clamp(40px→132px), stacked across four lines. The word "Journey" is rendered in lime as a solid colour block behind it — an offset lime capsule that bleeds 24px off the left viewport edge at mobile and 80px at desktop, with the white type sitting on top of it. The type and the block read as one sculptural object rather than a headline on a background.
Beneath the headline sit two pill CTAs: "Start Free" filled in lime with graphite text, and "Explore Programs" as a graphite capsule with a lime hairline.
The right 6 columns carry the glossy lime 3D dumbbell form floating over a graphite field, casting a soft magenta-tinted shadow, slowly morphing, bleeding off the right edge of the viewport. Behind everything, a faint 1px grid of hairlines and a single diagonal lime light streak.
The bottom strip is a horizontally scrolling ticker of real stats ("4.9★ • 12,000+ members • 340 workouts • 50 exercises") in Unbounded 500 uppercase at 14px, moving at 40s per loop, pausable on hover and wrapping into rows under prefers-reduced-motion.
On mobile the composition stacks: lime block + headline first, glossy form below at 60% viewport width, ticker pinned at the bottom.
This concept recomposes only accepted content, states, and controls — it introduces no new behaviour, page, or destination.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: webgl
Focal subject: A real-time glossy 3D liquid-metal dumbbell/kettlebell hybrid in lime and graphite with soft studio reflections, floating over a graphite field.
Input → transformation → outcome thesis: As the visitor arrives, the glossy form breathes and slowly morphs on a 9-second loop between a dumbbell, a kettlebell, and a ring, with a lime specular sweep travelling across its surface. The transformation communicates the product's promise — training that adapts and rewards — using only accepted behaviour (the hero visual and the "Start Free" / "Explore Programs" CTAs).
Motion vocabulary: Expressive, at the muse's ceiling but never bouncy-cartoonish. Cards enter with a 320ms cubic-bezier(0.22,1,0.36,1) rise-and-scale from 0.96, staggered 60ms. Tapping a completed set fires a liquid ripple that fills the capsule in lime. Progress rings sweep with a spring on value change. Hover on desktop raises a card 4px and slides a magenta glint across its top hairline. The mobile bottom nav's active pill stretches elastically between items.
Composed first frame: Left 6 columns — the lime capsule bleeding off the left edge with "Your Fitness Journey Starts Here." stacked across four lines, "Journey" in lime on the block; two pill CTAs beneath. Right 6 columns — the glossy lime form mid-morph, magenta-tinted shadow beneath, bleeding off the right edge. Faint 1px hairline grid and a single diagonal lime light streak behind. Bottom strip — the stats ticker at rest.
Reduced-motion state: All morphs and sweeps freeze to a static glossy form; entrance animations become instant opacity fades; the ticker wraps into rows or becomes horizontally scrollable so every item can be brought fully into view.
A single crafted real-time object: a glossy liquid-metal dumbbell/kettlebell hybrid in lime (#C6FF3D) and graphite (#161A18) with soft studio reflections, rendered with Three.js / React Three Fiber. The object continuously morphs between a dumbbell silhouette, a kettlebell silhouette, and a ring on a 9-second loop, with a lime specular sweep. It floats over a graphite field (#0B0D0C) and casts a soft magenta-tinted shadow (#FF4FA3 at low opacity). The scene shows the product's defining state — adaptive training that rewards effort — and is the only 3D subject in the product, reused at smaller scale on program cards. Under prefers-reduced-motion, the object freezes to a static glossy form.
NFR-01 — Security (explicit) Secure password hashing, authentication, authorization, admin protection, API validation, rate limiting where appropriate, CSRF protection where applicable, input sanitization, secure file uploads, Stripe webhook signature verification, and database access control. Never expose passwords, private user information, API keys, or secret keys. Never expose Stripe secret keys. All secrets stored in environment variables.
NFR-02 — SEO (explicit) SEO metadata, Open Graph, X cards, sitemap, robots.txt, canonical URLs, and structured data.
NFR-03 — Performance (explicit) Optimized images, videos, lazy loading, database queries, caching, pagination, and SSR where useful.
NFR-04 — Accessibility (explicit) Semantic HTML, keyboard navigation, accessible labels, focus states, alt text, ARIA where needed, and good color contrast.
NFR-05 — Quality states (explicit) Loading, success, error, empty, 404, and 500 states across the application, using reusable modular components.
NFR-06 — Local resilience (explicit) If third-party services are not configured, clean integration layers and safe demo/mock data keep the application running locally.
NFR-07 — Demo/production separation (explicit) Demo data is clearly separated from production data.
NFR-08 — Responsive integrity (explicit, direction)
Headlines, wordmarks, labels, numbers, cards' text, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit. No other element covers any part of them. Moving and scrollable content may cross the viewport or container edge by design; every item becomes fully readable as it passes. Under prefers-reduced-motion, items wrap into rows or become horizontally scrollable.
NFR-09 — Premium access integrity (explicit) Premium access depends on actual subscription status synchronized from verified Stripe webhooks.
NFR-10 — Privacy of progress photos (explicit) Progress photos remain private unless the user explicitly chooses to share them.
NFR-11 — No medical diagnosis or treatment (explicit) FitForge does not provide medical diagnosis or treatment. Nutrition content clearly states it is general education and not medical advice.
NFR-12 — Configurable pricing (explicit) Prices are configurable through database/environment settings.
Assumptions
/admin access.Constraints
/admin requires admin authorization.No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No comments yet. Be the first!