Self-hosted deployment platform
This report presents the forensic synthetic code analysis of oblien/openship, a TypeScript project with 10,131 GitHub stars. SynthScan v2.0 examined 919,107 lines of code across 2647 source files, recording 2145 pattern matches distributed across 16 syntactic categories. The overall adjusted score of 5.6 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
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 2145 distinct pattern matches across 16 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 |
|---|---|---|---|---|
| MEDIUM | docker-compose.yml | 1 | # ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker-compose.yml | 38 | # ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker-compose.yml | 41 | # ─── Database (storage, private) ────────────────────── | COMMENT |
| MEDIUM | docker-compose.yml | 60 | # ─── Cache / Queue / Rate-limit (private) ───────────── | COMMENT |
| MEDIUM | docker-compose.yml | 76 | # ─── API (control plane) ────────────────────────────── | COMMENT |
| MEDIUM | docker-compose.yml | 108 | # ─── Dashboard (app UI) ─────────────────────────────── | COMMENT |
| MEDIUM | docker-compose.yml | 126 | # ─── Web / Landing ──────────────────────────────────── | COMMENT |
| MEDIUM | docker/docker-compose.build.yml | 1 | # ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/docker-compose.build.yml | 13 | # ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/docker-compose.yml | 1 | # ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/docker-compose.yml | 53 | # ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/docker-compose.yml | 58 | # ─── Database (storage, private) ────────────────────── | COMMENT |
| MEDIUM | docker/docker-compose.yml | 85 | # ─── Cache / Queue / Rate-limit (private) ───────────── | COMMENT |
| MEDIUM | docker/docker-compose.yml | 101 | # ─── API (control plane) ────────────────────────────── | COMMENT |
| MEDIUM | docker/docker-compose.yml | 159 | # ─── Dashboard (app UI) ─────────────────────────────── | COMMENT |
| MEDIUM | docker/docker-compose.yml | 175 | # ─── Edge (OpenResty on :80/:443) ───────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/mail_app.ts | 45 | // ─── user_settings ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/mail_app.ts | 64 | // ─── user_hotkeys ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/mail_app.ts | 83 | // ─── summary ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/mail_app.ts | 112 | // ─── note ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/mail_app.ts | 141 | // ─── writing_style_matrix ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/mail_app.ts | 161 | // ─── email_template ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/mail_app.ts | 185 | // ─── Type exports ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 43 | // ─── Reusable column factories ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 61 | // ─── admin ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 85 | // ─── alias ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 107 | // ─── moderators ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 127 | // ─── maillist_owners ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 146 | // ─── forwardings ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 176 | // ─── domain ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 205 | // ─── alias_domain ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 223 | // ─── domain_admins ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 243 | // ─── mailbox ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 349 | // ─── maillists ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 379 | // ─── sender_bcc_domain ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 399 | // ─── sender_bcc_user ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 421 | // ─── recipient_bcc_domain ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 441 | // ─── recipient_bcc_user ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 462 | // ─── sender_relayhost ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 474 | // ─── deleted_mailboxes ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 500 | // ─── share_folder ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 516 | // ─── anyone_shares ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 527 | // ─── last_login ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 549 | // ─── used_quota ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/db-email/src/schema/vmail.ts | 566 | // ─── Type exports ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/core/src/stacks.ts | 129 | // ─── Stack categories ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/core/src/stacks.ts | 133 | // ─── Project type (determines deploy-page UI path) ────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/core/src/stacks.ts | 137 | // ─── Stack definition ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 19 | // ─── Language definitions ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 232 | // ─── The registry ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 236 | // ── JavaScript / TypeScript - Frontend & Fullstack ───────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 373 | // ── JavaScript / TypeScript - Backend ────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 455 | // ── Go ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 513 | // ── Rust ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 571 | // ── Python ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 624 | // ── Ruby ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 654 | // ── PHP ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 701 | // ── Java / JVM ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 744 | // ── Kotlin (JVM, Gradle) ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/core/src/stacks.ts | 769 | // ── C# / .NET ────────────────────────────────────────────────────────────── | COMMENT |
| 1320 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/core/src/stacks.ts | 964 | export function buildOutputTransferExcludes( | CODE |
| LOW | packages/core/src/stacks.ts | 1055 | export function packageManagerEnsureCommand(packageManager?: string): string { | CODE |
| LOW | packages/core/src/source-access.ts | 330 | export function serializeSourceAccessScope( | CODE |
| LOW | packages/core/src/service-status.ts | 55 | export function serviceStatusToContainerState( | CODE |
| LOW | packages/core/src/rollback-window.ts | 71 | export function computeAutoRollbackWindow(input: AutoRollbackWindowInput): number { | CODE |
| LOW | packages/core/src/connectivity.ts | 81 | export function classifyConnectivityError( | CODE |
| LOW | packages/core/src/service-routing.ts | 20 | export function resolvePublicUrlPlaceholders( | CODE |
| LOW | packages/core/src/service-routing.ts | 92 | export function defaultServiceHostnameLabel( | CODE |
| LOW | packages/core/src/service-routing.ts | 141 | export function resolveServiceHostnameLabel( | CODE |
| LOW | packages/core/src/workspaces/toml-helpers.ts | 20 | export function extractStringArrayFromSection( | CODE |
| LOW | packages/core/src/workspaces/node.ts | 45 | function parsePackageJsonWorkspaces(content: string): string[] { | CODE |
| LOW | packages/core/src/metadata/index.ts | 28 | export function missingOutputDirectoryMessage(outputDirectory?: string, subject?: string): string { | CODE |
| LOW | packages/adapters/src/dockerfile/compiler.ts | 375 | function findPreviousStageReference( | CODE |
| LOW | packages/adapters/src/dockerfile/compiler.ts | 402 | function validateStageArtifactCopies(stages: WorkspaceBuildStagePlan[]): WorkspacePlanDiagnostic[] { | CODE |
| LOW | packages/adapters/src/dockerfile/compiler.ts | 422 | export function compileDockerfileParseResult( | CODE |
| LOW | packages/adapters/src/dockerfile/compiler.ts | 666 | export function compileDockerfileToWorkspacePlan( | CODE |
| LOW | packages/adapters/src/runtime/docker-build-context.ts | 127 | function anchorDockerignorePattern(line: string): string { | CODE |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 61 | function getConfiguredDockerSocketPath(opts: DockerConnectionOptions): string | null { | CODE |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 66 | function getFallbackDockerSocketPath(opts: DockerConnectionOptions): string { | CODE |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 101 | async function discoverRemoteDockerSocketPathsWithClient( | CODE |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 114 | async function discoverRemoteDockerSocketPathsWithExecutor( | CODE |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 125 | async function discoverRemoteDockerSocketPaths( | CODE |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 143 | async function resolveRemoteDockerSocketPath( | CODE |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 164 | function shouldCollectSocketDiagnostics(error: unknown): boolean { | CODE |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 177 | async function collectDockerSocketDiagnostics( | CODE |
| LOW | packages/adapters/src/runtime/docker-transport.ts | 80 | export function resolveLocalDockerSocketPath( | CODE |
| LOW | packages/adapters/src/runtime/resource-limits.ts | 61 | export function dockerBuildResourceLimits( | CODE |
| LOW | packages/adapters/src/runtime/cloud.ts | 250 | function stageArtifactDownloadPath(source: string): string { | CODE |
| LOW | packages/adapters/src/runtime/cloud.ts | 281 | function resolveCopyDestinationPath( | CODE |
| LOW | packages/adapters/src/runtime/docker-paths.ts | 8 | export function normalizeDockerRelativePath(value?: string | null): string { | CODE |
| LOW | packages/adapters/src/runtime/docker-paths.ts | 20 | export function normalizeDockerRootDirectory(rootDirectory?: string, localPath?: string): string { | CODE |
| LOW | packages/adapters/src/runtime/docker-paths.ts | 49 | function resolveExplicitDockerfileCandidate( | CODE |
| LOW | packages/adapters/src/runtime/docker-paths.ts | 71 | export function resolveDockerfileCandidates( | CODE |
| LOW | packages/adapters/src/runtime/docker-paths.ts | 198 | export async function resolveDockerRootDirectory( | CODE |
| LOW | packages/adapters/src/system/components.ts | 44 | export function getSystemComponentDefinition( | CODE |
| LOW | packages/adapters/src/system/errors.ts | 58 | export function isRetryableRemoteConnectionError(err: unknown): boolean { | CODE |
| LOW | packages/adapters/src/system/reverse-tunnel.ts | 38 | export async function openSystemSshReverseTunnel( | CODE |
| LOW | packages/adapters/src/system/proxy/takeover-journal.ts | 249 | export async function recoverInterruptedTakeover( | CODE |
| LOW | …ges/adapters/src/system/proxy/ensure-container-edge.ts | 162 | export async function localContainerEdgeProvider( | CODE |
| LOW | packages/adapters/src/backup/registry.ts | 94 | export function resolveProducerForService(service: ServiceHandle): BackupProducer { | CODE |
| LOW | packages/adapters/src/backup/registry.ts | 135 | export function listRegisteredDestinations(): DestinationKind[] { | CODE |
| LOW | packages/adapters/src/backup/common/credentials.ts | 29 | export function setBackupCredentialSecret(secret: string | undefined): void { | CODE |
| LOW | packages/db/src/client.ts | 194 | function clearStalePgliteControlFile(dataDir: string): void { | CODE |
| LOW | …kages/db/src/repos/personal-access-token-grant.repo.ts | 51 | export function createPersonalAccessTokenGrantRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/billing-usage-snapshot.repo.ts | 42 | export function createBillingUsageSnapshotRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/stripe-topup-grant.repo.ts | 38 | export function createStripeTopupGrantRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/notification.repo.ts | 38 | export function createNotificationChannelRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/notification.repo.ts | 147 | export function createNotificationSubscriptionRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/notification.repo.ts | 281 | export function createNotificationDefaultRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/notification.repo.ts | 327 | export function createNotificationDeliveryRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/backup.repo.ts | 83 | export function createBackupDestinationRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/invitation-pending-grant.repo.ts | 58 | export function createInvitationPendingGrantRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/orphaned-resource.repo.ts | 15 | export function createOrphanedResourceRepo(db: Database) { | CODE |
| LOW⚡ | packages/db/src/repos/custom-app-template.repo.ts | 13 | export function createCustomAppTemplateRepo(db: Database) { | CODE |
| LOW⚡ | packages/db/src/repos/project-connection.repo.ts | 13 | export function createProjectConnectionRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/service-deployment.repo.ts | 38 | export function createServiceDeploymentRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/docker-migration.repo.ts | 46 | export function createDockerMigrationRunRepo(db: Database) { | CODE |
| LOW⚡ | packages/db/src/repos/git-installation.repo.ts | 13 | export function createGitInstallationRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/billing-anniversary-grant.repo.ts | 50 | export function createBillingAnniversaryGrantRepo(db: Database) { | CODE |
| LOW | packages/db/src/repos/cloud-handoff-code.repo.ts | 34 | export function createCloudHandoffCodeRepo(db: Database) { | CODE |
| 276 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.yml | 1 | # ────────────────────────────────────────────────────────── | COMMENT |
| LOW | docker-compose.yml | 21 | # unprivileged control plane. | COMMENT |
| LOW | docker/docker-compose.build.yml | 1 | # ────────────────────────────────────────────────────────── | COMMENT |
| LOW | docker/docker-compose.yml | 1 | # ────────────────────────────────────────────────────────── | COMMENT |
| LOW | docker/docker-compose.yml | 21 | # equivalent stack at ~/.openship/compose/. This file is the reference for | COMMENT |
| LOW | docker/docker-compose.yml | 41 | # build + run your deployed apps as host containers (Docker-out-of-Docker). The | COMMENT |
| LOW | docker/docker-compose.yml | 101 | # ─── API (control plane) ────────────────────────────── | COMMENT |
| LOW | scripts/install.sh | 1 | #!/bin/sh | COMMENT |
| LOW | scripts/release.ts | 81 | // home Updates block). WITH it, we write a release advisory for this version | COMMENT |
| LOW | scripts/install-source.sh | 1 | #!/bin/sh | COMMENT |
| LOW | packages/core/src/mail-server/routing/build-routes.ts | 141 | value: `v=DMARC1; p=quarantine; rua=mailto:dmarc@${apex}`, | COMMENT |
| LOW | packages/adapters/src/platform.ts | 241 | COMMENT | |
| LOW | packages/adapters/src/infra/nginx.ts | 741 | // longest-prefix / exact match routes them ahead of the primary target. | COMMENT |
| LOW | packages/adapters/src/infra/nginx.ts | 1021 | const validEmail = !!this.acmeEmail && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.acmeEmail); | COMMENT |
| LOW | packages/adapters/src/infra/nginx.ts | 1121 | COMMENT | |
| LOW | packages/adapters/src/infra/nginx.ts | 1361 | } catch { | COMMENT |
| LOW | packages/adapters/src/runtime/bare.ts | 261 | const releaseDir = this.releaseDir(deploymentId); | COMMENT |
| LOW | packages/adapters/src/runtime/bare.ts | 761 | COMMENT | |
| LOW | packages/adapters/src/runtime/docker-ssh-agent.ts | 21 | // the SSH server silently refuses forwarding (AllowStreamLocalForwarding no) — the | COMMENT |
| LOW | packages/adapters/src/runtime/docker.ts | 2081 | serviceName: c.Labels?.["openship.service"], | COMMENT |
| LOW | packages/adapters/src/runtime/build-pipeline.ts | 201 | // Local project (source transferred into projectDir by the runtime's | COMMENT |
| LOW | packages/adapters/src/runtime/build-pipeline.ts | 221 | // the helper IS the auth. | COMMENT |
| LOW | packages/adapters/src/runtime/types.ts | 261 | * touch. Best-effort + idempotent. Optional (docker only). */ | COMMENT |
| LOW | packages/adapters/src/runtime/types.ts | 281 | // restore re-materializes the container from the retained image | COMMENT |
| LOW | packages/adapters/src/runtime/cloud.ts | 1501 | } catch (err) { | COMMENT |
| LOW | packages/adapters/src/runtime/cloud.ts | 1941 | } | COMMENT |
| LOW | packages/adapters/src/runtime/cloud.ts | 1961 | // Deleting the workspace orphans the archive — there's no | COMMENT |
| LOW | packages/adapters/src/system/executor.ts | 81 | // fallback below is correct for a bare install (LocalExecutor IS the host) but | COMMENT |
| LOW | packages/adapters/src/system/docker-edge-executor.ts | 101 | }); | COMMENT |
| LOW | packages/adapters/src/system/proxy/detect.ts | 461 | COMMENT | |
| LOW | packages/adapters/src/system/proxy/takeover-journal.ts | 121 | onLog: SystemLogCallback, | COMMENT |
| LOW | packages/adapters/src/system/proxy/takeover.ts | 241 | if (!install.success) { | COMMENT |
| LOW | packages/adapters/src/backup/producers/pg-dump.ts | 101 | service.env.POSTGRES_DB ?? | COMMENT |
| LOW | packages/db/src/migrations-additive.test.ts | 1 | import { describe, expect, test } from "vitest"; | COMMENT |
| LOW | packages/db/src/dump.ts | 681 | deploymentId: "deployment", | COMMENT |
| LOW | packages/db/src/dump.ts | 741 | await tx.execute(sql`SET CONSTRAINTS ALL DEFERRED`); | COMMENT |
| LOW | packages/db/src/dump.ts | 801 | // is filtered to it below so a version-skewed dump ingests cleanly: | COMMENT |
| LOW | packages/db/src/schema/webhook-delivery.ts | 1 | import { pgTable, text, integer, jsonb, timestamp, index, uniqueIndex } from "drizzle-orm/pg-core"; | COMMENT |
| LOW | packages/db/src/schema/deployment-check-run.ts | 81 | // Note: no secondary `ix_deployment_check_run_deployment` — | COMMENT |
| LOW | packages/db/src/schema/settings.ts | 141 | /** From header, e.g. "Openship <no-reply@example.com>". Falls back to smtpUser. */ | COMMENT |
| LOW | packages/db/src/schema/billing.ts | 181 | }, | COMMENT |
| LOW | .github/workflows/release.yml | 481 | name: Publish CLI to npm | COMMENT |
| LOW | .github/workflows/docker-images.yml | 1 | name: Docker images | COMMENT |
| LOW | apps/web/src/app/(docs)/layout.tsx | 1 | import type { Metadata, Viewport } from "next"; | COMMENT |
| LOW | apps/desktop/src/main/index.ts | 241 | title: "Openship", | COMMENT |
| LOW | apps/desktop/src/main/index.ts | 621 | const autoUpdate = store.get("autoUpdate") === true; | COMMENT |
| LOW | apps/desktop/src/main/services.ts | 301 | // fresh ones rather than the pair that just failed. | COMMENT |
| LOW | apps/desktop/src/main/services.ts | 361 | // Point geo-ip.ts straight at the staged mmdb. Only set when the file is | COMMENT |
| LOW | apps/desktop/src/main/services.ts | 381 | // The origin external MCP/OAuth clients actually reach this API at. Feeds | COMMENT |
| LOW | apps/cli/tsup.config.ts | 21 | noExternal: [/^@repo\//], | COMMENT |
| LOW | apps/cli/scripts/release-smoke.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | apps/cli/src/index.ts | 61 | if (thisCommand.opts().json) setJsonMode(true); | COMMENT |
| LOW | apps/cli/src/lib/compose.ts | 1121 | opts: ComposeUpOpts, | COMMENT |
| LOW | apps/cli/src/commands/up.ts | 681 | // BARE, not "desktop". This box is a server-host: openship runs ON it and it | COMMENT |
| LOW | apps/cli/src/commands/up.ts | 701 | }; | COMMENT |
| LOW | apps/cli/src/commands/up.ts | 721 | // longer INFERS the auth mode from it — it exits at boot unless the launcher | COMMENT |
| LOW | apps/dashboard/src/context/ProjectSettingsContext.tsx | 301 | "project-not-found" | "repo-not-found" | "access-denied" | null | COMMENT |
| LOW | apps/dashboard/src/context/CloudContext.tsx | 261 | // bounces to /login when the user isn't authenticated there, so this | COMMENT |
| LOW | …ashboard/src/context/deployment/useDeploymentBuild.tsx | 361 | })); | COMMENT |
| LOW | …ashboard/src/context/deployment/useDeploymentBuild.tsx | 841 | // Only a server target uses serverId — never let a stale id ride along | COMMENT |
| 232 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/core/src/apps/catalog.json | 892 | "placeholder": "UTC", | CODE |
| LOW | packages/core/src/apps/catalog.json | 901 | "placeholder": "en" | CODE |
| LOW | packages/core/src/apps/catalog/n8n.json | 65 | "placeholder": "UTC", | CODE |
| LOW | packages/core/src/apps/catalog/n8n.json | 74 | "placeholder": "en" | CODE |
| LOW | apps/dashboard/src/i18n/locales/ja/settings.json | 169 | "placeholder": "ghp_… または github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ja/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ja/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ja/chrome.json | 8 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ja/projectSettings.json | 202 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/dashboard/src/i18n/locales/pt/settings.json | 169 | "placeholder": "ghp_… ou github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/pt/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/pt/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/pt/chrome.json | 8 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | apps/dashboard/src/i18n/locales/pt/projectSettings.json | 202 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/dashboard/src/i18n/locales/zh/settings.json | 169 | "placeholder": "ghp_… 或 github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/zh/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/zh/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/zh/settings.json | 416 | "namePlaceholder": "Jane Doe", | CODE |
| LOW | apps/dashboard/src/i18n/locales/zh/chrome.json | 8 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | apps/dashboard/src/i18n/locales/zh/projectSettings.json | 202 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ar/settings.json | 169 | "placeholder": "ghp_… أو github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ar/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ar/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ar/settings.json | 416 | "namePlaceholder": "Jane Doe", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ar/chrome.json | 8 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | apps/dashboard/src/i18n/locales/ar/projectSettings.json | 202 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/dashboard/src/i18n/locales/de/settings.json | 169 | "placeholder": "ghp_… oder github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/de/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/de/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/de/chrome.json | 8 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | apps/dashboard/src/i18n/locales/de/projectSettings.json | 202 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/dashboard/src/i18n/locales/fr/settings.json | 169 | "placeholder": "ghp_… ou github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/fr/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/fr/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/fr/chrome.json | 8 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | apps/dashboard/src/i18n/locales/fr/projectSettings.json | 202 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/dashboard/src/i18n/locales/es/settings.json | 169 | "placeholder": "ghp_… o github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/es/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/es/settings.json | 299 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/es/chrome.json | 8 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | apps/dashboard/src/i18n/locales/es/projectSettings.json | 202 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/dashboard/src/i18n/locales/en/settings.json | 72 | "userPlaceholder": "user@example.com", | CODE |
| LOW | apps/dashboard/src/i18n/locales/en/settings.json | 248 | "placeholder": "ghp_… or github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/en/settings.json | 392 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/en/settings.json | 392 | "placeholder": "Acme Inc", | CODE |
| LOW | apps/dashboard/src/i18n/locales/en/settings.json | 551 | "namePlaceholder": "Jane Doe", | CODE |
| LOW | apps/dashboard/src/i18n/locales/en/chrome.json | 8 | "namePlaceholder": "Acme Corp", | CODE |
| LOW | apps/dashboard/src/i18n/locales/en/projectSettings.json | 325 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/dashboard/src/i18n/locales/tr/settings.json | 209 | "placeholder": "ghp_… veya github_pat_…", | CODE |
| LOW | apps/dashboard/src/i18n/locales/tr/settings.json | 350 | "placeholder": "Acme Şirketi", | CODE |
| LOW | apps/dashboard/src/i18n/locales/tr/projectSettings.json | 301 | "placeholder": "storage\nuploads:/app/public/uploads", | CODE |
| LOW | apps/api/test/lib/email-templates.test.ts | 46 | { name: "<script>alert(1)</script>", email: "user@example.com" }, | CODE |
| LOW | apps/api/test/modules/mail/email-case.test.ts | 202 | await softDeleteMailbox("srv_test", "Ops@Example.com", "admin@example.com"); | CODE |
| LOW⚡ | apps/email/server/test/from-header.test.ts | 9 | email: "user@example.com", | CODE |
| LOW⚡ | apps/email/server/test/from-header.test.ts | 18 | email: "user@example.com", | CODE |
| LOW⚡ | apps/email/server/test/from-header.test.ts | 27 | const from = formatFromAddress(undefined, "user@example.com", "Bikram C"); | CODE |
| LOW⚡ | apps/email/server/test/from-header.test.ts | 32 | const from = formatFromAddress(undefined, "user@example.com", "Bikram <C>"); | CODE |
| LOW⚡ | apps/email/server/test/from-header.test.ts | 37 | expect(formatFromAddress(undefined, "user@example.com", null)).toBe("user@example.com"); | CODE |
| LOW⚡ | apps/email/server/test/from-header.test.ts | 38 | expect(formatFromAddress(undefined, "user@example.com", "")).toBe("user@example.com"); | CODE |
| LOW⚡ | apps/email/server/test/from-header.test.ts | 44 | "user@example.com", | CODE |
| 20 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/email/engine/iRedMail.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/tools/migrate_sql_alias_table.py | 2 | # This file is used to migrate SQL table `vmail.alias` for SQL backends. | COMMENT |
| MEDIUM | apps/email/engine/dialog/virtual_domain_config.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/dialog/pgsql_config.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/dialog/optional_components.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/dialog/config_via_dialog.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/pkgs/get_all.sh | 7 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/pkgs/get_all.sh | 112 | # Create a temp file to store shasum | COMMENT |
| MEDIUM | apps/email/engine/functions/amavisd.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/amavisd.sh | 117 | # Create a empty disclaimer. | COMMENT |
| MEDIUM | apps/email/engine/functions/packages_freebsd.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/postgresql.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/backend.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/iredapd.sh | 7 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/clamav.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/dovecot.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/cleanup.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/postfix.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/postfix.sh | 416 | # Create the directory if not present. | COMMENT |
| MEDIUM | apps/email/engine/functions/fail2ban.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| MEDIUM | apps/email/engine/functions/packages.sh | 6 | # This file is part of iRedMail, which is an open source mail server | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/email/engine/tools/create_mail_user_OpenLDAP.py | 293 | print("Error: file not exist:", CSV) | CODE |
| LOW | apps/email/engine/tools/ldap_assign_user_to_groups.py | 150 | except Exception as e: | STRING |
| LOW | …ail/engine/tools/ldap_move_members_to_another_group.py | 120 | except Exception as e: | STRING |
| LOW | apps/email/engine/tools/migrate_sql_alias_table.py | 52 | except Exception as e: | CODE |
| LOW | apps/email/engine/tools/migrate_sql_alias_table.py | 145 | except Exception as e: | CODE |
| MEDIUM | apps/email/engine/tools/migrate_sql_alias_table.py | 150 | print("Error while migrating %s %s: %s" % (_type, m, repr(e))) | CODE |
| LOW | apps/email/engine/tools/migrate_sql_alias_table.py | 168 | except Exception as e: | CODE |
| MEDIUM | apps/email/engine/tools/migrate_sql_alias_table.py | 173 | print("Error while migrating moderators of alias account %s: %s" % (m, repr(e))) | CODE |
| LOW | …ps/email/engine/update/ldap/update-ldap-dovecot-2.3.py | 58 | except Exception as e: | CODE |
| MEDIUM | …ps/email/engine/update/ldap/update-ldap-dovecot-2.3.py | 59 | print("Error while updating user {}: {}".format(mail, repr(e))) | CODE |
| LOW | apps/email/engine/update/1.4.1/update-ldap.py | 55 | except Exception as e: | CODE |
| MEDIUM | apps/email/engine/update/1.4.1/update-ldap.py | 56 | print("Error while updating user {}: {}".format(mail, repr(e))) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/adapters/docs/CLOUD.md | 71 | ### Step 1: User connects their Openship Cloud account | COMMENT |
| LOW | packages/adapters/docs/CLOUD.md | 82 | ### Step 2: Deploy to cloud | COMMENT |
| LOW | …ashboard/src/context/deployment/useDeploymentBuild.tsx | 726 | // Step 1: Ensure project exists | COMMENT |
| LOW | …ashboard/src/context/deployment/useDeploymentBuild.tsx | 811 | // Step 2: Create deployment with config snapshot + env vars | COMMENT |
| LOW | apps/api/src/modules/github/github.controller.ts | 249 | // Step 1: GitHub OAuth via SaaS. The Connect button does this FIRST. | COMMENT |
| LOW | apps/api/src/modules/github/github.controller.ts | 270 | // Step 2: OAuth done. Check if installations already exist. | COMMENT |
| LOW⚡ | apps/api/src/modules/cloud/cloud-saas.controller.ts | 825 | // Step 1: Local→SaaS Step 2: SaaS→Browser Step 3: Browser→GitHub→SaaS | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | apps/dashboard/src/app/(dashboard)/projects/page.tsx | 187 | {t.dashboard.pages.projects.noResultsFound.replace("{query}", searchQuery)} | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ashboard/src/context/deployment/useDeploymentBuild.tsx | 726 | // Step 1: Ensure project exists | COMMENT |
| LOW | …ashboard/src/context/deployment/useDeploymentBuild.tsx | 811 | // Step 2: Create deployment with config snapshot + env vars | COMMENT |
| LOW | apps/api/src/modules/github/github.controller.ts | 249 | // Step 1: GitHub OAuth via SaaS. The Connect button does this FIRST. | COMMENT |
| LOW | apps/api/src/modules/github/github.controller.ts | 270 | // Step 2: OAuth done. Check if installations already exist. | COMMENT |
| LOW⚡ | apps/api/src/modules/cloud/cloud-saas.controller.ts | 825 | // Step 1: Local→SaaS Step 2: SaaS→Browser Step 3: Browser→GitHub→SaaS | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/db-email/src/schema/mail_app.ts | 84 | // AI-generated summary of a single message. `connection_id` upstream is | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …/dashboard/src/app/(auth)/select-organization/page.tsx | 131 | // payloads — robust against shared members between orgs. | COMMENT |
| MEDIUM | apps/email/client/components/mail/thread-display.tsx | 195 | // wiring robust to row-click misses, keyboard navigation, and direct | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/email/engine/tools/fail2ban_unban_ip.sh | 6 | # Usage: | COMMENT |
| LOW | apps/email/engine/tools/create_mail_user_SQL.sh | 8 | # Usage: | COMMENT |
| LOW⚡ | apps/email/engine/functions/cleanup.sh | 30 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/api/src/modules/system/setup.controller.ts | 790 | // guardrails authMiddleware does. Using the shared guard (canonical authMode | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/email/engine/tools/create_mail_user_OpenLDAP.py | 128 | CODE | |
| LOW | apps/email/engine/tools/migrate_sql_alias_table.py | 69 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/email/client/components/create/email-phrases.ts | 70 | 'Let me know if you need any clarification ', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/email/client/app/entry.server.tsx | 7 | export default async function handleRequest( | CODE |