The task manager you actually own.
This report presents the forensic synthetic code analysis of go-vikunja/vikunja, a Go project with 4,752 GitHub stars. SynthScan v2.0 examined 347,109 lines of code across 1739 source files, recording 1853 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 6.0 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).
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 1853 distinct pattern matches across 13 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 | magefile.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | magefile.go | 421 | func (Test) E2EApi(ctx context.Context) error { | COMMENT |
| LOW | magefile.go | 901 | COMMENT | |
| LOW | main.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | frontend/embed.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | frontend/embed.go | 21 | // all: is required to include files starting with _ or ., such as the | COMMENT |
| LOW | frontend/tests/e2e/sharing/linkShare.spec.ts | 61 | await page.goto(`/tasks/${tasks[0].id}#share-auth-token=${share.hash}`) | COMMENT |
| LOW | frontend/scripts/fonts-subset.sh | 1 | #!/bin/sh | COMMENT |
| LOW | frontend/src/stores/auth.ts | 341 | isAuthenticated = jwtUser.exp >= ts | COMMENT |
| LOW | frontend/src/styles/common-imports.scss | 1 | // | COMMENT |
| LOW | frontend/src/styles/global.scss | 41 | @import "bulma-css-variables/sass/form/tools"; | COMMENT |
| LOW | frontend/src/styles/global.scss | 61 | // @import "bulma-css-variables/sass/grid/tiles"; // not used | COMMENT |
| LOW | frontend/src/styles/custom-properties/colors.scss | 1 | // Vikunja colors as CSS custom properties. | COMMENT |
| LOW | frontend/src/components/misc/Modal.vue | 101 | // If we're re-opening while the previous close transition is still in | COMMENT |
| LOW | frontend/src/components/project/views/ProjectKanban.vue | 561 | COMMENT | |
| LOW | desktop/build.js | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | examples/plugins/example/main.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/magefile.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/cmd/veans/main.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/bootstrap/botuser_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/bootstrap/hooks.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/bootstrap/hooks.go | 41 | var ClaudeCodeHookEvents = []string{"SessionStart", "PreCompact"} | COMMENT |
| LOW | veans/internal/bootstrap/botuser.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/bootstrap/bootstrap.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/bootstrap/hooks_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/bootstrap/bootstrap_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/picker/flatten.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/picker/tree.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/picker/picker.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/picker/flatten_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/picker/tree_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/picker/model.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/config/config.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/config/config_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/auth/auth_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/auth/auth.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/auth/auth.go | 81 | // Non-TTY (CI, scripted test) — read a plain line. | COMMENT |
| LOW | veans/internal/auth/oauth_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/auth/oauth.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/output/errors_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/output/errors.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/status/status_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/status/status.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/create.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/list.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/git.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/git.go | 21 | "os" | COMMENT |
| LOW | veans/internal/commands/prime.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/labels.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/show.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/update.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/runtime.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/update_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/claim.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/prime_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/api.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/init.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/login.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/root.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| LOW | veans/internal/commands/list_test.go | 1 | // Vikunja is a to-do list application to facilitate your life. | COMMENT |
| 959 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/tests/e2e/project/project-view-kanban.spec.ts | 267 | description: 'Lorem Ipsum', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 154 | description: 'Lorem Ipsum', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 276 | description: 'Lorem ipsum dolor sit amet.', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 276 | description: 'Lorem ipsum dolor sit amet.', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 337 | description: 'Lorem ipsum dolor sit amet.', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 337 | description: 'Lorem ipsum dolor sit amet.', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 390 | description: 'Lorem Ipsum dolor sit amet', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 390 | description: 'Lorem Ipsum dolor sit amet', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 401 | description: '<p>Lorem Ipsum dolor sit amet</p>', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 401 | description: '<p>Lorem Ipsum dolor sit amet</p>', | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1196 | <h1>Lorem Ipsum</h1> | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1197 | <p>Dolor sit amet</p> | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1210 | await expect(page.locator('.tiptap__editor h1').filter({hasText: 'Lorem Ipsum'})).toBeVisible() | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1211 | await expect(page.locator('.tiptap__editor p').filter({hasText: 'Dolor sit amet'})).toBeVisible() | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1284 | ${Array(30).fill('<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1284 | ${Array(30).fill('<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1335 | ${Array(20).fill('- Lorem ipsum dolor sit amet, consectetur adipiscing elit').join('\n')} | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1335 | ${Array(20).fill('- Lorem ipsum dolor sit amet, consectetur adipiscing elit').join('\n')} | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1405 | const longDescription = Array(30).fill('<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>').join('\n') | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 1405 | const longDescription = Array(30).fill('<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>').join('\n') | CODE |
| LOW | frontend/src/models/user.test.ts | 24 | const user = makeUser({name: 'Jane Doe'}) | CODE |
| LOW | frontend/src/models/user.test.ts | 25 | expect(getDisplayName(user)).toBe('Jane Doe') | CODE |
| LOW | frontend/src/components/misc/ShortcutRecorder.vue | 22 | <span class="placeholder">{{ $t('user.settings.desktop.shortcutRecorderPlaceholder') }}</span> | CODE |
| LOW | frontend/src/components/input/FormInput.test.ts | 91 | expect(input.attributes('placeholder')).toBe('Enter email') | CODE |
| LOW | frontend/src/components/input/FormField.test.ts | 99 | expect(input.attributes('placeholder')).toBe('Enter email') | CODE |
| LOW | frontend/src/components/input/Multiselect.vue | 52 | :placeholder="placeholder" | CODE |
| LOW | frontend/src/components/quick-actions/QuickActions.vue | 30 | :placeholder="placeholder" | CODE |
| LOW | frontend/src/i18n/lang/de-swiss.json | 422 | "namePlaceholder": "z.B. Lorem Ipsum", | CODE |
| LOW | frontend/src/i18n/lang/de-swiss.json | 599 | "placeholder": "Gib eine Suche oder Filterabfrage ein…", | CODE |
| LOW | frontend/src/i18n/lang/de-swiss.json | 835 | "placeholder": "Gib Text ein, drücke '/' für mehr Optionen…", | CODE |
| LOW | frontend/src/i18n/lang/de-swiss.json | 1066 | "placeholder": "Füge deinen Kommentar hinzu, drücke '/' für weitere Optionen…", | CODE |
| LOW⚡ | frontend/src/i18n/lang/de-swiss.json | 1089 | "placeholder": "Gib eine Beschreibung ein, drücke '/' für mehr Optionen…" | CODE |
| LOW⚡ | frontend/src/i18n/lang/de-swiss.json | 1092 | "placeholder": "Schriib, um en User zuezwiise…", | CODE |
| LOW⚡ | frontend/src/i18n/lang/de-swiss.json | 1098 | "placeholder": "Beginne zu schreiben, um ein Label hinzuzufügen…", | CODE |
| LOW | frontend/src/i18n/lang/de-swiss.json | 1348 | "placeholder": "Schriib en Befehl oder suech…", | CODE |
| LOW | frontend/src/i18n/lang/el-GR.json | 422 | "namePlaceholder": "π.χ. Lorem Ipsum", | CODE |
| LOW | frontend/src/i18n/lang/el-GR.json | 599 | "placeholder": "Πληκτρολογήστε για αναζήτηση ή φιλτράρισμα ερωτήματος…", | CODE |
| LOW | frontend/src/i18n/lang/el-GR.json | 835 | "placeholder": "Πληκτρολογήστε κάποιο κείμενο ή πατήστε '/' για να δείτε περισσότερες επιλογές…", | CODE |
| LOW | frontend/src/i18n/lang/el-GR.json | 1066 | "placeholder": "Προσθέστε το σχόλιό σας, πατήστε '/' για περισσότερες επιλογές…", | CODE |
| LOW⚡ | frontend/src/i18n/lang/el-GR.json | 1089 | "placeholder": "Εισαγάγετε μια περιγραφή για το έργο, πατήστε '/' για περισσότερες επιλογές…" | CODE |
| LOW⚡ | frontend/src/i18n/lang/el-GR.json | 1092 | "placeholder": "Πληκτρολογήστε για να αναθέσετε σε χρήστη…", | CODE |
| LOW⚡ | frontend/src/i18n/lang/el-GR.json | 1098 | "placeholder": "Πληκτρολογήστε για να προσθέσετε ετικέτα…", | CODE |
| LOW | frontend/src/i18n/lang/el-GR.json | 1348 | "placeholder": "Πληκτρολογήστε εντολή ή κάντε αναζήτηση…", | CODE |
| LOW | frontend/src/i18n/lang/it-IT.json | 312 | "namePlaceholder": "es. Lorem Ipsum", | CODE |
| LOW | frontend/src/i18n/lang/it-IT.json | 479 | "placeholder": "Digitare una ricerca o un filtro query…", | CODE |
| LOW | frontend/src/i18n/lang/it-IT.json | 658 | "placeholder": "Digita del testo o premi '/' per vedere più opzioni…", | CODE |
| LOW | frontend/src/i18n/lang/it-IT.json | 874 | "placeholder": "Aggiungi il tuo commento, premi '/' per altre opzioni…", | CODE |
| LOW⚡ | frontend/src/i18n/lang/it-IT.json | 892 | "placeholder": "Inserisci una descrizione per questo progetto, premi '/' per altre opzioni…" | CODE |
| LOW⚡ | frontend/src/i18n/lang/it-IT.json | 895 | "placeholder": "Digita per assegnare un utente…", | CODE |
| LOW⚡ | frontend/src/i18n/lang/it-IT.json | 901 | "placeholder": "Digita per aggiungere un'etichetta…", | CODE |
| LOW | frontend/src/i18n/lang/it-IT.json | 1148 | "placeholder": "Digita un comando o cerca…", | CODE |
| LOW | frontend/src/i18n/lang/ko-KR.json | 280 | "namePlaceholder": "예: Lorem Ipsum", | CODE |
| LOW | frontend/src/i18n/lang/ko-KR.json | 424 | "placeholder": "검색 또는 필터 쿼리 입력...", | CODE |
| LOW | frontend/src/i18n/lang/ko-KR.json | 597 | "placeholder": "더 많은 옵션을 보려면 텍스트를 입력하거나 '/'를 누르세요...", | CODE |
| LOW | frontend/src/i18n/lang/ko-KR.json | 805 | "placeholder": "댓글을 추가하고 더 많은 옵션을 보려면 '/'를 누르세요...", | CODE |
| LOW⚡ | frontend/src/i18n/lang/ko-KR.json | 820 | "placeholder": "설명을 입력하고 더 많은 옵션을 보려면 '/'를 누르세요..." | CODE |
| LOW⚡ | frontend/src/i18n/lang/ko-KR.json | 823 | "placeholder": "사용자를 할당하려면 입력...", | CODE |
| LOW⚡ | frontend/src/i18n/lang/ko-KR.json | 829 | "placeholder": "레이블을 추가하려면 입력...", | CODE |
| LOW | frontend/src/i18n/lang/ko-KR.json | 1054 | "placeholder": "명령을 입력하거나 검색...", | CODE |
| LOW | frontend/src/i18n/lang/es-ES.json | 213 | "namePlaceholder": "ej. Lorem Ipsum", | CODE |
| 613 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 161 | // Step 1: Create a filter with multi-value project using 'in' operator | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 192 | // Step 2: Save the filter and verify no error | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 199 | // Step 3: Open the filter settings menu from sidebar and click Edit | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 225 | // Step 4: Add a trailing space (the bug trigger from #2010) | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 232 | // Step 5: Save again and wait for the modal to close (indicates save complete) | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 238 | // Step 6: Assert no error occurred | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 241 | // Step 7: Reload and re-open edit to verify the filter text is still intact | COMMENT |
| LOW | frontend/src/helpers/ganttTaskTree.ts | 20 | // Step 1: Build parent -> children mapping | COMMENT |
| LOW⚡ | frontend/src/helpers/ganttTaskTree.ts | 42 | // Step 2: Find root tasks (no parent in the current view) | COMMENT |
| LOW⚡ | frontend/src/helpers/ganttTaskTree.ts | 50 | // Step 3: Depth-first flatten | COMMENT |
| LOW | veans/internal/bootstrap/botuser.go | 69 | // Step 3: try creating. | COMMENT |
| LOW⚡ | pkg/caldavtests/relations_test.go | 90 | // Step 1: Child arrives first | COMMENT |
| LOW⚡ | pkg/caldavtests/relations_test.go | 97 | // Step 2: Parent arrives later (no RELATED-TO) | COMMENT |
| LOW⚡ | pkg/caldavtests/relations_test.go | 102 | // Step 3: Verify parent has correct title (not DUMMY-UID) | COMMENT |
| LOW⚡ | pkg/caldavtests/relations_test.go | 109 | // Step 4: Verify child still has parent relation | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 33 | // Step 1: Discover principal | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 39 | // Step 2: Get calendar-home-set from principal | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 45 | // Step 3: List calendars | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 52 | // Step 4: Check CTag for a specific calendar | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 56 | // Step 5: Full sync — calendar-query to get all task ETags | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 71 | // Step 6: Multiget to fetch specific tasks | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 81 | // Step 7: Push a local change via PUT | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 95 | // Step 1: Thunderbird starts with OPTIONS to check DAV support | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 103 | // Step 2: PROPFIND on well-known for principal | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 110 | // Step 3: PROPFIND principal for calendar-home-set | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 114 | // Step 4: Thunderbird checks current-user-privilege-set to know if it can write | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 121 | // Step 5: List calendars | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 125 | // Step 6: Sync via calendar-query | COMMENT |
| LOW⚡ | pkg/caldavtests/discovery_test.go | 249 | // Step 1: Hit well-known endpoint | COMMENT |
| LOW⚡ | pkg/caldavtests/discovery_test.go | 257 | // Step 2: PROPFIND the entry point for principal info | COMMENT |
| LOW⚡ | pkg/caldavtests/discovery_test.go | 261 | // Step 3: PROPFIND the principal URL for calendar-home-set | COMMENT |
| LOW | pkg/caldavtests/discovery_test.go | 272 | // Step 4: PROPFIND Depth:1 on calendar home to list calendars | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 379 | // Step 1: Subtask arrives FIRST, referencing a parent that doesn't exist yet. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 395 | // Step 2: Parent arrives with NO RELATED-TO at all. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 410 | // Step 3: Verify relations at the DB level. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 450 | // Step 1: Parent created first (no RELATED-TO). | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 464 | // Step 2: Subtask arrives with RELATED-TO;RELTYPE=PARENT. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 479 | // Step 3: Parent is re-synced (updated) — still no RELATED-TO. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 494 | // Step 4: Verify relations still intact after parent re-sync. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 529 | // Step 1: First subtask arrives, parent doesn't exist yet. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 544 | // Step 2: Second subtask arrives, parent should exist as DUMMY now. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 559 | // Step 3: Parent arrives with NO RELATED-TO. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 573 | // Step 4: Verify all relations intact and no DUMMY tasks. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 161 | // Step 1: Create a filter with multi-value project using 'in' operator | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 192 | // Step 2: Save the filter and verify no error | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 199 | // Step 3: Open the filter settings menu from sidebar and click Edit | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 225 | // Step 4: Add a trailing space (the bug trigger from #2010) | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 232 | // Step 5: Save again and wait for the modal to close (indicates save complete) | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 238 | // Step 6: Assert no error occurred | COMMENT |
| LOW⚡ | frontend/tests/e2e/filters/filter-autocomplete.spec.ts | 241 | // Step 7: Reload and re-open edit to verify the filter text is still intact | COMMENT |
| LOW | frontend/src/helpers/ganttTaskTree.ts | 20 | // Step 1: Build parent -> children mapping | COMMENT |
| LOW⚡ | frontend/src/helpers/ganttTaskTree.ts | 42 | // Step 2: Find root tasks (no parent in the current view) | COMMENT |
| LOW⚡ | frontend/src/helpers/ganttTaskTree.ts | 50 | // Step 3: Depth-first flatten | COMMENT |
| LOW | veans/internal/bootstrap/botuser.go | 69 | // Step 3: try creating. | COMMENT |
| LOW⚡ | pkg/caldavtests/relations_test.go | 90 | // Step 1: Child arrives first | COMMENT |
| LOW⚡ | pkg/caldavtests/relations_test.go | 97 | // Step 2: Parent arrives later (no RELATED-TO) | COMMENT |
| LOW⚡ | pkg/caldavtests/relations_test.go | 102 | // Step 3: Verify parent has correct title (not DUMMY-UID) | COMMENT |
| LOW⚡ | pkg/caldavtests/relations_test.go | 109 | // Step 4: Verify child still has parent relation | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 33 | // Step 1: Discover principal | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 39 | // Step 2: Get calendar-home-set from principal | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 45 | // Step 3: List calendars | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 52 | // Step 4: Check CTag for a specific calendar | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 56 | // Step 5: Full sync — calendar-query to get all task ETags | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 71 | // Step 6: Multiget to fetch specific tasks | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 81 | // Step 7: Push a local change via PUT | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 95 | // Step 1: Thunderbird starts with OPTIONS to check DAV support | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 103 | // Step 2: PROPFIND on well-known for principal | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 110 | // Step 3: PROPFIND principal for calendar-home-set | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 114 | // Step 4: Thunderbird checks current-user-privilege-set to know if it can write | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 121 | // Step 5: List calendars | COMMENT |
| LOW⚡ | pkg/caldavtests/client_compat_test.go | 125 | // Step 6: Sync via calendar-query | COMMENT |
| LOW⚡ | pkg/caldavtests/discovery_test.go | 249 | // Step 1: Hit well-known endpoint | COMMENT |
| LOW⚡ | pkg/caldavtests/discovery_test.go | 257 | // Step 2: PROPFIND the entry point for principal info | COMMENT |
| LOW⚡ | pkg/caldavtests/discovery_test.go | 261 | // Step 3: PROPFIND the principal URL for calendar-home-set | COMMENT |
| LOW | pkg/caldavtests/discovery_test.go | 272 | // Step 4: PROPFIND Depth:1 on calendar home to list calendars | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 379 | // Step 1: Subtask arrives FIRST, referencing a parent that doesn't exist yet. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 395 | // Step 2: Parent arrives with NO RELATED-TO at all. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 410 | // Step 3: Verify relations at the DB level. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 450 | // Step 1: Parent created first (no RELATED-TO). | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 464 | // Step 2: Subtask arrives with RELATED-TO;RELTYPE=PARENT. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 479 | // Step 3: Parent is re-synced (updated) — still no RELATED-TO. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 494 | // Step 4: Verify relations still intact after parent re-sync. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 529 | // Step 1: First subtask arrives, parent doesn't exist yet. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 544 | // Step 2: Second subtask arrives, parent should exist as DUMMY now. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 559 | // Step 3: Parent arrives with NO RELATED-TO. | COMMENT |
| LOW | pkg/webtests/caldav_test.go | 573 | // Step 4: Verify all relations intact and no DUMMY tasks. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/tests/support/filterTestHelpers.ts | 4 | export async function createTasksWithPriorities(buckets?: any[]) { | CODE |
| LOW | frontend/tests/e2e/project/project-history.spec.ts | 7 | async function visitProjectsToBuildHistory(page: Page, projects: any[]) { | CODE |
| LOW | frontend/tests/e2e/task/comment-sort-order.spec.ts | 14 | async function createCommentsWithTimestamps(count: number, taskId = 1) { | CODE |
| LOW | frontend/tests/e2e/task/bucket-select.spec.ts | 90 | async function createTaskWithMultipleKanbanViews() { | CODE |
| LOW | frontend/tests/e2e/task/task.spec.ts | 73 | async function uploadAttachmentAndVerify(page: Page, taskId: number, file = 'tests/fixtures/image.jpg') { | CODE |
| LOW | frontend/src/composables/useCopyToClipboard.ts | 7 | function fallbackCopyTextToClipboard(text: string) { | CODE |
| LOW | frontend/src/stores/base.ts | 78 | function setKeyboardShortcutsActive(value: boolean) { | CODE |
| LOW | frontend/src/stores/base.ts | 142 | async function handleSetCurrentProjectIfNotSet(project: IProject) { | CODE |
| LOW | frontend/src/stores/projects.ts | 56 | function getEffectiveParentProjectId(project: IProject, parentProjectIdFromDom: number): number { | CODE |
| LOW | frontend/src/stores/projects.ts | 174 | async function toggleSavedFilterFavorite(project: IProject) { | CODE |
| LOW | frontend/src/stores/kanban.ts | 158 | function ensureTaskIsInCorrectBucket(task: ITask) { | CODE |
| LOW | frontend/src/stores/kanban.ts | 247 | function setTasksLoadedForBucketPage({bucketId, page}: { bucketId: IBucket['id'], page: number }) { | CODE |
| LOW | frontend/src/stores/kanban.ts | 251 | function setAllTasksLoadedForBucket(bucketId: IBucket['id']) { | CODE |
| LOW | frontend/src/stores/timeTracking.ts | 118 | function unsubscribeFromTimerEvents() { | CODE |
| LOW | frontend/src/stores/tasks.ts | 46 | export function buildDefaultRemindersForQuickAdd( | CODE |
| LOW | frontend/src/stores/auth.ts | 36 | function redirectToSpecifiedProvider() { | CODE |
| LOW | frontend/src/stores/auth.ts | 123 | function setIsLoadingGeneralSettings(isLoading: boolean) { | CODE |
| LOW | frontend/src/components/token/ApiTokenForm.vue | 204 | function toggleGroupPermissionsFromChild(group: string, checked: boolean) { | CODE |
| LOW | frontend/src/components/misc/OpenQuickActions.vue | 11 | function openQuickActionsViaHotkey(event) { | CODE |
| LOW | …d/src/components/tasks/partials/commentReplyContext.ts | 14 | export function scrollAndHighlightComment(id: number): void { | CODE |
| LOW | frontend/src/components/tasks/partials/Attachments.vue | 332 | function syncDropzoneTeleportTarget() { | CODE |
| LOW | …ntend/src/components/tasks/partials/ReminderDetail.vue | 193 | function updateDataAndMaybeCloseNow(close: () => void) { | CODE |
| LOW | frontend/src/components/sharing/UserTeam.vue | 225 | function createShareTypeNameComputed(count: number) { | CODE |
| LOW | frontend/src/components/input/DatepickerInline.vue | 127 | function formatDateToFlatpickrString(date: Date): string { | CODE |
| LOW | frontend/src/components/input/DatepickerInline.vue | 222 | function getWeekdayFromStringInterval(dateString: string) { | CODE |
| LOW | frontend/src/components/input/Reactions.vue | 130 | function hasCurrentUserReactedWithEmoji(value: string | number): boolean { | CODE |
| LOW | …tend/src/components/input/filter/FilterAutocomplete.ts | 61 | export function calculateReplacementRange( | CODE |
| LOW | frontend/src/components/input/filter/FilterInput.vue | 160 | function setEditorContentFromModelValue(newValue: string | undefined) { | CODE |
| LOW | frontend/src/components/project/views/ProjectTable.vue | 411 | function setActiveColumnsSortParam() { | CODE |
| LOW | frontend/src/components/project/views/ProjectKanban.vue | 514 | function handleTaskContainerScroll(id: IBucket['id'], el: HTMLElement) { | CODE |
| LOW | frontend/src/components/project/views/ProjectKanban.vue | 764 | function handleRecurringTaskCompletion() { | CODE |
| LOW | frontend/src/views/user/settings/General.vue | 470 | function enforceBackgroundBrightnessBounds() { | CODE |
| LOW | frontend/src/views/project/ProjectView.vue | 84 | function redirectToDefaultViewIfNecessary() { | CODE |
| LOW | frontend/src/helpers/filters.ts | 83 | export function getFilterFieldRegexPattern(field: string): RegExp { | CODE |
| LOW | frontend/src/helpers/filters.ts | 87 | export function transformFilterStringForApi( | CODE |
| LOW | frontend/src/helpers/filters.ts | 187 | export function transformFilterStringFromApi( | CODE |
| LOW | frontend/src/helpers/getInheritedBackgroundColor.ts | 13 | export function getInheritedBackgroundColor(el: HTMLElement): string { | CODE |
| LOW | frontend/src/helpers/redirectToProvider.ts | 6 | export function getRedirectUrlFromCurrentFrontendPath(provider: IProvider): string { | CODE |
| LOW | frontend/src/helpers/parseSubtasksViaIndention.ts | 19 | export function parseSubtasksViaIndention(taskTitles: string, prefixMode: PrefixMode): TaskWithParent[] { | CODE |
| LOW | frontend/src/helpers/desktopAuth.ts | 11 | export function listenForDesktopOAuthTokens(callback: (tokens: OAuthTokens) => void): void { | CODE |
| LOW | frontend/src/helpers/desktopAuth.ts | 15 | export function listenForDesktopOAuthError(callback: (error: string) => void): void { | CODE |
| LOW | frontend/src/helpers/time/roundToNaturalDayBoundary.ts | 1 | export function roundToNaturalDayBoundary(date: Date, isStart = false): Date { | CODE |
| LOW | frontend/src/services/savedFilter.ts | 31 | export function getSavedFilterIdFromProjectId(projectId: IProject['id']) { | CODE |
| LOW | frontend/src/services/savedFilter.ts | 117 | async function createFilterWithValidation() { | CODE |
| LOW | frontend/src/services/taskCollection.ts | 20 | export function getDefaultTaskFilterParams(): TaskFilterParams { | CODE |
| LOW | desktop/build.js | 52 | async function renameDistFilesToUnstable(currentVersion) { | CODE |
| LOW | desktop/main.js | 486 | function registerQuickEntryShortcut(shortcut) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | frontend/src/components/input/editor/TipTap.vue | 862 | event.target.parentNode.parentNode.firstChild.click() | CODE |
| CRITICAL | .github/workflows/preview.yml | 81 | const shortSha = shaTag ? shaTag.replace('sha-', '').substring(0, 7) : context.payload.pull_request.head.sha | CODE |
| CRITICAL | pkg/routes/api/v1/redoc/redoc.standalone.js | 41 | `;class As extends n.PureComponent{render(){return n.createElement("div",{style:{textAlign:"center"}},n.createElement(_s | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | desktop/main.js | 161 | // ─── Express server ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/main.js | 185 | // ─── Zoom ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/main.js | 239 | // ─── Main window ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/main.js | 303 | // ─── Quick Entry window ────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/main.js | 407 | // ─── System tray ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/main.js | 458 | // ─── IPC handlers ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/main.js | 485 | // ─── Shortcut management ──────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/main.js | 513 | // ─── App lifecycle ─────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/test.yml | 465 | # so the test harness can authenticate against /api/v1/test/. | COMMENT |
| MEDIUM | pkg/cmd/migrate.go | 35 | // list -> Essentially just show the table, maybe with an extra column if the migration did run or not | COMMENT |
| MEDIUM⚡ | pkg/routes/api/v1/redoc/redoc.standalone.js | 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):"function"==typeof de | CODE |
| MEDIUM⚡ | pkg/routes/api/v1/redoc/redoc.standalone.js | 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):"function"==typeof de | CODE |
| MEDIUM⚡ | pkg/routes/api/v1/redoc/redoc.standalone.js | 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):"function"==typeof de | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | cliff.toml | 0 | {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%y-%m-%d") }} {% else % | STRING |
| HIGH | frontend/cliff.toml | 0 | {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%y-%m-%d") }} {% else % | STRING |
| HIGH | desktop/cliff.toml | 0 | {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%y-%m-%d") }} {% else % | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/scripts/fonts-subset.sh | 95 | # Check if the output font file already exists | COMMENT |
| LOW⚡ | frontend/scripts/fonts-subset.sh | 123 | # Check if fonttools is available | COMMENT |
| LOW⚡ | frontend/scripts/fonts-subset.sh | 131 | # Check if pyftsubset is available (part of fonttools) | COMMENT |
| LOW⚡ | frontend/scripts/fonts-subset.sh | 139 | # Check if brotli is available | COMMENT |
| LOW | .github/workflows/nixpkgs-update.yml | 35 | # Check if there's already an open PR updating vikunja (from us or r-ryantm) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | frontend/scripts/fonts-subset.sh | 149 | echo "# Create a partial instance of the variable font" | CODE |
| MEDIUM | frontend/src/components/base/Expandable.vue | 81 | # The following functions are called by the js hooks of the transitions. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/src/components/base/BasePagination.vue | 85 | // Layout/scaffold rules ported from bulma-css-variables/sass/components/pagination.sass. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pkg/models/subscription_test.go | 190 | // TODO: Add tests to test triggering of notifications for subscribed things | COMMENT |