🚀 Beautiful highly customizable statusline for Claude Code CLI with powerline support, themes, and more.
This report summarizes scanner evidence for sirmalloc/ccstatusline, a TypeScript project with 13,480 GitHub stars. SynthScan examined 95,237 lines of code across 487 source files, recording 208 pattern matches distributed across 5 syntactic categories. The legacy adjusted pattern signal is 2.4 (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? 204 finding(s).
Are imports declared and package/API names verified? 4 finding(s).
Are wrappers, guards, and repeated structures necessary? 191 finding(s).
Which changes need focused human review? 208 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 208 distinct pattern matches across 5 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | remotion/tuiDemo.tsx | 1225 | function getLineTwoPreviewSegments(phase: Phase): string[] { | CODE |
| LOW | remotion/tuiDemo.tsx | 1564 | function getFreshInstallWidgetColor(segment: string): string { | CODE |
| LOW | remotion/tuiDemo.tsx | 1808 | function getUsagePercentKeybindsText(mode: UsageDisplayMode): string { | CODE |
| LOW | src/ccstatusline.ts | 53 | function hasSessionDurationInStatusJson(data: StatusJSON): boolean { | CODE |
| LOW | src/ccstatusline.ts | 67 | function isDispatchableHookPayload(data: unknown): boolean { | CODE |
| LOW | src/tui/App.tsx | 307 | function getGlobalUninstallCommand(packageManager: GlobalPackageManager): string { | CODE |
| LOW | src/tui/App.tsx | 313 | function buildUninstallConfirmMessage(selection: UninstallSelection): string { | CODE |
| LOW | src/tui/App.tsx | 339 | function clearInstallationMetadata(settings: Settings | null): Settings | null { | CODE |
| LOW | src/tui/App.tsx | 350 | export function classifyInstalledStatusLine( | CODE |
| LOW | src/tui/App.tsx | 379 | function getPinnedGlobalRelaunchCommand(packageManager: GlobalPackageManager): string { | CODE |
| LOW | src/tui/App.tsx | 427 | export function getPathInferredInstallation( | CODE |
| LOW | src/tui/App.tsx | 468 | export function clearInstallMenuSelection(menuSelections: Record<string, number>): Record<string, number> { | CODE |
| LOW | src/tui/App.tsx | 487 | export function buildInvalidConfigSaveConfirm( | CODE |
| LOW | src/tui/claude-status.ts | 11 | export async function loadClaudeStatusLineState(): Promise<ClaudeStatusLineState> { | CODE |
| LOW | src/tui/components/StatusLinePreview.tsx | 62 | export function preparePreviewLineForTerminal(line: string, terminalWidth: number): string { | CODE |
| LOW | src/tui/components/PowerlineThemeSelector.tsx | 44 | export function applyCustomPowerlineTheme( | CODE |
| LOW | src/tui/components/ManageInstallationMenu.tsx | 76 | export function buildManageInstallationItems(): ListEntry<ManageInstallationAction>[] { | CODE |
| LOW | src/tui/components/ItemsEditor.tsx | 82 | function isMergedIntoPreviousWidget(widgets: WidgetItem[], index: number): boolean { | CODE |
| LOW | src/tui/components/PowerlineSetup.tsx | 106 | export function buildPowerlineSetupMenuItems( | CODE |
| LOW | src/tui/components/TerminalOptionsMenu.tsx | 27 | export function shouldWarnOnColorLevelChange( | CODE |
| LOW | src/tui/components/TerminalOptionsMenu.tsx | 37 | export function buildTerminalOptionsItems( | CODE |
| LOW | src/tui/components/RefreshIntervalMenu.tsx | 22 | function getRefreshIntervalSublabel(interval: number | null, supported: boolean): string { | CODE |
| LOW | src/tui/components/RefreshIntervalMenu.tsx | 46 | export function buildConfigureStatusLineItems( | CODE |
| LOW | src/tui/components/RefreshIntervalMenu.tsx | 84 | export function validateRefreshIntervalInput(value: string): string | null { | CODE |
| LOW | src/tui/components/RefreshIntervalMenu.tsx | 128 | export function validateCustomCommandCacheTtlInput(value: string): string | null { | CODE |
| LOW | src/tui/components/RefreshIntervalMenu.tsx | 132 | export function validateTerminalWidthCacheTtlInput(value: string): string | null { | CODE |
| LOW | src/tui/components/MainMenu.tsx | 176 | export function getMainMenuSelectionIndex(items: MainMenuEntry[], option: MainMenuOption): number { | CODE |
| LOW | src/tui/components/MainMenu.tsx | 196 | export function getMainMenuInstallSelectionIndex( | CODE |
| LOW | src/tui/components/color-menu/mutations.ts | 88 | function getDefaultForegroundColor(widget: WidgetItem): string { | CODE |
| LOW | src/utils/session-usage-history.ts | 111 | export function getDefaultSessionUsageHistoryDeps(payload?: StatusJSON): SessionUsageHistoryDeps { | CODE |
| LOW | src/utils/session-usage-history.ts | 363 | export function recordSessionUsageReading( | CODE |
| LOW | src/utils/colors.ts | 299 | export function getAvailableBackgroundColorsForUI(): { name: string; value: string }[] { | CODE |
| LOW | src/utils/colors.ts | 309 | export function getBackgroundColorsForPowerline(): string[] { | CODE |
| LOW | src/utils/number-format.ts | 23 | export function getNumberFormatModifierText(item: WidgetItem): string | undefined { | CODE |
| LOW | src/utils/timezones.ts | 24 | function getSupportedTimezoneValues(): string[] { | CODE |
| LOW | src/utils/timezones.ts | 52 | function createLocalTimezoneOption(): TimezoneOption { | CODE |
| LOW | src/utils/powerline-theme-index.ts | 17 | export function assignPowerlineThemeSlots( | CODE |
| LOW | src/utils/powerline-theme-index.ts | 57 | export function advanceGlobalPowerlineThemeIndex(currentIndex: number, entries: PowerlineThemeSlotEntry[]): number { | CODE |
| LOW | src/utils/global-package-manager.ts | 92 | function getFilesystemPathVariants(filePath: string): string[] { | CODE |
| LOW | src/utils/global-package-manager.ts | 183 | function getNpmGlobalPackageVersion(platform: NodeJS.Platform): string | null { | CODE |
| LOW | src/utils/global-package-manager.ts | 211 | function getBunGlobalPackageVersion(binDir: string | null): string | null { | CODE |
| LOW | src/utils/global-package-manager.ts | 301 | function getActiveResolutionWarning( | CODE |
| LOW | src/utils/global-package-manager.ts | 321 | export function inspectActiveGlobalCommand({ | CODE |
| LOW | src/utils/global-package-manager.ts | 347 | export function inspectGlobalPackageInstallations({ | CODE |
| LOW | src/utils/global-package-manager.ts | 358 | export function runGlobalPackageUninstall( | CODE |
| LOW | src/utils/speed-window.ts | 23 | export function getWidgetSpeedWindowSeconds(item: WidgetItem): number { | CODE |
| LOW | src/utils/speed-window.ts | 37 | export function isWidgetSpeedWindowEnabled(item: WidgetItem): boolean { | CODE |
| LOW | src/utils/speed-window.ts | 41 | export function withWidgetSpeedWindowSeconds(item: WidgetItem, seconds: number): WidgetItem { | CODE |
| LOW | src/utils/update-checker.ts | 133 | function getAutoUpdateLaunchCommand(installation: ResolvedInstallationMetadata): string | undefined { | CODE |
| LOW | src/utils/context-percentage.ts | 20 | export function calculateContextPercentageMetrics(context: Pick<RenderContext, 'data' | 'tokenMetrics'>): ContextPercent | CODE |
| LOW | src/utils/context-percentage.ts | 49 | export function calculateContextPercentage(context: RenderContext): number { | CODE |
| LOW | src/utils/custom-command.ts | 201 | function writePersistentCacheEntry( | CODE |
| LOW | src/utils/usage-prefetch.ts | 152 | function getUsageFieldRequirements(lines: WidgetItem[][]): UsageFieldRequirement[] { | CODE |
| LOW | src/utils/usage-prefetch.ts | 177 | function isUsageRequirementSatisfied(data: UsageData | null, requirement: UsageFieldRequirement): boolean { | CODE |
| LOW | src/utils/usage-prefetch.ts | 185 | function getMissingFetchRequirements( | CODE |
| LOW | src/utils/usage-prefetch.ts | 247 | export function extractUsageDataFromRateLimits(rateLimits: StatusJSON['rate_limits']): UsageData | null { | CODE |
| LOW | src/utils/usage-prefetch.ts | 283 | export async function prefetchUsageDataIfNeeded(lines: WidgetItem[][], data?: StatusJSON): Promise<UsageData | null> { | CODE |
| LOW | src/utils/ansi.ts | 51 | function createUnicodePropertyRegex(pattern: string): RegExp | null { | CODE |
| LOW | src/utils/ansi.ts | 137 | function isZeroWidthStandaloneCluster(cluster: string): boolean { | CODE |
| LOW | src/utils/ansi.ts | 153 | function shouldTreatClusterAsNarrowTextPictograph(cluster: string, clusterStringWidth: number): boolean { | CODE |
| 131 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/utils/session-usage-history.ts | 21 | const HISTORY_SCHEMA_VERSION = 1 as const; | COMMENT |
| LOW | src/utils/gradient.ts | 321 | } | COMMENT |
| LOW | src/utils/gradient.ts | 341 | // function assigns a separate gradient step to each code point in the cluster | COMMENT |
| LOW | src/utils/renderer.ts | 1401 | COMMENT | |
| LOW | src/utils/terminal-sanitize.ts | 1 | // Text in the status line comes from places the user doesn't control: the | COMMENT |
| LOW | src/utils/usage-types.ts | 41 | COMMENT | |
| LOW | src/widgets/shared/usage-display.ts | 21 | // Shared by the usage percentage widgets and the reset timers, which render the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/utils/jsonl-blocks.ts | 41 | // Step 1: Find all JSONL files with their modification times | COMMENT |
| LOW⚡ | src/utils/jsonl-blocks.ts | 52 | // Step 2: Get file stats and sort by modification time (most recent first) | COMMENT |
| LOW⚡ | src/utils/jsonl-blocks.ts | 60 | // Step 3: Progressive lookback - start small and expand if needed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/utils/jsonl-blocks.ts | 41 | // Step 1: Find all JSONL files with their modification times | COMMENT |
| LOW⚡ | src/utils/jsonl-blocks.ts | 52 | // Step 2: Get file stats and sort by modification time (most recent first) | COMMENT |
| LOW⚡ | src/utils/jsonl-blocks.ts | 60 | // Step 3: Progressive lookback - start small and expand if needed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/widgets/__tests__/ClaudeAccountEmail.test.ts | 85 | fs.writeFileSync(claudeJsonPath, JSON.stringify({ oauthAccount: { emailAddress: 'user@example.com' } }), 'utf-8' | CODE |
| LOW | src/widgets/__tests__/ClaudeAccountEmail.test.ts | 96 | fs.writeFileSync(claudeJsonPath, JSON.stringify({ oauthAccount: { emailAddress: 'user@example.com' } }), 'utf-8' | CODE |
| LOW | src/widgets/__tests__/ClaudeAccountEmail.test.ts | 98 | expect(render({ rawValue: true })).toBe('user@example.com'); | CODE |
| LOW | src/widgets/__tests__/ClaudeAccountEmail.test.ts | 163 | JSON.stringify({ oauthAccount: { emailAddress: 'user@example.com' } }), | CODE |