A self-hosted open source photo management service.
This report presents the forensic synthetic code analysis of LibrePhotos/librephotos, a Python project with 8,000 GitHub stars. SynthScan v2.0 examined 137,797 lines of code across 1200 source files, recording 1809 pattern matches distributed across 19 syntactic categories. The overall adjusted score of 15.5 places this repository in the Moderate 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 1809 distinct pattern matches across 19 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 | apps/frontend/src/api_client/stacks/hooks.ts | 150 | export function useRemoveFromStackMutation() { | CODE |
| LOW | apps/frontend/src/api_client/stacks/hooks.ts | 178 | export function useCreateManualStackMutation() { | CODE |
| LOW | …c/api_client/photos/hooks/usePhotoMetadataMutations.ts | 21 | export function useUpdatePhotoMetadataMutation() { | CODE |
| LOW | …c/api_client/photos/hooks/usePhotoMetadataMutations.ts | 42 | export function useRevertMetadataEditMutation() { | CODE |
| LOW | …c/api_client/photos/hooks/usePhotoMetadataMutations.ts | 61 | export function useRevertAllMetadataEditsMutation() { | CODE |
| LOW | …c/api_client/photos/hooks/usePhotoMetadataMutations.ts | 80 | export function useBulkUpdateMetadataMutation() { | CODE |
| LOW | …pi_client/photos/hooks/useFetchMetadataHistoryQuery.ts | 14 | export function useFetchMetadataHistoryQuery( | CODE |
| LOW | …/api_client/photos/hooks/useFetchPhotoMetadataQuery.ts | 14 | export function useFetchPhotoMetadataQuery( | CODE |
| LOW | apps/frontend/src/util/util.ts | 42 | export function getPhotosFlatFromSingleGroup(group: DatePhotosGroup) { | CODE |
| LOW | apps/frontend/src/util/util.ts | 46 | export function getPhotosFlatFromGroupedByDate(photosGroupedByDate: DatePhotosGroup[]) { | CODE |
| LOW | apps/frontend/src/util/util.ts | 62 | export function addTempElementsToFlatList(photosCount: number) { | CODE |
| LOW | apps/frontend/src/util/util.ts | 74 | export function getPhotosFlatFromGroupedByUser(photosGroupedByUser: any[]) { | CODE |
| LOW | apps/frontend/src/components/react-pig/index.tsx | 122 | // export function addTempElementsToFlatList(photosCount: number): ImageItem[] { | COMMENT |
| LOW | …ps/frontend/src/components/charts/FaceClusterGraph.tsx | 42 | function extractPhotoHashFromFaceUrl(faceUrl: string): string | null { | CODE |
| LOW | …d/src/components/charts/LocationDurationStackedBar.tsx | 11 | export function LocationDurationStackedBar() { | CODE |
| LOW | …/components/modals/ModalNextcloudScanDirectoryEdit.tsx | 15 | export function ModalNextcloudScanDirectoryEdit(props: Props) { | CODE |
| LOW | …nd/src/components/modals/ModalConfigBurstDetection.tsx | 52 | export function ModalConfigBurstDetection({ opened, onClose, availableRules, onAddRules }: Props) { | CODE |
| LOW | apps/frontend/src/service/notifications/albums.ts | 52 | function deleteAutogeneratedAlbums() { | CODE |
| LOW | apps/frontend/src/routes/__root.tsx | 9 | export function AppShellPublicWithoutHeader() { | CODE |
| LOW | apps/backend/api/batch_jobs.py | 12 | def batch_calculate_clip_embedding(user): | CODE |
| LOW | apps/backend/api/stack_detection.py | 132 | def _detect_bursts_hard_criteria(user, hard_rules, progress_callback=None): | CODE |
| LOW | apps/backend/api/stack_detection.py | 200 | def _detect_bursts_soft_criteria( | CODE |
| LOW | apps/backend/api/image_similarity.py | 71 | def build_image_similarity_index(user): | CODE |
| LOW | apps/backend/api/services.py | 173 | def has_required_cpu_features(service): | CODE |
| LOW | apps/backend/api/date_time_extractor.py | 64 | def _extract_no_tz_datetime_from_str(x, regexp=REGEXP_NO_TZ, group_mapping=None): | CODE |
| LOW | apps/backend/api/date_time_extractor.py | 253 | def _check_condition_filename(self, path): | CODE |
| LOW | apps/backend/api/background_tasks.py | 41 | def add_photos_to_album_things(): | CODE |
| LOW | apps/backend/api/perceptual_hash.py | 21 | def calculate_perceptual_hash(image_path: str, hash_size: int = 8) -> str | None: | CODE |
| LOW⚡ | apps/backend/api/perceptual_hash.py | 47 | def calculate_hash_from_thumbnail(thumbnail_path: str) -> str | None: | CODE |
| LOW | apps/backend/api/admin.py | 22 | def deduplicate_faces_function(queryset): | CODE |
| LOW | apps/backend/api/stats.py | 541 | def get_searchterms_wordcloud(user): | CODE |
| LOW | apps/backend/api/burst_detection_rules.py | 122 | def _check_condition_filename(self, path): | CODE |
| LOW | apps/backend/api/burst_detection_rules.py | 211 | def _check_exif_sequence_number(self, photo, exif_tags): | CODE |
| LOW | apps/backend/api/burst_detection_rules.py | 335 | def group_photos_by_timestamp(photos, interval_ms=2000, require_same_camera=True): | CODE |
| LOW | apps/backend/api/burst_detection_rules.py | 399 | def group_photos_by_visual_similarity(photos, similarity_threshold=15): | CODE |
| LOW | apps/backend/api/burst_detection_rules.py | 541 | def get_default_burst_detection_rules(): | CODE |
| LOW | apps/backend/api/burst_detection_rules.py | 546 | def get_all_predefined_burst_rules(): | CODE |
| LOW | apps/backend/api/face_classify.py | 233 | def delete_persons_without_faces(): | CODE |
| LOW | apps/backend/api/thumbnails.py | 119 | def create_animated_thumbnail(input_path, output_height, output_path, hash, file_type): | CODE |
| LOW | apps/backend/api/thumbnails.py | 145 | def create_thumbnail_for_video(input_path, output_path, hash, file_type): | CODE |
| LOW⚡ | apps/backend/api/thumbnails.py | 166 | def does_static_thumbnail_exist(output_path, hash): | CODE |
| LOW⚡ | apps/backend/api/thumbnails.py | 172 | def does_video_thumbnail_exist(output_path, hash): | CODE |
| LOW | apps/backend/api/semantic_search.py | 28 | def calculate_query_embeddings(query): | CODE |
| LOW | apps/backend/api/face_extractor.py | 92 | def extract_from_face_service(image_path, big_thumbnail_path): | CODE |
| LOW⚡ | apps/backend/api/stacks/live_photo.py | 38 | def _locate_google_embedded_video(data: bytes) -> int: | CODE |
| LOW⚡ | apps/backend/api/stacks/live_photo.py | 48 | def _locate_samsung_embedded_video(data: bytes) -> int: | CODE |
| LOW⚡ | apps/backend/api/stacks/live_photo.py | 57 | def has_embedded_motion_video(path: str) -> bool: | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 88 | def extract_embedded_motion_video(path: str, output_hash: str) -> str | None: | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 129 | def find_apple_live_photo_video(image_path: str) -> str | None: | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 186 | def _create_embedded_live_photo_stack( | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 229 | def _create_apple_live_photo_stack( | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 277 | def process_live_photos_batch(user: "User", photos: list["Photo"]) -> dict: | CODE |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 86 | def _select_groups_to_process( | CODE |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 117 | def wait_for_group_and_process_metadata( | CODE |
| LOW | apps/backend/api/directory_watcher/file_grouping.py | 94 | def find_matching_image_for_video(video_path: str, user) -> Photo | None: | CODE |
| LOW | apps/backend/api/directory_watcher/utils.py | 28 | def _exceeds_failure_threshold(error_count: int, target: int) -> bool: | CODE |
| LOW | apps/backend/api/directory_watcher/repair_jobs.py | 16 | def repair_ungrouped_file_variants(user, job_id: UUID): | CODE |
| LOW⚡ | …ckend/api/tests/test_bktree_and_duplicate_detection.py | 362 | def test_batch_detection_exact_only(self): | CODE |
| LOW⚡ | …ckend/api/tests/test_bktree_and_duplicate_detection.py | 377 | def test_batch_detection_visual_only(self): | CODE |
| LOW⚡ | …ckend/api/tests/test_bktree_and_duplicate_detection.py | 419 | def test_batch_detection_with_null_options(self): | CODE |
| 1204 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/nextcloud/directory_watcher.py | 25 | except Exception: | CODE |
| LOW | apps/backend/nextcloud/directory_watcher.py | 87 | except Exception as e: | CODE |
| LOW | apps/backend/nextcloud/views.py | 46 | except Exception: | CODE |
| LOW | apps/backend/api/batch_jobs.py | 65 | except Exception as e: | CODE |
| LOW | apps/backend/api/stack_detection.py | 167 | except Exception as e: | CODE |
| LOW | apps/backend/api/stack_detection.py | 368 | except Exception as e: | CODE |
| LOW | apps/backend/api/duplicate_detection.py | 531 | except Exception as e: | CODE |
| LOW | apps/backend/api/services.py | 125 | except Exception as e: | CODE |
| MEDIUM | apps/backend/api/services.py | 98 | def stop_service(service): | CODE |
| LOW | apps/backend/api/background_tasks.py | 37 | except Exception: | CODE |
| LOW⚡ | apps/backend/api/perceptual_hash.py | 42 | except Exception as e: | CODE |
| LOW | apps/backend/api/perceptual_hash.py | 78 | except Exception as e: | CODE |
| LOW | apps/backend/api/all_tasks.py | 65 | except Exception: | CODE |
| LOW | apps/backend/api/all_tasks.py | 74 | except Exception: | CODE |
| LOW | apps/backend/api/all_tasks.py | 114 | except Exception as e: | CODE |
| LOW | apps/backend/api/all_tasks.py | 135 | except Exception as e: | CODE |
| LOW | apps/backend/api/util.py | 44 | except Exception: | CODE |
| LOW | apps/backend/api/util.py | 77 | except Exception: | CODE |
| MEDIUM | apps/backend/api/util.py | 73 | def is_number(s): | CODE |
| LOW | apps/backend/api/nextcloud.py | 18 | except Exception: | CODE |
| LOW | apps/backend/api/llm.py | 28 | except Exception as e: | CODE |
| MEDIUM | apps/backend/api/llm.py | 29 | print(f"Error converting image to data URI: {str(e)}") | CODE |
| LOW | apps/backend/api/llm.py | 57 | except Exception as e: | CODE |
| MEDIUM | apps/backend/api/llm.py | 58 | print(f"Error converting image: {e}") | CODE |
| MEDIUM⚡ | apps/backend/api/llm.py | 75 | print("Error with LLM service: Cannot connect to service on port 8008") | CODE |
| MEDIUM⚡ | apps/backend/api/llm.py | 78 | print("Error with LLM service: Request timeout") | CODE |
| LOW⚡ | apps/backend/api/llm.py | 80 | except Exception as e: | CODE |
| MEDIUM⚡ | apps/backend/api/llm.py | 81 | print(f"Error with LLM service: {e}") | CODE |
| LOW | apps/backend/api/apps.py | 17 | except Exception: | CODE |
| LOW | apps/backend/api/autoalbum.py | 41 | except Exception as e: | CODE |
| LOW | apps/backend/api/autoalbum.py | 151 | except Exception as e: | CODE |
| LOW | apps/backend/api/autoalbum.py | 207 | except Exception as e: | CODE |
| MEDIUM⚡ | apps/backend/api/image_captioning.py | 38 | print("Error with Moondream captioning service: Request timeout") | CODE |
| LOW⚡ | apps/backend/api/image_captioning.py | 40 | except Exception as e: | CODE |
| MEDIUM⚡ | apps/backend/api/image_captioning.py | 41 | print(f"Error with Moondream captioning service: {e}") | CODE |
| LOW | apps/backend/api/stats.py | 587 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 610 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 673 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 734 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 750 | except Exception: | CODE |
| LOW | apps/backend/api/api_util.py | 36 | except Exception: | CODE |
| MEDIUM | apps/backend/api/api_util.py | 33 | def has_hidden_attribute(filepath): | CODE |
| LOW | apps/backend/api/thumbnails.py | 114 | except Exception as e: | CODE |
| LOW | apps/backend/api/thumbnails.py | 140 | except Exception as e: | CODE |
| LOW⚡ | apps/backend/api/thumbnails.py | 161 | except Exception as e: | CODE |
| MEDIUM | apps/backend/api/thumbnails.py | 57 | def create_thumbnail( | CODE |
| MEDIUM | apps/backend/api/thumbnails.py | 119 | def create_animated_thumbnail(input_path, output_height, output_path, hash, file | CODE |
| MEDIUM | apps/backend/api/thumbnails.py | 145 | def create_thumbnail_for_video(input_path, output_path, hash, file_type): | CODE |
| LOW | apps/backend/api/face_extractor.py | 95 | except Exception: | CODE |
| MEDIUM | apps/backend/api/face_extractor.py | 92 | def extract_from_face_service(image_path, big_thumbnail_path): | CODE |
| LOW | apps/backend/api/social_graph.py | 127 | except Exception: | STRING |
| MEDIUM | apps/backend/api/social_graph.py | 94 | def build_social_graph(user): | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 83 | except Exception as e: | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 124 | except Exception as e: | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 299 | except Exception as e: | CODE |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 147 | except Exception as e: | CODE |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 209 | except Exception as e: | CODE |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 405 | except Exception as e: | CODE |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 428 | except Exception as e: | CODE |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 465 | except Exception as e: | CODE |
| 123 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/backend/api/face_classify.py | 35 | # Create a color mapping for each person | COMMENT |
| MEDIUM | apps/backend/api/directory_watcher/file_handlers.py | 68 | # Create the File record (File.create handles race conditions via unique path constraint) | COMMENT |
| MEDIUM | apps/backend/api/tests/test_file_path_uniqueness.py | 88 | # Create a temp directory for test files | COMMENT |
| MEDIUM | apps/backend/api/tests/test_duplicate_filtering.py | 272 | # Create a pending duplicate first | COMMENT |
| MEDIUM | apps/backend/api/tests/test_api_robustness.py | 42 | # Create a duplicate | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_social_graph.py | 24 | # Create a photo | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_social_graph.py | 31 | # Create a person | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_social_graph.py | 34 | # Create a face | COMMENT |
| MEDIUM | apps/backend/api/tests/test_social_graph.py | 51 | # Create a photo | COMMENT |
| MEDIUM | apps/backend/api/tests/test_photo_metadata.py | 556 | # Create an edit | COMMENT |
| MEDIUM | apps/backend/api/tests/test_thumbnail_migration.py | 19 | # Create a temporary directory for test thumbnails | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_photo_model_integration.py | 292 | # Create a photo with search data | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_photo_model_integration.py | 313 | # Create a photo with search data | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_photo_model_integration.py | 320 | # Create an album date and add the photo to it | COMMENT |
| MEDIUM | apps/backend/api/tests/test_search_term_examples.py | 16 | # Create a photo with captions and geolocation | COMMENT |
| MEDIUM | apps/backend/api/tests/test_search_term_examples.py | 51 | # Create a photo without captions | COMMENT |
| MEDIUM | apps/backend/api/tests/test_search_term_examples.py | 86 | # Create a photo with captions and geolocation | COMMENT |
| MEDIUM | apps/backend/api/tests/test_duplicate_detection.py | 477 | # Create a duplicate and manually remove all but one photo | COMMENT |
| MEDIUM | apps/backend/api/tests/test_multi_user_isolation.py | 231 | # Create a stack for user1 | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_redetection_idempotency.py | 500 | # Create a photo (create_test_photo adds its own file) | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_redetection_idempotency.py | 509 | # Create a JPEG file | COMMENT |
| MEDIUM | apps/backend/api/tests/test_redetection_idempotency.py | 276 | # Create a duplicate | COMMENT |
| MEDIUM | apps/backend/api/tests/test_redetection_idempotency.py | 306 | # Create a manual stack | COMMENT |
| MEDIUM | apps/backend/api/tests/test_redetection_idempotency.py | 330 | # Create a duplicate group | COMMENT |
| MEDIUM | apps/backend/api/tests/test_redetection_idempotency.py | 363 | # Create a pending duplicate | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_detection_edge_cases.py | 256 | # Create a regular test photo (which has main_file) | COMMENT |
| MEDIUM | apps/backend/api/tests/test_thumbnail_naming.py | 19 | # Create a photo with thumbnail | COMMENT |
| MEDIUM | apps/backend/api/tests/test_thumbnail_naming.py | 49 | # Create a photo | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_stats_accuracy.py | 292 | # Create a valid stack | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_stats_accuracy.py | 300 | # Create an old duplicate-type stack (should be excluded) | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_perceptual_hash.py | 391 | # Create a horizontal gradient pattern | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_perceptual_hash.py | 398 | # Create a vertical gradient pattern (different structure) | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_perceptual_hash.py | 550 | # Create a large list of hashes | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_perceptual_hash.py | 564 | # Create a CMYK image | COMMENT |
| MEDIUM | apps/backend/api/tests/test_perceptual_hash.py | 655 | # Create a list of 100 hashes | COMMENT |
| MEDIUM | apps/backend/api/tests/utils.py | 176 | # Create the photo with remaining kwargs | COMMENT |
| MEDIUM | apps/backend/api/tests/test_im2txt.py | 60 | # Define the path to the output JSON file | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_photo_lifecycle.py | 533 | # Create a temp file to simulate a real file | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_photo_lifecycle.py | 539 | # Create a file that's only used by one photo | COMMENT |
| MEDIUM | apps/backend/api/tests/test_photo_lifecycle.py | 486 | # Create a shared file | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_live_photo.py | 290 | # Create a regular JPEG without embedded video | COMMENT |
| MEDIUM | apps/backend/api/tests/test_live_photo.py | 263 | # Create a fake motion photo file | COMMENT |
| MEDIUM | apps/backend/api/tests/test_live_photo.py | 422 | # Create a mock photo with existing stack | COMMENT |
| MEDIUM | apps/backend/api/tests/test_live_photo.py | 444 | # Create a test file | COMMENT |
| MEDIUM | apps/backend/api/tests/test_live_photo.py | 455 | # Create a test photo with required fields | COMMENT |
| MEDIUM | apps/backend/api/tests/test_live_photo.py | 474 | # Create a real video file to avoid foreign key issues | COMMENT |
| MEDIUM | apps/backend/api/tests/test_live_photo.py | 508 | # Create a real video file | COMMENT |
| MEDIUM | apps/backend/api/tests/test_stack_detection.py | 200 | # Create a test stack | COMMENT |
| MEDIUM | apps/backend/api/tests/test_scan_percentage_bug.py | 150 | # Create a temporary empty directory for testing | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0101.py | 38 | # Create a photo with caption | COMMENT |
| MEDIUM | apps/backend/api/tests/test_directory_watcher_fix.py | 14 | # Create a photo without places365 captions | COMMENT |
| MEDIUM | apps/backend/api/tests/test_directory_watcher_fix.py | 43 | # Create a photo with places365 captions | COMMENT |
| MEDIUM | apps/backend/api/serializers/album_date.py | 68 | # This method is removed as we're directly including paginated photos in the response. | COMMENT |
| MEDIUM | apps/backend/api/views/photo_metadata.py | 152 | # Create a new edit record for the revert | COMMENT |
| MEDIUM | …end/service/image_captioning/api/im2txt/build_vocab.py | 53 | # Create a vocab wrapper and add some special tokens. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy/docker/unified/entrypoint.sh | 56 | email = os.environ.get('ADMIN_EMAIL', 'admin@example.com') | CODE |
| LOW | apps/frontend/e2e/test/pages/login-page.ts | 15 | .should("have.attr", "placeholder", "Username") | CODE |
| LOW | apps/frontend/e2e/test/pages/login-page.ts | 24 | .should("have.attr", "placeholder", "Password") | CODE |
| LOW | apps/frontend/src/locales/sk/translation.json | 22 | "placeholder": "Minimálne hodnotenie" | CODE |
| LOW | apps/frontend/src/locales/sk/translation.json | 116 | "placeholder": "Výsledky sémantického vyhľadávania", | CODE |
| LOW | apps/frontend/src/locales/sk/translation.json | 182 | "placeholder": "Názov albumu", | CODE |
| LOW | apps/frontend/src/locales/pl/translation.json | 101 | "placeholder": "Wyniki wyszukiwania semantycznego", | CODE |
| LOW | apps/frontend/src/locales/pl/translation.json | 111 | "placeholder": "Minimalna ocena" | CODE |
| LOW | apps/frontend/src/locales/pl/translation.json | 421 | "placeholder": "Tytuł albumu", | CODE |
| LOW | apps/frontend/src/locales/sv/translation.json | 101 | "placeholder": "Lägsta betyg" | CODE |
| LOW | apps/frontend/src/locales/sv/translation.json | 115 | "placeholder": "Semantiska sökresultat", | CODE |
| LOW | apps/frontend/src/locales/sv/translation.json | 203 | "placeholder": "Albumtitel" | CODE |
| LOW | apps/frontend/src/locales/da/translation.json | 131 | "placeholder": "Semantisk søgning resultater", | CODE |
| LOW | apps/frontend/src/locales/da/translation.json | 141 | "placeholder": "Minimum vurdering" | CODE |
| LOW | apps/frontend/src/locales/pt_BR/translation.json | 78 | "placeholder": "Máximo de resultados de pesquisa semântica", | CODE |
| LOW | apps/frontend/src/locales/pt_BR/translation.json | 95 | "placeholder": "Classificação mínima" | CODE |
| LOW | apps/frontend/src/locales/pt_BR/translation.json | 272 | "placeholder": "Título do álbum", | CODE |
| LOW | apps/frontend/src/locales/ja/translation.json | 76 | "placeholder": "セマンティック検索結果", | CODE |
| LOW | apps/frontend/src/locales/ja/translation.json | 85 | "placeholder": "最小レート" | CODE |
| LOW | apps/frontend/src/locales/it/translation.json | 84 | "placeholder": "Minimo voto" | CODE |
| LOW | apps/frontend/src/locales/it/translation.json | 148 | "placeholder": "Risultati ricerca semantica", | CODE |
| LOW | apps/frontend/src/locales/it/translation.json | 340 | "placeholder": "Titolo album" | CODE |
| LOW | apps/frontend/src/locales/nb_NO/translation.json | 82 | "placeholder": "Semantiske søkeresultater", | CODE |
| LOW | apps/frontend/src/locales/nb_NO/translation.json | 100 | "placeholder": "Minimumsvurdering" | CODE |
| LOW | apps/frontend/src/locales/nb_NO/translation.json | 619 | "placeholder": "Albumsnavn", | CODE |
| LOW | apps/frontend/src/locales/cs/translation.json | 100 | "placeholder": "Výsledky sémantického vyhledávání", | CODE |
| LOW | apps/frontend/src/locales/cs/translation.json | 109 | "placeholder": "Minimální hodnocení" | CODE |
| LOW | apps/frontend/src/locales/cs/translation.json | 170 | "placeholder": "Název alba", | CODE |
| LOW | apps/frontend/src/locales/zh_Hans/translation.json | 85 | "placeholder": "语义化搜索结果", | CODE |
| LOW | apps/frontend/src/locales/zh_Hans/translation.json | 95 | "placeholder": "最低等级" | CODE |
| LOW | apps/frontend/src/locales/zh_Hans/translation.json | 646 | "placeholder": "相册标题", | CODE |
| LOW | apps/frontend/src/locales/ru/translation.json | 106 | "placeholder": "Результаты семантического поиска", | CODE |
| LOW | apps/frontend/src/locales/ru/translation.json | 116 | "placeholder": "Минимальный рейтинг" | CODE |
| LOW | apps/frontend/src/locales/ru/translation.json | 206 | "placeholder": "Название альбома", | CODE |
| LOW | apps/frontend/src/locales/zh_Hant/translation.json | 98 | "placeholder": "最低評級" | CODE |
| LOW | apps/frontend/src/locales/zh_Hant/translation.json | 163 | "placeholder": "相冊名稱" | CODE |
| LOW | apps/frontend/src/locales/pt/translation.json | 47 | "placeholder": "Resultados da pesquisa semântica", | CODE |
| LOW | apps/frontend/src/locales/pt/translation.json | 105 | "placeholder": "Classificação mínima" | CODE |
| LOW | apps/frontend/src/locales/pt/translation.json | 323 | "placeholder": "Título do álbum", | CODE |
| LOW | apps/frontend/src/locales/pt/translation.json | 944 | "placeholder": "Procurar fotos, correr comandos...", | CODE |
| LOW | apps/frontend/src/locales/uk/translation.json | 108 | "placeholder": "Результати семантичного пошуку" | CODE |
| LOW | apps/frontend/src/locales/uk/translation.json | 140 | "placeholder": "Мінімальний рейтинг" | CODE |
| LOW | apps/frontend/src/locales/uk/translation.json | 234 | "placeholder": "Назва альбому", | CODE |
| LOW | apps/frontend/src/locales/nl/translation.json | 106 | "placeholder": "Semantische zoekresultaten", | CODE |
| LOW | apps/frontend/src/locales/nl/translation.json | 118 | "placeholder": "Minimale waardering" | CODE |
| LOW | apps/frontend/src/locales/nl/translation.json | 651 | "placeholder": "Albumnaam", | CODE |
| LOW | apps/frontend/src/locales/hi/translation.json | 145 | "placeholder": "सिमेंटिक खोज परिणाम" | CODE |
| LOW | apps/frontend/src/locales/hi/translation.json | 151 | "placeholder": "न्यूनतम रेटिंग" | CODE |
| LOW | apps/frontend/src/locales/hi/translation.json | 454 | "placeholder": "एल्बम का शीर्षक", | CODE |
| LOW | apps/frontend/src/locales/de/translation.json | 93 | "placeholder": "Anzahl der Resultate", | CODE |
| LOW | apps/frontend/src/locales/de/translation.json | 103 | "placeholder": "Minimale Bewertung" | CODE |
| LOW | apps/frontend/src/locales/de/translation.json | 661 | "placeholder": "Albumtitel", | CODE |
| LOW | apps/frontend/src/locales/ko/translation.json | 142 | "placeholder": "시맨틱(의미 기반) 검색 결과", | CODE |
| LOW | apps/frontend/src/locales/ko/translation.json | 152 | "placeholder": "최소 평점" | CODE |
| LOW | apps/frontend/src/locales/ko/translation.json | 239 | "placeholder": "앨범 제목", | CODE |
| LOW | apps/frontend/src/locales/fi/translation.json | 97 | "placeholder": "Semanttiset hakutulokset" | CODE |
| LOW | apps/frontend/src/locales/fi/translation.json | 114 | "placeholder": "Vähimmäisarvosana" | CODE |
| LOW | apps/frontend/src/locales/fi/translation.json | 163 | "placeholder": "Albumin otsikko", | CODE |
| LOW | apps/frontend/src/locales/eo/translation.json | 183 | "placeholder": "Titolo de albumo", | CODE |
| LOW | apps/frontend/src/locales/fr/translation.json | 93 | "placeholder": "Résultat recherche sémantique", | CODE |
| 25 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | apps/backend/api/models/photo_search.py | 68 | for face in api.models.face.Face.objects.filter(photo=self.photo).all(): | CODE |
| CRITICAL | apps/backend/api/models/photo.py | 237 | return api.models.album_place.AlbumPlace.objects.filter( | CODE |
| CRITICAL | apps/backend/api/models/photo.py | 416 | api.models.face.Face.objects.filter(photo=self).values_list( | CODE |
| CRITICAL | apps/backend/api/models/photo_caption.py | 248 | for album_thing in api.models.album_thing.AlbumThing.objects.filter( | CODE |
| CRITICAL | apps/backend/api/models/photo_caption.py | 349 | for album_thing in api.models.album_thing.AlbumThing.objects.filter( | CODE |
| CRITICAL | apps/backend/api/models/photo_caption.py | 382 | for album_thing in api.models.album_thing.AlbumThing.objects.filter( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/librephotos/settings/development.py | 1 | CODE | |
| LOW | apps/backend/librephotos/settings/test.py | 1 | CODE | |
| LOW | apps/backend/librephotos/settings/test_sqlite.py | 8 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/live_photo.py | 26 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 16 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 16 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 16 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 16 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 24 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 24 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 24 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 24 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 24 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 33 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 33 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 33 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 33 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 33 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 33 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 43 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 43 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 43 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 43 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 43 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 43 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 53 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 58 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 58 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 58 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 58 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 58 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 67 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 1 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 2 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 3 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 4 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 5 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 6 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 7 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 8 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 9 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 10 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 11 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 12 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 13 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 15 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 16 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 17 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 18 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 19 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/backend/api/util.py | 144 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | apps/backend/api/util.py | 146 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_migration_0099.py | 552 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_migration_0099.py | 554 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_migration_0099.py | 585 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_migration_0099.py | 587 | # ============================================================================ | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0099.py | 31 | # ============================================================================ | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0099.py | 33 | # ============================================================================ | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0099.py | 62 | # ============================================================================ | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0099.py | 64 | # ============================================================================ | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0099.py | 293 | # ============================================================================ | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0099.py | 295 | # ============================================================================ | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0099.py | 515 | # ============================================================================ | COMMENT |
| MEDIUM | apps/backend/api/tests/test_migration_0099.py | 517 | # ============================================================================ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/api/batch_jobs.py | 12 | CODE | |
| LOW | apps/backend/api/stack_detection.py | 200 | CODE | |
| LOW | apps/backend/api/duplicate_detection.py | 274 | CODE | |
| LOW | apps/backend/api/services.py | 140 | CODE | |
| LOW | apps/backend/api/date_time_extractor.py | 292 | CODE | |
| LOW | apps/backend/api/date_time_extractor.py | 308 | CODE | |
| LOW | apps/backend/api/all_tasks.py | 30 | CODE | |
| LOW | apps/backend/api/autoalbum.py | 48 | CODE | |
| LOW | apps/backend/api/admin.py | 22 | CODE | |
| LOW | apps/backend/api/stats.py | 541 | CODE | |
| LOW | apps/backend/api/stats.py | 657 | CODE | |
| LOW | apps/backend/api/stats.py | 719 | CODE | |
| LOW | apps/backend/api/burst_detection_rules.py | 233 | CODE | |
| LOW | apps/backend/api/drf_optimize.py | 42 | CODE | |
| LOW | apps/backend/api/face_classify.py | 276 | CODE | |
| LOW | apps/backend/api/thumbnails.py | 57 | CODE | |
| LOW | apps/backend/api/ml_models.py | 246 | CODE | |
| LOW | apps/backend/api/face_extractor.py | 10 | CODE | |
| LOW | apps/backend/api/stacks/live_photo.py | 88 | CODE | |
| LOW | apps/backend/api/stacks/live_photo.py | 277 | CODE | |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 238 | CODE | |
| LOW | apps/backend/api/directory_watcher/utils.py | 117 | CODE | |
| LOW | apps/backend/api/directory_watcher/repair_jobs.py | 16 | CODE | |
| LOW | apps/backend/api/tests/test_face_writeback.py | 92 | CODE | |
| LOW | apps/backend/api/tests/test_perceptual_hash.py | 578 | CODE | |
| LOW | apps/backend/api/tests/utils.py | 231 | CODE | |
| LOW | apps/backend/api/tests/test_iptc_integration.py | 51 | CODE | |
| LOW | …s/backend/api/tests/test_metadata_ordering_sentinel.py | 96 | CODE | |
| LOW | apps/backend/api/management/commands/scan.py | 30 | CODE | |
| LOW | apps/backend/api/models/photo_search.py | 28 | CODE | |
| LOW | apps/backend/api/models/album_auto.py | 30 | CODE | |
| LOW | apps/backend/api/models/photo_stack.py | 124 | CODE | |
| LOW | apps/backend/api/serializers/photos.py | 207 | CODE | |
| LOW | apps/backend/api/views/jobs.py | 36 | CODE | |
| LOW | apps/backend/api/views/photos.py | 874 | CODE | |
| LOW | apps/backend/api/views/views.py | 43 | CODE | |
| LOW | apps/backend/api/views/views.py | 660 | CODE | |
| LOW | apps/backend/api/views/views.py | 695 | CODE | |
| LOW | apps/backend/api/metadata/face_regions.py | 20 | CODE | |
| LOW | apps/backend/api/metadata/writer.py | 9 | CODE | |
| LOW | apps/backend/service/llm/main.py | 32 | CODE | |
| LOW | apps/backend/service/tags/siglip2/siglip2.py | 64 | CODE | |
| LOW | apps/backend/service/exif/main.py | 17 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/med.py | 665 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/med.py | 741 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/vit.py | 273 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/vit.py | 277 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/CONTRIBUTING.md | 25 | ### Step 1: Clone the Monorepo | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 49 | ### Step 2: Configure Environment | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 71 | ### Step 3: Start the Development Environment | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 265 | ### Step 1: Fork the Repository | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 277 | ### Step 2: Create a Feature Branch | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 287 | ### Step 3: Make Your Changes | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 305 | ### Step 4: Push and Create Pull Request | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 320 | ### Step 5: Respond to Review | COMMENT |
| LOW⚡ | apps/backend/api/tests/test_face_writeback.py | 228 | # Step 1: Convert pixel -> normalized (writeback path) | COMMENT |
| LOW⚡ | apps/backend/api/tests/test_face_writeback.py | 238 | # Step 2: Simulate read-back (face_extractor.py lines 82-90) | COMMENT |
| LOW | apps/docs/docs/user-guide/first-steps.md | 11 | ### Step 1: Create Your Admin Account | COMMENT |
| LOW | apps/docs/docs/user-guide/first-steps.md | 24 | ### Step 2: Site Settings | COMMENT |
| LOW | apps/docs/docs/user-guide/first-steps.md | 33 | ### Step 3: Configure Your Scan Directory | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 9 | ### Step 1: Download the Models Manually | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 37 | ### Step 2: Place the Models in the Correct Location | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 60 | ### Step 3: Verify Model Placement | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 83 | ### Step 4: Run LibrePhotos | COMMENT |
| LOW⚡ | apps/docs/docs/user-guide/places.md | 56 | ### Step 1: Configure Geocoding Provider (Optional) | COMMENT |
| LOW⚡ | apps/docs/docs/user-guide/places.md | 63 | ### Step 2: Scan Your Photos | COMMENT |
| LOW⚡ | apps/docs/docs/user-guide/places.md | 69 | ### Step 3: View Your Places | COMMENT |
| LOW | apps/docs/docs/development/dev-install.md | 27 | ### Step 1: Clone the Monorepo | COMMENT |
| LOW | apps/docs/docs/development/dev-install.md | 51 | ### Step 2: Configure Environment | COMMENT |
| LOW | apps/docs/docs/development/dev-install.md | 80 | ### Step 3: Start Development Environment | COMMENT |
| LOW | apps/docs/docs/development/dev-install.md | 92 | ### Step 4: Access LibrePhotos | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy/docker/unified/entrypoint.sh | 7 | # Check if we should serve frontend | COMMENT |
| LOW | deploy/docker/unified/entrypoint.sh | 46 | # Check if we need to create a superuser | COMMENT |
| LOW | deploy/compose/build-unified.sh | 10 | # Check if we're in the right directory | COMMENT |
| LOW | apps/backend/api/services.py | 146 | # Check if we're on ARM architecture | COMMENT |
| LOW | apps/backend/api/services.py | 182 | # Check if we're on ARM architecture | COMMENT |
| LOW | apps/backend/api/image_captioning.py | 8 | # Check if Moondream is selected as captioning model | COMMENT |
| LOW | apps/backend/api/burst_detection_rules.py | 374 | # Check if same camera (if required) | COMMENT |
| LOW | apps/backend/api/face_classify.py | 265 | if len(encoding) == expected_shape: # Check if shape is consistent | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 235 | # Check if video is already a known photo/file | COMMENT |
| LOW | apps/backend/api/directory_watcher/file_handlers.py | 107 | # Check if a Photo already exists with any of these files. Matching on | COMMENT |
| LOW | apps/backend/api/directory_watcher/file_handlers.py | 223 | # Check if this RAW file is already attached | COMMENT |
| LOW | apps/backend/api/directory_watcher/file_handlers.py | 237 | # Check if this video is already attached | COMMENT |
| LOW | apps/backend/api/directory_watcher/repair_jobs.py | 53 | # Check if this RAW photo has any IMAGE files (already grouped) | COMMENT |
| LOW | apps/backend/api/tests/test_duplicate_api_edge_cases.py | 409 | # Check if duplicate still exists (might be deleted due to Bug #12 fix) | COMMENT |
| LOW | apps/backend/api/tests/test_im2txt.py | 102 | # Check if the required files exist in the fixtures directory | COMMENT |
| LOW | apps/backend/api/models/file.py | 68 | # Check if a File with this path already exists | COMMENT |
| LOW | apps/backend/api/models/duplicate.py | 259 | # Check if any photo is already in a duplicate group of the same type | COMMENT |
| LOW | apps/backend/api/models/photo.py | 526 | # Check if this file is used by other Photos (via files M2M or as main_file) | COMMENT |
| LOW | apps/backend/api/models/photo_stack.py | 216 | # Check if any photo is already in a stack of the same type | COMMENT |
| LOW | apps/backend/api/serializers/photos.py | 625 | # Check if this is the main file | COMMENT |
| LOW | apps/backend/api/views/views.py | 762 | # Check if fname is UUID format (36 chars with 4 hyphens) or image_hash | COMMENT |
| LOW | apps/backend/api/views/stacks.py | 429 | # Check if any photo is already in a manual stack | COMMENT |
| LOW | …/backend/service/image_captioning/api/im2txt/sample.py | 49 | # Check if the image has 3 channels (RGB) | COMMENT |
| LOW | apps/backend/image_similarity/retrieval_index.py | 21 | # Check if we have any embeddings to process | COMMENT |
| LOW | apps/backend/image_similarity/retrieval_index.py | 57 | # Add hashes to the list | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | deploy/docker/unified/production_noproxy.py | 271 | # Based on best practices from https://alldjango.com/articles/definitive-guide-to-using-django-sqlite-in-production | COMMENT |
| MEDIUM⚡ | apps/backend/api/perceptual_hash.py | 39 | # More robust than average hash or difference hash | COMMENT |
| MEDIUM⚡ | apps/backend/api/tests/test_photo_search_model.py | 175 | # Create comprehensive test data | COMMENT |
| MEDIUM | apps/backend/api/serializers/photos.py | 107 | # Use len() instead of .count() to leverage prefetched embedded_media | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy/k8s/ingress.yaml | 21 | service: | COMMENT |
| LOW | deploy/k8s/ingress.yaml | 41 | # - photos.example.com | COMMENT |
| LOW | …ontend/src/components/react-pig/computeLayoutGroups.js | 41 | // or when we're out of images, we say that we have all the images we | COMMENT |
| LOW | apps/frontend/src/components/react-pig/utils/getUrl.js | 1 | // This is the default getUrl function, which you can overwrite using a prop; | COMMENT |
| LOW | …rontend/src/components/react-pig/utils/getOffsetTop.js | 1 | // /** | COMMENT |
| LOW | apps/backend/requirements.txt | 61 | # On the GPU image (Python 3.10) the Dockerfile swaps this for | COMMENT |
| LOW | apps/backend/chunked_upload/tests.py | 1 | # Tests for chunked_upload should be created on the app where it is being used, | COMMENT |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 301 | metadata_paths.append(path) | COMMENT |
| LOW | apps/backend/api/models/photo_stack.py | 41 | class StackType(models.TextChoices): | COMMENT |
| LOW | apps/backend/api/metadata/__init__.py | 1 | # api/metadata — organized metadata reading, writing, and tag constants. | COMMENT |
| LOW | apps/backend/service/tags/places365/places365.py | 161 | # output the prediction of scene category | COMMENT |
| LOW | apps/mobile/ios/LibrePhotosMobile/AppDelegate.mm | 1 | #import "AppDelegate.h" | COMMENT |
| LOW | …oid/app/src/main/jni/MainApplicationModuleProvider.cpp | 1 | #include "MainApplicationModuleProvider.h" | COMMENT |
| LOW | apps/mobile/src/Config/index.js | 1 | // import { store } from '../Store' | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/api/stats.py | 431 | CODE | |
| LOW | apps/backend/api/stats.py | 495 | CODE | |
| LOW | apps/backend/api/social_graph.py | 143 | CODE | |
| LOW | apps/backend/api/tests/utils.py | 55 | CODE | |
| LOW | apps/backend/api/serializers/person.py | 32 | CODE | |
| LOW | apps/backend/api/serializers/album_user.py | 53 | CODE | |
| LOW | apps/backend/api/serializers/album_thing.py | 33 | CODE | |
| LOW | apps/backend/api/serializers/album_place.py | 34 | CODE | |
| LOW | apps/backend/service/tags/places365/wideresnet.py | 47 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/med.py | 453 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/med.py | 741 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/med.py | 929 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/vit.py | 109 | CODE | |
| LOW | …ackend/service/image_captioning/api/im2txt/blip/vit.py | 155 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/api/apps.py | 5 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/stacks/__init__.py | 22 | __all__ = [ | CODE |
| LOW | apps/backend/api/directory_watcher/__init__.py | 69 | __all__ = [ | CODE |
| LOW | apps/backend/api/tests/test_authz_scoping.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/tests/test_user.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/tests/test_bulk_operations.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/tests/test_share_photos.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/tests/test_public_photos.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/models/__init__.py | 21 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/backend/api/models/user.py | 44 | "share_captions": False, # AI-generated or user captions | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/backend/api/views/photo_filters.py | 14 | Build a Photo queryset from filter parameters. This function reuses the same filtering logic as AlbumDateListViewSe | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/backend/service/llm/main.py | 55 | n_ctx=2048, # Increase context window for image processing | CODE |
| MEDIUM | apps/backend/service/tags/siglip2/siglip2.py | 168 | # Use prompt template for better zero-shot performance | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | apps/backend/api/tests/test_face_writeback.py | 228 | # Step 1: Convert pixel -> normalized (writeback path) | COMMENT |
| LOW⚡ | apps/backend/api/tests/test_face_writeback.py | 238 | # Step 2: Simulate read-back (face_extractor.py lines 82-90) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/scripts/setup_test_env.sh | 5 | # Usage: | COMMENT |