An Open Source implementation of Notebook LM with more flexibility and features
This report presents the forensic synthetic code analysis of lfnovo/open-notebook, a TypeScript project with 35,620 GitHub stars. SynthScan v2.0 examined 108,341 lines of code across 493 source files, recording 1163 pattern matches distributed across 18 syntactic categories. The overall adjusted score of 16.0 places this repository in the Moderate 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 1163 distinct pattern matches across 18 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 | …nsformations/components/TransformationEditorDialog.tsx | 51 | export function TransformationEditorDialog({ open, onOpenChange, transformation }: TransformationEditorDialogProps) { | CODE |
| LOW | …src/components/settings/EmbeddingModelChangeDialog.tsx | 27 | export function EmbeddingModelChangeDialog({ | CODE |
| LOW | …/src/components/podcasts/generate-podcast-selection.ts | 53 | export function selectionsToContextConfigs( | CODE |
| LOW | frontend/src/lib/credential-update-payload.ts | 23 | export function buildCredentialUpdatePayload( | CODE |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 179 | export function convertReferencesToMarkdownLinks(text: string): string { | CODE |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 348 | export function convertReferencesToCompactMarkdown(text: string, referencesLabel: string = 'References'): string { | CODE |
| LOW | frontend/src/lib/utils/source-references.tsx | 275 | export function createReferenceLinkComponent( | CODE |
| LOW | frontend/src/lib/utils/source-references.tsx | 440 | export function createCompactReferenceLinkComponent( | CODE |
| LOW | frontend/src/lib/utils/source-references.tsx | 491 | export function convertSourceReferencesLegacy(text: string): React.ReactNode { | CODE |
| LOW | frontend/src/lib/hooks/use-podcasts.ts | 234 | export function useDuplicateEpisodeProfile() { | CODE |
| LOW | frontend/src/lib/hooks/use-podcasts.ts | 366 | export function useDuplicateSpeakerProfile() { | CODE |
| LOW | frontend/src/lib/hooks/use-sources.ts | 352 | export function useRemoveSourceFromNotebook() { | CODE |
| LOW | frontend/src/lib/hooks/use-credentials.ts | 338 | export function useMigrateFromProviderConfig() { | CODE |
| LOW | open_notebook/utils/version_utils.py | 14 | async def get_version_from_github_async(repo_url: str, branch: str = "main") -> str: | CODE |
| LOW | open_notebook/utils/chunking.py | 173 | def detect_content_type_from_extension( | CODE |
| LOW | open_notebook/utils/chunking.py | 195 | def detect_content_type_from_heuristics(text: str) -> Tuple[ContentType, float]: | CODE |
| LOW | open_notebook/utils/chunking.py | 266 | def _calculate_markdown_score(text: str) -> float: | CODE |
| LOW | open_notebook/utils/chunking.py | 398 | def _apply_secondary_chunking(chunks: List[str]) -> List[str]: | CODE |
| LOW | open_notebook/utils/encryption.py | 62 | def _get_or_create_encryption_key() -> str: | CODE |
| LOW | open_notebook/utils/embedding.py | 24 | def _get_embedding_batch_size() -> int: | CODE |
| LOW | open_notebook/utils/graph_utils.py | 7 | async def get_session_message_count(graph, session_id: str) -> int: | CODE |
| LOW | open_notebook/podcasts/audio_paths.py | 63 | def resolve_contained_audio_path(audio_file: Optional[str]) -> Optional[Path]: | CODE |
| LOW | open_notebook/podcasts/models.py | 107 | async def resolve_transcript_config(self) -> Tuple[str, str, dict]: | CODE |
| LOW | open_notebook/podcasts/models.py | 285 | async def get_job_details_for_commands( | CODE |
| LOW | open_notebook/ai/connection_tester.py | 28 | def _is_vertex_credentials_file_error(exc: Exception) -> bool: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 176 | async def _test_openai_compatible_connection(base_url: str, api_key: Optional[str] = None) -> Tuple[bool, str]: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 284 | def _connection_failure_reason(error_msg: str) -> Optional[str]: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 366 | def classify_provider_test_error(error_msg: str) -> Tuple[bool, str]: | CODE |
| LOW | open_notebook/ai/key_provider.py | 113 | async def _provision_simple_provider(provider: str) -> bool: | CODE |
| LOW | open_notebook/ai/key_provider.py | 221 | async def _provision_openai_compatible() -> bool: | CODE |
| LOW | open_notebook/ai/provision.py | 10 | async def provision_langchain_model( | CODE |
| LOW⚡ | open_notebook/ai/model_discovery.py | 317 | async def fetch_anthropic_model_ids(api_key: str) -> List[str]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 247 | async def discover_openai_compatible_provider(provider: str) -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 290 | def _make_openai_compat_discoverer( | CODE |
| LOW | open_notebook/ai/model_discovery.py | 351 | async def discover_anthropic_models() -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 473 | async def discover_elevenlabs_models() -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 530 | async def discover_openai_compatible_models() -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/graphs/source_chat.py | 33 | def call_model_with_source_context( | CODE |
| LOW | open_notebook/graphs/source_chat.py | 54 | def _call_model_with_source_context_inner( | CODE |
| LOW | open_notebook/domain/notebook.py | 679 | def content_must_not_be_empty(cls, v): | CODE |
| LOW | tests/test_model_discovery.py | 47 | def test_table_covers_all_openai_compatible_providers(self): | CODE |
| LOW | tests/test_model_discovery.py | 59 | def test_provider_discovery_functions_keys_unchanged(self): | CODE |
| LOW | tests/test_model_discovery.py | 83 | def test_module_level_names_preserved(self): | CODE |
| LOW | tests/test_model_discovery.py | 92 | async def test_discovery_uses_spec_url_and_bearer_key(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 121 | async def test_missing_env_key_returns_empty(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 126 | async def test_http_error_returns_empty(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 138 | async def test_mistral_capabilities_quirk(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 164 | async def test_openrouter_quirk_language_and_description(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 185 | async def test_missing_key_returns_empty(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 190 | async def test_discovery_paginates_and_sends_anthropic_headers(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 236 | async def test_api_failure_falls_back_to_static_list(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 256 | async def test_discover_with_config_uses_anthropic_api(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 275 | async def test_discover_with_config_falls_back_on_error(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 291 | async def test_discover_with_config_requires_key(self): | CODE |
| LOW⚡ | tests/test_add_insight_failure_propagation.py | 31 | async def test_returns_command_id_on_success(self): | CODE |
| LOW⚡ | tests/test_add_insight_failure_propagation.py | 41 | async def test_raises_database_operation_error_on_submission_failure(self): | CODE |
| LOW⚡ | tests/test_add_insight_failure_propagation.py | 51 | async def test_still_raises_invalid_input_for_empty_content(self): | CODE |
| LOW⚡ | tests/test_add_insight_failure_propagation.py | 57 | async def test_still_raises_invalid_input_for_empty_type(self): | CODE |
| LOW⚡ | tests/test_add_insight_failure_propagation.py | 67 | async def test_add_insight_failure_propagates_out_of_run_transformation(self): | CODE |
| LOW | tests/test_add_insight_failure_propagation.py | 111 | async def test_successful_add_insight_returns_output_normally(self): | CODE |
| 431 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | open_notebook/ai/key_provider.py | 22 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/key_provider.py | 24 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 312 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 314 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 594 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 596 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/model_discovery.py | 32 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/model_discovery.py | 34 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/model_discovery.py | 194 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/model_discovery.py | 196 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 134 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 136 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 181 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 183 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_utils.py | 24 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_utils.py | 26 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_utils.py | 251 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_utils.py | 253 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 26 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 28 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 73 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 75 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 101 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 103 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 158 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 160 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 277 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 279 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 45 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 47 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 99 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 101 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 189 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 191 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 231 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 233 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_embedding.py | 25 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_embedding.py | 27 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 110 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 112 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 157 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 159 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 327 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 329 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 32 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 34 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 63 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 65 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 81 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 83 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 232 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 234 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 370 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 372 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 410 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 412 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 539 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 541 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 597 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 599 | # ============================================================================ | COMMENT |
| 48 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/AGENTS.md | 34 | except Exception as e: | CODE |
| LOW | open_notebook/database/async_migrate.py | 47 | except Exception as e: | CODE |
| LOW | open_notebook/database/async_migrate.py | 247 | except Exception as e: | CODE |
| LOW | open_notebook/database/async_migrate.py | 262 | except Exception: | CODE |
| LOW | open_notebook/database/async_migrate.py | 272 | except Exception: | CODE |
| LOW | open_notebook/database/repository.py | 109 | except Exception as e: | CODE |
| LOW | open_notebook/database/repository.py | 130 | except Exception as e: | CODE |
| LOW | open_notebook/database/repository.py | 197 | except Exception as e: | CODE |
| LOW | open_notebook/database/repository.py | 207 | except Exception as e: | CODE |
| LOW | open_notebook/database/repository.py | 233 | except Exception as e: | CODE |
| LOW | open_notebook/utils/chunking.py | 191 | except Exception: | CODE |
| LOW | open_notebook/utils/encryption.py | 55 | except Exception as e: | CODE |
| LOW | open_notebook/utils/encryption.py | 163 | except Exception: | CODE |
| LOW | open_notebook/utils/encryption.py | 196 | except Exception as e: | CODE |
| LOW | open_notebook/utils/embedding.py | 179 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 71 | except Exception: | CODE |
| LOW | open_notebook/utils/context_builder.py | 82 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 100 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 110 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 123 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 133 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 206 | except Exception as e: | CODE |
| LOW | open_notebook/utils/url_validation.py | 96 | except Exception: | CODE |
| LOW | open_notebook/utils/graph_utils.py | 21 | except Exception as e: | CODE |
| LOW | open_notebook/podcasts/models.py | 263 | except Exception: | CODE |
| LOW | open_notebook/podcasts/models.py | 281 | except Exception: | CODE |
| LOW | open_notebook/podcasts/models.py | 314 | except Exception as e: | CODE |
| LOW | open_notebook/ai/models.py | 97 | except Exception as e: | CODE |
| LOW | open_notebook/ai/models.py | 130 | except Exception: | CODE |
| LOW | open_notebook/ai/models.py | 182 | except Exception: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 133 | except Exception as e: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 172 | except Exception as e: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 215 | except Exception as e: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 442 | except Exception: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 474 | except Exception as e: | CODE |
| LOW | open_notebook/ai/key_provider.py | 82 | except Exception as e: | CODE |
| LOW⚡ | open_notebook/ai/model_discovery.py | 588 | except Exception as e: | CODE |
| LOW⚡ | open_notebook/ai/model_discovery.py | 679 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 284 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 359 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 411 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 445 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 546 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 701 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/transformation.py | 68 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/ask.py | 80 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/ask.py | 124 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/ask.py | 143 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/source_chat.py | 49 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/chat.py | 83 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/source.py | 76 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/source.py | 94 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/source.py | 160 | except Exception as e: | CODE |
| LOW | open_notebook/domain/provider_config.py | 268 | except Exception: | CODE |
| MEDIUM | open_notebook/domain/notebook.py | 136 | def get_chat_sessions(self) -> List["ChatSession"]: | CODE |
| MEDIUM | open_notebook/domain/notebook.py | 315 | def get_source(self) -> "Source": | CODE |
| MEDIUM | open_notebook/domain/notebook.py | 364 | def get_source(self) -> "Source": | CODE |
| MEDIUM | open_notebook/domain/notebook.py | 484 | def get_embedded_chunks(self) -> int: | CODE |
| MEDIUM | open_notebook/domain/notebook.py | 500 | def get_insights(self) -> List[SourceInsight]: | CODE |
| LOW⚡ | open_notebook/domain/notebook.py | 780 | except Exception as ve: | CODE |
| 205 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 103 | ### Step 1: Get docker-compose.yml | COMMENT |
| LOW⚡ | README.md | 165 | ### Step 2: Set Your Encryption Key | COMMENT |
| LOW⚡ | README.md | 172 | ### Step 3: Start Services | COMMENT |
| LOW⚡ | README.md | 179 | ### Step 4: Configure AI Provider | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 180 | // Step 1: Find ALL references using simple greedy pattern. | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 210 | // Step 2: Process references from end to start (to preserve indices) | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 218 | // Step 3: Analyze context around the reference | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 258 | // Step 4: Build the markdown link | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 262 | // Step 5: Replace in the result string | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 349 | // Step 1: Parse all references using existing function | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 352 | // Step 2: If no references found, return original text | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 357 | // Step 3: Build reference map (deduplicate and assign numbers) | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 408 | // Step 5: Build reference list | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 417 | // Step 6: Append reference list to result | COMMENT |
| LOW | frontend/src/lib/utils/source-references.tsx | 372 | // Step 4: Replace references with numbered citations (process from end to start) | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 16 | ## Step 1: Clone and Initial Setup | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 27 | ## Step 2: Install Python Dependencies | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 37 | ## Step 3: Environment Variables | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 86 | ## Step 4: Start SurrealDB | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 125 | ## Step 5: Run Database Migrations | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 144 | ## Step 6: Start the API Server | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 172 | ## Step 7: Start the Frontend (Optional) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 17 | ## Step 1: Choose Your Setup (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 27 | ## Step 2: Create Configuration (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 93 | ## Step 3: Start Services (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 105 | ## Step 4: Download a Model (2-3 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 124 | ## Step 5: Access Open Notebook (instant) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 135 | ## Step 6: Configure Ollama Provider (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-local.md | 148 | ## Step 7: Configure Local Model (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-local.md | 158 | ## Step 8: Create Your First Notebook (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-local.md | 166 | ## Step 9: Add Local Content (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-local.md | 175 | ## Step 10: Chat With Your Content (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 20 | ## Step 1: Create Configuration (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 65 | ## Step 2: Start Services (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 77 | ## Step 3: Access Open Notebook (instant) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 88 | ## Step 4: Configure Your AI Provider (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 104 | ## Step 5: Configure Your Model (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 122 | ## Step 6: Create Your First Notebook (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 130 | ## Step 7: Add Content & Chat (2 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-openai.md | 17 | ## Step 1: Create Configuration (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-openai.md | 63 | ## Step 2: Start Services (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-openai.md | 75 | ## Step 3: Access Open Notebook (instant) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-openai.md | 86 | ## Step 4: Configure Your OpenAI Provider (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-openai.md | 101 | ## Step 5: Create Your First Notebook (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-openai.md | 109 | ## Step 6: Add a Source (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-openai.md | 119 | ## Step 7: Chat With Your Content (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 22 | ## Step 1: Start Ollama (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 40 | ## Step 2: Create Configuration (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 86 | ## Step 3: Connect Open Notebook to Host Ollama (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 98 | ## Step 4: Start Open Notebook (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 110 | ## Step 5: Configure Ollama Provider (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 125 | ## Step 6: Configure Models (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 135 | ## Step 7: Access Open Notebook (instant) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 13 | ## Step 1: Get docker-compose.yml (1 min) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 88 | ## Step 2: Start Services (2 min) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 109 | ## Step 3: Verify Installation (1 min) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 127 | ## Step 4: Configure AI Provider (2 min) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 147 | ## Step 5: First Notebook (2 min) | COMMENT |
| LOW | docs/5-CONFIGURATION/local-tts.md | 28 | ### Step 1: Create Docker Compose File | COMMENT |
| LOW | docs/5-CONFIGURATION/local-tts.md | 47 | ### Step 2: Start and Download Model | COMMENT |
| 55 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | open_notebook/utils/version_utils.py | 60 | Fetch and parse the version from pyproject.toml in a public GitHub repository. Args: repo_url (str): U | STRING |
| HIGH | open_notebook/utils/version_utils.py | 114 | Get the version of an installed package. Args: package_name (str): Name of the installed package | STRING |
| HIGH | open_notebook/utils/encryption.py | 129 | Encrypt a string value using Fernet symmetric encryption. Args: value: The plain text string to encryp | STRING |
| HIGH | open_notebook/utils/encryption.py | 168 | Decrypt a Fernet-encrypted string value. Handles graceful fallback for legacy unencrypted data. Args: | STRING |
| HIGH | open_notebook/utils/embedding.py | 51 | Combine multiple embeddings into a single embedding using mean pooling. Algorithm: 1. Normalize each embed | STRING |
| HIGH | open_notebook/utils/embedding.py | 109 | Generate embeddings for multiple texts with automatic batching and retry. Texts are split into batches of EMBE | STRING |
| HIGH | open_notebook/utils/embedding.py | 210 | Generate a single embedding for text, handling large content via chunking and mean pooling. For short text (<= | STRING |
| HIGH | open_notebook/domain/notebook.py | 567 | Submit insight creation as an async command (fire-and-forget). Submits a create_insight command that h | STRING |
| HIGH | docs/7-DEVELOPMENT/code-standards.md | 79 | Perform vector search across embedded content. Args: query: Search query string limit: Maximum numb | STRING |
| HIGH | docs/7-DEVELOPMENT/code-standards.md | 131 | Create a new notebook with validation. Args: name: The notebook name (required, non-empty) descript | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | open_notebook/domain/notebook.py | 781 | # Both search paths failed (e.g. no embedding model configured). | COMMENT |
| MEDIUM | open_notebook/domain/credential.py | 79 | # Ollama-only: overrides the context window (num_ctx). Esperanto defaults to | COMMENT |
| MEDIUM | open_notebook/domain/credential.py | 80 | # 8192; raise this if your hardware can handle a larger context window. | COMMENT |
| MEDIUM | tests/test_crud_404.py | 125 | mock_embed_model.return_value = MagicMock() # an embedding model is configured | CODE |
| MEDIUM | docs/2-CORE-CONCEPTS/index.md | 14 | ### 2. [AI Context & RAG](ai-context-rag.md) | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 1 | # AI Context & RAG - How Open Notebook Uses Your Research | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 40 | ## How RAG Works: Three Stages | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 272 | ### Chat: Full-Content Context (NO RAG) | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 311 | ### Ask: RAG - Automatic Retrieval | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 437 | ### Ask (RAG) | COMMENT |
| MEDIUM | docs/5-CONFIGURATION/ollama.md | 36 | ollama pull mxbai-embed-large # Best embedding model for Ollama | CODE |
| MEDIUM | api/routers/embedding.py | 20 | # Check if embedding model is available | COMMENT |
| MEDIUM | api/routers/search.py | 26 | # Check if embedding model is available for vector search | COMMENT |
| MEDIUM | api/routers/search.py | 148 | # Check if embedding model is available | COMMENT |
| MEDIUM | api/routers/search.py | 202 | # Check if embedding model is available | COMMENT |
| MEDIUM | commands/embedding_commands.py | 635 | # Check embedding model availability (fail fast) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/utils/encryption.py | 29 | CODE | |
| LOW | open_notebook/utils/text_utils.py | 122 | CODE | |
| LOW | open_notebook/utils/embedding.py | 106 | CODE | |
| LOW | open_notebook/utils/context_builder.py | 40 | CODE | |
| LOW | open_notebook/utils/context_builder.py | 140 | CODE | |
| LOW | open_notebook/utils/url_validation.py | 22 | CODE | |
| LOW | open_notebook/ai/models.py | 175 | CODE | |
| LOW | open_notebook/ai/models.py | 295 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 74 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 137 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 176 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 392 | CODE | |
| LOW | open_notebook/ai/model_discovery.py | 375 | CODE | |
| LOW | open_notebook/graphs/source_chat.py | 189 | CODE | |
| LOW | open_notebook/domain/provider_config.py | 198 | CODE | |
| LOW | open_notebook/domain/notebook.py | 70 | CODE | |
| LOW | open_notebook/domain/notebook.py | 211 | CODE | |
| LOW | open_notebook/domain/credential.py | 171 | CODE | |
| LOW | open_notebook/domain/base.py | 40 | CODE | |
| LOW | open_notebook/domain/base.py | 148 | CODE | |
| LOW | open_notebook/domain/base.py | 284 | CODE | |
| LOW | tests/test_max_body_size_middleware.py | 86 | CODE | |
| LOW | api/credentials_service.py | 104 | CODE | |
| LOW | api/credentials_service.py | 217 | CODE | |
| LOW | api/credentials_service.py | 577 | CODE | |
| LOW | api/credentials_service.py | 685 | CODE | |
| LOW | api/routers/models.py | 388 | CODE | |
| LOW | api/routers/models.py | 690 | CODE | |
| LOW | api/routers/transformations.py | 210 | CODE | |
| LOW | api/routers/embedding.py | 17 | CODE | |
| LOW | api/routers/credentials.py | 299 | CODE | |
| LOW | api/routers/podcasts.py | 178 | CODE | |
| LOW | api/routers/source_chat.py | 130 | CODE | |
| LOW | api/routers/source_chat.py | 332 | CODE | |
| LOW | api/routers/sources.py | 245 | CODE | |
| LOW | api/routers/sources.py | 414 | CODE | |
| LOW | api/routers/sources.py | 831 | CODE | |
| LOW | api/routers/sources.py | 922 | CODE | |
| LOW | api/routers/embedding_rebuild.py | 20 | CODE | |
| LOW | api/routers/search.py | 69 | CODE | |
| LOW | api/routers/notebooks.py | 62 | CODE | |
| LOW | api/routers/languages.py | 38 | CODE | |
| LOW | api/routers/commands.py | 142 | CODE | |
| LOW | commands/podcast_commands.py | 66 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_search_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_recently_viewed_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_sources_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_models_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_credentials_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_notes_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_insight_timestamps.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/utils/context_builder.py | 17 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 20 | CODE | |
| LOW | open_notebook/utils/__init__.py | 20 | CODE | |
| LOW | open_notebook/utils/__init__.py | 20 | CODE | |
| LOW | open_notebook/utils/__init__.py | 25 | CODE | |
| LOW | open_notebook/utils/__init__.py | 25 | CODE | |
| LOW | open_notebook/utils/__init__.py | 29 | CODE | |
| LOW | open_notebook/utils/__init__.py | 30 | CODE | |
| LOW | open_notebook/utils/__init__.py | 30 | CODE | |
| LOW | open_notebook/utils/__init__.py | 30 | CODE | |
| LOW | open_notebook/utils/__init__.py | 30 | CODE | |
| LOW | open_notebook/utils/__init__.py | 36 | CODE | |
| LOW | open_notebook/utils/__init__.py | 36 | CODE | |
| LOW | open_notebook/utils/__init__.py | 37 | CODE | |
| LOW | open_notebook/utils/__init__.py | 37 | CODE | |
| LOW | open_notebook/utils/__init__.py | 37 | CODE | |
| LOW | tests/test_podcast_legacy_field_removal.py | 109 | CODE | |
| LOW | api/command_service.py | 22 | CODE | |
| LOW | api/podcast_service.py | 91 | CODE | |
| LOW | api/routers/embedding.py | 43 | CODE | |
| LOW | api/routers/sources.py | 498 | CODE | |
| LOW | api/routers/sources.py | 563 | CODE | |
| LOW | api/routers/sources.py | 987 | CODE | |
| LOW | api/routers/embedding_rebuild.py | 35 | CODE | |
| LOW | commands/__init__.py | 3 | CODE | |
| LOW | commands/__init__.py | 3 | CODE | |
| LOW | commands/__init__.py | 3 | CODE | |
| LOW | commands/__init__.py | 3 | CODE | |
| LOW | commands/__init__.py | 9 | CODE | |
| LOW | commands/__init__.py | 10 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/utils/embedding.py | 240 | # Check if chunking is needed | COMMENT |
| LOW⚡ | open_notebook/ai/model_discovery.py | 686 | # Check if model already exists using pre-fetched data | COMMENT |
| LOW | .github/workflows/build-dev.yml | 66 | # Check if this is a push to main (not a PR) | COMMENT |
| LOW | api/credentials_service.py | 603 | # Check if a credential already exists for this provider with same name | COMMENT |
| LOW⚡ | api/podcast_service.py | 167 | # Check if profiles already exist | COMMENT |
| LOW⚡ | api/podcast_service.py | 188 | # Check if profiles already exist | COMMENT |
| LOW | api/routers/config.py | 53 | # Check if cache is still valid (within TTL) | COMMENT |
| LOW | api/routers/embedding.py | 20 | # Check if embedding model is available | COMMENT |
| LOW | api/routers/sources.py | 839 | # Check if this is a legacy source (no command) | COMMENT |
| LOW | api/routers/sources.py | 930 | # Check if source already has a running command | COMMENT |
| LOW | api/routers/sources.py | 977 | # Check if it's a text source by trying to get full_text | COMMENT |
| LOW | api/routers/search.py | 26 | # Check if embedding model is available for vector search | COMMENT |
| LOW | api/routers/search.py | 148 | # Check if embedding model is available | COMMENT |
| LOW | api/routers/search.py | 202 | # Check if embedding model is available | COMMENT |
| LOW | api/routers/notebooks.py | 354 | # Check if reference already exists (idempotency) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cubic.yaml | 1 | # yaml-language-server: $schema=https://cubic.dev/schema/cubic-repository-config.schema.json | COMMENT |
| LOW | docker-compose.yml | 1 | services: | COMMENT |
| LOW | frontend/src/components/ui/markdown-editor.tsx | 21 | // (e.g. pasted content, or an AI-generated note echoing an indirect prompt | COMMENT |
| LOW | open_notebook/config.py | 21 | # TIKTOKEN CACHE FOLDER | COMMENT |
| LOW | open_notebook/podcasts/__init__.py | 1 | # Podcasts module | COMMENT |
| LOW | open_notebook/ai/__init__.py | 1 | # AI infrastructure module | COMMENT |
| LOW | tests/test_podcast_audio_paths.py | 141 | # Percent-encoded file:// URIs cannot be URL-decoded in SurrealQL and | COMMENT |
| LOW | docs/6-TROUBLESHOOTING/connection-issues.md | 61 | COMMENT | |
| LOW | docs/6-TROUBLESHOOTING/quick-fixes.md | 121 | **Solution (1 minute):** | COMMENT |
| LOW | docs/6-TROUBLESHOOTING/quick-fixes.md | 181 | **Solution (1 minute):** | COMMENT |
| LOW | examples/docker-compose-speaches.yml | 1 | # Docker Compose with Speaches (Local TTS/STT) | COMMENT |
| LOW | examples/docker-compose-speaches.yml | 81 | # For TTS (Text-to-Speech): | COMMENT |
| LOW | examples/docker-compose-speaches.yml | 101 | # 6. Add TTS Model: | COMMENT |
| LOW | examples/docker-compose-speaches.yml | 121 | # Test STT: | COMMENT |
| LOW | examples/docker-compose-ollama.yml | 1 | # Docker Compose with Ollama (Free Local AI) | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 1 | # Docker Compose - 100% Local AI Setup | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 101 | hf-hub-cache: | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 121 | # | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 141 | # 3. Discover Speech Models: | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 161 | # For TTS: | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 181 | # - 50 GB disk space | COMMENT |
| LOW | examples/docker-compose-single.yml | 21 | # Access: | COMMENT |
| LOW | scripts/docker-entrypoint.sh | 1 | #!/bin/sh | COMMENT |
| LOW | scripts/release-test/rc-stack.sh | 1 | #!/bin/bash | COMMENT |
| LOW | api/main.py | 241 | ) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 180 | // Step 1: Find ALL references using simple greedy pattern. | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 210 | // Step 2: Process references from end to start (to preserve indices) | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 218 | // Step 3: Analyze context around the reference | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 258 | // Step 4: Build the markdown link | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 262 | // Step 5: Replace in the result string | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 349 | // Step 1: Parse all references using existing function | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 352 | // Step 2: If no references found, return original text | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 357 | // Step 3: Build reference map (deduplicate and assign numbers) | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 408 | // Step 5: Build reference list | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 417 | // Step 6: Append reference list to result | COMMENT |
| LOW | frontend/src/lib/utils/source-references.tsx | 372 | // Step 4: Replace references with numbered citations (process from end to start) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 675 | # Create a set of (name, type) tuples for O(1) lookup | COMMENT |
| MEDIUM | open_notebook/graphs/source_chat.py | 249 | # Create the StateGraph | COMMENT |
| MEDIUM | open_notebook/graphs/source.py | 253 | # Define the graph edges | COMMENT |
| MEDIUM | open_notebook/domain/credential.py | 188 | # Create a minimal credential with error info from raw DB fields | COMMENT |
| MEDIUM | tests/test_domain.py | 258 | # Create a temporary file | COMMENT |
| MEDIUM | commands/podcast_commands.py | 257 | # Create the record for the episode and associate with the ongoing command | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | frontend/src/components/ui/markdown-editor.tsx | 21 | // (e.g. pasted content, or an AI-generated note echoing an indirect prompt | COMMENT |
| HIGH | frontend/src/components/ui/markdown-editor.test.tsx | 9 | // default). Notes can hold AI-generated content that echoes an indirect | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/src/lib/api/source-chat.ts | 54 | // Use relative URL to leverage Next.js rewrites | COMMENT |
| MEDIUM | frontend/src/lib/api/search.ts | 17 | // Use relative URL to leverage Next.js rewrites | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/docker-compose-speaches.yml | 13 | # Usage: | COMMENT |
| LOW | examples/docker-compose-ollama.yml | 6 | # Usage: | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 16 | # Usage: | COMMENT |
| LOW | scripts/release-test/rc-stack.sh | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/utils/__init__.py | 43 | __all__ = [ | CODE |
| LOW | scripts/export_docs.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | commands/__init__.py | 12 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/domain/provider_config.py | 51 | CODE | |
| LOW | api/auth.py | 82 | CODE | |
| LOW | api/routers/sources.py | 173 | CODE |