Repository Analysis

photoprism/photoprism

AI-Powered Photos App for the Decentralized Web 🌈💎✨

1.0 Likely human-written View on GitHub
1.0
Adjusted Score
1.0
Raw Score
100%
Time Factor
2026-05-30
Last Push
39,713
Stars
Go
Language
514,338
Lines of Code
3121
Files
354
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 8HIGH 2MEDIUM 27LOW 317

Pattern Findings

354 matches across 12 categories. Click a row to expand file-level details.

Fake / Example Data161 hits · 202 pts
SeverityFileLineSnippet
LOW.ldap.cfg24 displayName = "John Doe"
LOWdocker/ddns/config/ddns.yml53 user: "foo@bar.com"
LOWfrontend/tests/vitest/fixtures.js141 user: { ID: 1, UID: "urjysof3b9v7lgex", Name: "test", Email: "test@test.com" },
LOWfrontend/tests/vitest/fixtures.js155 user: { ID: 1, UID: "urjysof3b9v7lgex", Name: "test", Email: "test@test.com" },
LOWfrontend/tests/vitest/fixtures.js168 user: { ID: 1, UID: "urjysof3b9v7lgex", Name: "test", Email: "test@test.com" },
LOWfrontend/tests/vitest/fixtures.js181 user: { ID: 1, UID: "urjysof3b9v7lgex", Name: "test", Email: "test@test.com" },
LOWfrontend/tests/vitest/component/settings/webdav.test.js39 const wrapper = mountWebdavDialog({ userName: "user@example.com" });
LOWfrontend/tests/vitest/component/settings/webdav.test.js40 const expected = `${window.location.protocol}//${encodeURIComponent("user@example.com")}@${window.location.host}/ori
LOW…ntend/tests/vitest/component/meta/face/markers.test.js107 { UID: "m1", Name: "Jane Doe", X: 0.1, Y: 0.1, W: 0.2, H: 0.2 },
LOW…ntend/tests/vitest/component/meta/face/markers.test.js117 expect(namedTitle.textContent).toBe("Jane Doe");
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js192 { UID: "m1", CropID: "crop1", Name: "Jane Doe", SubjUID: "subj1", thumbnailUrl: () => "/t/thumb1/public/tile_160
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js487 expect(wrapper.vm.people[0].Name).toBe("Jane Doe");
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js550 expect(wrapper.html()).toContain("Jane Doe");
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js838 w.vm.onClearSubject({ UID: "m1", SubjUID: "subj1", Name: "Jane Doe" });
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js908 expect(w.vm.markerInputValue("m1")).toBe("Jane Doe");
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js1302 const marker = { UID: "m1", Name: "Jane Doe", SubjUID: "subj1", thumbnailUrl: () => "/t/x/p/tile_160" };
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js2266 w.vm.navigateToPerson({ UID: "m1", Name: "Jane Doe", SubjUID: "subj1" });
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js3470 expect(html).not.toContain("Jane Doe");
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js3596 namedMarker: "Jane Doe",
LOW…ontend/tests/vitest/component/photo/people-tab.test.js18 Name: "John Doe",
LOW…ontend/tests/vitest/component/photo/people-tab.test.js38 Name: "John Doe",
LOWfrontend/tests/vitest/common/session.test.js57 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js100 expect(result.Email).toBe("test@test.com");
LOWfrontend/tests/vitest/common/session.test.js121 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js128 expect(result).toBe("test@test.com");
LOWfrontend/tests/vitest/common/session.test.js133 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js151 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js167 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js185 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js196 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js236 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js254 Email: "test@test.com",
LOWfrontend/tests/vitest/common/session.test.js272 Email: "test@test.com",
LOWfrontend/tests/vitest/common/form.test.js134 "user@example.com",
LOWfrontend/tests/vitest/common/form.test.js234 expect(requiredEmail[1]("user@example.com")).toBe(true);
LOWfrontend/tests/vitest/model/user.test.js16 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js28 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js42 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js54 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js68 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js80 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js92 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js108 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js126 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js138 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js144 expect(result2).toBe("test@test.com");
LOWfrontend/tests/vitest/model/user.test.js191 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js215 Email: "test@test.com",
LOWfrontend/tests/vitest/model/user.test.js317 Email: "test@test.com",
LOWfrontend/tests/vitest/model/subject.test.js49 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js63 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js83 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js104 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js120 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js128 expect(result).toBe("Jane Doe");
LOWfrontend/tests/vitest/model/subject.test.js136 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js152 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js168 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js186 Name: "Jane Doe",
LOWfrontend/tests/vitest/model/subject.test.js201 Name: "Jane Doe",
101 more matches not shown…
Over-Commented Block142 hits · 142 pts
SeverityFileLineSnippet
LOW.golangci.yml61 - nolint
LOWcompose.nvidia.yaml201 OLLAMA_CONTEXT_LENGTH: "4096" # maximum input context length
LOWcompose.yaml321 OLLAMA_SCHED_SPREAD: "false" # allows scheduling models across all GPUs.
LOW.qdrant.yaml1log_level: INFO
LOW.qdrant.yaml21 snapshots_path: ./snapshots
LOW.qdrant.yaml61 # node_type: "Listener"
LOW.qdrant.yaml81 # If null - auto selection.
LOW.qdrant.yaml101 optimizers:
LOW.qdrant.yaml121 #
LOW.qdrant.yaml141 indexing_threshold_kb: 20000
LOW.qdrant.yaml161 # flush_interval_sec: 5
LOW.qdrant.yaml261 # If enabled, browsers would be allowed to query REST endpoints regardless of query origin.
LOW.qdrant.yaml281 # api_key: your_secret_api_key_here
LOW.qdrant.yaml321 # Setting this parameter to lower value will allow consensus
LOWcompose.armv7.yaml61 PHOTOPRISM_UPLOAD_ALLOW: "" # restricts uploads to these file types (comma-separated list of EX
LOWdocker/demo/setup.sh1#!/usr/bin/env bash
LOWdocker/demo/jobs.ini1# See https://github.com/mcuadros/ofelia/blob/master/docs/jobs.md for job settings!
LOWdocker/ddns/config/ddns.yml1# DigitalOcean DynDNS Config
LOWfrontend/tests/vitest/component/lightbox.basic.test.js141 expect(localStorage.getItem(captionKey)).toBeNull();
LOWfrontend/tests/vitest/component/lightbox.basic.test.js561 // exitFaceMarkerMode delegates to the singleton's exit() — the
LOW…ontend/tests/vitest/component/lightbox/sidebar.test.js41 thumb: () => ({ src: "/t.jpg", w: 100, h: 100 }),
LOWfrontend/tests/vitest/common/view.test.js121 // obvious (it intercepts iOS swipe-back / pull-to-refresh / horizontal-
LOWfrontend/tests/vitest/model/thumb.test.js381 // in fixtures.js plus Mock.history for the request log.
LOWfrontend/tests/vitest/model/photo.test.js2281 // malformed-payload guard, not a silent no-op for valid data).
LOWfrontend/tests/vitest/helpers/jsdom-quiet.js1// Quiet jsdom's known false-positive CSS-parser warnings on
LOWfrontend/tests/vitest/helpers/jsdom-quiet.js21// enough to cover Vuetify, Vuetify-derived components, and our
LOWfrontend/src/options/face-marker.js1// Face-marker UI state-machine values. Shared between the lightbox
LOWfrontend/src/component/photo/edit/labels.vue201 newLabelModel: null,
LOWfrontend/src/common/event.js41// kept in sync with EntityCreated / EntityUpdated / EntityDeleted /
LOWfrontend/src/model/rest.js41 // Returns a new instance of the same subclass populated with the
LOWfrontend/src/model/rest.js221
LOWfrontend/src/model/model-cache.js41 }
LOWsetup/podman/docker-compose.yml1version: '3.5'
LOWsetup/podman/docker-compose.yml21# Stop | podman-compose stop
LOWsetup/podman/docker-compose.yml101 PHOTOPRISM_INIT: "https tensorflow" # common options: update https tensorflow tensorflow-gpu intel gpu
LOWsetup/podman/docker-compose.yml141 MARIADB_PASSWORD: "insecure"
LOWsetup/docker/compose.yaml1# Example Docker Compose config file for PhotoPrism (Linux / AMD64)
LOWsetup/docker/compose.yaml101 ## Video Transcoding (https://docs.photoprism.app/getting-started/advanced/transcoding/):
LOWsetup/docker/compose.yaml121 # "/host/folder:/photoprism/folder" # Example
LOWsetup/docker/compose.yaml161 # MARIADB_REPLICATION_PASSWORD: ""
LOWsetup/docker/compose.yaml201 # NVIDIA_VISIBLE_DEVICES: "all"
LOWsetup/docker/macos/compose.yaml1# Example Docker Compose config file for PhotoPrism (Apple macOS)
LOWsetup/docker/macos/compose.yaml121 MARIADB_AUTO_UPGRADE: "1"
LOWsetup/docker/scheduler/jobs.ini1# See https://github.com/mcuadros/ofelia/blob/master/docs/jobs.md for job settings!
LOWsetup/docker/scheduler/compose.yaml1# Example Docker Compose config file for PhotoPrism (Linux / AMD64)
LOWsetup/docker/scheduler/compose.yaml101 # PHOTOPRISM_FFMPEG_BITRATE: "32" # video bitrate limit in Mbps (default: 60)
LOWsetup/docker/scheduler/compose.yaml141 image: mcuadros/ofelia:latest
LOWsetup/docker/armv7/compose.yaml1# Example Docker Compose config file for PhotoPrism (ARMv7-based, 32-bit devices)
LOWsetup/docker/armv7/compose.yaml21# - https://docs.photoprism.app/getting-started/troubleshooting/docker/
LOWsetup/docker/armv7/compose.yaml101 # PHOTOPRISM_FFMPEG_BITRATE: "32" # video bitrate limit in Mbps (default: 60)
LOWsetup/docker/armv7/compose.yaml141 MYSQL_CHARSET: "utf8mb4"
LOWsetup/docker/sqlite/compose.yaml1# Example Docker Compose config file for PhotoPrism (Linux / AMD64)
LOWsetup/docker/sqlite/compose.yaml81 PHOTOPRISM_SITE_DESCRIPTION: "" # meta site description
LOWsetup/docker/sqlite/compose.yaml101 volumes:
LOWsetup/docker/nvidia/compose.yaml1# Example Docker Compose config file for PhotoPrism (NVIDIA Container Toolkit / AMD64)
LOWsetup/docker/nvidia/compose.yaml21# - https://docs.photoprism.app/getting-started/troubleshooting/
LOWsetup/docker/nvidia/compose.yaml161 # MARIADB_REPLICATION_PASSWORD: ""
LOWsetup/docker/windows/compose.yaml1# Example Docker Compose config file for PhotoPrism (Windows / AMD64)
LOWsetup/docker/windows/compose.yaml21# - https://docs.photoprism.app/getting-started/troubleshooting/
LOWsetup/docker/windows/compose.yaml141 # image: nickfedor/watchtower
82 more matches not shown…
Hallucination Indicators8 hits · 80 pts
SeverityFileLineSnippet
CRITICAL…ontend/tests/vitest/component/lightbox/sidebar.test.js2867 expect(w.vm.chipState.albums.options.some((a) => a.UID === "alb-created")).toBe(true);
CRITICAL…ontend/tests/vitest/component/lightbox/sidebar.test.js3077 expect(w.vm.chipState.labels.options.map((l) => l.Name)).toEqual(["apple", "Beach", "Mountain"]);
CRITICAL…ontend/tests/vitest/component/lightbox/sidebar.test.js3094 expect(w.vm.chipState.albums.options.map((a) => a.Title)).toEqual(["alpha", "Mango", "Zebra"]);
CRITICAL…tend/tests/vitest/component/photo/edit/details.test.js297 wrapper.vm.view.model.localDate.mockReturnValue(mockLocalDate);
CRITICAL…tend/tests/vitest/component/photo/edit/details.test.js312 wrapper.vm.view.model.localDate.mockReturnValue(mockInvalidDate);
CRITICAL…tend/tests/vitest/component/photo/edit/details.test.js556 wrapper.vm.view.model.localDate.mockReturnValue(mockLocalDate);
CRITICALfrontend/src/page/places.vue940 this.map.setLanguage(this.$config.values.settings.ui.language.split("-")[0]);
CRITICALfrontend/src/common/maplibregl.js134 this.setLanguage($config.values.settings.ui.language.split("-")[0] || opt_fallback || "native");
Decorative Section Separators23 hits · 69 pts
SeverityFileLineSnippet
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js101 // ─── Rendering ────────────────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js129 // ─── v-file-upload props ──────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js178 // ─── onFilesSelected — append / remove / dedup ────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js225 // ─── hasFiles computed ─────────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js253 // ─── Upload button enabled/disabled ───────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js274 // ─── onUpload() guards ────────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js310 // ─── onUpload() — starts upload ───────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js338 // ─── reset() ─────────────────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js370 // ─── onClose() ───────────────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js429 // ─── onUploadProgress() ───────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js457 // ─── onUploadComplete() ───────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js481 // ─── visible watcher ─────────────────────────────────────────────────────
MEDIUMfrontend/tests/vitest/component/upload/dialog.test.js500 // ─── title computed ───────────────────────────────────────────────────────
MEDIUMsetup/podman/docker-compose.yml19# --------------------------------------------------------------------------
MEDIUMsetup/cloud/digitalocean/setup.sh4# =============================
MEDIUMsetup/cloud/digitalocean/compose.yaml1# ========================================================================
MEDIUMsetup/cloud/digitalocean/compose.yaml3# ========================================================================
MEDIUMsetup/cloud/digitalocean/compose.yaml42# ------------------------------------------------------------------------
MEDIUMsetup/cloud/digitalocean/compose.yaml53# ------------------------------------------------------------------------
MEDIUMsetup/cloud/digitalocean/compose.yaml74# ------------------------------------------------------------------------
MEDIUMsetup/cloud/digitalocean/install_photoprism.sh4# ============================
MEDIUMsetup/cloud/digitalocean/traefik.yaml2# -------------------------------------------------------------------------
MEDIUMsetup/cloud/digitalocean/traefik.yaml16# -------------------------------------------------------------------------
Synthetic Comment Markers2 hits · 15 pts
SeverityFileLineSnippet
HIGHfrontend/src/model/label.js16// Label models user-defined keywords and AI-generated tags.
HIGHinternal/api/session_create.go65 // Protection against AI-generated vulnerability reports.
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippet
MEDIUMcompose.yaml523## Create a shared bridge network for connecting with services in other compose.yaml files.
MEDIUMscripts/setup/nas/raspberry-pi/build.sh85# Create the final SD card image.
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippet
LOWsetup/cloud/digitalocean/init/check.sh93 # Check if there are log archives or log files that have not been recently cleared.
LOWscripts/render/app-icon.sh14# Check if source file exists.
LOWscripts/render/svg-icon.sh14 # Check if source file exists.
LOWscripts/render/svg-icon.sh31 # Check if source file exists.
Verbosity Indicators3 hits · 4 pts
SeverityFileLineSnippet
LOWinternal/api/oidc_redirect.go145 // Step 1: Create user account if it does not exist yet.
LOWinternal/api/oidc_redirect.go387 // Step 2: Create user session.
LOWinternal/api/oidc_redirect.go438 // Step 3: Render HTML template to set the access token in localStorage.
Hyper-Verbose Identifiers4 hits · 4 pts
SeverityFileLineSnippet
LOWfrontend/src/common/albums.js43export function createAlbumSelectionWatcher(albumsProperty) {
LOWfrontend/src/common/view.js370export function preventNavigationTouchEvent(ev) {
LOW…ns/maplibre-gl-rtl-text/v0.2.3/maplibre-gl-rtl-text.js5;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){b=0;break}}while(1){f=b+20|0;d=c[f>>2]|0;if(!d){f=b+16|0;d=c[f>>2]|0;if(!d)break;els
LOW…ns/maplibre-gl-rtl-text/v0.2.3/maplibre-gl-rtl-text.js6;for(var i=0,list=mergedParagraphLineBreakPoints;i<list.length;i+=1){var lineBreakPoint=list[i];var returnStringPtr=Modu
Example Usage Blocks2 hits · 3 pts
SeverityFileLineSnippet
LOWdocker/demo/setup.sh5# Usage:
LOWscripts/dav-probe.sh6# Usage:
Slop Phrases2 hits · 3 pts
SeverityFileLineSnippet
MEDIUMsetup/pkg/linux/README.html701<div id='write' class=''><h2 id='photoprism®-installation-packages'><span>PhotoPrism® Installation Packages</span></h2>
LOWsetup/pkg/linux/README.html701<div id='write' class=''><h2 id='photoprism®-installation-packages'><span>PhotoPrism® Installation Packages</span></h2>
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippet
MEDIUMinternal/commands/show_metadata.go68 // Documentation links for those who want to delve deeper.