Repository Analysis

datalab-to/marker

Convert PDF to markdown + JSON quickly with high accuracy

4.3 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of datalab-to/marker, a Python project with 37,464 GitHub stars. SynthScan v2.0 examined 60,493 lines of code across 233 source files, recording 234 pattern matches distributed across 10 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-07-07
Last Push
37.5K
Stars
Python
Language
60.5K
Lines of Code
233
Files
234
Pattern Hits
2026-07-14
Scan Date
0.00
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

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

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 0HIGH 1MEDIUM 20LOW 213

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 234 distinct pattern matches across 10 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.

Excessive Try-Catch Wrapping62 hits · 68 pts
SeverityFileLineSnippetContext
LOWexamples/marker_modal_deployment.py92 except Exception as e:CODE
LOWexamples/marker_modal_deployment.py117 except Exception as e:CODE
LOWexamples/marker_modal_deployment.py286 except Exception as e:CODE
LOWexamples/marker_modal_deployment.py343 except Exception as e:CODE
MEDIUMexamples/marker_modal_deployment.py344 print(f"Error getting web URL: {e}")CODE
LOWexamples/marker_modal_deployment.py363 except Exception as e:CODE
MEDIUMexamples/marker_modal_deployment.py394 print(f"Error: {response.text}")CODE
LOWexamples/marker_modal_deployment.py396 except Exception as e:CODE
LOWbenchmarks/table/inference.py156 except Exception as e:CODE
LOWbenchmarks/overall/elo.py119 except Exception as e:STRING
MEDIUMbenchmarks/overall/elo.py120 print(f"Error: {e}")STRING
LOWbenchmarks/overall/elo.py159 except Exception as e:STRING
MEDIUMbenchmarks/overall/elo.py160 print(f"Error: {e}")STRING
LOWbenchmarks/overall/overall.py60 except Exception as e:CODE
LOWbenchmarks/overall/overall.py72 except Exception as e:CODE
LOWbenchmarks/overall/methods/olmocr.py66 except Exception:CODE
LOWbenchmarks/overall/methods/olmocr.py69 except Exception:CODE
LOWbenchmarks/overall/scorers/clean.py87 except Exception as e:CODE
MEDIUMbenchmarks/overall/scorers/clean.py78def standardize_math(self, match):CODE
MEDIUMbenchmarks/overall/download/base.py48 print(f"Error with sample {idx}: {e}")CODE
LOWbenchmarks/overall/download/base.py50 except Exception as e:CODE
MEDIUMbenchmarks/overall/download/base.py51 print(f"Error with sample {idx}: {e}")CODE
LOWbenchmarks/overall/display/dataset.py34 except Exception as e:CODE
LOWmarker/builders/ocr.py369 except Exception:CODE
LOWmarker/config/parser.py148 except Exception as e:CODE
LOWmarker/config/parser.py159 except Exception as e:CODE
LOWmarker/providers/spreadsheet.py40 except Exception as e:STRING
LOWmarker/providers/registry.py79 except Exception:CODE
LOWmarker/providers/html.py16 except Exception as e:CODE
LOWmarker/providers/pdf.py449 except Exception:CODE
LOWmarker/providers/powerpoint.py53 except Exception as e:STRING
LOWmarker/providers/powerpoint.py223 except Exception as e:STRING
LOWmarker/providers/document.py61 except Exception as e:STRING
LOWmarker/providers/document.py100 except Exception as e:STRING
MEDIUMmarker/providers/document.py89def convert_image(match):CODE
LOWmarker/providers/epub.py56 except Exception as e:STRING
LOWmarker/utils/gpu.py122 except Exception as e:CODE
MEDIUMmarker/utils/gpu.py98def stop_mps_server(self) -> None:CODE
LOWmarker/processors/block_relabel.py55 except Exception as e:CODE
LOWmarker/processors/llm/llm_meta.py60 except Exception as e:CODE
LOWmarker/processors/llm/__init__.py127 except Exception as e:CODE
LOWmarker/processors/llm/__init__.py143 except Exception as e:CODE
LOWmarker/processors/llm/__init__.py189 except Exception as e:CODE
LOWmarker/processors/llm/llm_page_correction.py196 except Exception as e:STRING
LOWmarker/processors/llm/llm_page_correction.py217 except Exception as e:STRING
LOWmarker/processors/llm/llm_page_correction.py264 except Exception as e:STRING
LOWmarker/scripts/server.py106 except Exception as e:CODE
LOWmarker/scripts/convert.py56 except Exception:CODE
LOWmarker/scripts/convert.py96 except Exception as e:CODE
LOWmarker/scripts/extraction_app.py166 except Exception as e:CODE
LOWmarker/scripts/extraction_app.py228 except Exception as e:CODE
LOWmarker/scripts/file_to_s3.py38 except Exception as e:CODE
MEDIUMmarker/scripts/file_to_s3.py39 print(f"Error uploading {filepath}: {str(e)}")CODE
LOWmarker/scripts/common.py156 except Exception as e:CODE
MEDIUMmarker/scripts/common.py157 print(f"Error parsing schema: {e}")CODE
LOWmarker/services/claude.py52 except Exception:CODE
LOWmarker/services/claude.py58 except Exception:CODE
LOWmarker/services/claude.py130 except Exception as e:STRING
LOWmarker/services/gemini.py126 except Exception as e:CODE
LOWmarker/services/openai.py123 except Exception as e:CODE
2 more matches not shown…
Unused Imports59 hits · 58 pts
SeverityFileLineSnippetContext
LOWbenchmarks/table/inference.py14CODE
LOWbenchmarks/table/inference.py15CODE
LOWbenchmarks/table/table.py6CODE
LOWbenchmarks/overall/elo.py3CODE
LOWbenchmarks/overall/elo.py5CODE
LOWbenchmarks/overall/elo.py6CODE
LOWbenchmarks/overall/elo.py6CODE
LOWbenchmarks/overall/elo.py6CODE
LOWbenchmarks/overall/elo.py18CODE
LOWbenchmarks/overall/methods/__init__.py2CODE
LOWbenchmarks/overall/methods/__init__.py4CODE
LOWbenchmarks/overall/methods/olmocr.py7CODE
LOWbenchmarks/overall/scorers/llm.py13CODE
LOWbenchmarks/overall/scorers/schema.py1CODE
LOWbenchmarks/overall/display/table.py2CODE
LOWmarker/builders/line.py6CODE
LOWmarker/schema/polygon.py1CODE
LOWmarker/schema/polygon.py5CODE
LOWmarker/schema/document.py1CODE
LOWmarker/schema/blocks/__init__.py1CODE
LOWmarker/schema/blocks/__init__.py3CODE
LOWmarker/schema/blocks/__init__.py3CODE
LOWmarker/schema/blocks/__init__.py3CODE
LOWmarker/schema/blocks/__init__.py4CODE
LOWmarker/schema/blocks/__init__.py5CODE
LOWmarker/schema/blocks/__init__.py6CODE
LOWmarker/schema/blocks/__init__.py7CODE
LOWmarker/schema/blocks/__init__.py8CODE
LOWmarker/schema/blocks/__init__.py9CODE
LOWmarker/schema/blocks/__init__.py10CODE
LOWmarker/schema/blocks/__init__.py11CODE
LOWmarker/schema/blocks/__init__.py12CODE
LOWmarker/schema/blocks/__init__.py13CODE
LOWmarker/schema/blocks/__init__.py14CODE
LOWmarker/schema/blocks/__init__.py15CODE
LOWmarker/schema/blocks/__init__.py16CODE
LOWmarker/schema/blocks/__init__.py17CODE
LOWmarker/schema/blocks/__init__.py18CODE
LOWmarker/schema/blocks/__init__.py19CODE
LOWmarker/schema/blocks/__init__.py20CODE
LOWmarker/schema/blocks/__init__.py21CODE
LOWmarker/schema/blocks/__init__.py22CODE
LOWmarker/schema/blocks/form.py1CODE
LOWmarker/schema/blocks/base.py1CODE
LOWmarker/schema/groups/__init__.py1CODE
LOWmarker/schema/groups/__init__.py2CODE
LOWmarker/schema/groups/__init__.py3CODE
LOWmarker/schema/groups/__init__.py4CODE
LOWmarker/schema/groups/__init__.py5CODE
LOWmarker/schema/groups/__init__.py6CODE
LOWmarker/schema/text/__init__.py1CODE
LOWmarker/schema/text/__init__.py2CODE
LOWmarker/processors/util.py1CODE
LOWmarker/processors/order.py1CODE
LOWmarker/scripts/file_to_s3.py1CODE
LOWmarker/scripts/file_to_s3.py2CODE
LOWmarker/scripts/file_to_s3.py3CODE
LOWmarker/scripts/file_to_s3.py7CODE
LOWmarker/scripts/chunk_convert.py4CODE
Deep Nesting49 hits · 49 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py130CODE
LOWbenchmarks/table/inference.py45CODE
LOWbenchmarks/overall/elo.py180CODE
LOWbenchmarks/overall/overall.py24CODE
LOWbenchmarks/overall/scorers/heuristic.py50CODE
LOWbenchmarks/overall/display/dataset.py11CODE
LOWbenchmarks/overall/display/table.py17CODE
LOWmarker/output.py55CODE
LOWmarker/renderers/ocr_json.py55CODE
LOWmarker/renderers/html.py50CODE
LOWmarker/renderers/html.py81CODE
LOWmarker/renderers/markdown.py29CODE
LOWmarker/renderers/markdown.py120CODE
LOWmarker/builders/layout.py94CODE
LOWmarker/builders/ocr.py165CODE
LOWmarker/builders/ocr.py252CODE
LOWmarker/config/printer.py9CODE
LOWmarker/config/crawler.py34CODE
LOWmarker/config/crawler.py99CODE
LOWmarker/providers/spreadsheet.py81CODE
LOWmarker/providers/pdf.py127CODE
LOWmarker/providers/pdf.py202CODE
LOWmarker/providers/powerpoint.py64CODE
LOWmarker/providers/powerpoint.py140CODE
LOWmarker/converters/__init__.py24CODE
LOWmarker/converters/pdf.py154CODE
LOWmarker/schema/polygon.py78CODE
LOWmarker/schema/polygon.py117CODE
LOWmarker/schema/polygon.py193CODE
LOWmarker/schema/groups/page.py262CODE
LOWmarker/schema/text/line.py60CODE
LOWmarker/schema/text/span.py82CODE
LOWmarker/processors/list.py57CODE
LOWmarker/processors/ignoretext.py44CODE
LOWmarker/processors/order.py15CODE
LOWmarker/processors/debug.py62CODE
LOWmarker/processors/blockquote.py35CODE
LOWmarker/processors/table.py85CODE
LOWmarker/processors/table.py234CODE
LOWmarker/processors/table.py312CODE
LOWmarker/processors/table.py457CODE
LOWmarker/processors/table.py604CODE
LOWmarker/processors/line_numbers.py40CODE
LOWmarker/processors/line_numbers.py76CODE
LOWmarker/processors/sectionheader.py38CODE
LOWmarker/processors/llm/llm_table_merge.py156CODE
LOWmarker/processors/llm/llm_table.py249CODE
LOWmarker/scripts/common.py96CODE
LOWmarker/services/gemini.py43CODE
Hyper-Verbose Identifiers37 hits · 38 pts
SeverityFileLineSnippetContext
LOWtests/renderers/test_html_renderer.py14def test_html_renderer_block_ids(pdf_document, config):CODE
LOWtests/renderers/test_markdown_renderer.py18def test_markdown_renderer_auto_ocr(pdf_document):CODE
LOWtests/renderers/test_markdown_renderer.py27def test_markdown_renderer_pagination(pdf_document):CODE
LOWtests/renderers/test_markdown_renderer.py36def test_markdown_renderer_pagination_blank_last_page(pdf_document):CODE
LOWtests/renderers/test_markdown_renderer.py52def test_markdown_renderer_metadata(pdf_document):CODE
LOWtests/renderers/test_markdown_renderer.py59def test_markdown_renderer_images(pdf_document):CODE
LOWtests/renderers/test_markdown_renderer.py68def test_markdown_renderer_tables(pdf_document):CODE
LOWtests/renderers/test_json_renderer.py7def test_markdown_renderer_pagination(pdf_document):CODE
LOWtests/renderers/test_extract_images.py8def test_disable_extract_images(pdf_document):CODE
LOWtests/builders/test_ocr_pipeline.py44def test_ocr_with_inline_pipeline(pdf_document):CODE
LOWtests/builders/test_document_builder.py28def test_document_builder_inline_eq(pdf_document):CODE
LOWtests/providers/test_image_provider.py13def test_image_provider_conversion(pdf_converter, temp_image):CODE
LOWtests/converters/test_extraction_converter.py52def test_extraction_converter(config, model_dict, mock_llm_service, temp_doc):CODE
LOWtests/converters/test_extraction_converter.py66def test_extraction_converter_multiple_pages(extraction_converter, temp_doc):CODE
LOWtests/processors/test_llm_processors.py19def test_llm_form_processor_no_config(pdf_document, llm_service):CODE
LOWtests/processors/test_llm_processors.py30def test_llm_form_processor_no_cells(pdf_document, llm_service):CODE
LOWtests/processors/test_llm_processors.py107def test_llm_caption_processor_disabled(pdf_document):STRING
LOWtests/processors/test_llm_processors.py119def test_llm_caption_processor(pdf_document):STRING
LOWtests/processors/test_llm_processors.py141def test_llm_complex_region_processor(pdf_document):STRING
LOWtests/processors/test_llm_processors.py167def test_multi_llm_processors(pdf_document):STRING
LOWtests/processors/test_table_merge.py11def test_llm_table_processor_nomerge(pdf_document, table_rec_model, recognition_model, detection_model, mocker):CODE
LOWtests/processors/test_document_toc_processor.py7def test_document_toc_processor(pdf_document, detection_model, recognition_model, table_rec_model):CODE
LOWtests/processors/test_ignoretext.py10def test_ignoretext_processor(pdf_document):CODE
LOWexamples/marker_modal_deployment.py33def setup_models_with_cache_check(logger, commit_volume=False):CODE
LOWmarker/renderers/__init__.py117 def generate_document_metadata(self, document: Document, document_output):CODE
LOWmarker/renderers/chunk.py36def assemble_html_with_images(block: JSONBlockOutput, image_blocks: set[str]) -> str:CODE
LOWmarker/renderers/json.py29def reformat_section_hierarchy(section_hierarchy):CODE
LOWmarker/builders/ocr.py96 def get_recognition_batch_size(self):CODE
LOWmarker/builders/ocr.py105 def select_ocr_blocks_by_mode(CODE
LOWmarker/builders/ocr.py120 def get_ocr_images_polygons_ids(CODE
LOWmarker/config/crawler.py64 def _gather_super_annotations(cls: Type) -> Dict[str, Type]:CODE
LOWmarker/utils/batch.py4def get_batch_sizes_worker_counts(gpu_manager: GPUManager, peak_worker_vram: int):CODE
LOWmarker/schema/groups/page.py139 def compute_line_block_intersections(CODE
LOWmarker/schema/groups/page.py163 def compute_max_structure_block_intersection_pct(self):CODE
LOWmarker/processors/table.py705 def get_recognition_batch_size(self):CODE
LOWmarker/processors/line_numbers.py61 def ignore_line_number_blocks(self, document: Document):CODE
LOWmarker/scripts/common.py96def extract_root_pydantic_class(schema_code: str) -> Optional[str]:CODE
Redundant / Tautological Comments14 hits · 17 pts
SeverityFileLineSnippetContext
LOWexamples/marker_modal_deployment.py41 # Check if models exist in cacheCOMMENT
LOWexamples/marker_modal_deployment.py207 # Read file contentCOMMENT
LOWmarker/providers/spreadsheet.py95 # Check if this cell is the start of a merged rangeSTRING
LOWmarker/providers/registry.py76 # Check if there are any HTML tagsCOMMENT
LOWmarker/schema/groups/page.py60 # Check if RGB, convert if neededCOMMENT
LOWmarker/processors/footnote.py25 # Check if it is top-levelCOMMENT
LOWmarker/processors/llm/llm_mathblock.py126 # Check if the ratio of math blocks to additional blocks is high enoughSTRING
LOWmarker/processors/llm/llm_table_merge.py297 # Check if the number of rows is the sameSTRING
LOWmarker/processors/llm/llm_table_merge.py302 # Check if the number of columns is the sameSTRING
LOWmarker/scripts/chunk_convert.sh5# Check if NUM_DEVICES is setCOMMENT
LOWmarker/scripts/extraction_app.py83 # Check if this is a new fileSTRING
LOWmarker/scripts/extraction_app.py196# Check if schema is provided before runningCOMMENT
LOWmarker/scripts/common.py107 # Check if this class inherits from BaseModelCOMMENT
LOWmarker/scripts/common.py129 # Check if this field references another classCOMMENT
Self-Referential Comments6 hits · 16 pts
SeverityFileLineSnippetContext
MEDIUMexamples/marker_modal_deployment.py9# Define the Modal appCOMMENT
MEDIUMexamples/marker_modal_deployment.py14# Define the container image with all dependenciesCOMMENT
MEDIUMexamples/marker_modal_deployment.py30# Create a persistent volume for model cachingCOMMENT
MEDIUMmarker/builders/structure.py68 # Create a merged blockCOMMENT
MEDIUMmarker/scripts/extraction_app.py80 # Create a unique identifier for the current fileSTRING
MEDIUMmarker/scripts/extraction_app.py109 # Initialize schema variableSTRING
AI Response Leakage1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHdata/examples/markdown/thinkpython/thinkpython.md8598Figure [C.7](#page-237-1) shows the result. Each class is represented with a box that contains the name of the class, anCODE
AI Slop Vocabulary2 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUMdata/examples/json/multicolcnn.json1164 "html": "<p block-type=\"Text\">We propose the use of dilated convolutions as an attractive alternative to theCODE
MEDIUMdata/examples/json/multicolcnn.json1865 "html": "<p block-type=\"Text\">Furthermore, we performed a set of experiments in which we varied the number oCODE
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMexamples/marker_modal_deployment.py304# that you can use to test your deployment. It'll store theCOMMENT
Over-Commented Block3 hits · 3 pts
SeverityFileLineSnippetContext
LOW…/examples/markdown/switch_transformers/switch_trans.md561import mesh tensorflow as mtfCOMMENT
LOW…/examples/markdown/switch_transformers/switch_trans.md661# d model = model hidden size (scalar).COMMENT
LOW…/examples/markdown/switch_transformers/switch_trans.md681# probability.COMMENT