graph LR

  subgraph API
    subgraph api_activity["activity"]
      api__api_activity__activity_id_["GET /api/activity/{activity_id}"]
      api__api_activity__activity_id_["POST /api/activity/{activity_id}"]
      api__api_activity__activity_id_["DELETE /api/activity/{activity_id}"]
      api__api_activity__activity_id__images["GET /api/activity/{activity_id}/images"]
      api__api_activity__activity_id__images["POST /api/activity/{activity_id}/images"]
      api__api_activity__activity_id__images__filename_["DELETE /api/activity/{activity_id}/images/{filename}"]
    end
    subgraph api_admin["admin"]
      api__api_admin_users["GET /api/admin/users"]
      api__api_admin_jobs["GET /api/admin/jobs"]
      api__api_admin_disk["GET /api/admin/disk"]
      api__api_admin_users__handle__reset_password_code["POST /api/admin/users/{handle}/reset-password-code"]
      api__api_admin_users__handle__rebuild["POST /api/admin/users/{handle}/rebuild"]
      api__api_admin_users__handle__activities["DELETE /api/admin/users/{handle}/activities"]
    end
    subgraph api_athlete["athlete"]
      api__api_athlete["GET /api/athlete"]
      api__api_athlete["POST /api/athlete"]
    end
    subgraph api_auth["auth"]
      api__api_auth_login["POST /api/auth/login"]
      api__api_auth_logout["POST /api/auth/logout"]
      api__api_auth_reset_password["POST /api/auth/reset-password"]
    end
    subgraph api_feedback["feedback"]
      api__api_feedback["POST /api/feedback"]
    end
    subgraph api_garmin["garmin"]
      api__api_garmin_status["GET /api/garmin/status"]
      api__api_garmin_connect["POST /api/garmin/connect"]
      api__api_garmin_disconnect["POST /api/garmin/disconnect"]
      api__api_garmin_sync_stream["GET /api/garmin/sync/stream"]
    end
    subgraph api_invites["invites"]
      api__api_invites["GET /api/invites"]
      api__api_invites["POST /api/invites"]
    end
    subgraph api_me["me"]
      api__api_me["GET /api/me"]
    end
    subgraph api_register["register"]
      api__api_register["POST /api/register"]
    end
    subgraph api_stats["stats"]
      api__api_stats["GET /api/stats"]
    end
    subgraph api_strava["strava"]
      api__api_strava_status["GET /api/strava/status"]
      api__api_strava_reset["POST /api/strava/reset"]
      api__api_strava_auth_url["GET /api/strava/auth-url"]
      api__api_strava_callback["GET /api/strava/callback"]
      api__api_strava_sync_stream["GET /api/strava/sync/stream"]
      api__api_strava_sync["POST /api/strava/sync"]
    end
    subgraph api_upload["upload"]
      api__api_upload["POST /api/upload"]
      api__api_upload_strava_zip["POST /api/upload/strava-zip"]
    end
  end

  subgraph Pages
    site_src_pages_about_ca_index_astro["pages/about/ca/"]
    site_src_pages_about_es_index_astro["pages/about/es/"]
    site_src_pages_about_index_astro["pages/about/"]
    site_src_pages_about_it_index_astro["pages/about/it/"]
    site_src_pages_activity__id__astro["pages/activity/[id].astro"]
    site_src_pages_activity_index_astro["pages/activity/"]
    site_src_pages_activity_local_index_astro["pages/activity/local/"]
    site_src_pages_admin_index_astro["pages/admin/"]
    site_src_pages_athlete_index_astro["pages/athlete/"]
    site_src_pages_community_index_astro["pages/community/"]
    site_src_pages_convert_index_astro["pages/convert/"]
    site_src_pages_feedback_index_astro["pages/feedback/"]
    site_src_pages_index_astro["pages/"]
    site_src_pages_invites_index_astro["pages/invites/"]
    site_src_pages_login_index_astro["pages/login/"]
    site_src_pages_record_index_astro["pages/record/"]
    site_src_pages_register_index_astro["pages/register/"]
    site_src_pages_reset_password_index_astro["pages/reset-password/"]
    site_src_pages_stats_index_astro["pages/stats/"]
    site_src_pages_u__handle__athlete_index_astro["pages/u/[handle]/athlete/"]
    site_src_pages_u__handle__index_astro["pages/u/[handle]/"]
    site_src_pages_u__handle__stats_index_astro["pages/u/[handle]/stats/"]
  end

  subgraph Components
    site_src_components_ActivityCharts_svelte["components/ActivityCharts.svelte"]
    site_src_components_ActivityDetail_svelte["components/ActivityDetail.svelte"]
    site_src_components_ActivityDetailLoader_svelte["components/ActivityDetailLoader.svelte"]
    site_src_components_ActivityFeed_svelte["components/ActivityFeed.svelte"]
    site_src_components_ActivityMap_svelte["components/ActivityMap.svelte"]
    site_src_components_AthleteDrawer_svelte["components/AthleteDrawer.svelte"]
    site_src_components_AthleteView_svelte["components/AthleteView.svelte"]
    site_src_components_CommunityView_svelte["components/CommunityView.svelte"]
    site_src_components_EditDrawer_svelte["components/EditDrawer.svelte"]
    site_src_components_LocalActivityDetail_svelte["components/LocalActivityDetail.svelte"]
    site_src_components_MmpChart_svelte["components/MmpChart.svelte"]
    site_src_components_RecordsView_svelte["components/RecordsView.svelte"]
    site_src_components_StatsView_svelte["components/StatsView.svelte"]
  end

  subgraph Python
    subgraph py_edit["edit"]
      bincio_edit_cli_py["cli"]
      bincio_edit_ops_py["ops"]
      bincio_edit_server_py["server"]
    end
    subgraph py_extract["extract"]
      bincio_extract_cli_py["cli"]
      bincio_extract_config_py["config"]
      bincio_extract_dedup_py["dedup"]
      bincio_extract_garmin_api_py["garmin_api"]
      bincio_extract_garmin_sync_py["garmin_sync"]
      bincio_extract_ingest_py["ingest"]
      bincio_extract_metrics_py["metrics"]
      bincio_extract_models_py["models"]
      bincio_extract_parsers_base_py["base"]
      bincio_extract_parsers_factory_py["factory"]
      bincio_extract_parsers_fit_py["fit"]
      bincio_extract_parsers_gpx_py["gpx"]
      bincio_extract_parsers_tcx_py["tcx"]
      bincio_extract_simplify_py["simplify"]
      bincio_extract_sport_py["sport"]
      bincio_extract_strava_api_py["strava_api"]
      bincio_extract_strava_csv_py["strava_csv"]
      bincio_extract_strava_zip_py["strava_zip"]
      bincio_extract_timeseries_py["timeseries"]
      bincio_extract_writer_py["writer"]
    end
    subgraph py_import_["import_"]
      bincio_import__cli_py["cli"]
      bincio_import__strava_py["strava"]
    end
    subgraph py_render["render"]
      bincio_render_cli_py["cli"]
      bincio_render_merge_py["merge"]
    end
    subgraph py_root["root"]
      bincio_cli_py["cli"]
      bincio_dev_py["dev"]
    end
    subgraph py_serve["serve"]
      bincio_serve_cli_py["cli"]
      bincio_serve_db_py["db"]
      bincio_serve_init_cmd_py["init_cmd"]
      bincio_serve_server_py["server"]
    end
  end

  site_src_components_EditDrawer_svelte -->|fetch| api__api_activity_
  site_src_components_AthleteDrawer_svelte -->|fetch| api__api_athlete
  site_src_components_AthleteView_svelte -->|fetch| api__api_athlete
  site_src_components_AthleteView_svelte -->|fetch| api__api_athlete__
  site_src_layouts_Base_astro -->|fetch| api__api_me
  site_src_layouts_Base_astro -->|fetch| api__api_admin_jobs
  site_src_layouts_Base_astro -->|fetch| api__api_auth_logout
  site_src_layouts_Base_astro -->|fetch| api__api_admin_jobs__
  site_src_layouts_Base_astro -->|fetch| api__api_auth_logout__
  site_src_layouts_Base_astro -->|fetch| api__api_upload
  site_src_layouts_Base_astro -->|fetch| api__api_strava_status
  site_src_layouts_Base_astro -->|fetch| api__api_strava_auth_url
  site_src_layouts_Base_astro -->|fetch| api__api_strava_sync_stream
  site_src_layouts_Base_astro -->|fetch| api__api_strava_reset
  site_src_layouts_Base_astro -->|fetch| api__api_upload_strava_zip
  site_src_layouts_Base_astro -->|fetch| api__api_garmin_status
  site_src_layouts_Base_astro -->|fetch| api__api_garmin_connect
  site_src_layouts_Base_astro -->|fetch| api__api_garmin_sync_stream
  site_src_layouts_Base_astro -->|fetch| api__api_garmin_disconnect
  site_src_pages_admin_index_astro -->|fetch| api__api_admin_disk
  site_src_pages_admin_index_astro -->|fetch| api__api_admin_users___h__rebuild
  site_src_pages_admin_index_astro -->|fetch| api__api_admin_users___h__reset_password_code
  site_src_pages_admin_index_astro -->|fetch| api__api_admin_users___pendingHandle__activities
  site_src_pages_admin_index_astro -->|fetch| api__api_admin_disk__
  site_src_pages_admin_index_astro -->|fetch| api__api_admin_users_
  site_src_pages_about_index_astro -->|fetch| api__api_me
  site_src_pages_about_index_astro -->|fetch| api__api_stats
  site_src_pages_about_index_astro -->|fetch| api__api_stats___
  site_src_pages_feedback_index_astro -->|fetch| api__api_feedback
  site_src_pages_feedback_index_astro -->|fetch| api__api_me
  site_src_pages_feedback_index_astro -->|fetch| api__api_feedback__
  site_src_pages_feedback_index_astro -->|fetch| api__api_me__
  site_src_pages_register_index_astro -->|fetch| api__api_register
  site_src_pages_reset_password_index_astro -->|fetch| api__api_auth_reset_password
  site_src_pages_invites_index_astro -->|fetch| api__api_invites
  site_src_pages_invites_index_astro -->|fetch| api__api_invites__
  site_src_pages_login_index_astro -->|fetch| api__api_auth_login
  site_src_pages_convert_index_astro -->|fetch| api__api_import_bas
  site_src_pages_about_it_index_astro -->|fetch| api__api_me
  site_src_pages_about_it_index_astro -->|fetch| api__api_stats
  site_src_pages_about_it_index_astro -->|fetch| api__api_stats___
  site_src_pages_about_ca_index_astro -->|fetch| api__api_me
  site_src_pages_about_ca_index_astro -->|fetch| api__api_stats
  site_src_pages_about_ca_index_astro -->|fetch| api__api_stats___
  site_src_pages_about_es_index_astro -->|fetch| api__api_me
  site_src_pages_about_es_index_astro -->|fetch| api__api_stats
  site_src_pages_about_es_index_astro -->|fetch| api__api_stats___
  site_src_components_ActivityDetail_svelte --> site_src_components_ActivityMap_svelte
  site_src_components_ActivityDetail_svelte --> site_src_components_ActivityCharts_svelte
  site_src_components_ActivityDetail_svelte --> site_src_components_EditDrawer_svelte
  site_src_components_ActivityDetailLoader_svelte --> site_src_components_ActivityDetail_svelte
  site_src_components_AthleteView_svelte --> site_src_components_MmpChart_svelte
  site_src_components_AthleteView_svelte --> site_src_components_RecordsView_svelte
  site_src_components_AthleteView_svelte --> site_src_components_AthleteDrawer_svelte
  site_src_components_LocalActivityDetail_svelte --> site_src_components_ActivityDetail_svelte
  site_src_pages_index_astro --> site_src_components_ActivityFeed_svelte
  site_src_pages_index_astro --> site_src_layouts_Base_astro
  site_src_pages_record_index_astro --> site_src_layouts_Base_astro
  site_src_pages_activity__id__astro --> site_src_components_ActivityDetail_svelte
  site_src_pages_activity__id__astro --> site_src_layouts_Base_astro
  site_src_pages_activity_index_astro --> site_src_components_ActivityDetailLoader_svelte
  site_src_pages_activity_index_astro --> site_src_layouts_Base_astro
  site_src_pages_admin_index_astro --> site_src_layouts_Base_astro
  site_src_pages_about_index_astro --> site_src_layouts_Base_astro
  site_src_pages_feedback_index_astro --> site_src_layouts_Base_astro
  site_src_pages_register_index_astro --> site_src_layouts_Base_astro
  site_src_pages_reset_password_index_astro --> site_src_layouts_Base_astro
  site_src_pages_community_index_astro --> site_src_components_CommunityView_svelte
  site_src_pages_community_index_astro --> site_src_layouts_Base_astro
  site_src_pages_invites_index_astro --> site_src_layouts_Base_astro
  site_src_pages_login_index_astro --> site_src_layouts_Base_astro
  site_src_pages_convert_index_astro --> site_src_layouts_Base_astro
  site_src_pages_activity_local_index_astro --> site_src_components_LocalActivityDetail_svelte
  site_src_pages_activity_local_index_astro --> site_src_layouts_Base_astro
  site_src_pages_u__handle__index_astro --> site_src_components_ActivityFeed_svelte
  site_src_pages_u__handle__index_astro --> site_src_layouts_Base_astro
  site_src_pages_u__handle__athlete_index_astro --> site_src_components_AthleteView_svelte
  site_src_pages_u__handle__athlete_index_astro --> site_src_layouts_Base_astro
  site_src_pages_u__handle__stats_index_astro --> site_src_components_StatsView_svelte
  site_src_pages_u__handle__stats_index_astro --> site_src_layouts_Base_astro
  site_src_pages_about_it_index_astro --> site_src_layouts_Base_astro
  site_src_pages_about_ca_index_astro --> site_src_layouts_Base_astro
  site_src_pages_about_es_index_astro --> site_src_layouts_Base_astro
  bincio_cli_py --> bincio_edit_cli_py
  bincio_cli_py --> bincio_extract_cli_py
  bincio_cli_py --> bincio_render_cli_py
  bincio_cli_py --> bincio_serve_cli_py
  bincio_cli_py --> bincio_import__cli_py
  bincio_cli_py --> bincio_serve_init_cmd_py
  bincio_cli_py --> bincio_dev_py
  bincio_import__strava_py --> bincio_extract_models_py
  bincio_import__strava_py --> bincio_extract_sport_py
  bincio_edit_server_py --> bincio_edit_ops_py
  bincio_extract_simplify_py --> bincio_extract_models_py
  bincio_extract_metrics_py --> bincio_extract_models_py
  bincio_extract_ingest_py --> bincio_extract_models_py
  bincio_extract_strava_api_py --> bincio_extract_models_py
  bincio_extract_strava_api_py --> bincio_extract_sport_py
  bincio_extract_cli_py --> bincio_extract_parsers_factory_py
  bincio_extract_cli_py --> bincio_extract_config_py
  bincio_extract_cli_py --> bincio_extract_dedup_py
  bincio_extract_writer_py --> bincio_extract_metrics_py
  bincio_extract_writer_py --> bincio_extract_simplify_py
  bincio_extract_writer_py --> bincio_extract_timeseries_py
  bincio_extract_writer_py --> bincio_extract_models_py
  bincio_extract_timeseries_py --> bincio_extract_models_py
  bincio_serve_server_py --> bincio_serve_db_py
  bincio_serve_server_py --> bincio_edit_ops_py
  bincio_extract_parsers_tcx_py --> bincio_extract_models_py
  bincio_extract_parsers_tcx_py --> bincio_extract_sport_py
  bincio_extract_parsers_fit_py --> bincio_extract_models_py
  bincio_extract_parsers_fit_py --> bincio_extract_sport_py
  bincio_extract_parsers_gpx_py --> bincio_extract_sport_py
  bincio_extract_parsers_gpx_py --> bincio_extract_models_py
  bincio_extract_parsers_gpx_py --> bincio_extract_parsers_base_py
  bincio_extract_parsers_factory_py --> bincio_extract_parsers_gpx_py
  bincio_extract_parsers_factory_py --> bincio_extract_models_py
  bincio_extract_parsers_factory_py --> bincio_extract_parsers_tcx_py
  bincio_extract_parsers_factory_py --> bincio_extract_parsers_base_py
  bincio_extract_parsers_factory_py --> bincio_extract_parsers_fit_py
  bincio_extract_parsers_base_py --> bincio_extract_models_py