A cross-platform Markdown AI note-taking software.
This report presents the forensic synthetic code analysis of codexu/note-gen, a TypeScript project with 12,294 GitHub stars. SynthScan v2.0 examined 161,625 lines of code across 692 source files, recording 372 pattern matches distributed across 4 syntactic categories. The overall adjusted score of 2.4 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 372 distinct pattern matches across 4 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/general/interface-settings/file-manager-text-size.tsx | 16 | export function FileManagerTextSizeSettings() { | CODE |
| LOW | src/app/core/setting/about/updater.tsx | 278 | async function handleRestoreIgnoredVersion() { | CODE |
| LOW | src/app/core/setting/sync/gitlab-sync.tsx | 109 | async function instanceTypeChangeHandler(value: GitlabInstanceType) { | CODE |
| LOW | src/app/core/setting/sync/gitea-sync.tsx | 122 | async function instanceTypeChangeHandler(value: GiteaInstanceType) { | CODE |
| LOW | src/app/core/setting/sync/page.tsx | 208 | async function handleExcludeSensitiveConfigChange(checked: boolean) { | CODE |
| LOW | src/app/core/main/chat/chat-send.tsx | 26 | function getLastDisplayableAgentContent( | CODE |
| LOW | src/app/core/main/chat/streaming-smoother.ts | 15 | export function getAdaptiveCharsPerSecond(backlog: number): number { | CODE |
| LOW | src/app/core/main/chat/prompt-select.tsx | 23 | async function promptSelectChangeHandler(id: string) { | CODE |
| LOW | src/app/core/main/chat/chat-input.tsx | 388 | async function buildAttachmentsFromBrowserFiles(files: File[], source: 'file' | 'paste', maxCount: number) { | CODE |
| LOW | src/app/core/main/chat/chat-input.tsx | 424 | async function buildAttachmentsFromLocalPaths(paths: string[], maxCount: number) { | CODE |
| LOW | src/app/core/main/chat/agent-approval-actions.ts | 6 | export function confirmPendingAgentAction(scope: AgentApprovalScope = "once") { | CODE |
| LOW | src/app/core/main/file/file-item.tsx | 43 | function shouldAutoSyncOnInitialRead(options?: { isNewFile?: boolean }) { | CODE |
| LOW | src/app/core/main/file/file-actions.tsx | 24 | async function copyMarkdownFilesRecursively( | CODE |
| LOW | src/app/core/main/file/batch-selection-context-menu.tsx | 21 | export function BatchSelectionContextMenu({ | CODE |
| LOW | src/app/core/main/file/file-manager.tsx | 245 | function updateSelectionFromPointer(currentX: number, currentY: number) { | CODE |
| LOW | src/app/core/main/file/file-manager.tsx | 391 | async function handleDeleteSelectedEntries() { | CODE |
| LOW | src/app/core/main/file/vector-knowledge-menu.tsx | 107 | async function handleToggleExcludeFromKB(checked: boolean) { | CODE |
| LOW | src/app/core/main/file/file-selection.ts | 62 | export function getTopLevelSelectionEntries(entries: FileSelectionEntry[]) { | CODE |
| LOW | src/app/core/main/file/file-selection.ts | 78 | export function isInteractiveSelectionTarget(target: EventTarget | null) { | CODE |
| LOW | src/app/core/main/file/file-dnd.ts | 43 | export function isInvalidFolderMoveTarget(sourcePath: string, targetDirectoryPath: string) { | CODE |
| LOW | …/app/core/main/file/folder-item/delete-folder-utils.ts | 120 | export async function collectFolderMarkdownPaths(folderPath: string, item: DirTree) { | CODE |
| LOW | …/app/core/main/file/folder-item/delete-folder-utils.ts | 137 | export async function deleteVectorDocumentsByPaths(paths: string[]) { | CODE |
| LOW | …/app/core/main/file/folder-item/delete-folder-utils.ts | 152 | export async function deleteLocalFolderIfExists(folderPath: string) { | CODE |
| LOW | …/app/core/main/file/folder-item/delete-folder-utils.ts | 208 | async function collectGitRemoteFileEntries(platform: GitSyncPlatform, folderPath: string, repo: string) { | CODE |
| LOW | src/app/core/main/mark/image-record-status.ts | 50 | export function getImageRecordDisplayText( | CODE |
| LOW | src/app/core/main/mark/organize-notes.tsx | 65 | function shouldAutoSyncOnInitialRead(options?: { isNewFile?: boolean }) { | CODE |
| LOW | src/app/core/main/mark/image-gallery.tsx | 288 | function handleToggleImageGroupSelection() { | CODE |
| LOW | src/app/core/main/mark/organize-onboarding.ts | 1 | export function shouldEmitOrganizeOnboardingComplete({ | CODE |
| LOW | src/app/core/main/mark/control-scan.tsx | 50 | function isScreenshotDialogControlTarget(target: EventTarget | null) { | CODE |
| LOW | src/app/core/main/mark/control-scan.tsx | 87 | function setCenteredDefaultCropBox(cropper: Cropper) { | CODE |
| LOW | src/app/core/main/mark/mark-type-meta.ts | 54 | export function getMarkTypeListBadgeClasses(type: Mark["type"], textSize?: string) { | CODE |
| LOW | src/app/core/main/editor/empty-state-actions.ts | 1 | export async function createNewNoteFromEmptyState({ | CODE |
| LOW | src/app/core/main/editor/empty-state-actions.ts | 19 | export async function startCreateRecordOnboardingStep({ | CODE |
| LOW | src/app/core/main/editor/empty-state-actions.ts | 44 | export function getOnboardingSpotlightTarget(step: 'create-record' | 'organize-note' | 'ai-polish') { | CODE |
| LOW | src/app/core/main/editor/onboarding-state.ts | 15 | export function createDefaultOnboardingProgress(): OnboardingProgress { | CODE |
| LOW | src/app/core/main/editor/onboarding-state.ts | 26 | export function normalizeOnboardingProgress(value: unknown): OnboardingProgress { | CODE |
| LOW | src/app/core/main/editor/onboarding-state.ts | 80 | export function shouldShowOnboardingTasks(progress: OnboardingProgress): boolean { | CODE |
| LOW | src/app/core/main/editor/onboarding-state.ts | 84 | export function getCompletionFeedbackMode( | CODE |
| LOW | src/app/core/main/editor/markdown/markdown-export.ts | 256 | export function getMarkdownExportBaseName(filePath?: string) { | CODE |
| LOW | src/app/core/main/editor/markdown/markdown-export.ts | 361 | function registerHighlightLanguages() { | CODE |
| LOW | src/app/core/main/editor/markdown/markdown-export.ts | 436 | async function resolveMarkdownImageSources(html: string, sourcePath?: string) { | CODE |
| LOW | src/app/core/main/editor/markdown/markdown-export.ts | 459 | function sanitizeExportElementAttributes(root: DocumentFragment | Element) { | CODE |
| LOW | …p/core/main/editor/markdown/ai-suggestion-highlight.ts | 62 | export function clearAiSuggestionHighlight(editor: Editor) { | CODE |
| LOW | src/app/core/main/editor/markdown/quote-session.ts | 3 | export function shouldRestorePendingQuote( | CODE |
| LOW | src/app/core/main/editor/markdown/markdown-paragraph.ts | 19 | export function normalizeMarkdownPlaceholders(markdown: string): string { | CODE |
| LOW | …p/core/main/editor/markdown/ai-suggestion-floating.tsx | 35 | function calculateFloatingPosition( | CODE |
| LOW | src/app/core/main/editor/markdown/bubble-menu.tsx | 78 | function isKeyboardSelectionIntent(event: KeyboardEvent): boolean { | CODE |
| LOW | src/app/core/main/editor/markdown/image-src.ts | 17 | export function shouldTransformImageSrcToWorkspaceAsset(src: string | null | undefined): boolean { | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 169 | function getEditorBlockDropIndicatorTop(editor: CoreEditor, pos: number, fallbackTop: number) { | CODE |
| LOW⚡ | src/app/core/main/editor/markdown/tiptap-editor.tsx | 197 | function clearEditorNativeDropCursor(editor: CoreEditor) { | CODE |
| LOW⚡ | src/app/core/main/editor/markdown/tiptap-editor.tsx | 207 | function getDroppedMarkImageMimeType(fileName: string) { | CODE |
| LOW⚡ | src/app/core/main/editor/markdown/tiptap-editor.tsx | 217 | function isEditorAiGenerationAction(action: unknown): action is EditorAiGenerationAction { | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 328 | function normalizeWorkspacePathSegments(path: string): string[] { | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 438 | async function getWorkspaceRelativePathForAbsolutePath(path: string): Promise<string | null> { | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 450 | async function getMarkdownHrefForDroppedPath(path: string, currentFilePath: string): Promise<string> { | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 466 | async function createMarkdownLinksForDroppedPaths(files: DroppedFileLink[], currentFilePath: string): Promise<string[]> | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 475 | function getFileUrlsFromDataTransfer(dataTransfer: DataTransfer): string[] { | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 496 | async function getDroppedFileMarkdownLinks(dataTransfer: DataTransfer, currentFilePath: string): Promise<string[]> { | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 562 | async function openLocalPathWithDefaultApp(path: string) { | CODE |
| LOW | src/app/core/main/editor/markdown/tiptap-editor.tsx | 592 | function getImageDimensionFromElement(element: HTMLElement, name: 'width' | 'height'): number | null { | CODE |
| 178 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | messages/zh.json | 2134 | "placeholder": "搜索 AI 模型", | CODE |
| LOW⚡ | messages/zh.json | 2139 | "placeholder": "搜索 Prompt" | CODE |
| LOW⚡ | messages/zh.json | 2145 | "placeholder": "搜索语言" | CODE |
| LOW | messages/zh.json | 45 | "placeholder": "选择缩放比例" | CODE |
| LOW | messages/zh.json | 62 | "placeholder": "选择字体", | CODE |
| LOW | messages/zh.json | 83 | "placeholder": "在此输入自定义 CSS 代码。", | CODE |
| LOW | messages/zh.json | 103 | "placeholder": "点击生成按钮将当前配色导出为代码" | CODE |
| LOW | messages/zh.json | 108 | "placeholder": "粘贴配色方案的 JSON 代码" | CODE |
| LOW | messages/zh.json | 426 | "placeholder": "输入 Mermaid 图表代码...", | CODE |
| LOW | messages/zh.json | 520 | "placeholder": "输入 Agent 的身份定义、工具调用约束和 Core Rules。", | CODE |
| LOW | messages/zh.json | 582 | "placeholder": "请选择或搜索模型", | CODE |
| LOW | messages/zh.json | 593 | "placeholder": { | CODE |
| LOW | messages/zh.json | 923 | "placeholder": "选择自动同步时间", | CODE |
| LOW | messages/zh.json | 977 | "placeholder": "输入 S.EE API Token" | CODE |
| LOW | messages/zh.json | 1201 | "placeholder": "使用主模型" | CODE |
| LOW | messages/zh.json | 1223 | "placeholder": "输入自定义提示词...", | CODE |
| LOW | messages/zh.json | 1876 | "placeholder": { | CODE |
| LOW | messages/zh.json | 2102 | "placeholder": { | CODE |
| LOW | messages/zh.json | 2412 | "placeholder": "输入标签名称" | CODE |
| LOW | messages/zh.json | 2416 | "placeholder": "搜索笔记和文章...", | CODE |
| LOW | messages/zh.json | 2791 | "placeholder": "在文档中查找", | CODE |
| LOW | messages/zh.json | 3036 | "placeholder": "输入 / 唤起菜单,或直接开始写作...", | CODE |
| LOW | messages/zh.json | 3138 | "placeholder": "输入 Mermaid 图表代码...", | CODE |
| LOW | messages/zh.json | 3244 | "placeholder": "输入 AI 指令", | CODE |
| LOW⚡ | messages/ja.json | 2091 | "placeholder": "AIモデルを検索", | CODE |
| LOW⚡ | messages/ja.json | 2096 | "placeholder": "プロンプトを検索" | CODE |
| LOW⚡ | messages/ja.json | 2104 | "placeholder": "言語を検索" | CODE |
| LOW | messages/ja.json | 45 | "placeholder": "スケール比率を選択" | CODE |
| LOW | messages/ja.json | 62 | "placeholder": "フォントを選択", | CODE |
| LOW | messages/ja.json | 83 | "placeholder": "ここにカスタム CSS コードを入力", | CODE |
| LOW | messages/ja.json | 109 | "placeholder": "点击生成按钮将当前配色导出为代码" | CODE |
| LOW | messages/ja.json | 114 | "placeholder": "粘贴配色方案的 JSON 代码" | CODE |
| LOW | messages/ja.json | 372 | "placeholder": "Mermaid диаграммаコードを入力...", | CODE |
| LOW | messages/ja.json | 466 | "placeholder": "Agent の身分定義、ツール呼び出し制約、Core Rules を入力してください。", | CODE |
| LOW | messages/ja.json | 528 | "placeholder": "モデルを選択または検索してください", | CODE |
| LOW | messages/ja.json | 538 | "placeholder": { | CODE |
| LOW | messages/ja.json | 782 | "placeholder": "自動同期時間", | CODE |
| LOW | messages/ja.json | 891 | "placeholder": "S.EE API Token を入力" | CODE |
| LOW | messages/ja.json | 1116 | "placeholder": "メインモデルを使用" | CODE |
| LOW | messages/ja.json | 1138 | "placeholder": "カスタムプロンプトを入力...", | CODE |
| LOW | messages/ja.json | 1867 | "placeholder": { | CODE |
| LOW | messages/ja.json | 2060 | "placeholder": { | CODE |
| LOW | messages/ja.json | 2322 | "placeholder": "入力するタグ名" | CODE |
| LOW | messages/ja.json | 2413 | "placeholder": "ノートと記事を検索...", | CODE |
| LOW | messages/ja.json | 2711 | "placeholder": "ドキュメント内を検索", | CODE |
| LOW | messages/ja.json | 2948 | "placeholder": "「/」を入力してメニューを開くか、直接書き始める...", | CODE |
| LOW | messages/ja.json | 3050 | "placeholder": "Mermaid диаграммаコードを入力...", | CODE |
| LOW | messages/ja.json | 3156 | "placeholder": "AI 指示を入力", | CODE |
| LOW⚡ | messages/en.json | 2216 | "placeholder": "Search AI models", | CODE |
| LOW⚡ | messages/en.json | 2221 | "placeholder": "Search prompts" | CODE |
| LOW⚡ | messages/en.json | 2230 | "placeholder": "Search language" | CODE |
| LOW | messages/en.json | 45 | "placeholder": "Select scale ratio" | CODE |
| LOW | messages/en.json | 62 | "placeholder": "Select font", | CODE |
| LOW | messages/en.json | 83 | "placeholder": "Enter custom CSS code here", | CODE |
| LOW | messages/en.json | 103 | "placeholder": "Click the generate button to export current color scheme as code" | CODE |
| LOW | messages/en.json | 108 | "placeholder": "Paste the JSON code of the color scheme" | CODE |
| LOW | messages/en.json | 426 | "placeholder": "Enter Mermaid diagram code...", | CODE |
| LOW | messages/en.json | 651 | "placeholder": "Please select or search for models", | CODE |
| LOW | messages/en.json | 661 | "placeholder": { | CODE |
| LOW | messages/en.json | 762 | "placeholder": "Enter the Agent identity, tool-call constraints, and Core Rules.", | CODE |
| 69 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | messages/en.json | 1924 | "description": "The current note is generated by AI and cannot be edited. Convert the current note to an art | CODE |
| HIGH | messages/en.json | 2111 | "description": "The current note is generated by AI and cannot be edited. Convert the current note to an article | CODE |
| HIGH | src/app/core/main/mark/organize-notes.tsx | 598 | // Skip sync for AI-generated content | COMMENT |
| HIGH | src/app/core/main/editor/markdown/md-editor-wrapper.tsx | 115 | // Check if this file is currently being generated by AI | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/app/core/main/editor/markdown/tiptap-editor.tsx | 4360 | // Try to find searchContent in the document using a more robust method | COMMENT |