A community-supported supercharged document management system: scan, index and archive all your documents
This report summarizes scanner evidence for paperless-ngx/paperless-ngx, a Python project with 46,483 GitHub stars. SynthScan examined 266,669 lines of code across 1113 source files, recording 3317 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 14.4 (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.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 2716 finding(s).
Are imports declared and package/API names verified? 208 finding(s).
Are wrappers, guards, and repeated structures necessary? 2928 finding(s).
Which changes need focused human review? 3317 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
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.
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.
The scanner identified 3317 distinct pattern matches across 22 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.
| 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/conftest.py | 48 | def _clear_content_type_caches() -> None: | CODE |
| LOW | src/paperless_ai/embedding.py | 107 | def get_configured_model_name(config: AIConfig) -> str: | CODE |
| LOW | src/paperless_ai/embedding.py | 120 | def _normalize_llm_index_text(text: str) -> str: | CODE |
| LOW | src/paperless_ai/vector_store.py | 390 | def _delete_chunks_by_document_id(self, document_id: int) -> None: | CODE |
| LOW | src/paperless_ai/vector_store.py | 742 | def _run_structural_migration(self, migration: Migration) -> None: | CODE |
| LOW | src/paperless_ai/base_model.py | 210 | def model_to_classification_suggestions( | CODE |
| LOW | src/paperless_ai/base_model.py | 276 | def classification_suggestions_to_model( | CODE |
| LOW | src/paperless_ai/matching.py | 49 | def resolve_correspondent_ids( | CODE |
| LOW | src/paperless_ai/matching.py | 56 | def resolve_document_type_ids(ids: list[int], user: User | None) -> list[DocumentType]: | CODE |
| LOW⚡ | src/paperless_ai/matching.py | 82 | def match_correspondents_by_name( | CODE |
| LOW⚡ | src/paperless_ai/matching.py | 89 | def match_document_types_by_name( | CODE |
| LOW⚡ | src/paperless_ai/matching.py | 96 | def match_storage_paths_by_name( | CODE |
| LOW | src/paperless_ai/chat.py | 39 | def _build_document_reference( | CODE |
| LOW | src/paperless_ai/chat.py | 89 | def _format_chat_metadata_trailer(references: list[dict[str, int | str]]) -> str: | CODE |
| LOW | src/paperless_ai/chat.py | 96 | def stream_chat_with_documents( | CODE |
| LOW | src/paperless_ai/chat.py | 115 | def _stream_chat_with_documents( | CODE |
| LOW | src/paperless_ai/taxonomy.py | 46 | def empty_taxonomy_candidates() -> TaxonomyCandidates: | CODE |
| LOW | src/paperless_ai/taxonomy.py | 83 | def _visible_ranked_candidates( | CODE |
| LOW | src/paperless_ai/taxonomy.py | 115 | def build_taxonomy_candidates( | CODE |
| LOW | src/paperless_ai/taxonomy.py | 196 | def format_taxonomy_for_prompt( | CODE |
| LOW | src/paperless_ai/indexing.py | 44 | def queue_llm_index_update_if_needed(*, rebuild: bool, reason: str) -> bool: | CODE |
| LOW | src/paperless_ai/indexing.py | 219 | def _check_and_run_migrations( | CODE |
| LOW | src/paperless_ai/indexing.py | 382 | def _exclude_document_id_filter(document_id: int | str): | CODE |
| LOW | src/paperless_ai/indexing.py | 399 | def exclude_document_ids_filter(doc_ids): | CODE |
| LOW | src/paperless_ai/indexing.py | 512 | def llm_index_add_or_update_document(document: Document): | CODE |
| LOW | src/paperless_ai/indexing.py | 579 | def llm_index_remove_document(document: Document): | CODE |
| LOW | src/paperless_ai/ai_classifier.py | 43 | def _fulltext_similar_documents( | CODE |
| LOW | src/paperless_ai/ai_classifier.py | 161 | def build_localization_prompt( | CODE |
| LOW | src/paperless_ai/ai_classifier.py | 291 | def get_ai_document_classification( | CODE |
| 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_tables.py | 25 | def test_create_is_idempotent(self, conn: sqlite3.Connection) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 39 | def test_insert_many_then_lookup_by_document_id( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 63 | def test_delete_for_document_removes_only_that_document( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 84 | def test_delete_all_clears_every_row(self, conn: sqlite3.Connection) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 101 | def test_count_reflects_live_rows(self, conn: sqlite3.Connection) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 121 | def test_upsert_many_then_all_modified_times( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 146 | def test_upsert_many_overwrites_existing_value( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 164 | def test_delete_for_document_removes_only_that_row( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 184 | def test_delete_all_clears_every_row(self, conn: sqlite3.Connection) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 201 | def test_copy_all_streams_every_row_to_destination( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 241 | def test_typed_accessor_roundtrip( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 263 | def test_total_inserts_starts_at_zero(self, conn: sqlite3.Connection) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 275 | def test_increment_total_inserts_accumulates( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 292 | def test_increment_total_inserts_is_a_single_statement( | CODE |
| LOW | src/paperless_ai/tests/test_tables.py | 325 | def test_reset_total_inserts_sets_absolute_value( | CODE |
| LOW | src/paperless_ai/tests/test_prompts.py | 14 | def test_renders_taxonomy_block_empty_when_candidates_empty(self) -> None: | CODE |
| LOW | src/paperless_ai/tests/test_prompts.py | 57 | def test_render_prompt_resolves_every_prompt_name( | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 64 | def test_get_embedding_model_openai(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 86 | def test_get_embedding_model_openai_falls_back_to_llm_api_key(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 101 | def test_get_embedding_model_openai_without_api_key_sends_placeholder( | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 120 | def test_get_embedding_model_openai_prefers_embedding_endpoint(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 142 | def test_get_embedding_model_openai_blocks_internal_endpoint_when_disallowed( | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 155 | def test_get_embedding_model_huggingface(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 172 | def test_get_embedding_model_ollama(mock_ai_config): | CODE |
| LOW | src/paperless_ai/tests/test_embedding.py | 189 | def test_get_embedding_model_ollama_prefers_embedding_endpoint(mock_ai_config): | CODE |
| 2470 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/ci-release.yml | 193 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | .github/workflows/ci-release.yml | 195 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/paperless/celery.py | 13 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/paperless/celery.py | 19 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/mail.py | 446 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/mail.py | 448 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 94 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 96 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 136 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 138 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 164 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 166 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 190 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 192 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 282 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 284 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 317 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/mail.py | 319 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 96 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 98 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 108 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 110 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 135 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 137 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 142 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/paperless/parsers/tesseract.py | 144 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 77 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 79 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 155 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/tesseract.py | 157 | # ------------------------------------------------------------------ | 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 | 119 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 121 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 174 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 176 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 205 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 207 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 230 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 232 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 284 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 286 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 306 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 308 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 395 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/paperless/parsers/remote.py | 397 | # ------------------------------------------------------------------ | 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 |
|---|---|---|---|---|
| LOW | src-ui/e2e/backend.py | 5 | CODE | |
| LOW | src/conftest.py | 8 | CODE | |
| LOW | src/paperless_testing/dirs.py | 8 | CODE | |
| LOW | src/paperless_testing/typed_factory.py | 5 | CODE | |
| LOW | src/paperless_testing/factories.py | 5 | CODE | |
| LOW | src/paperless_testing/assertions.py | 3 | CODE | |
| LOW | src/paperless_testing/retry.py | 1 | CODE | |
| LOW | src/paperless_testing/http.py | 1 | CODE | |
| LOW | src/paperless_testing/migrations.py | 1 | CODE | |
| LOW | src/paperless_testing/permissions.py | 8 | CODE | |
| LOW | src/paperless_testing/fakes/progress.py | 1 | CODE | |
| LOW | src/paperless_ai/db.py | 1 | CODE | |
| LOW | src/paperless_ai/embedding.py | 7 | CODE | |
| LOW | src/paperless_ai/vector_store.py | 756 | CODE | |
| LOW | src/paperless_ai/taxonomy.py | 21 | CODE | |
| LOW | src/paperless_ai/indexing.py | 27 | CODE | |
| LOW | src/paperless_ai/indexing.py | 28 | CODE | |
| LOW | src/paperless_ai/tests/test_chat.py | 1 | CODE | |
| LOW | src/paperless_ai/tests/test_ai_classifier.py | 33 | CODE | |
| LOW | src/paperless/logging.py | 1 | CODE | |
| LOW | src/paperless/signed_pickle.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 | 15 | 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/test_remote_ocr_config.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 | 191 | CODE | |
| LOW | src/documents/utils.py | 19 | CODE | |
| LOW | src/documents/utils.py | 20 | CODE | |
| LOW | src/documents/barcodes.py | 1 | CODE | |
| LOW | src/documents/serialisers.py | 1 | CODE | |
| 97 more matches not shown… | ||||
| 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 | 569 | except Exception as e: | CODE |
| LOW | src/paperless_testing/retry.py | 59 | except Exception as e: # pragma: no cover | CODE |
| LOW | src/paperless_ai/client.py | 183 | except Exception as exc: | CODE |
| MEDIUM | src/paperless_ai/client.py | 178 | def _normalize_errors(self) -> Iterator[None]: | CODE |
| LOW | src/paperless_ai/chat.py | 110 | except Exception as e: | CODE |
| LOW | src/paperless_ai/ai_classifier.py | 241 | except Exception: | 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 | 492 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/mail.py | 529 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/mail.py | 602 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/mail.py | 730 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/mail.py | 828 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 218 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 231 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 362 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 409 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 432 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 552 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 565 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 650 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/tesseract.py | 653 | 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 | 452 | except Exception as err: | CODE |
| LOW | src/paperless/parsers/remote.py | 507 | 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 | 263 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/utils.py | 303 | except Exception as e: | CODE |
| LOW | src/paperless/parsers/utils.py | 335 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 243 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 308 | except Exception: | CODE |
| LOW | src/paperless_mail/mail.py | 594 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 643 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 733 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 739 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 775 | except Exception as e: | CODE |
| LOW | src/paperless_mail/mail.py | 798 | except Exception as err: | CODE |
| LOW | src/paperless_mail/mail.py | 834 | except Exception as err: | CODE |
| LOW | src/paperless_mail/mail.py | 884 | except Exception as e: | CODE |
| LOW | src/documents/classifier.py | 189 | except Exception as e: # pragma: no cover | CODE |
| LOW | src/documents/classifier.py | 286 | except Exception as err: | CODE |
| LOW | src/documents/tasks.py | 267 | except Exception as e: | CODE |
| LOW | src/documents/tasks.py | 366 | except Exception as e: | CODE |
| LOW | src/documents/tasks.py | 511 | except Exception: | CODE |
| LOW | src/documents/tasks.py | 545 | except Exception as e: # pragma: no cover | CODE |
| LOW | src/documents/tasks.py | 880 | except Exception as exc: | CODE |
| LOW | src/documents/tasks.py | 918 | 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 | 327 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 396 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 456 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 582 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 796 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 886 | except Exception as e: | CODE |
| LOW | src/documents/consumer.py | 993 | except Exception as e: | CODE |
| 70 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src-ui/src/app/services/document-list-view.service.ts | 291 | if (!this.router.routerState.snapshot.url.includes('/view/')) { | CODE |
| CRITICAL | src-ui/src/app/services/document-list-view.service.ts | 356 | 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 | 1431 | self.mailMocker.bogus_mailbox.folder.list.assert_called_once() | CODE |
| CRITICAL | src/paperless_mail/tests/test_mail.py | 1464 | self.mailMocker.bogus_mailbox.folder.list.assert_called_once() | CODE |
| CRITICAL | src/documents/models.py | 10 | 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/views.py | 375 | ) and self.request.user.ui_settings.settings.get("language"): | CODE |
| CRITICAL | src/documents/views.py | 376 | lang = self.request.user.ui_settings.settings.get("language") | CODE |
| CRITICAL | src/documents/tests/test_bulk_edit.py | 913 | mock_consume_file.return_value.set.return_value.apply_async.assert_called_once() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/paperless/auth.py | 31 | except User.DoesNotExist: | CODE |
| HIGH | src/paperless/checks.py | 54 | except (PermissionError, OSError): | CODE |
| HIGH | src/paperless_mail/tests/test_preprocessor.py | 56 | except (FileNotFoundError, subprocess.TimeoutExpired): | CODE |
| HIGH | src/paperless_mail/tests/test_preprocessor.py | 198 | except (FileNotFoundError, subprocess.TimeoutExpired): | CODE |
| HIGH | src/documents/tasks.py | 902 | except OSError: | CODE |
| HIGH | src/documents/tasks.py | 896 | except OSError: | CODE |
| HIGH | src/documents/models.py | 1233 | except OSError: | CODE |
| HIGH | src/documents/consumer.py | 1013 | except Exception: # pragma: no cover | CODE |
| HIGH | src/documents/utils.py | 91 | except PermissionError: | CODE |
| HIGH | src/documents/serialisers.py | 312 | except KeyError: | CODE |
| HIGH | src/documents/serialisers.py | 2625 | except KeyError: | CODE |
| HIGH | src/documents/bulk_edit.py | 1076 | except pikepdf.PasswordError: | CODE |
| HIGH | src/documents/filters.py | 337 | except StopIteration: | CODE |
| HIGH | src/documents/filters.py | 1042 | except (TypeError, ValueError): | CODE |
| HIGH | src/documents/views.py | 1538 | except Exception: | CODE |
| HIGH | src/documents/signals/handlers.py | 1145 | except ValueError: | CODE |
| HIGH | src/documents/signals/handlers.py | 636 | except Exception: | CODE |
| HIGH | src/documents/tests/test_management_importer.py | 423 | except CommandError: | CODE |
| HIGH | src/documents/tests/search/test_backend.py | 63 | except RuntimeError: | CODE |
| HIGH | src/documents/templating/filepath.py | 409 | except UndefinedError: | CODE |
| 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 | 36 | """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 | 651 | # Create a log entry for the version addition, if enabled | COMMENT |
| MEDIUM | src/documents/barcodes.py | 213 | # Create the split document tasks | COMMENT |
| MEDIUM | src/documents/barcodes.py | 235 | # This file is now two or more files | COMMENT |
| MEDIUM | src/documents/barcodes.py | 298 | # This file is really borked, allow the consumption to continue | COMMENT |
| MEDIUM | src/documents/bulk_edit.py | 955 | # Create a new version from the edited PDF rather than replacing in-place | COMMENT |
| MEDIUM | src/documents/bulk_edit.py | 1089 | # Create a new version rather than modifying the root/original in place. | COMMENT |
| MEDIUM | src/documents/bulk_edit.py | 1175 | # 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 | 5028 | # Create a test file to be consumed | COMMENT |
| MEDIUM | src/documents/tests/test_workflows.py | 5036 | # Create a ConsumableDocument | COMMENT |
| MEDIUM | src/documents/tests/test_workflows.py | 5092 | # Create a test file to be consumed | COMMENT |
| MEDIUM | src/documents/tests/test_workflows.py | 5100 | # Create a ConsumableDocument | COMMENT |
| MEDIUM | src/documents/tests/test_api_app_config.py | 850 | # 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 | 381 | # Create an identical document and ensure it is trashed under a new name | COMMENT |
| MEDIUM | src/documents/management/commands/document_importer.py | 461 | # 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 | docker/rootfs/usr/local/bin/deduplicate.py | 52 | CODE | |
| LOW | src/paperless_ai/vector_store.py | 109 | CODE | |
| LOW | src/paperless_ai/indexing.py | 416 | 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/serialisers.py | 265 | CODE | |
| LOW | src/paperless/settings/parsers.py | 61 | CODE | |
| LOW | src/paperless/parsers/tesseract.py | 265 | CODE | |
| LOW | src/paperless/parsers/tika.py | 398 | CODE | |
| LOW | src/paperless_mail/mail.py | 389 | CODE | |
| LOW | src/paperless_mail/mail.py | 649 | CODE | |
| LOW | src/paperless_mail/mail.py | 677 | CODE | |
| LOW | src/paperless_mail/views.py | 98 | CODE | |
| LOW | src/paperless_mail/tests/test_mail.py | 104 | CODE | |
| LOW | src/paperless_mail/tests/helpers.py | 51 | CODE | |
| LOW | src/paperless_mail/tests/helpers.py | 162 | CODE | |
| LOW | src/documents/mail.py | 19 | CODE | |
| LOW | src/documents/tasks.py | 186 | CODE | |
| LOW | src/documents/tasks.py | 372 | CODE | |
| LOW | src/documents/tasks.py | 555 | CODE | |
| LOW | src/documents/double_sided.py | 39 | CODE | |
| LOW | src/documents/matching.py | 165 | CODE | |
| LOW | src/documents/matching.py | 637 | CODE | |
| LOW | src/documents/consumer.py | 404 | CODE | |
| LOW | src/documents/sanity_checker.py | 240 | CODE | |
| LOW | src/documents/permissions.py | 104 | CODE | |
| LOW | src/documents/barcodes.py | 341 | CODE | |
| LOW | src/documents/serialisers.py | 239 | CODE | |
| LOW | src/documents/serialisers.py | 907 | CODE | |
| LOW | src/documents/serialisers.py | 1207 | CODE | |
| LOW | src/documents/serialisers.py | 1551 | CODE | |
| LOW | src/documents/serialisers.py | 1955 | CODE | |
| LOW | src/documents/serialisers.py | 2219 | CODE | |
| LOW | src/documents/serialisers.py | 3065 | CODE | |
| LOW | src/documents/bulk_edit.py | 477 | CODE | |
| LOW | src/documents/bulk_edit.py | 766 | CODE | |
| LOW | src/documents/bulk_edit.py | 898 | CODE | |
| LOW | src/documents/bulk_edit.py | 1037 | CODE | |
| LOW | src/documents/bulk_edit.py | 1149 | CODE | |
| LOW | src/documents/filters.py | 250 | CODE | |
| LOW | src/documents/filters.py | 471 | CODE | |
| LOW | src/documents/filters.py | 637 | CODE | |
| LOW | src/documents/views.py | 1862 | CODE | |
| LOW | src/documents/signals/handlers.py | 345 | CODE | |
| LOW | src/documents/signals/handlers.py | 440 | CODE | |
| LOW | src/documents/signals/handlers.py | 757 | CODE | |
| LOW | src/documents/signals/handlers.py | 862 | CODE | |
| LOW | src/documents/signals/handlers.py | 1080 | CODE | |
| LOW | src/documents/tests/test_bulk_edit.py | 1644 | CODE | |
| LOW | src/documents/tests/test_management_exporter.py | 199 | CODE | |
| LOW | src/documents/tests/test_consumer.py | 144 | CODE | |
| LOW | src/documents/tests/test_consumer.py | 1402 | CODE | |
| LOW | src/documents/tests/test_consumer.py | 1557 | CODE | |
| LOW | src/documents/tests/test_api_bulk_edit.py | 1986 | CODE | |
| LOW | …c/documents/tests/search/test_unicode_normalization.py | 136 | CODE | |
| LOW | src/documents/tests/export/test_sinks.py | 365 | CODE | |
| LOW | src/documents/management/commands/document_retagger.py | 230 | CODE | |
| LOW | src/documents/management/commands/document_importer.py | 74 | CODE | |
| LOW | src/documents/management/commands/document_importer.py | 218 | CODE | |
| 20 more matches not shown… | ||||
| 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 |
| HIGH | src/paperless/tests/test_ocr_config.py | 0 | mock applicationconfiguration with all fields none → falls back to django settings. | STRING |
| HIGH | src/paperless/tests/test_remote_ocr_config.py | 0 | mock applicationconfiguration with all fields none → falls back to django settings. | STRING |
| HIGH | src/documents/tests/test_consumer_archive.py | 0 | mock applicationconfiguration with all fields none → falls back to django settings. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/changelog.md | 8719 | thinking that everything is in Catalan because we had _Lorem ipsum_ | CODE |
| LOW | docs/development.md | 421 | author = "Acme Corp" # author / organisation | CODE |
| LOW | docs/development.md | 693 | author = "Acme Corp" | CODE |
| LOW | src-ui/src/app/components/chat/chat/chat.component.html | 38 | [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 | 23 | [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 | 27 | 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 | 75 | "correspondents": {"existing_ids": [], "new_names": ["John Doe"]}, | CODE |
| LOW | src/paperless_ai/tests/test_ai_classifier.py | 104 | "correspondents": {"existing_ids": [], "new_names": ["Jane Doe"]}, | CODE |
| LOW | src/paperless_ai/tests/test_ai_classifier.py | 117 | assert result["correspondents"]["new_names"] == ["John Doe"] | CODE |
| LOW | src/paperless_ai/tests/test_ai_classifier.py | 159 | assert result["correspondents"]["new_names"] == ["John Doe"] | CODE |
| LOW | src/paperless_ai/tests/test_client.py | 134 | "correspondents": ["John Doe"], | CODE |
| LOW | src/paperless_ai/tests/test_client.py | 174 | "correspondents": ["John Doe"], | CODE |
| LOW | src/paperless/parsers/__init__.py | 20 | author = "Acme Corp" | STRING |
| LOW | src/paperless/tests/test_adapter.py | 101 | "email": "user@example.com", | CODE |
| LOW | src/documents/tests/test_workflows.py | 3554 | to="user@example.com", | CODE |
| LOW | src/documents/tests/test_workflows.py | 3902 | to="user@example.com", | CODE |
| LOW | src/documents/tests/test_workflows.py | 4762 | to="user@example.com", | CODE |
| LOW | src/documents/tests/test_workflows.py | 4896 | to="user@example.com", | CODE |
| LOW⚡ | src/documents/tests/test_api_search.py | 187 | content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", | CODE |
| LOW⚡ | src/documents/tests/test_api_search.py | 187 | content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", | CODE |
| LOW⚡ | src/documents/tests/search/test_backend.py | 429 | content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", | CODE |
| LOW⚡ | src/documents/tests/search/test_backend.py | 429 | content="Lorem ipsum dolor sit amet, consectetur adipiscing elit.", | CODE |
| LOW⚡ | src/documents/tests/search/test_fuzzy_scoring.py | 29 | _PADDING = "lorem ipsum dolor sit amet " * 40 | CODE |
| LOW⚡ | src/documents/tests/search/test_fuzzy_scoring.py | 29 | _PADDING = "lorem ipsum dolor sit amet " * 40 | 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 | 190 | 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 | 1095 | Get a batch context manager for bulk index operations. Use this for efficient bulk document updates/de | 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 | 444 | # Check if exception is raised when Tika cannot be reached. | COMMENT |
| LOW | src/documents/classifier.py | 410 | # Check if retraining is actually required. | COMMENT |
| LOW | src/documents/matching.py | 373 | # Check if any tag filters exist to determine if we need to load document tags | COMMENT |
| LOW | src/documents/bulk_edit.py | 1161 | # 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 | 566 | # Check if 1) custom field name matches, and 2) value satisfies condition | COMMENT |
| LOW | src/documents/filters.py | 608 | # Check if the operator is supported for the current data_type. | COMMENT |
| LOW | src/documents/filters.py | 728 | # Check if any of the requested IDs are missing. | COMMENT |
| LOW | src/documents/signals/handlers.py | 920 | # 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 | 562 | # Step 2: delete all documents | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 566 | # Step 3: rebuild with no documents — drop_table is called so the table | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 570 | # Step 4: the table must be absent (no rows) — phantom vectors gone | COMMENT |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 548 | # Step 1: create a document and build a non-empty index | COMMENT |
| LOW | src/documents/classifier.py | 356 | # Step 1: Extract and preprocess training data from the database. | COMMENT |
| LOW | src/documents/classifier.py | 455 | # Step 2: vectorize data | COMMENT |
| LOW | src/documents/classifier.py | 490 | # 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 | 429 | # subtract 1 since -1 (null) is also part of the classes. | COMMENT |
| HIGH | src/documents/tests/test_api_bulk_edit.py | 1695 | - A legacy rotate bulk edit with degrees that are null, not an | STRING |
| 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 | 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 | 61 | COMMENT | |
| LOW | src/paperless_ai/vector_store.py | 41 | # this to decide which migrations to run on an existing store. | COMMENT |
| LOW | src/paperless_ai/vector_store.py | 221 | conn.row_factory = sqlite3.Row | COMMENT |
| LOW | src/paperless_ai/indexing.py | 81 | ) | COMMENT |
| LOW | src/paperless_ai/tests/test_vector_store.py | 1101 | vec_table_spy = mocker.spy( | COMMENT |
| LOW | src/paperless/settings/__init__.py | 41 | load_dotenv(path) | COMMENT |
| LOW | src/documents/views.py | 281 | from paperless_ai.base_model import TaxonomyChoiceDict | COMMENT |
| LOW | src/documents/views.py | 1141 | # favor of the Tantivy-backed search endpoint (see filters.py's | COMMENT |
| LOW | src/documents/tests/search/test_documented_syntax.py | 341 | # Zero-width: these resolve to a single instant, not a span, so | COMMENT |
| LOW | src/documents/search/_query.py | 41 | # Uses Unicode properties to cover all blocks including Extension B+ planes. | COMMENT |
| LOW | src/documents/search/_query.py | 301 | # produce bigrams spanning the join. A run's own bigrams stay | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/paperless_ai/tables.py | 192 | def set_dim(conn: sqlite3.Connection, dim: int) -> None: | CODE |
| LOW⚡ | src/paperless_ai/tables.py | 200 | def set_embed_model(conn: sqlite3.Connection, name: str) -> None: | CODE |
| LOW⚡ | src/paperless_ai/tables.py | 209 | def set_schema_version(conn: sqlite3.Connection, version: int) -> None: | CODE |
| LOW | src/paperless/__init__.py | 7 | __all__ = [ | CODE |
| LOW | src/paperless/settings/custom.py | 15 | 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 | 224 | def _update_data_vectorizer_hash(self) -> None: | CODE |
| LOW⚡ | src/documents/tasks.py | 805 | def update_document_in_llm_index(document) -> None: | CODE |
| LOW | src/documents/tasks.py | 695 | def update_document_parent_tags(tag: Tag, new_parent: Tag) -> None: | CODE |
| LOW | src/documents/__init__.py | 4 | __all__ = ["parser_check"] | CODE |
| LOW | src/documents/serialisers.py | 258 | 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 | 18 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 562 | # Step 2: delete all documents | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 566 | # Step 3: rebuild with no documents — drop_table is called so the table | COMMENT |
| LOW⚡ | src/paperless_ai/tests/test_ai_indexing.py | 570 | # Step 4: the table must be absent (no rows) — phantom vectors gone | COMMENT |
| LOW | src/paperless_ai/tests/test_ai_indexing.py | 548 | # Step 1: create a document and build a non-empty index | COMMENT |
| LOW | src/documents/classifier.py | 356 | # Step 1: Extract and preprocess training data from the database. | COMMENT |
| LOW | src/documents/classifier.py | 455 | # Step 2: vectorize data | COMMENT |
| LOW | src/documents/classifier.py | 490 | # 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 |
|---|---|---|---|---|
| MEDIUM | docs/advanced_usage.md | 150 | ### The LLM index (RAG) and similar documents | COMMENT |
| MEDIUM | docs/usage.md | 334 | 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 |
| MEDIUM | src/paperless_ai/ai_classifier.py | 33 | # neighbours get their text spliced into the RAG context block). A wider | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 17 | # TODO: Move certain things to groups and then utilize that further | STRING |
| MEDIUM | src/paperless/parsers/tesseract.py | 242 | # the whole text, so do not utilize it in that case | COMMENT |
| LOW | src/documents/views.py | 2932 | # if all is not true, just pass through the provided document ids | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/paperless/settings/__init__.py | 751 | CODE | |
| LOW | src/paperless_mail/tests/helpers.py | 199 | CODE | |
| LOW | src/documents/parsers.py | 71 | CODE | |
| LOW | src/documents/views.py | 2481 | CODE | |
| LOW | src/documents/tests/test_management_exporter.py | 159 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/documents/tests/search/test_backend.py | 871 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/paperless/network.py | 155 | def handle_request(self, request: httpx.Request) -> httpx.Response: | CODE |