Qwen Fitness Tracker

Track workouts, nutrition, sleep, steps, weight, goals, and streaks.

Calories In vs Out

Weight Trend

Today's Macros

Weekly Activity Minutes

Recent Logs

DateTypeDetailsValue

Log Workout

Log Daily Steps & Sleep

Recent Workouts

DateTypeIntensityMinCalDistanceHR

Log Meal

Today's Meals

MealFoodCalPCF

Recent Meals

DateMealFoodCalPCF

Log Weight & Measurements

Weight & Measurement History

DateWeight kgBody Fat %Waist cmNeck cmChest cmArm cmThigh cm

Profile & Goals

Goal Progress

Achievements

``` --- # FILE 2 — `qwen_health_analytics.html` ```html Qwen Health Analytics

Health Analytics Dashboard

SQL-backed longitudinal fitness and nutrition analytics.

1. Calorie Deficit / Surplus Over Time

Actionable Insights

    2. Workout Frequency and Intensity Trends

    4. Macro Distribution

    3. Weight Trajectory and Target Date

    6. Goal Progress Percentages

    5. Activity Streaks

    DateActivity Logged

    Goal Progress Table

    GoalProgress

    Core Schema

    CREATE TABLE users (
      id TEXT PRIMARY KEY,
      name TEXT,
      height_cm NUMERIC,
      weight_kg NUMERIC,
      start_weight_kg NUMERIC,
      goal_weight_kg NUMERIC,
      target_date DATE,
      calorie_target INT,
      protein_target INT,
      carbs_target INT,
      fat_target INT,
      step_target INT,
      sleep_target NUMERIC,
      workout_target_per_week INT
    );
    
    CREATE TABLE activities (
      id TEXT PRIMARY KEY,
      user_id TEXT REFERENCES users(id),
      date DATE,
      type TEXT,
      intensity TEXT,
      minutes NUMERIC,
      distance_km NUMERIC,
      calories_burned NUMERIC,
      steps INT,
      heart_rate_avg INT,
      notes TEXT
    );
    
    CREATE TABLE meals (
      id TEXT PRIMARY KEY,
      user_id TEXT REFERENCES users(id),
      date DATE,
      meal TEXT,
      food TEXT,
      calories INT,
      protein_g NUMERIC,
      carbs_g NUMERIC,
      fat_g NUMERIC
    );
    
    CREATE TABLE weights (
      id TEXT PRIMARY KEY,
      user_id TEXT REFERENCES users(id),
      date DATE,
      weight_kg NUMERIC,
      body_fat_pct NUMERIC
    );
    
    CREATE TABLE measurements (
      id TEXT PRIMARY KEY,
      user_id TEXT REFERENCES users(id),
      date DATE,
      waist_cm NUMERIC,
      neck_cm NUMERIC,
      chest_cm NUMERIC,
      arm_cm NUMERIC,
      thigh_cm NUMERIC
    );
    
    CREATE TABLE achievements (
      id TEXT PRIMARY KEY,
      user_id TEXT REFERENCES users(id),
      key TEXT,
      date DATE
    );

    1. Calorie Deficit/Surplus Analysis Over Time

    WITH daily AS (
      SELECT user_id, date AS log_date, calories AS calories_in, 0 AS calories_out
      FROM meals
      WHERE user_id = :user_id
        AND date BETWEEN :start_date AND :end_date
    
      UNION ALL
    
      SELECT user_id, date, 0, calories_burned
      FROM activities
      WHERE user_id = :user_id
        AND date BETWEEN :start_date AND :end_date
    )
    SELECT
      log_date,
      SUM(calories_in) AS calories_in,
      SUM(calories_out) AS calories_out,
      SUM(calories_in) - SUM(calories_out) AS net_calories
    FROM daily
    GROUP BY log_date
    ORDER BY log_date;

    2. Workout Frequency and Intensity Trends

    SELECT
      date_trunc('week', date) AS week,
      COUNT(*) AS workout_count,
      SUM(minutes) AS total_minutes,
      AVG(
        CASE intensity
          WHEN 'light' THEN 1
          WHEN 'moderate' THEN 2
          WHEN 'vigorous' THEN 3
          ELSE 2
        END
      ) AS avg_intensity,
      AVG(heart_rate_avg) AS avg_heart_rate
    FROM activities
    WHERE user_id = :user_id
      AND type NOT IN ('Steps', 'Sleep')
      AND date BETWEEN :start_date AND :end_date
    GROUP BY 1
    ORDER BY 1;

    3. Weight Trajectory and Target Date Calculation

    WITH trend AS (
      SELECT
        regr_slope(
          EXTRACT(EPOCH FROM date)::float,
          weight_kg
        ) AS slope
      FROM weights
      WHERE user_id = :user_id
        AND date >= CURRENT_DATE - INTERVAL '60 days'
    ),
    latest AS (
      SELECT weight_kg
      FROM weights
      WHERE user_id = :user_id
      ORDER BY date DESC
      LIMIT 1
    )
    SELECT
      latest.weight_kg AS current_weight,
      :target_weight AS target_weight,
      trend.slope,
      CASE
        WHEN trend.slope < -0.001 AND :target_weight < latest.weight_kg
          THEN CURRENT_DATE + ((latest.weight_kg - :target_weight) / ABS(trend.slope))::int
        WHEN trend.slope > 0.001 AND :target_weight > latest.weight_kg
          THEN CURRENT_DATE + ((:target_weight - latest.weight_kg) / trend.slope)::int
      END AS projected_target_date
    FROM trend
    CROSS JOIN latest;

    4. Macro Distribution Pie Chart

    SELECT
      SUM(protein_g) * 4 AS protein_calories,
      SUM(carbs_g) * 4 AS carb_calories,
      SUM(fat_g) * 9 AS fat_calories,
      SUM(protein_g) AS protein_g,
      SUM(carbs_g) AS carbs_g,
      SUM(fat_g) AS fat_g
    FROM meals
    WHERE user_id = :user_id
      AND date BETWEEN :start_date AND :end_date;

    5. Activity Streaks

    WITH logged AS (
      SELECT DISTINCT date
      FROM activities
      WHERE user_id = :user_id
        AND date BETWEEN :start_date AND :end_date
        AND type <> 'Sleep'
    ),
    grouped AS (
      SELECT
        date,
        date - ((ROW_NUMBER() OVER (ORDER BY date))::text || ' days')::interval AS grp
      FROM logged
    )
    SELECT
      MIN(date) AS streak_start,
      MAX(date) AS streak_end,
      COUNT(*) AS streak_days
    FROM grouped
    GROUP BY grp
    ORDER BY streak_days DESC
    LIMIT 1;

    6. Goal Progress Percentage Calculations

    WITH latest AS (
      SELECT weight_kg
      FROM weights
      WHERE user_id = :user_id
      ORDER BY date DESC
      LIMIT 1
    ),
    daily AS (
      SELECT user_id, log_date, SUM(calories_in) AS calories_in
      FROM (
        SELECT user_id, date AS log_date, calories AS calories_in
        FROM meals
        WHERE user_id = :user_id
          AND date BETWEEN :start_date AND :end_date
    
        UNION ALL
    
        SELECT user_id, date, 0
        FROM activities
        WHERE user_id = :user_id
          AND date BETWEEN :start_date AND :end_date
      ) d
      GROUP BY user_id, log_date
    )
    SELECT
      u.name,
      ROUND(
        ABS(u.start_weight_kg - latest.weight_kg)
        / NULLIF(ABS(u.start_weight_kg - u.goal_weight_kg), 0)
        * 100,
        1
      ) AS weight_goal_pct,
      ROUND(
        100.0 * COUNT(*) FILTER (
          WHERE daily.calories_in BETWEEN u.calorie_target - 200 AND u.calorie_target + 200
        ) / NULLIF(COUNT(*), 0),
        1
      ) AS calorie_adherence_pct
    FROM users u
    CROSS JOIN latest
    LEFT JOIN daily ON daily.user_id = u.id
    WHERE u.id = :user_id
    GROUP BY u.name, latest.weight_kg;