A community-supported supercharged document management system: scan, index and archive all your documents
This report presents the forensic synthetic code analysis of paperless-ngx/paperless-ngx, a Python project with 43,007 GitHub stars. SynthScan v2.0 examined 240,998 lines of code across 1003 source files, recording 2499 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 12.9 places this repository in the Low AI signal 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).
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.
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.
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.
The scanner identified 2499 distinct pattern matches across 20 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src-ui/src/app/utils/query-params.ts | 60 | export function transformLegacyFilterRules( | CODE |
| LOW | src-ui/src/app/utils/query-params.ts | 103 | export function filterRulesFromQueryParams( | CODE |
| LOW | src-ui/src/app/utils/query-params.ts | 151 | export function queryParamsFromFilterRules(filterRules: FilterRule[]): Params { | CODE |
| LOW | src-ui/src/app/utils/http.ts | 1 | export function getFilenameFromContentDisposition(header: string): string { | CODE |
| LOW | src-ui/src/app/utils/color.ts | 122 | export function estimateBrightnessForColor(colorHex: string) { | CODE |
| LOW | src/paperless_ai/embedding.py | 105 | def get_configured_model_name(config: AIConfig) -> str: | CODE |
| LOW | src/paperless_ai/embedding.py | 118 | def _normalize_llm_index_text(text: str) -> str: | CODE |
| LOW | src/paperless_ai/vector_store.py | 595 | def _run_structural_migration(self, migration: Migration) -> None: | CODE |
| LOW⚡ | src/paperless_ai/matching.py | 27 | def match_correspondents_by_name(names: list[str], user: User) -> list[Correspondent]: | CODE |
| LOW⚡ | src/paperless_ai/matching.py | 36 | def match_document_types_by_name(names: list[str], user: User) -> list[DocumentType]: | CODE |
| LOW⚡ | src/paperless_ai/matching.py | 45 | def match_storage_paths_by_name(names: list[str], user: User) -> list[StoragePath]: | CODE |
| LOW | src/paperless_ai/chat.py | 36 | def _build_document_reference( | CODE |
| LOW⚡ | src/paperless_ai/chat.py | 75 | def _format_chat_metadata_trailer(references: list[dict[str, int | str]]) -> str: | CODE |
| LOW⚡ | src/paperless_ai/chat.py | 82 | def stream_chat_with_documents(query_str: str, documents: list[Document]): | CODE |
| LOW⚡ | src/paperless_ai/chat.py | 90 | def _stream_chat_with_documents(query_str: str, documents: list[Document]): | CODE |
| LOW | src/paperless_ai/indexing.py | 35 | def queue_llm_index_update_if_needed(*, rebuild: bool, reason: str) -> bool: | CODE |
| LOW | src/paperless_ai/indexing.py | 382 | def llm_index_add_or_update_document(document: Document): | CODE |
| LOW | src/paperless_ai/indexing.py | 409 | def llm_index_remove_document(document: Document): | CODE |
| LOW | src/paperless_ai/ai_classifier.py | 75 | def build_localization_prompt(suggestions: dict, output_language: str) -> str: | STRING |
| LOW | src/paperless_ai/ai_classifier.py | 136 | def get_ai_document_classification( | STRING |
| LOW | src/paperless_ai/tests/test_lazy_imports.py | 9 | def test_importing_tasks_does_not_load_ai_libraries(self) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 61 | def test_get_embedding_model_openai(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 82 | def test_get_embedding_model_openai_prefers_embedding_endpoint(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 104 | def test_get_embedding_model_openai_blocks_internal_endpoint_when_disallowed( | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 117 | def test_get_embedding_model_huggingface(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 134 | def test_get_embedding_model_ollama(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 151 | def test_get_embedding_model_ollama_prefers_embedding_endpoint(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 169 | def test_get_embedding_model_ollama_blocks_internal_endpoint_when_disallowed( | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 181 | def test_get_embedding_model_invalid_backend(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 199 | def test_get_configured_model_name_falls_back_to_backend_default( | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 211 | def test_get_configured_model_name_explicit_overrides_default(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 221 | def test_build_llm_index_text(mock_document): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 246 | def test_build_llm_index_text_normalizes_ocr_punctuation_runs(mock_document): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 262 | def test_normalize_llm_index_text_collapses_ocr_leaders_without_joining_lines(): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 266 | def test_normalize_llm_index_text_collapses_non_breaking_spaces(): | CODE |
| LOW | src/paperless_ai/tests/test_chat.py | 63 | def test_stream_chat_with_one_document_retrieval( | CODE |
| LOW | src/paperless_ai/tests/test_chat.py | 121 | def test_stream_chat_with_multiple_documents_retrieval(patch_embed_nodes) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_chat.py | 180 | def test_stream_chat_empty_document_list() -> None: | CODE |
| LOW | src/paperless_ai/tests/test_chat.py | 187 | def test_stream_chat_no_matching_nodes() -> None: | CODE |
| LOW | src/paperless_ai/tests/test_chat.py | 207 | def test_stream_chat_unexpected_failure_returns_generic_error(caplog) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_chat.py | 240 | def test_no_nodes_yields_no_content_message( | CODE |
| LOW | src/paperless_ai/tests/test_chat.py | 250 | def test_chat_filter_contains_only_requested_document_ids( | CODE |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 124 | def test_get_rag_chunk_overlap_clamps_to_chunk_size() -> None: | CODE |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 130 | def test_get_rag_prompt_helper_uses_context_setting() -> None: | CODE |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 140 | def test_truncate_embedding_query_returns_single_chunk() -> None: | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 50 | def test_build_document_node_sets_ref_doc_id(real_document: Document) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 62 | def test_build_document_node_excludes_metadata_from_embedding( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 82 | def test_build_document_node_structured_fields_in_metadata( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 99 | def test_build_document_node_excludes_document_id_from_llm_context( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 111 | def test_build_document_node_uses_rag_chunk_settings(real_document: Document) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 175 | def test_update_llm_index_rebuilds_on_model_name_change( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 211 | def test_update_llm_index_partial_update( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 258 | def test_add_or_update_document_updates_existing_entry( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 273 | def test_query_after_remove_does_not_raise_key_error( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 293 | def test_update_llm_index_no_documents( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 312 | def test_update_no_documents_no_index_returns_early( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 328 | def test_queue_llm_index_update_if_needed_enqueues_when_idle_or_skips_recent() -> None: | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 363 | def test_query_similar_documents( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 411 | def test_query_similar_documents_truncates_query_to_embedding_chunk_size( | CODE |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 443 | def test_query_similar_documents_triggers_update_when_index_missing( | CODE |
| 1757 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/ci-release.yml | 191 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | .github/workflows/ci-release.yml | 193 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/paperless/celery.py | 13 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/paperless/celery.py | 19 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/mail.py | 448 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/mail.py | 450 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 93 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 95 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 135 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 137 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 163 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 165 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 189 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 191 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 284 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 286 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 319 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 321 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 97 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 99 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 109 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 111 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 136 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 138 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 143 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 145 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 78 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 80 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 156 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 158 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 90 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 92 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 137 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 139 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 164 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 166 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 205 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 207 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 278 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 280 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 313 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tika.py | 315 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tika.py | 394 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tika.py | 396 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 92 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 94 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 151 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 153 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 179 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 181 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 204 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 206 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 246 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 248 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 268 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 270 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 357 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 359 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/registry.py | 47 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/paperless/parsers/registry.py | 49 | # --------------------------------------------------------------------------- | COMMENT |
| 156 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src-ui/src/app/services/document-list-view.service.ts | 283 | if (!this.router.routerState.snapshot.url.includes('/view/')) { | CODE |
| CRITICAL | src-ui/src/app/services/document-list-view.service.ts | 348 | replaceUrl: !this.router.routerState.snapshot.url.includes('?'), // in case navigating from params-less /d | CODE |
| CRITICAL | src/paperless/validators.py | 4 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | src/paperless_mail/tests/test_mail.py | 1256 | self.mailMocker.bogus_mailbox.folder.list.assert_called_once() | CODE |
| CRITICAL | src/paperless_mail/tests/test_mail.py | 1289 | self.mailMocker.bogus_mailbox.folder.list.assert_called_once() | CODE |
| CRITICAL | src/documents/models.py | 9 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | src/documents/validators.py | 3 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | src/documents/serialisers.py | 19 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | src/documents/filters.py | 15 | from django.core.exceptions import FieldError | CODE |
| CRITICAL | src/documents/views.py | 328 | ) and self.request.user.ui_settings.settings.get("language"): | CODE |
| CRITICAL | src/documents/views.py | 329 | lang = self.request.user.ui_settings.settings.get("language") | CODE |
| CRITICAL | src/documents/tests/test_bulk_edit.py | 734 | mock_consume_file.return_value.set.return_value.apply_async.assert_called_once() | CODE |
| CRITICAL | src/documents/tests/test_api_document_versions.py | 11 | from django.core.exceptions import FieldError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/rootfs/usr/local/bin/wait-for-redis.py | 44 | except Exception as e: | CODE |
| LOW | docs/development.md | 544 | except Exception as e: | CODE |
| LOW | src/paperless_ai/client.py | 158 | except Exception as exc: | CODE |
| MEDIUM | src/paperless_ai/client.py | 153 | def _normalize_timeouts(self) -> Iterator[None]: | CODE |
| LOW⚡ | src/paperless_ai/chat.py | 85 | except Exception as e: | CODE |
| LOW | src/paperless/utils.py | 151 | except Exception: | CODE |
| LOW | src/paperless/utils.py | 160 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/mail.py | 494 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/mail.py | 528 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/mail.py | 601 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/mail.py | 729 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/mail.py | 827 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 219 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 232 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 363 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 406 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 429 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 547 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 560 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 645 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 648 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tika.py | 262 | except Exception as err: | CODE |
| LOW⚡ | src/paperless/parsers/tika.py | 386 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tika.py | 447 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/remote.py | 427 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/registry.py | 239 | except Exception: | CODE |
| LOW | src/paperless/parsers/utils.py | 63 | except Exception: | CODE |
| LOW | src/paperless/parsers/utils.py | 106 | except Exception: | CODE |
| LOW | src/paperless/parsers/utils.py | 181 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/utils.py | 221 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/utils.py | 253 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 231 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 294 | except Exception: | CODE |
| LOW | src/paperless_mail/mail.py | 473 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 597 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 603 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 639 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 663 | except Exception as err: | CODE |
| LOW | src/paperless_mail/mail.py | 707 | except Exception as e: | CODE |
| LOW | src/documents/classifier.py | 88 | except Exception as e: # pragma: no cover | CODE |
| LOW | src/documents/classifier.py | 171 | except Exception as err: | CODE |
| LOW | src/documents/tasks.py | 263 | except Exception as e: | CODE |
| LOW | src/documents/tasks.py | 451 | except Exception: | CODE |
| LOW | src/documents/tasks.py | 485 | except Exception as e: # pragma: no cover | CODE |
| LOW | src/documents/tasks.py | 781 | except Exception as exc: | CODE |
| LOW | src/documents/tasks.py | 819 | except Exception as exc: | CODE |
| LOW | src/documents/validators.py | 43 | except Exception as e: | CODE |
| LOW | src/documents/parsers.py | 119 | except Exception as e: # pragma: no cover | CODE |
| LOW | src/documents/consumer.py | 331 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 400 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 460 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 562 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 761 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 850 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 951 | except Exception: # pragma: no cover | CODE |
| LOW | src/documents/barcodes.py | 356 | except Exception as e: # pragma: no cover | CODE |
| LOW | src/documents/barcodes.py | 441 | except Exception as e: | CODE |
| LOW | src/documents/serialisers.py | 923 | except Exception: | CODE |
| LOW | src/documents/serialisers.py | 939 | except Exception: | CODE |
| LOW | src/documents/serialisers.py | 1796 | except Exception as e: | CODE |
| 67 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/compose/docker-compose.sqlite.yml | 2 | # This file contains everything paperless needs to run. | COMMENT |
| MEDIUM | docker/compose/docker-compose.mariadb.yml | 2 | # This file contains everything paperless needs to run. | COMMENT |
| MEDIUM | docker/compose/docker-compose.postgres-tika.yml | 2 | # This file contains everything paperless needs to run. | COMMENT |
| MEDIUM | docker/compose/docker-compose.postgres.yml | 2 | # This file contains everything paperless needs to run. | COMMENT |
| MEDIUM | docker/compose/docker-compose.sqlite-tika.yml | 2 | # This file contains everything paperless needs to run. | COMMENT |
| MEDIUM | docker/compose/docker-compose.mariadb-tika.yml | 2 | # This file contains everything paperless needs to run. | COMMENT |
| MEDIUM | docker/compose/docker-compose.portainer.yml | 2 | # This file contains everything paperless needs to run. | COMMENT |
| MEDIUM | …vcontainer/docker-compose.devcontainer.sqlite-tika.yml | 2 | # This file contains everything Paperless NGX needs to run. | COMMENT |
| MEDIUM | …vcontainer/docker-compose.devcontainer.sqlite-tika.yml | 21 | # This file is intended only to be used through VSCOde devcontainers. See README.md | COMMENT |
| MEDIUM | src/paperless/auth.py | 33 | """This class is here to provide authentication to the angular dev server | STRING |
| MEDIUM | src/paperless/tests/test_registry.py | 171 | # Create a subclass and delete the specified method to break compliance. | COMMENT |
| MEDIUM | …c/paperless/tests/settings/test_environment_parsers.py | 102 | # Create a dummy file to resolve against | COMMENT |
| MEDIUM | src/documents/consumer.py | 624 | # Create a log entry for the version addition, if enabled | COMMENT |
| MEDIUM | src/documents/barcodes.py | 209 | # Create the split document tasks | COMMENT |
| MEDIUM | src/documents/barcodes.py | 231 | # This file is now two or more files | COMMENT |
| MEDIUM | src/documents/barcodes.py | 354 | # This file is really borked, allow the consumption to continue | COMMENT |
| MEDIUM | src/documents/bulk_edit.py | 795 | # Create a new version from the edited PDF rather than replacing in-place | COMMENT |
| MEDIUM | src/documents/bulk_edit.py | 929 | # Create a new version rather than modifying the root/original in place. | COMMENT |
| MEDIUM | src/documents/bulk_edit.py | 1015 | # Create an instance if target doc doesn't have this field or append it to an existing one | COMMENT |
| MEDIUM | src/documents/tests/test_workflows.py | 4752 | # Create a test file to be consumed | COMMENT |
| MEDIUM | src/documents/tests/test_workflows.py | 4760 | # Create a ConsumableDocument | COMMENT |
| MEDIUM | src/documents/tests/test_workflows.py | 4816 | # Create a test file to be consumed | COMMENT |
| MEDIUM | src/documents/tests/test_workflows.py | 4824 | # Create a ConsumableDocument | COMMENT |
| MEDIUM | src/documents/tests/test_api_app_config.py | 711 | # Define a custom namespace "my:hack" and try to use it | COMMENT |
| MEDIUM | src/documents/tests/test_management_importer.py | 382 | # Create the zip file | COMMENT |
| MEDIUM | src/documents/tests/test_file_handling.py | 347 | # Create an identical document and ensure it is trashed under a new name | COMMENT |
| MEDIUM | src/documents/management/commands/document_importer.py | 450 | # Create a temporary directory for extracting a zip file into it, even if supplied source is no zip file to keep | COMMENT |
| MEDIUM | src/documents/templating/filepath.py | 364 | # Create the dummy document object with all fields filled in for validation purposes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/paperless_ai/db.py | 1 | CODE | |
| LOW | src/paperless_ai/embedding.py | 7 | CODE | |
| LOW | src/paperless_ai/indexing.py | 24 | CODE | |
| LOW | src/paperless/logging.py | 1 | CODE | |
| LOW | src/paperless/consumers.py | 1 | CODE | |
| LOW | src/paperless/__init__.py | 1 | CODE | |
| LOW | src/paperless/__init__.py | 2 | CODE | |
| LOW | src/paperless/__init__.py | 3 | CODE | |
| LOW | src/paperless/__init__.py | 4 | CODE | |
| LOW | src/paperless/__init__.py | 5 | CODE | |
| LOW | src/paperless/parsers/mail.py | 14 | CODE | |
| LOW | src/paperless/parsers/tesseract.py | 1 | CODE | |
| LOW | src/paperless/parsers/tika.py | 10 | CODE | |
| LOW | src/paperless/parsers/remote.py | 13 | CODE | |
| LOW | src/paperless/parsers/registry.py | 33 | CODE | |
| LOW | src/paperless/parsers/__init__.py | 36 | CODE | |
| LOW | src/paperless/parsers/utils.py | 9 | CODE | |
| LOW | src/paperless/parsers/text.py | 9 | CODE | |
| LOW | src/paperless/tests/test_registry.py | 10 | CODE | |
| LOW | src/paperless/tests/conftest.py | 11 | CODE | |
| LOW | src/paperless/tests/test_checks_v3.py | 3 | CODE | |
| LOW | src/paperless/tests/test_ocr_config.py | 3 | CODE | |
| LOW | src/paperless/tests/test_parser_utils.py | 3 | CODE | |
| LOW | src/paperless/tests/parsers/conftest.py | 7 | CODE | |
| LOW | src/paperless/tests/parsers/test_remote_parser.py | 16 | CODE | |
| LOW | src/paperless/tests/parsers/test_text_parser.py | 8 | CODE | |
| LOW | src/paperless/tests/parsers/test_tesseract_parser.py | 9 | CODE | |
| LOW | …/paperless/tests/parsers/test_convert_image_to_pdfa.py | 12 | CODE | |
| LOW | src/paperless/tests/parsers/test_parse_modes.py | 12 | CODE | |
| LOW | src/paperless_mail/tests/factories.py | 1 | CODE | |
| LOW | src/documents/mail.py | 1 | CODE | |
| LOW | src/documents/classifier.py | 1 | CODE | |
| LOW | src/documents/__init__.py | 2 | CODE | |
| LOW | src/documents/parsers.py | 1 | CODE | |
| LOW | src/documents/apps.py | 36 | CODE | |
| LOW | src/documents/bulk_download.py | 1 | CODE | |
| LOW | src/documents/caching.py | 1 | CODE | |
| LOW | src/documents/consumer.py | 195 | CODE | |
| LOW | src/documents/versioning.py | 1 | CODE | |
| LOW | src/documents/barcodes.py | 1 | CODE | |
| LOW | src/documents/serialisers.py | 1 | CODE | |
| LOW | src/documents/bulk_edit.py | 1 | CODE | |
| LOW | src/documents/regex.py | 1 | CODE | |
| LOW | src/documents/signals/handlers.py | 1 | CODE | |
| LOW | src/documents/tests/test_share_link_bundles.py | 1 | CODE | |
| LOW | src/documents/tests/test_management_consumer.py | 14 | CODE | |
| LOW | src/documents/tests/conftest.py | 21 | CODE | |
| LOW | src/documents/tests/test_consumer_archive.py | 3 | CODE | |
| LOW | src/documents/tests/test_sanity_check.py | 7 | CODE | |
| LOW | src/documents/tests/test_management.py | 1 | CODE | |
| LOW | src/documents/tests/test_api_chat.py | 1 | CODE | |
| LOW | src/documents/tests/factories.py | 5 | CODE | |
| LOW | src/documents/tests/test_api_document_versions.py | 1 | CODE | |
| LOW | src/documents/tests/test_management_retagger.py | 5 | CODE | |
| LOW | …documents/tests/management/test_management_base_cmd.py | 3 | CODE | |
| LOW | …nts/tests/management/test_management_sanity_checker.py | 6 | CODE | |
| LOW | …/tests/management/test_management_document_llmindex.py | 1 | CODE | |
| LOW | src/documents/tests/search/conftest.py | 1 | CODE | |
| LOW | src/documents/tests/search/test_tokenizer.py | 1 | CODE | |
| LOW | src/documents/tests/search/test_lock_backoff.py | 3 | CODE | |
| 29 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/rootfs/usr/local/bin/deduplicate.py | 52 | CODE | |
| LOW | src/paperless_ai/indexing.py | 300 | CODE | |
| LOW | src/paperless/validators.py | 183 | CODE | |
| LOW | src/paperless/checks.py | 25 | CODE | |
| LOW | src/paperless/utils.py | 118 | CODE | |
| LOW | src/paperless/settings/parsers.py | 61 | CODE | |
| LOW | src/paperless/parsers/tesseract.py | 266 | CODE | |
| LOW | src/paperless/parsers/tika.py | 398 | CODE | |
| LOW | src/paperless_mail/mail.py | 362 | CODE | |
| LOW | src/paperless_mail/mail.py | 513 | CODE | |
| LOW | src/paperless_mail/mail.py | 541 | CODE | |
| LOW | src/paperless_mail/views.py | 87 | CODE | |
| LOW | src/paperless_mail/tests/test_mail.py | 81 | CODE | |
| LOW | src/paperless_mail/tests/test_mail.py | 172 | CODE | |
| LOW | src/paperless_mail/tests/test_mail.py | 331 | CODE | |
| LOW | src/documents/mail.py | 19 | CODE | |
| LOW | src/documents/tasks.py | 182 | CODE | |
| LOW | src/documents/tasks.py | 338 | CODE | |
| LOW | src/documents/tasks.py | 495 | CODE | |
| LOW | src/documents/double_sided.py | 39 | CODE | |
| LOW | src/documents/matching.py | 169 | CODE | |
| LOW | src/documents/matching.py | 642 | CODE | |
| LOW | src/documents/consumer.py | 408 | CODE | |
| LOW | src/documents/sanity_checker.py | 240 | CODE | |
| LOW | src/documents/permissions.py | 93 | CODE | |
| LOW | src/documents/barcodes.py | 397 | CODE | |
| LOW | src/documents/serialisers.py | 231 | CODE | |
| LOW | src/documents/serialisers.py | 889 | CODE | |
| LOW | src/documents/serialisers.py | 1170 | CODE | |
| LOW | src/documents/serialisers.py | 1503 | CODE | |
| LOW | src/documents/serialisers.py | 1787 | CODE | |
| LOW | src/documents/serialisers.py | 1826 | CODE | |
| LOW | src/documents/serialisers.py | 2067 | CODE | |
| LOW | src/documents/serialisers.py | 2907 | CODE | |
| LOW | src/documents/bulk_edit.py | 289 | CODE | |
| LOW | src/documents/bulk_edit.py | 435 | CODE | |
| LOW | src/documents/bulk_edit.py | 615 | CODE | |
| LOW | src/documents/bulk_edit.py | 747 | CODE | |
| LOW | src/documents/bulk_edit.py | 877 | CODE | |
| LOW | src/documents/bulk_edit.py | 989 | CODE | |
| LOW | src/documents/filters.py | 255 | CODE | |
| LOW | src/documents/filters.py | 472 | CODE | |
| LOW | src/documents/filters.py | 638 | CODE | |
| LOW | src/documents/views.py | 1637 | CODE | |
| LOW | src/documents/views.py | 2864 | CODE | |
| LOW | src/documents/views.py | 4663 | CODE | |
| LOW | src/documents/signals/handlers.py | 343 | CODE | |
| LOW | src/documents/signals/handlers.py | 434 | CODE | |
| LOW | src/documents/signals/handlers.py | 751 | CODE | |
| LOW | src/documents/signals/handlers.py | 854 | CODE | |
| LOW | src/documents/signals/handlers.py | 1038 | CODE | |
| LOW | src/documents/tests/test_management_exporter.py | 195 | CODE | |
| LOW | src/documents/tests/test_consumer.py | 143 | CODE | |
| LOW | src/documents/tests/test_consumer.py | 1374 | CODE | |
| LOW | src/documents/tests/test_consumer.py | 1529 | CODE | |
| LOW | src/documents/tests/test_api_bulk_edit.py | 1439 | CODE | |
| LOW | src/documents/management/commands/document_retagger.py | 230 | CODE | |
| LOW | src/documents/management/commands/document_importer.py | 72 | CODE | |
| LOW | src/documents/management/commands/document_importer.py | 216 | CODE | |
| LOW | src/documents/management/commands/document_importer.py | 283 | CODE | |
| 17 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/changelog.md | 7054 | thinking that everything is in Catalan because we had _Lorem ipsum_ | CODE |
| LOW | docs/development.md | 414 | author = "Acme Corp" # author / organisation | CODE |
| LOW | docs/development.md | 666 | author = "Acme Corp" | CODE |
| LOW | src-ui/src/app/components/chat/chat/chat.component.html | 36 | [placeholder]="placeholder" | CODE |
| LOW | …il/document-history/document-history.component.spec.ts | 76 | const correspondentName = 'John Doe' | CODE |
| LOW | …il/document-history/document-history.component.spec.ts | 92 | .mockReturnValue(of({ name: 'John Doe' })) | CODE |
| LOW | …file-edit-dialog/profile-edit-dialog.component.spec.ts | 28 | email: 'foo@bar.com', | CODE |
| LOW | …c/app/components/common/input/date/date.component.html | 13 | <input #inputField class="form-control" [class.is-invalid]="error" [placeholder]="placeholder" [id]="inputId" | CODE |
| LOW | …ommon/input/document-link/document-link.component.html | 30 | [placeholder]="placeholder" | CODE |
| LOW | …mponents/common/input/textarea/textarea.component.html | 22 | [placeholder]="placeholder" | CODE |
| LOW | …c/app/components/common/input/text/text.component.html | 14 | <input #inputField type="text" class="form-control" [class.is-invalid]="error" [id]="inputId" [(ngModel)]="value | CODE |
| LOW | …p/components/common/input/select/select.component.html | 27 | [placeholder]="placeholder" | CODE |
| LOW | …stions-dropdown/suggestions-dropdown.component.spec.ts | 26 | suggested_correspondents: ['John Doe'], | CODE |
| LOW | …s/common/preview-popup/preview-popup.component.spec.ts | 21 | content: 'Cupcake ipsum dolor sit amet ice cream.', | CODE |
| LOW | …ument-card-large/document-card-large.component.spec.ts | 37 | 'Cupcake ipsum dolor sit amet ice cream. Donut shortbread cheesecake caramels tiramisu pastry caramels chocolate bar | CODE |
| LOW | …ument-card-small/document-card-small.component.spec.ts | 26 | 'Cupcake ipsum dolor sit amet ice cream. Donut shortbread cheesecake caramels tiramisu pastry caramels chocolate bar | CODE |
| LOW | src-ui/src/app/services/profile.service.spec.ts | 42 | service.update({ email: 'foo@bar.com' }).subscribe() | CODE |
| LOW | src-ui/src/app/services/profile.service.spec.ts | 48 | email: 'foo@bar.com', | CODE |
| LOW⚡ | src/paperless_ai/tests/test_ai_classifier.py | 84 | "correspondents": ["John Doe"], | CODE |
| LOW⚡ | src/paperless_ai/tests/test_ai_classifier.py | 92 | "correspondents": ["Jane Doe"], | CODE |
| LOW | src/paperless_ai/tests/test_ai_classifier.py | 103 | assert result["correspondents"] == ["John Doe"] | CODE |
| LOW | src/paperless_ai/tests/test_ai_classifier.py | 128 | "correspondents": ["John Doe"], | CODE |
| LOW | src/paperless_ai/tests/test_ai_classifier.py | 147 | assert result["correspondents"] == ["John Doe"] | CODE |
| LOW | src/paperless_ai/tests/test_ai_classifier.py | 227 | "correspondents": ["John Doe"], | CODE |
| LOW | src/paperless_ai/tests/test_client.py | 109 | "correspondents": ["John Doe"], | CODE |
| LOW | src/paperless_ai/tests/test_client.py | 141 | "correspondents": ["John Doe"], | CODE |
| LOW | src/paperless/parsers/__init__.py | 20 | author = "Acme Corp" | STRING |
| LOW | src/paperless/tests/test_adapter.py | 100 | "email": "user@example.com", | CODE |
| LOW | src/documents/tests/test_workflows.py | 3402 | to="user@example.com", | CODE |
| LOW | src/documents/tests/test_workflows.py | 3689 | to="user@example.com", | CODE |
| LOW | src/documents/tests/test_workflows.py | 4486 | to="user@example.com", | CODE |
| LOW | src/documents/tests/test_workflows.py | 4620 | to="user@example.com", | CODE |
| LOW⚡ | src/documents/tests/test_api_search.py | 156 | content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", | CODE |
| LOW⚡ | src/documents/tests/test_api_search.py | 156 | content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", | CODE |
| LOW⚡ | src/documents/tests/search/test_backend.py | 175 | content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", | CODE |
| LOW⚡ | src/documents/tests/search/test_backend.py | 175 | content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/paperless/settings/parsers.py | 14 | Converts a string representation of truth to a boolean value. Recognizes 'true', '1', 't', 'y', 'yes' as True, | STRING |
| HIGH | src/paperless/settings/parsers.py | 67 | Parses a key-value string into a dictionary, applying defaults and casting types. Supports nested keys via dot | STRING |
| HIGH | src/paperless/settings/parsers.py | 224 | Get and parse a list from an environment variable or return a default. Args: key: Environment variable | STRING |
| HIGH | src/paperless/settings/parsers.py | 289 | Gets and validates an environment variable against a set of allowed choices. Args: env_key: The enviro | STRING |
| HIGH | src/documents/utils.py | 148 | Compute the SHA-256 checksum of a file. Reads the file in chunks to avoid loading the entire file into memory. | STRING |
| HIGH | src/documents/templating/filters.py | 11 | Format a date, datetime or str object into a localized string using Babel. Args: value (date | datetim | STRING |
| HIGH | src/documents/search/_backend.py | 894 | Get a batch context manager for bulk index operations. Use this for efficient bulk document updates/de | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/paperless/parsers/mail.py | 0 | return the mime types this parser handles. returns ------- dict[str, str] mapping of mime type to preferred file extensi | STRING |
| HIGH | src/paperless/parsers/tika.py | 0 | return the mime types this parser handles. returns ------- dict[str, str] mapping of mime type to preferred file extensi | STRING |
| HIGH | src/paperless/parsers/text.py | 0 | return the mime types this parser handles. returns ------- dict[str, str] mapping of mime type to preferred file extensi | STRING |
| HIGH | src/paperless/parsers/mail.py | 0 | return the plain-text content extracted during parse. returns ------- str extracted text, or an empty string if no text | STRING |
| HIGH | src/paperless/parsers/tika.py | 0 | return the plain-text content extracted during parse. returns ------- str extracted text, or an empty string if no text | STRING |
| HIGH | src/paperless/parsers/__init__.py | 0 | return the plain-text content extracted during parse. returns ------- str extracted text, or an empty string if no text | STRING |
| HIGH | src/paperless/parsers/text.py | 0 | return the plain-text content extracted during parse. returns ------- str extracted text, or an empty string if no text | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install-paperless-ngx.sh | 64 | # Check if user has permissions to run Docker by trying to get the status of Docker (docker status). | COMMENT |
| LOW | docker/rootfs/usr/local/bin/deduplicate.py | 19 | # Read file in chunks to handle large files efficiently | COMMENT |
| LOW | src/paperless/validators.py | 234 | # Check if any dangerous pattern is a substring of the style | COMMENT |
| LOW | src/paperless/validators.py | 245 | # Check if value starts with any dangerous scheme | COMMENT |
| LOW | src/paperless/tests/parsers/test_mail_parser.py | 94 | # Check if exception is raised when parsing fails. | COMMENT |
| LOW | src/paperless/tests/parsers/test_mail_parser.py | 115 | # Check if exception is raised when the mail is faulty. | COMMENT |
| LOW | src/paperless/tests/parsers/test_mail_parser.py | 409 | # Check if exception is raised when Tika cannot be reached. | COMMENT |
| LOW | src/documents/classifier.py | 285 | # Check if retraining is actually required. | COMMENT |
| LOW | src/documents/matching.py | 378 | # Check if any tag filters exist to determine if we need to load document tags | COMMENT |
| LOW | src/documents/bulk_edit.py | 1001 | # Check if any documents are going to be removed from the current list of links and remove the symmetrical links | COMMENT |
| LOW | src/documents/filters.py | 567 | # Check if 1) custom field name matches, and 2) value satisfies condition | COMMENT |
| LOW | src/documents/filters.py | 609 | # Check if the operator is supported for the current data_type. | COMMENT |
| LOW | src/documents/filters.py | 725 | # Check if any of the requested IDs are missing. | COMMENT |
| LOW | src/documents/signals/handlers.py | 912 | # Check if document was soft deleted (moved to trash) | COMMENT |
| LOW | src/documents/tests/date_parsing/test_date_parsing.py | 85 | # Check if an error was logged | COMMENT |
| LOW | src/documents/tests/date_parsing/test_date_parsing.py | 89 | # Check if the specific error message is present | COMMENT |
| LOW | src/documents/management/commands/manage_superuser.py | 33 | # Check if there's already a user called admin | COMMENT |
| LOW | src/documents/management/commands/manage_superuser.py | 42 | # Check if any superuseruser | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .devcontainer/README.md | 44 | ### Step 1: Running the DevContainer | COMMENT |
| LOW | .devcontainer/README.md | 54 | ### Step 2: Initial Setup | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 528 | # Step 2: delete all documents | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 532 | # Step 3: rebuild with no documents — drop_table is called so the table | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 536 | # Step 4: the table must be absent (no rows) — phantom vectors gone | COMMENT |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 514 | # Step 1: create a document and build a non-empty index | COMMENT |
| LOW | src/documents/classifier.py | 246 | # Step 1: Extract and preprocess training data from the database. | COMMENT |
| LOW | src/documents/classifier.py | 324 | # Step 2: vectorize data | COMMENT |
| LOW | src/documents/classifier.py | 350 | # Step 3: train the classifiers | COMMENT |
| LOW⚡ | src/documents/templating/utils.py | 13 | # Step 1: Match placeholders with single curly braces but not those with double braces | COMMENT |
| LOW⚡ | src/documents/templating/utils.py | 16 | # Step 2: Replace the placeholders with {{ var }} or {{ }} | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/documents/classifier.py | 305 | # subtract 1 since -1 (null) is also part of the classes. | COMMENT |
| HIGH | …/documents/management/commands/convert_mariadb_uuid.py | 21 | old_field = models.CharField(null=null, max_length=36) | CODE |
| HIGH | …/documents/management/commands/convert_mariadb_uuid.py | 24 | new_field = models.UUIDField(null=null) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 528 | # Step 2: delete all documents | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 532 | # Step 3: rebuild with no documents — drop_table is called so the table | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 536 | # Step 4: the table must be absent (no rows) — phantom vectors gone | COMMENT |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 514 | # Step 1: create a document and build a non-empty index | COMMENT |
| LOW | src/documents/classifier.py | 246 | # Step 1: Extract and preprocess training data from the database. | COMMENT |
| LOW | src/documents/classifier.py | 324 | # Step 2: vectorize data | COMMENT |
| LOW | src/documents/classifier.py | 350 | # Step 3: train the classifiers | COMMENT |
| LOW⚡ | src/documents/templating/utils.py | 13 | # Step 1: Match placeholders with single curly braces but not those with double braces | COMMENT |
| LOW⚡ | src/documents/templating/utils.py | 16 | # Step 2: Replace the placeholders with {{ var }} or {{ }} | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/compose/docker-compose.sqlite.yml | 1 | # Docker Compose file for running paperless from the Docker Hub. | COMMENT |
| LOW | docker/compose/docker-compose.mariadb.yml | 1 | # Docker Compose file for running paperless from the Docker Hub. | COMMENT |
| LOW | docker/compose/docker-compose.postgres-tika.yml | 1 | # Docker Compose file for running paperless from the docker container registry. | COMMENT |
| LOW | docker/compose/docker-compose.postgres.yml | 1 | # Docker Compose file for running paperless from the Docker Hub. | COMMENT |
| LOW | docker/compose/docker-compose.sqlite-tika.yml | 1 | # Docker Compose file for running paperless from the docker container registry. | COMMENT |
| LOW | docker/compose/docker-compose.mariadb-tika.yml | 1 | # docker compose file for running paperless from the Docker Hub. | COMMENT |
| LOW | docker/compose/docker-compose.portainer.yml | 1 | # Docker Compose file for running paperless from the Docker Hub. | COMMENT |
| LOW | …vcontainer/docker-compose.devcontainer.sqlite-tika.yml | 1 | # Docker Compose file for developing Paperless NGX in VSCode DevContainers. | COMMENT |
| LOW | .github/workflows/codeql-analysis.yml | 1 | # For most projects, this workflow file will not need changing; you simply need | COMMENT |
| LOW | src-ui/playwright.config.ts | 41 | use: { ...devices['Desktop Chrome'] }, | COMMENT |
| LOW | src-ui/playwright.config.ts | 61 | // use: { ...devices['iPhone 12'] }, | COMMENT |
| LOW | src/paperless_ai/indexing.py | 81 | # each other, so only one rebuild/upsert/delete/compaction runs at a time. | COMMENT |
| LOW | src/paperless/settings/__init__.py | 41 | load_dotenv(path) | COMMENT |
| LOW | src/documents/signals/handlers.py | 461 | msg = f"Document {instance!s}: Cannot rename file since target path {new_path} already exists." | COMMENT |
| LOW | src/documents/search/_translate.py | 21 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/paperless/__init__.py | 7 | __all__ = [ | CODE |
| LOW | src/paperless/settings/custom.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/paperless/settings/parsers.py | 88 | def _set_nested(d: dict, keys: list[str], value: Any) -> None: | CODE |
| LOW | src/paperless/parsers/__init__.py | 50 | __all__ = [ | CODE |
| LOW | src/documents/classifier.py | 130 | def _update_data_vectorizer_hash(self) -> None: | CODE |
| LOW | src/documents/tasks.py | 338 | def update_document_content_maybe_archive_file(document_id) -> None: | CODE |
| LOW | src/documents/tasks.py | 635 | def update_document_parent_tags(tag: Tag, new_parent: Tag) -> None: | CODE |
| LOW⚡ | src/documents/tasks.py | 706 | def update_document_in_llm_index(document) -> None: | CODE |
| LOW | src/documents/__init__.py | 4 | __all__ = ["parser_check"] | CODE |
| LOW | src/documents/serialisers.py | 253 | def _set_permissions(self, permissions, object) -> None: | CODE |
| LOW | src/documents/plugins/date_parsing/__init__.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/documents/plugins/date_parsing/__init__.py | 96 | __all__ = [ | CODE |
| LOW | src/documents/plugins/date_parsing/base.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/documents/search/__init__.py | 14 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/advanced_usage.md | 142 | ### The LLM index (RAG) and similar documents | COMMENT |
| MEDIUM | docs/usage.md | 328 | See [AI features](advanced_usage.md#ai-features) for how to enable and configure these features, including choosing an L | CODE |
| MEDIUM | src-ui/README.md | 9 | ## Code scaffolding | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 14 | # TODO: Move certain things to groups and then utilize that further | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 243 | # the whole text, so do not utilize it in that case | COMMENT |
| LOW | src/documents/views.py | 2658 | # if all is not true, just pass through the provided document ids | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/paperless/settings/__init__.py | 726 | CODE | |
| LOW | src/paperless_mail/tests/test_mail.py | 209 | CODE | |
| LOW | src/documents/parsers.py | 71 | CODE | |
| LOW | src/documents/views.py | 2222 | CODE | |
| LOW | src/documents/tests/test_management_exporter.py | 155 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/paperless/network.py | 143 | def handle_request(self, request: httpx.Request) -> httpx.Response: | CODE |