A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today!
This report summarizes scanner evidence for amruthpillai/reactive-resume, a TypeScript project with 45,116 GitHub stars. SynthScan examined 309,891 lines of code across 1952 source files, recording 188 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 1.0 (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? 141 finding(s).
Are imports declared and package/API names verified? 38 finding(s).
Are wrappers, guards, and repeated structures necessary? 137 finding(s).
Which changes need focused human review? 188 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 188 distinct pattern matches across 9 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 | tooling/custom-styles.test.ts | 9 | function extractSemanticCssExamples(source: string): SemanticCssExample[] { | CODE |
| LOW | tooling/recovery/compare-resume.ts | 189 | function hasDuplicateSerializedResumeMembers(value: unknown): boolean { | CODE |
| LOW | tooling/mobile/distribution_test.rb | 28 | def app_store_connect_api_key(**_options) | CODE |
| LOW | tests/e2e/specs/builder-save-navigation.spec.ts | 11 | async function clickDashboardWithoutNavigationWait(page: Page) { | CODE |
| LOW | packages/forme-native/src/index.ts | 20 | export async function renderSerializedDocWithLayout(doc: Record<string, unknown>): Promise<RenderWithLayoutResult> { | CODE |
| LOW | packages/auth/src/config.ts | 114 | export function isCustomOAuthProviderEnabled() { | CODE |
| LOW | packages/auth/src/oauth-profile.ts | 81 | async function normalizeExistingUserEmail(userId: string, currentEmail: string, normalizedEmail: string) { | CODE |
| LOW | packages/auth/src/oauth-profile.ts | 143 | async function findAvailableUsernameSuffix(baseUsername: string, index = 1): Promise<string | null> { | CODE |
| LOW | packages/auth/src/oauth-profile.ts | 230 | export function createGithubProfileMapper() { | CODE |
| LOW | packages/resume/src/markdown.ts | 111 | export function getVisibleResumeStructure(data: ResumeStructure) { | CODE |
| LOW | packages/resume/src/export-sections.ts | 14 | export function isCoverLetterOnlyDocument(data: ResumeData): boolean { | CODE |
| LOW | packages/resume/src/section-sort.ts | 27 | function compareEndpointDescending(left: PeriodEndpoint | undefined, right: PeriodEndpoint | undefined): number { | CODE |
| LOW | packages/resume/src/structural-proposals.ts | 167 | export function applyResumeStructureChange(data: ResumeData, change: Exclude<ResumeChange, { kind: "text" }>) { | CODE |
| LOW | packages/resume/src/cover-letter.ts | 15 | export function createCoverLetterResumeData( | CODE |
| LOW | packages/resume/src/stylesheet/diagnostics.ts | 107 | export function isFatalStylesheetDiagnostic({ code }: Pick<SemanticCssDiagnostic, "code">): boolean { | CODE |
| LOW | packages/resume/src/stylesheet/values.ts | 65 | function isRegisteredPropertyValue(property: string, value: string): boolean { | CODE |
| LOW | packages/resume/src/stylesheet/values.ts | 71 | function isRegisteredShorthandComponent(property: string, value: string): boolean { | CODE |
| LOW | packages/resume/src/stylesheet/values.ts | 168 | function unsupportedPropertyMessage(property: string, value: AstNode | string | null | undefined): string { | CODE |
| LOW | packages/resume/src/stylesheet/serialize.ts | 27 | export function serializeGeneratedStylesheet(stylesheet: GeneratedStylesheet): string { | CODE |
| LOW | packages/pdf/src/html/document.ts | 173 | export function renderUnavailableDocument(options: { lang: string; messages: WebPageMessages }): string { | CODE |
| LOW | packages/pdf/src/forme/images.node.ts | 8 | export function configureOwnPictureReader(reader: (key: string) => Promise<Uint8Array>): void { | CODE |
| LOW | packages/pdf/src/semantic/template-manifest.ts | 171 | export function getTemplateSemanticManifest(template: Template): TemplateSemanticManifest { | CODE |
| LOW | packages/pdf/src/semantic/template-manifest.ts | 175 | export function getTemplateSemanticBindingRegistry(template: Template): SemanticBindingRegistry { | CODE |
| LOW | packages/pdf/src/semantic/context.tsx | 188 | export function SemanticItemNodeKeyProvider({ itemId, children }: { itemId: string; children: ReactNode }) { | CODE |
| LOW | packages/pdf/src/semantic/legacy-converter.ts | 294 | export function needsLegacyStyleConversion( | CODE |
| LOW | packages/pdf/src/templates/shared/primitives.tsx | 382 | export function semanticTemplatePartNodeKey(ownerNodeKey: string | undefined, ...partKeys: string[]) { | CODE |
| LOW | packages/utils/src/url-security.node.ts | 254 | export function isAllowedOAuthRedirectUri(input: string, trustedOrigins: string[], options?: OAuthRedirectUriOptions) { | CODE |
| LOW | packages/schema/src/resume/json-schema.ts | 11 | export function createResumeDataJsonSchema() { | CODE |
| LOW | packages/schema/src/resume/json-schema.ts | 21 | export function createCustomSectionItemJsonSchemas() { | CODE |
| LOW | packages/schema/src/applications/lanes.ts | 36 | export function createDefaultApplicationLanes(): ApplicationLane[] { | CODE |
| LOW | packages/schema/src/applications/lanes.ts | 49 | export function getActiveApplicationLanes(lanes: readonly ApplicationLane[]): ApplicationLane[] { | CODE |
| LOW | packages/ai/src/resume/sanitize.ts | 110 | function coerceValueAgainstTemplate( | CODE |
| LOW | packages/ai/src/resume/sanitize.ts | 176 | function normalizeResumeDataForSchema(data: Record<string, unknown>, diagnostics: ResumeSanitizationDiagnostics) { | CODE |
| LOW | packages/ai/src/resume/sanitize.ts | 235 | export function sanitizeAndParseResumeJson(resultText: string): ResumeSanitizationResult { | CODE |
| LOW | packages/ai/src/resume/extraction-template.ts | 92 | export function buildAiExtractionTemplate() { | CODE |
| LOW | packages/db/src/application-lanes.ts | 5 | export function createDefaultOwnedApplicationLanes(userId: string) { | CODE |
| LOW | packages/api/src/context.ts | 38 | async function getAuthenticationFromBearerToken(headers: Headers): Promise<RequestAuthentication | null> { | CODE |
| LOW | packages/api/src/context.ts | 59 | async function getAuthenticationFromApiKey(apiKey: string): Promise<RequestAuthentication | null> { | CODE |
| LOW | packages/api/src/context.ts | 78 | export async function resolveAuthenticationFromRequestHeaders(headers: Headers): Promise<RequestAuthentication | null> { | CODE |
| LOW | packages/api/src/context.ts | 109 | export async function resolveUserFromRequestHeaders(headers: Headers): Promise<User | null> { | CODE |
| LOW | packages/api/src/middleware/rate-limit/index.ts | 82 | export async function consumeResumePasswordLimit(input: ResumePasswordAttempt): Promise<boolean> { | CODE |
| LOW | packages/api/src/features/web-access/credentials.ts | 31 | function assertPersonalKeysAllowed() { | CODE |
| LOW | packages/api/src/features/resume/pdf-download-url.ts | 68 | export function createResumePdfDownloadUrl({ resumeId, userId, now = new Date() }: CreateResumePdfDownloadUrlInput) { | CODE |
| LOW | packages/api/src/features/resume/pdf-download-url.ts | 89 | export function verifyResumePdfDownloadToken({ | CODE |
| LOW | packages/api/src/features/agent/runs.ts | 48 | export async function clearActiveAgentRunIfCurrent( | CODE |
| LOW | packages/api/src/features/agent/routing.ts | 4 | function isAgentEnvironmentUnavailable(error: unknown) { | CODE |
| LOW | packages/api/src/features/agent/messages-persistence.ts | 194 | export function withAccumulatedUsageMetadata(previous: UIMessage, next: UIMessage): UIMessage { | CODE |
| LOW | packages/api/src/features/agent/messages-persistence.ts | 226 | export async function insertDraftAssistantMessage( | CODE |
| LOW | packages/api/src/features/agent/streams.ts | 18 | export function configureAgentStreamLifetime(callback: (promise: Promise<unknown>) => void) { | CODE |
| LOW | packages/api/src/features/agent/streams.ts | 45 | export function createAgentStreamLifecycle(options: AgentStreamLifecycleOptions) { | CODE |
| LOW | packages/api/src/features/agent/service.ts | 209 | function withoutAgentAttachmentUiParts(message: UIMessage): UIMessage { | CODE |
| LOW | packages/api/src/features/agent/service.ts | 306 | function getFirstUnansweredAskUserQuestionToolCallId(message: UIMessage) { | CODE |
| LOW | packages/api/src/features/agent/service.ts | 319 | function answerAskUserQuestionToolCall(message: UIMessage, toolCallId: string, answer: string) { | CODE |
| LOW | packages/api/src/features/agent/service.ts | 340 | function buildAttachmentModelParts(input: AttachmentModelInput[]): Array<TextPart | ImagePart | FilePart> { | CODE |
| LOW | packages/api/src/features/agent/service.ts | 374 | async function getUnlinkedMessageAttachments({ ids, ...input }: { ids: string[]; threadId: string; userId: string }) { | CODE |
| LOW | packages/api/src/features/agent/service.ts | 437 | function readAttachmentModelInputs(attachments: AgentAttachmentRecord[]): Promise<AttachmentModelInput[]> { | CODE |
| LOW | packages/api/src/features/agent/service.ts | 453 | function attachModelPartsToLatestUserMessage( | CODE |
| LOW | packages/api/src/features/agent/service.ts | 510 | function updateAssistantToolResultMessage(input: { | CODE |
| LOW | packages/api/src/features/agent/service.ts | 596 | async function repairLegacyAskUserQuestionAnswers( | CODE |
| LOW | packages/api/src/features/storage/cleanup.ts | 73 | export function reportStorageCleanupSummary(summary: StorageCleanupSummary) { | CODE |
| 68 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | packages/resume/src/ats/rules.ts | 85 | const website = context.data.basics.website.url.trim(); | CODE |
| CRITICAL | packages/mcp/src/tool-meta.ts | 269 | resumeDto.create.input.extend({ tags: resumeDto.create.input.shape.tags.default([]) }).strict(), | CODE |
| CRITICAL⚡ | packages/api/src/dto/cover-letter.ts | 98 | name: coverLetterStyleSchema.shape.basics.shape.name.describe("The letter sender's full name."), | CODE |
| CRITICAL⚡ | packages/api/src/dto/cover-letter.ts | 99 | email: coverLetterStyleSchema.shape.basics.shape.email.describe("The letter sender's email address."), | CODE |
| CRITICAL⚡ | packages/api/src/dto/cover-letter.ts | 100 | phone: coverLetterStyleSchema.shape.basics.shape.phone.describe("The letter sender's phone number."), | CODE |
| CRITICAL⚡ | packages/api/src/dto/cover-letter.ts | 101 | location: coverLetterStyleSchema.shape.basics.shape.location.describe("The letter sender's location."), | CODE |
| CRITICAL | packages/api/src/features/cover-letters/service.ts | 338 | const sender = coverLetterDto.update.input.shape.sender.unwrap().parse(input.sender); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …s/reactive-resume/skills/resume-content-guide/SKILL.md | 242 | { "op": "test", "path": "/sections/experience/items/5/company", "value": "Acme Corp" }, | CODE |
| LOW | …sume/skills/resume-content-guide/references/patches.md | 69 | { "op": "test", "path": "/sections/experience/items/5/company", "value": "Acme Corp" }, | CODE |
| LOW | packages/pdf/src/paragraph-indent.integration.test.tsx | 15 | data.basics.name = "Jane Doe"; | CODE |
| LOW | …ckages/pdf/src/special-characters.integration.test.tsx | 16 | data.basics.name = "Jane Doe"; | CODE |
| LOW | packages/pdf/src/forme/phosphor-icons/rest.json | 1058 | "placeholder": "<path d=\"M 208 32 H 48 A 16 16 0 0 0 32 48 V 208 a 16 16 0 0 0 16 16 H 208 a 16 16 0 0 0 16 -16 V 48 A | CODE |
| LOW | packages/mcp/src/prompts.ts | 74 | '| Change name | `{ "op": "replace", "path": "/basics/name", "value": "Jane Doe" }` |', | CODE |
| LOW | packages/schema/src/icons.ts | 1095 | "placeholder", | CODE |
| LOW | packages/api/src/dto/application.test.ts | 21 | contacts: [{ name: "Jane Doe" }], | CODE |
| LOW | packages/api/src/features/resume/social-meta.test.ts | 44 | data.basics.name = "Jane Doe"; | CODE |
| LOW | packages/api/src/features/resume/social-meta.test.ts | 58 | expect(card?.data.basics.name).toBe("Jane Doe"); | CODE |
| LOW | packages/import/src/plain-text.test.ts | 247 | expect(data.sections.experience.items[0]).toMatchObject({ company: "Acme Corp", period: "Jan 2020 – Present" }); | CODE |
| LOW | …kages/import/src/reactive-resume-v4-json.broad.test.ts | 6 | name: "Jane Doe", | CODE |
| LOW | …kages/import/src/reactive-resume-v4-json.broad.test.ts | 81 | company: "Acme Corp", | CODE |
| LOW | …kages/import/src/reactive-resume-v4-json.broad.test.ts | 213 | expect(result.basics.name).toBe("Jane Doe"); | CODE |
| LOW | …kages/import/src/reactive-resume-v4-json.broad.test.ts | 260 | expect(exp.company).toBe("Acme Corp"); | CODE |
| LOW | packages/import/src/json-resume.test.ts | 20 | name: "Jane Doe", | CODE |
| LOW | packages/import/src/json-resume.test.ts | 31 | expect(result.basics.name).toBe("Jane Doe"); | CODE |
| LOW | packages/import/src/json-resume.test.ts | 44 | name: "Acme Corp", | CODE |
| LOW | packages/import/src/json-resume.test.ts | 62 | expect(item.company).toBe("Acme Corp"); | CODE |
| LOW | packages/import/src/linkedin.test.ts | 26 | expect(result.basics.name).toBe("Jane Doe"); | CODE |
| LOW | packages/import/src/reactive-resume-v4-json.test.ts | 9 | name: "Jane Doe", | CODE |
| LOW | packages/email/src/transport.test.ts | 49 | sendEmail({ to: "user@example.com", subject: "Reset password", react: fakeReact }), | CODE |
| LOW | packages/email/src/transport.test.ts | 52 | to: "user@example.com", | CODE |
| LOW | packages/email/src/transport.test.ts | 63 | sendEmail({ to: "user@example.com", subject: "Reset password", react: fakeReact }), | CODE |
| LOW | packages/email/src/transport.test.ts | 66 | to: "user@example.com", | CODE |
| LOW | apps/web/src/features/career/coach-thread.tsx | 320 | type ComposerProps = Pick<CoachThreadProps, "placeholder" | "chips" | "privacy" | "draftKey" | "variant"> & { | CODE |
| LOW | apps/web/src/features/auth/pages/register.tsx | 153 | message: "John Doe", | CODE |
| LOW | apps/web/src/features/resume/import/pdf-text.test.ts | 78 | "Acme Corp", | CODE |
| LOW | apps/web/src/features/applications/csv.test.ts | 40 | contacts: [{ name: "Jane Doe", role: "", type: "", email: "jane@example.com", phone: "+1 555 0100" }], | CODE |
| LOW | apps/mobile/src/features/assistant/chat-view.tsx | 689 | type ComposerProps = Pick<ScopedChatViewProps, "chips" | "privacy" | "placeholder" | "scope"> & { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/mcp/src/resources.ts | 11 | // ── Resource: resume://{id} ────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/src/resources.ts | 52 | // ── Resource: resume://_meta/schema ─────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/src/prompts.ts | 9 | // ── Shared prompt helpers ──────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/src/prompts.ts | 93 | // ── Prompt Registration ────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/src/prompts.ts | 96 | // ── Build Resume ───────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/src/prompts.ts | 136 | // ── Improve Resume ─────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/mcp/src/prompts.ts | 179 | // ── Review Resume ──────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/import/src/reactive-resume-v4-json.test.ts | 275 | // ─── Bug #2726-B: Skill / Language levels incorrectly clamped to max ────────── | COMMENT |
| MEDIUM | packages/import/src/reactive-resume-v4-json.test.ts | 275 | // ─── Bug #2726-B: Skill / Language levels incorrectly clamped to max ────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …s/reactive-resume/skills/resume-content-guide/SKILL.md | 60 | ### Step 1: Classify the request | COMMENT |
| LOW⚡ | …s/reactive-resume/skills/resume-content-guide/SKILL.md | 67 | ### Step 2: Read first | COMMENT |
| LOW⚡ | …s/reactive-resume/skills/resume-content-guide/SKILL.md | 76 | ### Step 3: Confirm context in one message | COMMENT |
| LOW | …s/reactive-resume/skills/resume-content-guide/SKILL.md | 88 | ### Step 4: Run the checks | COMMENT |
| LOW | …s/reactive-resume/skills/resume-content-guide/SKILL.md | 107 | ### Step 5: Report | COMMENT |
| LOW | …s/reactive-resume/skills/resume-content-guide/SKILL.md | 118 | ### Step 6: Apply with consent, then follow up | COMMENT |
| LOW | plugins/reactive-resume/skills/resume-builder/SKILL.md | 32 | ### Step 1: Gather Basic Information | COMMENT |
| LOW | plugins/reactive-resume/skills/resume-builder/SKILL.md | 43 | ### Step 2: Collect Section Content | COMMENT |
| LOW | plugins/reactive-resume/skills/resume-builder/SKILL.md | 57 | ### Step 3: Configure Layout and Design | COMMENT |
| LOW | plugins/reactive-resume/skills/resume-builder/SKILL.md | 65 | ### Step 4: Generate Valid JSON | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tooling/docker-publishing.test.ts | 202 | elif [[ "$CHANGED" == true && "$4" != *:sha-* ]]; then | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ges/dsh-plugin/docs/plans/2026-08-16-implementation.md | 134 | ### Task 2: Repo scaffold with a green build and test cycle | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/schema/src/resume/sample.ts | 461 | "<ul><li>Core developer on 'Starbound Odyssey,' a sci-fi roguelike that achieved 500K+ sales on Steam with 'Very P | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/dsh-plugin/cordis.patch.yml | 1 | # dsh-plugin-reactive-resume bundle patch: one insert over the profile root. | COMMENT |