AI Slop Code RIsk Monitor

yihong0618/running_page

Make your own running home page

10.0 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for yihong0618/running_page, a TypeScript project with 4,545 GitHub stars. SynthScan examined 41,549 lines of code across 178 source files, recording 256 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 10.0 (Moderate pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

10.0
Adjusted Signal
10.0
Raw Pattern Score
100%
Time Factor
2026-10-07
Last Push
4.5K
Stars
TypeScript
Language
41.5K
Lines of Code
178
Files
256
Pattern Hits
2026-10-12
Scan Date
0.08
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 12.5/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 98 finding(s).

Hallucinated Dependency & Supply Chain Risk 4.0/100 · LOW

Are imports declared and package/API names verified? 10 finding(s).

Agent Over-Engineering Ratio 32.1/100 · MEDIUM

Are wrappers, guards, and repeated structures necessary? 199 finding(s).

PR Review Velocity Impact 42.2/100 · MEDIUM

Which changes need focused human review? 256 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 15MEDIUM 62LOW 179

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 256 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Excessive Try-Catch Wrapping107 hits · 147 pts
SeverityFileLineSnippetContext
MEDIUMrun_page/keep_to_strava_sync.py36 print(f"Error reading JSON file {KEEP2STRAVA_BK_PATH}: {e}")CODE
LOW⚡run_page/keep_to_strava_sync.py117 except Exception as e: # noqa: BLE001CODE
MEDIUM⚡run_page/keep_to_strava_sync.py118 print(f"Error reading JSON file {KEEP2STRAVA_BK_PATH}: {e}")CODE
LOWrun_page/coros_sync.py132 except Exception as exc: # noqa: BLE001CODE
MEDIUMrun_page/coros_sync.py133 print(f"Error occurred while downloading {file_url}: {exc}")CODE
LOWrun_page/tulipsport_sync.py196 except Exception as e: # noqa: BLE001CODE
LOW⚡run_page/tulipsport_sync.py255 except Exception as e: # noqa: BLE001CODE
LOWrun_page/gpx_to_strava_sync.py26 except Exception as e: # noqa: BLE001CODE
LOWrun_page/codoon_sync.py109 except Exception as e: # noqa: BLE001CODE
LOWrun_page/codoon_sync.py254 except Exception as e: # noqa: BLE001CODE
LOWrun_page/codoon_sync.py499 except Exception as e: # noqa: BLE001CODE
MEDIUMrun_page/codoon_sync.py103def download_codoon_gpx(gpx_data, log_id):CODE
LOWrun_page/oppo_sync.py293 except Exception as e: # noqa: BLE001CODE
LOWrun_page/oppo_sync.py387 except Exception as e: # noqa: BLE001STRING
MEDIUMrun_page/oppo_sync.py381def download_keep_gpx(gpx_data, keep_id):CODE
LOWrun_page/intervals_icu_sync.py55 except Exception: # noqa: BLE001CODE
LOWrun_page/intervals_icu_sync.py84 except Exception as e: # noqa: BLE001CODE
LOWrun_page/intervals_icu_sync.py112 except Exception as e: # noqa: BLE001CODE
LOWrun_page/intervals_icu_sync.py138 except Exception as e: # noqa: BLE001CODE
LOWrun_page/intervals_icu_sync.py230 except Exception as e: # noqa: BLE001CODE
LOW⚡run_page/nike_sync.py44 except Exception as e: # noqa: BLE001CODE
MEDIUM⚡run_page/nike_sync.py45 print(f"Error getting activities before id {activity_id}: {e}")CODE
LOW⚡run_page/nike_sync.py54 except Exception as e: # noqa: BLE001CODE
LOWrun_page/nike_sync.py117 except Exception:CODE
LOWrun_page/nike_sync.py133 except Exception as e: # noqa: BLE001CODE
MEDIUMrun_page/nike_sync.py134 print(f"Error getting last before id: {e}")CODE
LOWrun_page/nike_sync.py160 except Exception as e: # noqa: BLE001CODE
MEDIUMrun_page/nike_sync.py161 print(f"Error getting last time: {e}")CODE
LOWrun_page/nike_sync.py366 except Exception as e: # noqa: BLE001STRING
MEDIUMrun_page/nike_sync.py367 print(f"Error reading JSON file {file}: {e}")STRING
LOWrun_page/nike_sync.py381 except Exception as e: # noqa: BLE001STRING
MEDIUMrun_page/nike_sync.py51def get_activity(self, activity_id):CODE
MEDIUMrun_page/nike_sync.py122def get_last_before_id():CODE
LOWrun_page/joyrun_sync.py70 except Exception as e: # noqa: BLE001CODE
LOWrun_page/joyrun_sync.py80 except Exception as e: # noqa: BLE001CODE
MEDIUM⚡run_page/joyrun_sync.py240 print(f"Error parsing points content: {e}")CODE
LOW⚡run_page/joyrun_sync.py243 except Exception as e: # noqa: BLE001CODE
MEDIUM⚡run_page/joyrun_sync.py244 print(f"Error processing points: {e}")CODE
MEDIUMrun_page/joyrun_sync.py64def download_joyrun_gpx(gpx_data, joyrun_id):CODE
LOWrun_page/data_to_csv.py5except Exception: # noqa: BLE001CODE
LOWrun_page/data_to_csv.py16 except Exception as e: # noqa: BLE001CODE
MEDIUMrun_page/data_to_csv.py17 print(f"Error applying duration time: {e}")CODE
MEDIUMrun_page/data_to_csv.py13def apply_duration_time(d):CODE
LOWrun_page/fix_location.py52 except Exception as e: # noqa: BLE001CODE
LOW⚡run_page/fix_location.py79 except Exception as e: # noqa: BLE001CODE
MEDIUM⚡run_page/fix_location.py80 print(f"Error decoding polyline: {e}")CODE
LOWrun_page/fix_location.py242 except Exception as e: # noqa: BLE001CODE
LOWrun_page/igpsport_sync.py144 except Exception as e: # noqa: BLE001CODE
LOWrun_page/igpsport_sync.py149 except Exception as e: # noqa: BLE001CODE
LOWrun_page/polyline_processor.py13 except Exception as e: # noqa: BLE001CODE
MEDIUMrun_page/komoot_sync.py54 print("Error " + str(r.status_code) + ": " + str(r.json()))CODE
LOWrun_page/utils.py9except Exception: # noqa: S110, BLE001CODE
LOWrun_page/utils.py95 except Exception as e: # noqa: BLE001CODE
LOWrun_page/synced_data_file_logger.py21 except Exception as e: # noqa: BLE001CODE
LOWrun_page/keep_sync.py254 except Exception as e: # noqa: BLE001CODE
LOWrun_page/keep_sync.py478 except Exception as e: # noqa: BLE001STRING
LOWrun_page/keep_sync.py490 except Exception as e: # noqa: BLE001STRING
MEDIUMrun_page/keep_sync.py471def download_keep_gpx(gpx_data, keep_id):CODE
MEDIUMrun_page/keep_sync.py483def download_keep_tcx(tcx_data, keep_id):CODE
LOWrun_page/strava_to_garmin_sync.py39 except Exception as ex: # noqa: BLE001CODE
47 more matches not shown…
Decorative Section Separators26 hits · 65 pts
SeverityFileLineSnippetContext
MEDIUMconfig.yml4# ── 地图 ──────────────────────────────────────────────────────────────────────COMMENT
MEDIUMconfig.yml13# ── 外观 ─────────────────────────────────────────────────────────────────────COMMENT
MEDIUMconfig.yml24# ── 主题预设 ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMconfig.yml29# ── 运动目标 ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMrun_page/tui/app.py33# ── colour palette ─────────────────────────────────────────COMMENT
MEDIUMrun_page/tui/app.py295# ── widgets ─────────────────────────────────────────────────COMMENT
MEDIUMrun_page/tui/app.py433# ── filter bar ─────────────────────────────────────────────COMMENT
MEDIUMrun_page/tui/app.py539# ── nav sidebar ────────────────────────────────────────────COMMENT
MEDIUMrun_page/tui/app.py581# ── stats view ─────────────────────────────────────────────COMMENT
MEDIUMrun_page/tui/app.py769# ── main app ───────────────────────────────────────────────COMMENT
MEDIUM⚡run_page/tui/app.py1083 # ── message handlers ────────────────────────────────────STRING
MEDIUM⚡run_page/tui/app.py1107 # ── actions ─────────────────────────────────────────────STRING
MEDIUMrun_page/tui/app.py915 # ── lifecycle ───────────────────────────────────────────STRING
MEDIUMrun_page/tui/app.py959 # ── view switching ──────────────────────────────────────STRING
MEDIUMrun_page/tui/app.py968 # ── table helpers ───────────────────────────────────────STRING
MEDIUMrun_page/tui/app.py1036 # ── filtering ───────────────────────────────────────────STRING
MEDIUMrun_page/tui/app.py1178# ── entry point ────────────────────────────────────────────STRING
MEDIUMrun_page/tui/data.py12# ── constants matching web UI ──────────────────────────────COMMENT
MEDIUMrun_page/tui/data.py45# ── activity dataclass ─────────────────────────────────────COMMENT
MEDIUMrun_page/tui/data.py65 # ── computed properties ────────────────────────────────COMMENT
MEDIUMrun_page/tui/data.py155 # ── location parsing ───────────────────────────────────COMMENT
MEDIUMrun_page/tui/data.py201 # ── race classification ────────────────────────────────COMMENT
MEDIUMrun_page/tui/data.py219# ── filtering ──────────────────────────────────────────────COMMENT
MEDIUMrun_page/tui/data.py260# ── aggregation ────────────────────────────────────────────COMMENT
MEDIUMrun_page/tui/data.py494# ── contribution grid data ─────────────────────────────────COMMENT
MEDIUMrun_page/tui/data.py607# ── loading ────────────────────────────────────────────────COMMENT
Hyper-Verbose Identifiers49 hits · 49 pts
SeverityFileLineSnippetContext
LOWtest_generator.py40def test_load_preserves_source_routes_and_missing_gps(CODE
LOWtest_tui_app.py44 def test_monthly_distances_aggregates_by_month(self) -> None:CODE
LOWtest_tui_app.py61 async def test_default_year_filter_uses_latest_year(self) -> None:CODE
LOWtest_tui_app.py107 async def test_cursor_move_updates_detail_without_click(self) -> None:CODE
LOWtest_tui_app.py137 def test_run_detail_rows_keep_city_only(self) -> None:CODE
LOWtest_tui_app.py161 def test_run_detail_extra_rows_include_cumulative_context(self) -> None:CODE
LOWtest_tui_app.py209 async def test_stats_period_uses_overall_data_range(self) -> None:CODE
LOWtest_tui_app.py232 async def test_stats_period_uses_selected_year_and_next_year(self) -> None:CODE
LOWtest_tui_app.py256 async def test_stats_view_fits_single_screen_for_single_year(self) -> None:CODE
LOWtest_tui_app.py274 async def test_stats_view_scrolls_on_small_screen(self) -> None:CODE
LOWtest_tui_app.py292 async def test_left_right_keys_switch_selected_year(self) -> None:CODE
LOWrun_page/tulipsport_sync.py30def get_all_activity_summaries(session, headers, start_time=None):CODE
LOWrun_page/tulipsport_sync.py86def merge_summary_and_detail_to_nametuple(summary, detail):CODE
LOWrun_page/tulipsport_sync.py154def find_last_tulipsport_start_time(track_ids):CODE
LOW⚡run_page/tulipsport_sync.py261def build_tulipsport_int_activity_id(activity):CODE
LOW⚡run_page/tulipsport_sync.py269def sync_tulipsport_activites(token, with_gpx=False):CODE
LOWrun_page/codoon_sync.py553 def parse_raw_data_to_namedtuple(CODE
LOWrun_page/oppo_sync.py121def get_to_download_runs_ranges(session, sync_months, headers, start_timestamp):CODE
LOWrun_page/oppo_sync.py174def parse_raw_data_to_name_tuple(sport_data, with_gpx, with_tcx):CODE
LOWrun_page/oppo_sync.py302def map_oppo_fit_type_to_gpx_type(oppo_type):CODE
LOWrun_page/oppo_sync.py321def map_oppo_fit_type_to_strava_activity_type(oppo_type):CODE
LOWrun_page/endomondo_sync.py35def parse_run_endomondo_to_nametuple(en_dict):CODE
LOWrun_page/endomondo_sync.py96def get_all_en_endomondo_json_file(file_dir=ENDOMONDO_FILE_DIR):CODE
LOWrun_page/tcx_to_garmin_sync.py37async def upload_tcx_files_to_garmin(options):CODE
LOWrun_page/joyrun_sync.py542 def parse_raw_data_to_nametuple(CODE
LOWrun_page/fix_location.py59def get_coordinates_from_polyline(summary_polyline):CODE
LOW⚡run_page/fix_location.py85def fix_location_for_activity(session, activity, dry_run=False):CODE
LOWrun_page/igpsport_sync.py63 def get_activity_download_url(self, ride_id):CODE
LOWrun_page/polyline_processor.py55def point_in_list_points_range(CODE
LOWrun_page/db_updater.py9def add_column_elevation_gain(session):CODE
LOWrun_page/synced_data_file_logger.py7def save_synced_data_file_list(file_list: list):CODE
LOWrun_page/keep_sync.py115def parse_raw_data_to_nametuple(CODE
LOWrun_page/garmin_sync.py131 async def upload_activities_original_from_strava(CODE
LOW⚡run_page/garmin_sync.py161 async def upload_activity_from_file(self, file):CODE
LOWrun_page/garmin_device_adaptor.py100def create_new_record_message(old_message, heart_rate):CODE
LOWrun_page/garmin_device_adaptor.py116def get_processed_heart_rate_message(record_messages):CODE
LOWrun_page/tui/app.py209def _render_distribution_panel(data: AggregatedData, focus_year: str) -> Panel:CODE
LOW⚡run_page/tui/app.py1085 def on_data_table_row_highlighted(self, event: DataTable.RowHighlighted) -> None:STRING
LOW⚡run_page/tui/app.py1088 def on_data_table_row_selected(self, event: DataTable.RowSelected) -> None:STRING
LOW⚡run_page/tui/app.py1097 def on_filter_bar_filter_changed(self, event: FilterBar.FilterChanged) -> None:STRING
LOW⚡run_page/tui/app.py1100 def on_nav_sidebar_view_selected(self, event: NavSidebar.ViewSelected) -> None:STRING
LOWrun_page/tui/data.py373def _parse_city_province_country(a: Activity) -> tuple[str, str, str]:CODE
LOWrun_page/generator/db.py84def update_or_create_activity(session, run_activity):CODE
LOWrun_page/gpxtrackposter/track.py304 def _load_gpx_extensions_item(self, gpx, item_name):CODE
LOWrun_page/gpxtrackposter/track.py323 def _load_gpx_extensions_data(self, gpx):CODE
LOWrun_page/gpxtrackposter/poster.py278 def __compute_track_statistics(self):CODE
LOWrun_page/gpxtrackposter/year_summary_drawer.py336 def _draw_monthly_grid_vertical(CODE
LOWrun_page/gpxtrackposter/utils.py141def get_normalized_sport_type(sport_type):CODE
LOWsrc/themes/classic/components/ActivityList/index.tsx407function useActivityListMeasurements(itemWidth: number, gap: number) {CODE
Empty Error Handlers8 hits · 40 pts
SeverityFileLineSnippetContext
HIGHrun_page/utils.py9except Exception: # noqa: S110, BLE001CODE
HIGHrun_page/utils.py47except ValueError:CODE
HIGHrun_page/keep_sync.py409except KeyError:CODE
HIGHrun_page/keep_sync.py418except KeyError:CODE
HIGHrun_page/tui/app.py1094except (ValueError, IndexError):CODE
HIGHrun_page/tui/data.py132except (ValueError, IndexError):CODE
HIGHrun_page/generator/db.py128except Exception: # noqa: S110, BLE001CODE
HIGHrun_page/gpxtrackposter/track.py278except lxml.etree.XMLSyntaxError:CODE
Deep Nesting28 hits · 28 pts
SeverityFileLineSnippetContext
LOWtest_tui.py60CODE
LOWrun_page/onelap_sync.py78CODE
LOWrun_page/tulipsport_sync.py30CODE
LOWrun_page/gpx_to_strava_sync.py13CODE
LOWrun_page/codoon_sync.py258CODE
LOWrun_page/oppo_sync.py450CODE
LOWrun_page/intervals_icu_sync.py63CODE
LOWrun_page/intervals_icu_sync.py152CODE
LOWrun_page/nike_sync.py353CODE
LOWrun_page/joyrun_sync.py624CODE
LOWrun_page/fix_location.py85CODE
LOWrun_page/komoot_sync.py159CODE
LOWrun_page/keep_sync.py115CODE
LOWrun_page/garmin_sync.py269CODE
LOWrun_page/gen_svg.py24CODE
LOWrun_page/garmin_device_adaptor.py100CODE
LOWrun_page/tui/braille.py51CODE
LOWrun_page/tui/app.py917CODE
LOWrun_page/tui/data.py517CODE
LOWrun_page/generator/db.py84CODE
LOWrun_page/generator/__init__.py130CODE
LOWrun_page/gpxtrackposter/month_of_life_drawer.py47CODE
LOWrun_page/gpxtrackposter/track_loader.py117CODE
LOWrun_page/gpxtrackposter/year_summary_drawer.py245CODE
LOWrun_page/gpxtrackposter/year_summary_drawer.py336CODE
LOWrun_page/gpxtrackposter/utils.py43CODE
LOWrun_page/gpxtrackposter/utils.py79CODE
LOWrun_page/gpxtrackposter/github_drawer.py59CODE
Cross-Language Confusion4 hits · 28 pts
SeverityFileLineSnippetContext
HIGHrun_page/gpxtrackposter/circular_drawer.py151 path.push(CODE
HIGH⚡run_page/gpxtrackposter/circular_drawer.py243 path.push("l", (r2 - r1) * sin_a1, (r1 - r2) * cos_a1)CODE
HIGH⚡run_page/gpxtrackposter/circular_drawer.py244 path.push(f"a{r2},{r2} 0 0,0 {r2 * (sin_a2 - sin_a1)},{r2 * (cos_a1 - cos_a2)}")CODE
HIGH⚡run_page/gpxtrackposter/circular_drawer.py245 path.push("l", (r1 - r2) * sin_a2, (r2 - r1) * cos_a2)CODE
Cross-File Repetition3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHrun_page/tcx_sync.py0if you do not want bind any account only the gpx files in gpx_out syncSTRING
HIGHrun_page/gpx_sync.py0if you do not want bind any account only the gpx files in gpx_out syncSTRING
HIGHrun_page/fit_sync.py0if you do not want bind any account only the gpx files in gpx_out syncSTRING
AI Slop Vocabulary4 hits · 8 pts
SeverityFileLineSnippetContext
LOW⚡run_page/garmin_sync.py152 # just pass for nowCOMMENT
LOW⚡run_page/garmin_sync.py173 # just pass for nowCOMMENT
LOWrun_page/generator/__init__.py131 # if sub_type is not in the db, just add an empty string to itCOMMENT
LOW⚡run_page/gpxtrackposter/track.py227 # may be it's treadmill run, so we just use the start and end time of the extensionsCOMMENT
Redundant / Tautological Comments5 hits · 8 pts
SeverityFileLineSnippetContext
LOWrun_page/joyrun_sync.py363 # Increment timeCOMMENT
LOWrun_page/joyrun_sync.py504 # Increment timeCOMMENT
LOWrun_page/fix_location.py97 # Check if activity needs location fixCOMMENT
LOWrun_page/fix_location.py126 # Check if new location is more specific than "China"COMMENT
LOWrun_page/gpxtrackposter/year_summary_drawer.py376 # Check if this day exists in this monthCOMMENT
Over-Commented Block6 hits · 6 pts
SeverityFileLineSnippetContext
LOWconfig.yml1# Running Page 3.0 配置文件COMMENT
LOWtsconfig.json21 // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decoratorCOMMENT
LOWtsconfig.json41 // "types": [], /* Specify type package names to be included without being refeCOMMENT
LOWtsconfig.json61 // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only useCOMMENT
LOWtsconfig.json81 "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,COMMENT
LOWrun_page/oppo_sync.py561 # bpm = ET.Element("AverageHeartRateBpm")COMMENT
Self-Referential Comments1 hit · 4 pts
SeverityFileLineSnippetContext
MEDIUM⚡run_page/keep_to_strava_sync.py112 # This file is used to record which logs have been uploaded to stravaCOMMENT
Fake / Example Data4 hits · 4 pts
SeverityFileLineSnippetContext
LOWREADME.md1107 --athlete NAME Athlete name to display (default: "John Doe").CODE
LOWREADME-CN.md1231 --athlete NAME Athlete name to display (default: "John Doe").CODE
LOWrun_page/gen_svg.py73 default="John Doe",CODE
LOWrun_page/gen_svg.py74 help='Athlete name to display (default: "John Doe").',CODE
Modern Structural Boilerplate4 hits · 4 pts
SeverityFileLineSnippetContext
LOWrun_page/strava_web_sync.py32logger = logging.getLogger(__name__)CODE
LOWrun_page/garmin_sync.py30logger = logging.getLogger(__name__)CODE
LOWrun_page/tui/app.py478 def _set_selected_year(self, year: str) -> None:CODE
LOWrun_page/tui/app.py535 def set_summary(self, text: str) -> None:CODE
Verbosity Indicators2 hits · 3 pts
SeverityFileLineSnippetContext
LOWrun_page/garmin_sync_cn_global.py40 # Step 1:COMMENT
LOWrun_page/garmin_sync_cn_global.py90 # Step 2:COMMENT
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/run_data_sync.yml155 # for garmin if you want generate 'tcx' you can add --tcx command in the args.COMMENT
AI Structural Patterns2 hits · 2 pts
SeverityFileLineSnippetContext
LOWrun_page/codoon_sync.py546CODE
LOWrun_page/joyrun_sync.py540CODE
Unused Imports2 hits · 2 pts
SeverityFileLineSnippetContext
LOWrun_page/tui/app.py3CODE
LOWrun_page/tui/data.py3CODE