Realtime log viewer for containers. Supports Docker, Swarm and K8s.
This report summarizes scanner evidence for amir20/dozzle, a Go project with 14,771 GitHub stars. SynthScan examined 191,353 lines of code across 1187 source files, recording 149 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 0.8 (Low 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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 99 finding(s).
Are imports declared and package/API names verified? 50 finding(s).
Are wrappers, guards, and repeated structures necessary? 3 finding(s).
Which changes need focused human review? 149 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 149 distinct pattern matches across 5 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 | gqlgen.yml | 41 | # Only for single-file layout: | COMMENT |
| LOW | gqlgen.yml | 61 | # Optional: turn on to omit Is<Name>() methods to interface and unions | COMMENT |
| LOW | gqlgen.yml | 81 | # struct_fields_always_pointers: true | COMMENT |
| LOW | gqlgen.yml | 101 | # This enables argumment directives to not just mutate | COMMENT |
| LOW | playwright.config.ts | 61 | COMMENT | |
| LOW | eslint.config.js | 61 | // prettier-plugin-tailwindcss already sorts classes on every commit, and | COMMENT |
| LOW | vite.config.ts | 41 | // someone opens the pane, re-optimizes mid-session, and the chunk that | COMMENT |
| LOW | main.go | 521 | // cloudHostService is the view of the fleet the cloud client is given. | COMMENT |
| LOW | internal/config/file.go | 21 | // Path is relative to the working directory, like every other file under | COMMENT |
| LOW | internal/auth/oidc_logout.go | 21 | // session and the cookie carries no expiry of its own. Most people never click | COMMENT |
| LOW | internal/auth/oidc_logout.go | 161 | type LogoutTarget struct { | COMMENT |
| LOW | internal/auth/secret.go | 21 | // it from dir and creating it on first run. | COMMENT |
| LOW | internal/auth/oauth.go | 41 | byGithubLogin(login string) (User, bool) | COMMENT |
| LOW | internal/auth/oauth.go | 181 | // oauthState is the CSRF state and PKCE verifier for one in-flight login. It | COMMENT |
| LOW | internal/auth/simple.go | 21 | secret []byte | COMMENT |
| LOW | internal/auth/simple.go | 161 | // user happens to log out. The same is true of a roles or filter edit in | COMMENT |
| LOW | internal/notification/processing.go | 321 | func shortDigest(digest string) string { | COMMENT |
| LOW | internal/notification/dispatcher/cloud.go | 81 | // serverErrorRetryAfter is how long to back off after a 5xx that carries no | COMMENT |
| LOW | internal/web/index.go | 221 | // local cloud is one env var on this process — same as DOLIGENCE_URL, | COMMENT |
| LOW | internal/web/index.go | 341 | return "max-age=3600" | COMMENT |
| LOW | internal/web/cloud_patterns.go | 21 | const maxPatternLines = 500 | COMMENT |
| LOW | internal/web/cloud_alerts.go | 21 | // the logs without alerts than to hold the scroll waiting for them. | COMMENT |
| LOW | internal/web/cloud_metrics.go | 21 | // user cannot read the history of a container they cannot see. Cloud has never | COMMENT |
| LOW | internal/web/notifications.go | 561 | const ( | COMMENT |
| LOW | internal/web/bulk_update.go | 21 | // that started it must not leave a container stopped halfway through a swap. | COMMENT |
| LOW | internal/web/setup.go | 121 | return false | COMMENT |
| LOW | internal/web/routes.go | 101 | // them keeps Config and createServer signatures stable as more cloud RPCs | COMMENT |
| LOW | internal/web/container_logs.go | 21 | ) | COMMENT |
| LOW | internal/web/cloud_search.go | 21 | const cloudSearchTimeout = 3 * time.Second | COMMENT |
| LOW | internal/container/size_monitor.go | 21 | sizeTimeout = 30 * time.Second | COMMENT |
| LOW | internal/container/size_monitor.go | 41 | lastCheckNanos atomic.Int64 | COMMENT |
| LOW | internal/container/store.go | 21 | // Store is one host's containers, kept current from the engine's event | COMMENT |
| LOW | internal/container/store.go | 61 | // subscribers | COMMENT |
| LOW | internal/container/types.go | 41 | // RestartCount is how many times the engine restarted the container under | COMMENT |
| LOW | internal/container/types.go | 361 | // Labels an update leaves on the container it creates, and reads back on the | COMMENT |
| LOW | internal/container/types.go | 381 | // ExpectedFromDigest refuses the rollback unless the container still runs | COMMENT |
| LOW | internal/container/client.go | 61 | ContainerExec(ctx context.Context, id string, cmd []string) (*ExecSession, error) | COMMENT |
| LOW | internal/container/store_fanout.go | 81 | // draining its channel. | COMMENT |
| LOW | internal/container/store_fanout.go | 181 | Int("dropped", dropped). | COMMENT |
| LOW | internal/container/store_events.go | 21 | } | COMMENT |
| LOW | internal/container/host_id.go | 41 | // carries. Backends differ in how much of that they can supply, so the choice | COMMENT |
| LOW | internal/container/host_id.go | 81 | COMMENT | |
| LOW | internal/container/docker/stats_collector.go | 21 | retryMin time.Duration | COMMENT |
| LOW | internal/container/docker/swap/swap.go | 1 | // Package swap replaces a container with one built from its own config, and | COMMENT |
| LOW | internal/container/docker/swap/swap.go | 61 | // OldImage is the inspect of the image the old container runs. Settings it | COMMENT |
| LOW | internal/container/logparse/level_guesser.go | 41 | type levelMatcher struct { | COMMENT |
| LOW | internal/container/logparse/level_guesser.go | 61 | // last word. | COMMENT |
| LOW | internal/container/logparse/level_guesser.go | 81 | // klogPrefix matches the Kubernetes klog/glog header, where the single-letter | COMMENT |
| LOW | internal/container/logparse/timestamp_prefix.go | 1 | package logparse | COMMENT |
| LOW | internal/container/logparse/event_generator.go | 101 | // before giving up. A genuine orphan run is the tail of a single group split at | COMMENT |
| LOW | internal/container/histogram/counter.go | 1 | // Package histogram counts a container's log lines per time bucket, for the | COMMENT |
| LOW | internal/cloud/client.go | 121 | // SetDeployment records what kind of Dozzle process this is ("server", | COMMENT |
| LOW | internal/cloud/update_pusher.go | 21 | // Cloud already knows about. | COMMENT |
| LOW | internal/cloud/chat.go | 41 | // because that is what the browser has and what a human reads in a log; it | COMMENT |
| LOW | internal/cloud/chat.go | 101 | } | COMMENT |
| LOW | internal/cloud/stats_streamer.go | 41 | // statsSampleChanBuf absorbs a tick's worth of samples from a busy host | COMMENT |
| LOW | internal/cloud/stats_streamer.go | 101 | // statsStreamer aggregates raw container stats into fixed windows and pushes | COMMENT |
| LOW | internal/cloud/stats_streamer.go | 221 | a.diskWrite = s.Stat.DiskWriteTotal | COMMENT |
| LOW | internal/cloud/tools_resolve.go | 21 | COMMENT | |
| LOW | internal/cloud/tools_resolve.go | 41 | // 1. exact id match (full id or short/prefix id) — the legacy path | COMMENT |
| 22 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | locales/es.yml | 502 | simple: Este es un mensaje muy largo que por defecto se ajustará. Desactivar los ajustes suaves deshabilitará esto. | CODE |
| LOW | locales/es.yml | 502 | simple: Este es un mensaje muy largo que por defecto se ajustará. Desactivar los ajustes suaves deshabilitará esto. | CODE |
| LOW | locales/ko.yml | 360 | simple: 기본적으로 줄바꿈되는 매우 긴 메시지입니다. 자동 줄바꿈을 비활성화하면 이 기능이 꺼집니다. Lorem ipsum dolor sit amet, consectetur adipiscing elit, | CODE |
| LOW | locales/ko.yml | 360 | simple: 기본적으로 줄바꿈되는 매우 긴 메시지입니다. 자동 줄바꿈을 비활성화하면 이 기능이 꺼집니다. Lorem ipsum dolor sit amet, consectetur adipiscing elit, | CODE |
| LOW | locales/da.yml | 358 | simple: Dette er en meget meget lang besked som standard vil wrappe. Deaktivering af soft wraps vil deaktivere dette | CODE |
| LOW | locales/da.yml | 358 | simple: Dette er en meget meget lang besked som standard vil wrappe. Deaktivering af soft wraps vil deaktivere dette | CODE |
| LOW | locales/id.yml | 366 | simple: Ini adalah pesan yang sangat panjang yang akan terbungkus secara default. Menonaktifkan pembungkusan lunak a | CODE |
| LOW | locales/id.yml | 366 | simple: Ini adalah pesan yang sangat panjang yang akan terbungkus secara default. Menonaktifkan pembungkusan lunak a | CODE |
| LOW | locales/pt.yml | 358 | simple: Esta é uma mensagem muito longa que seria quebrada por padrão. Desabilitar quebras suaves desabilitaria isso | CODE |
| LOW | locales/pt.yml | 358 | simple: Esta é uma mensagem muito longa que seria quebrada por padrão. Desabilitar quebras suaves desabilitaria isso | CODE |
| LOW | locales/sl.yml | 363 | onemogočite mehke ovoje, bi to onemogočili. Lorem ipsum dolor sit amet, | CODE |
| LOW | locales/sl.yml | 363 | onemogočite mehke ovoje, bi to onemogočili. Lorem ipsum dolor sit amet, | CODE |
| LOW | locales/de.yml | 358 | simple: Dies ist eine sehr, sehr lange Nachricht, die standardmäßig umbrochen wird. Die Deaktivierung von Zeilenumbr | CODE |
| LOW | locales/de.yml | 358 | simple: Dies ist eine sehr, sehr lange Nachricht, die standardmäßig umbrochen wird. Die Deaktivierung von Zeilenumbr | CODE |
| LOW | locales/it.yml | 358 | simple: Questo è un messaggio molto molto lungo che dovrebbe andare a capo automaticamente. Disabilitando il soft wr | CODE |
| LOW | locales/it.yml | 358 | simple: Questo è un messaggio molto molto lungo che dovrebbe andare a capo automaticamente. Disabilitando il soft wr | CODE |
| LOW | locales/pl.yml | 360 | simple: To jest bardzo długa wiadomość, która domyślnie zostanie zawinięta. Wyłączenie miękkiego zawijania wyłączy t | CODE |
| LOW | locales/pl.yml | 360 | simple: To jest bardzo długa wiadomość, która domyślnie zostanie zawinięta. Wyłączenie miękkiego zawijania wyłączy t | CODE |
| LOW | locales/en.yml | 510 | simple: This is a very very long message which would wrap by default. Disabling soft wraps would disable this. Lorem | CODE |
| LOW | locales/en.yml | 510 | simple: This is a very very long message which would wrap by default. Disabling soft wraps would disable this. Lorem | CODE |
| LOW | locales/ru.yml | 358 | simple: Это очень длинное сообщение, которое по умолчанию переносится. Отключение мягкого переноса отключит это. Lor | CODE |
| LOW | locales/ru.yml | 358 | simple: Это очень длинное сообщение, которое по умолчанию переносится. Отключение мягкого переноса отключит это. Lor | CODE |
| LOW | locales/fr.yml | 358 | simple: Ceci est un très long message qui se plierait par défaut. La désactivation des retours à la ligne doux désac | CODE |
| LOW | locales/fr.yml | 358 | simple: Ceci est un très long message qui se plierait par défaut. La désactivation des retours à la ligne doux désac | CODE |
| LOW | locales/zh-tw.yml | 360 | simple: 這是一段非常長的訊息,預設情況下會自動換行。停用自動換行後便不會換行。Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod t | CODE |
| LOW | locales/zh-tw.yml | 360 | simple: 這是一段非常長的訊息,預設情況下會自動換行。停用自動換行後便不會換行。Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod t | CODE |
| LOW | locales/tr.yml | 361 | simple: Bu, varsayılan olarak kaydırılacak çok çok uzun bir mesajdır. Yumuşak kaydırmayı devre dışı bırakmak bunu de | CODE |
| LOW | locales/tr.yml | 361 | simple: Bu, varsayılan olarak kaydırılacak çok çok uzun bir mesajdır. Yumuşak kaydırmayı devre dışı bırakmak bunu de | CODE |
| LOW | locales/nl.yml | 359 | simple: Dit is een hele lange logregel die standaard wordt afgebroken. Als je zachte afbreking uitschakelt, gebeurt | CODE |
| LOW | locales/nl.yml | 359 | simple: Dit is een hele lange logregel die standaard wordt afgebroken. Als je zachte afbreking uitschakelt, gebeurt | CODE |
| LOW | locales/zh.yml | 358 | simple: 这是一个非常非常长的消息,默认情况下会自动换行。禁用软换行将禁用此功能。Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod | CODE |
| LOW | locales/zh.yml | 358 | simple: 这是一个非常非常长的消息,默认情况下会自动换行。禁用软换行将禁用此功能。Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod | CODE |
| LOW | internal/auth/secret_test.go | 85 | h.Write([]byte("admin@example.com")) | CODE |
| LOW | internal/container/logparse/event_generator_test.go | 132 | return ts + " lorem ipsum dolor sit amet", container.STDOUT, nil | CODE |
| LOW | internal/container/logparse/event_generator_test.go | 132 | return ts + " lorem ipsum dolor sit amet", container.STDOUT, nil | CODE |
| LOW | docs/guide/authentication.md | 39 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/guide/authentication.md | 47 | docker run -it --rm amir20/dozzle generate admin --email test@email.net --name "John Doe" > users.yml | CODE |
| LOW | docs/guide/supported-env-vars.md | 113 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/zh/guide/authentication.md | 40 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/zh/guide/authentication.md | 48 | docker run -it --rm amir20/dozzle generate admin --email test@email.net --name "John Doe" > users.yml | CODE |
| LOW | docs/zh/guide/supported-env-vars.md | 114 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/de/guide/authentication.md | 40 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/de/guide/authentication.md | 48 | docker run -it --rm amir20/dozzle generate admin --email test@email.net --name "John Doe" > users.yml | CODE |
| LOW | docs/de/guide/supported-env-vars.md | 114 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/fr/guide/authentication.md | 40 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/fr/guide/authentication.md | 48 | docker run -it --rm amir20/dozzle generate admin --email test@email.net --name "John Doe" > users.yml | CODE |
| LOW | docs/fr/guide/supported-env-vars.md | 114 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/es/guide/authentication.md | 40 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| LOW | docs/es/guide/authentication.md | 48 | docker run -it --rm amir20/dozzle generate admin --email test@email.net --name "John Doe" > users.yml | CODE |
| LOW | docs/es/guide/supported-env-vars.md | 114 | docker run -it --rm amir20/dozzle generate admin --password password --email test@email.net --name "John Doe" --user-fil | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/setup-remote-agent.sh | 120 | # Step 1: Create the VM | COMMENT |
| LOW⚡ | examples/setup-remote-agent.sh | 133 | # Step 2: Install Docker in the VM | COMMENT |
| LOW⚡ | examples/setup-remote-agent.sh | 142 | # Step 3: Copy shared certificates to VM | COMMENT |
| LOW | examples/setup-remote-agent.sh | 154 | # Step 4: Load or pull Dozzle image | COMMENT |
| LOW | examples/setup-remote-agent.sh | 179 | # Step 5: Start Dozzle agent | COMMENT |
| LOW⚡ | examples/setup-remote-agent.sh | 203 | # Step 6: Wait for agent to be ready | COMMENT |
| LOW⚡ | examples/setup-remote-agent.sh | 207 | # Step 7: Verify agent is running | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/setup-remote-agent.sh | 120 | # Step 1: Create the VM | COMMENT |
| LOW⚡ | examples/setup-remote-agent.sh | 133 | # Step 2: Install Docker in the VM | COMMENT |
| LOW⚡ | examples/setup-remote-agent.sh | 142 | # Step 3: Copy shared certificates to VM | COMMENT |
| LOW | examples/setup-remote-agent.sh | 154 | # Step 4: Load or pull Dozzle image | COMMENT |
| LOW | examples/setup-remote-agent.sh | 179 | # Step 5: Start Dozzle agent | COMMENT |
| LOW⚡ | examples/setup-remote-agent.sh | 203 | # Step 6: Wait for agent to be ready | COMMENT |
| LOW⚡ | examples/setup-remote-agent.sh | 207 | # Step 7: Verify agent is running | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | assets/composable/app/storage.ts | 24 | export function persistentVisibleKeysForContainer(container: Ref<Container | undefined>): Ref<Map<string[], boolean>> { | CODE |
| LOW | assets/composable/logs/historicalLogs.ts | 9 | export function useHistoricalContainerLog(historicalContainer: Ref<HistoricalContainer>): LogStreamSource { | CODE |
| LOW | assets/composable/logs/visible.ts | 9 | export function useVisibleKeysByContainer(): (containerID: string) => Map<string[], boolean> { | CODE |