Repository Analysis

thumbor/thumbor

thumbor is an open-source photo thumbnail service by globo.com

4.3 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of thumbor/thumbor, a Python project with 10,510 GitHub stars. SynthScan v2.0 examined 170,924 lines of code across 279 source files, recording 626 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 4.3 places this repository in the Likely human-written band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

4.3
Adjusted Score
4.3
Raw Score
100%
Time Factor
2026-08-07
Last Push
10.5K
Stars
Python
Language
170.9K
Lines of Code
279
Files
626
Pattern Hits
2026-08-09
Scan Date
0.01
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

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

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 3HIGH 0MEDIUM 4LOW 619

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 626 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers543 hits · 618 pts
SeverityFileLineSnippetContext
LOWintegration_tests/pil_test.py28 # def test_combined_params__with_pil(self):COMMENT
LOWtests/test_point.py17 def test_default_alignment_percentages(self):CODE
LOWtests/test_point.py26 def test_new_point_default_weight(self):CODE
LOWtests/test_point.py59 def test_new_point_square_point(self):CODE
LOWtests/test_point.py65 def test_aligned_point_center_middle(self):CODE
LOWtests/test_point.py71 def test_aligned_point_top_left(self):CODE
LOWtests/test_point.py77 def test_aligned_point_bottom_right(self):CODE
LOWtests/test_utils.py34 def test_can_get_content_type():CODE
LOWtests/test_utils.py95 def test_logger_should_be_instance_of_python_logger():CODE
LOWtests/test_utils.py99 def test_logger_should_not_be_null():CODE
LOWtests/test_utils.py103 def test_logger_should_not_be_an_error():CODE
LOWtests/test_utils.py107def test_get_color_space_handles_invalid_icc():CODE
LOWtests/test_utils.py115def test_get_color_space_handles_null_xcolor_space(image_cms_profile_mock):CODE
LOWtests/test_utils.py123def test_get_color_space_missing_imagecms_returns_none():CODE
LOWtests/test_utils.py129def test_ensure_srgb_handles_invalid_icc():CODE
LOWtests/test_utils.py136def test_ensure_srgb_missing_imagecms_runtimeerror():CODE
LOWtests/test_utils.py143def test_ensure_srgb_keeps_existing_srgb_profile():CODE
LOWtests/test_utils.py152def test_ensure_srgb_returns_none_for_unsupported_color_space(color_space):CODE
LOWtests/test_utils.py160def test_ensure_srgb_returns_none_for_animated_cmyk():CODE
LOWtests/test_console.py18 def test_can_get_default_server_parameters(self):CODE
LOWtests/test_console.py29 def test_can_get_custom_server_parameters(self):CODE
LOWtests/test_url_composer.py47 def test_fails_when_no_config_or_key(self, load_mock, mock_stdout):CODE
LOWtests/test_url_composer.py76 def test_get_thumbor_params_with_crop(self):CODE
LOWtests/test_url_composer.py96 def test_get_thumbor_params_full_adaptive_fitin_false(self):CODE
LOWtests/test_url_composer.py118 def test_get_thumbor_params_full_adaptive_fitin(self):CODE
LOWtests/test_url_composer.py137 def test_get_thumbor_params_adaptive_fitin(self):CODE
LOWtests/test_url_composer.py156 def test_get_thumbor_params_full_fitin(self):CODE
LOWtests/test_url_composer.py175 def test_get_thumbor_params_fitin(self):CODE
LOWtests/test_url_composer.py214 def test_get_options_from_sys(self):CODE
LOWtests/test_url_composer.py235 def test_get_options_fails_when_no_url(self):CODE
LOWtests/test_signal_handler.py18 def test_setup_signal_handler_sets_handler(self, signal_mock):CODE
LOWtests/test_signal_handler.py31 def test_signal_handler_calls_add_callback_from_signal(self, ioloop_mock):CODE
LOWtests/test_doctor.py26def test_get_doctor_output_no_config(capsys, doctor_output_no_config):CODE
LOWtests/test_importer.py40 def test_import_item_should_be_proper_item(self):CODE
LOWtests/test_importer.py69 def test_single_item_should_equal_file_storage():CODE
LOWtests/test_importer.py79 def test_multiple_items_can_be_imported():CODE
LOWtests/test_threadpool.py22async def test_can_get_threadpool_instance():CODE
LOWtests/test_threadpool.py37async def test_can_run_task_in_foreground():CODE
LOWtests/test_threadpool.py49async def test_can_run_task_in_foreground_and_exception_happens():CODE
LOWtests/test_threadpool.py62async def test_queueing_task_when_no_pool_runs_sync():CODE
LOWtests/test_threadpool.py74async def test_queueing_task_when_no_pool_runs_sync_and_exception_happens():CODE
LOWtests/test_threadpool.py100async def test_can_run_async_with_queue():CODE
LOWtests/test_server.py33 def test_can_get_value_as_integer(self):CODE
LOWtests/test_server.py39 def test_can_get_config_from_path(self):CODE
LOWtests/test_server.py47 def test_can_get_config_with_env_enabled(self):CODE
LOWtests/test_server.py58 def test_can_configure_log_from_config(self, basic_config_mock):CODE
LOWtests/test_server.py71 def test_can_configure_log_from_dict_config(self, dict_config_mock):CODE
LOWtests/test_server.py81 def test_can_import_default_modules(self):CODE
LOWtests/test_server.py88 def test_can_import_with_custom_error_handler_class(self):CODE
LOWtests/test_server.py101 def test_validate_config_security_key(self):CODE
LOWtests/test_server.py112 def test_validate_config_security_key_from_config(self):CODE
LOWtests/test_server.py120 def test_validate_config_warns_about_legacy_allowed_sources(CODE
LOWtests/test_server.py134 def test_validate_gifsicle_path(self, which_mock):CODE
LOWtests/test_server.py144 def test_validate_null_gifsicle_path(self, which_mock):CODE
LOWtests/test_server.py180 def test_can_run_server_with_default_params(self, server_mock):CODE
LOWtests/test_server.py196 def test_can_run_server_with_multiple_processes(self, server_mock):CODE
LOWtests/test_server.py212 def test_can_run_server_with_fd(self, socket_mock, server_mock):CODE
LOWtests/test_server.py229 def test_can_run_server_with_fd_non_blocking(CODE
LOWtests/test_server.py253 def test_can_run_server_with_unix_socket(CODE
LOWtests/test_server.py274 def test_run_server_returns_server(self, server_mock):CODE
483 more matches not shown…
Hallucination Indicators3 hits · 30 pts
SeverityFileLineSnippetContext
CRITICALthumbor/transformer.py171 self.context.modules.importer.error_handler.handle_error(CODE
CRITICALthumbor/handlers/__init__.py684 self.context.modules.importer.error_handler.handle_error(CODE
CRITICALthumbor/handlers/__init__.py1060 self.context.modules.importer.error_handler.handle_error(CODE
Excessive Try-Catch Wrapping20 hits · 20 pts
SeverityFileLineSnippetContext
LOWintegration_tests/urls_helpers.py147 except Exception as err: # pylint: disable=broad-exceptCODE
LOWtests/filters/test_convolution.py66 except Exception as exc: # pylint: disable=broad-exceptCODE
LOWthumbor/url_composer.py232 except Exception: # pylint: disable=broad-exceptCODE
LOWthumbor/utils.py34 except Exception:CODE
MEDIUMthumbor/utils.py31def _get_flag(flags, name):CODE
LOWthumbor/transformer.py165 except Exception: # pylint: disable=broad-exceptCODE
LOWthumbor/filters/watermark.py213 except Exception as error:CODE
LOWthumbor/filters/__init__.py233 except Exception:CODE
LOWthumbor/engines/gif.py157 except Exception:CODE
LOWthumbor/engines/__init__.py203 except Exception as error: # pylint: disable=broad-exceptSTRING
LOWthumbor/engines/__init__.py275 except Exception as error:STRING
LOWthumbor/engines/__init__.py332 except Exception as error:STRING
LOWthumbor/engines/pil.py144 except Exception:CODE
MEDIUMthumbor/engines/pil.py103def create_image(self, buffer):CODE
LOWthumbor/detectors/feature_detector/__init__.py33 except Exception as error:CODE
LOWthumbor/handlers/__init__.py146 except Exception as error:CODE
LOWthumbor/handlers/__init__.py253 except Exception as error:CODE
LOWthumbor/handlers/__init__.py283 except Exception as error:CODE
LOWthumbor/handlers/__init__.py679 except Exception as error: # pylint: disable=broad-exceptCODE
LOWthumbor/handlers/__init__.py999 except Exception as error:CODE
Redundant / Tautological Comments9 hits · 16 pts
SeverityFileLineSnippetContext
LOWthumbor/handlers/image_resource.py22 # Check if image existsCOMMENT
LOWthumbor/handlers/image_resource.py50 # Check if image overwriting is allowedCOMMENT
LOWthumbor/handlers/image_resource.py55 # Check if the image uploaded is validCOMMENT
LOWthumbor/handlers/image_resource.py62 # Check if image deleting is allowedCOMMENT
LOWthumbor/handlers/image_resource.py67 # Check if image existsCOMMENT
LOWthumbor/handlers/upload.py25 # Check if the image uploaded is a multipart/form-dataCOMMENT
LOWthumbor/handlers/upload.py38 # Check if the image uploaded is validCOMMENT
LOWthumbor/handlers/__init__.py1081 # Check if image is validCOMMENT
LOWthumbor/handlers/imaging.py34 # Check if an image with an uuid exists in storageCOMMENT
Over-Commented Block14 hits · 14 pts
SeverityFileLineSnippetContext
LOWdocs/conf.py1# -*- coding: utf-8 -*-COMMENT
LOWdocs/conf.py61COMMENT
LOWdocs/conf.py81# non-false value, then it is used:COMMENT
LOWdocs/conf.py101# If true, sectionauthor and moduleauthor directives will be shown in theCOMMENT
LOWdocs/conf.py121COMMENT
LOWdocs/conf.py141# The name of an image file (within the static path) to use as favicon of theCOMMENT
LOWdocs/conf.py161# typographically correct entities.COMMENT
LOWdocs/conf.py181# html_show_sourcelink = TrueCOMMENT
LOWdocs/conf.py221 "manual",COMMENT
LOWdocs/conf.py281# How to display URL addresses: 'footnote', 'no', or 'inline'.COMMENT
LOWthumbor/url.py1# -*- coding: utf-8 -*-COMMENT
LOWthumbor/lib/__init__.py1# -*- coding: utf-8 -*-COMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql-analysis.yml41 uses: actions/checkout@v7COMMENT
Deep Nesting14 hits · 14 pts
SeverityFileLineSnippetContext
LOWthumbor/importer.py148CODE
LOWthumbor/url_composer.py169CODE
LOWthumbor/transformer.py114CODE
LOWthumbor/filters/watermark.py57CODE
LOWthumbor/filters/redeye.py35CODE
LOWthumbor/engines/__init__.py107CODE
LOWthumbor/engines/__init__.py292CODE
LOWthumbor/engines/pil.py245CODE
LOWthumbor/loaders/http_loader.py82CODE
LOWthumbor/loaders/http_loader.py137CODE
LOWthumbor/handlers/__init__.py307CODE
LOWthumbor/handlers/__init__.py496CODE
LOWthumbor/handlers/__init__.py573CODE
LOWthumbor/handlers/__init__.py614CODE
Unused Imports8 hits · 8 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py7CODE
LOWthumbor/url.py10CODE
LOWthumbor/doctor.py184CODE
LOWthumbor/doctor.py185CODE
LOWthumbor/compatibility/__init__.py10CODE
LOWthumbor/url_signers/__init__.py14CODE
LOWthumbor/detectors/__init__.py13CODE
LOWthumbor/detectors/__init__.py14CODE
AI Structural Patterns8 hits · 8 pts
SeverityFileLineSnippetContext
LOWtests/loaders/test_file_loader_http_fallback.py34CODE
LOWtests/loaders/test_file_loader_http_fallback.py45CODE
LOWthumbor/context.py228CODE
LOWthumbor/storages/mixed_storage.py77CODE
LOWthumbor/storages/mixed_storage.py82CODE
LOWthumbor/storages/mixed_storage.py87CODE
LOWthumbor/storages/mixed_storage.py92CODE
LOWthumbor/result_storages/file_storage.py109CODE
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMtests/compatibility/legacy_file_result_storage.py10# This file is copied from legacy way of using thumbor result storages,COMMENT
MEDIUMdocs/conf.py6# This file is execfile()d with the current directory set to itsCOMMENT
Slop Phrases4 hits · 4 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py172Don't forget to copy this log and add it to the description.CODE
LOWthumbor/doctor.py466 print_info("Don't forget to copy this log and add it to the description.")STRING
LOW.github/ISSUE_TEMPLATE/bug_report.yml12 ⚠️ Don't forget to **replace your `SECURITY_KEY`** in the config with aCODE
LOW.github/ISSUE_TEMPLATE/bug_report.yml61 Paste your `thumbor.conf` contents here. **Make sure to replace yourCODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWthumbor/engines/pil.py296 # Can't simply set options['progressive'] to the valueCOMMENT