Not in the top 1,000 by GitHub stars
notoriouslab/doc-cleaner
日常文件轉 Markdown —— 涵蓋 PDF、Office、Apple Keynote/Numbers、EPUB 電子書等 16 種格式。中文友好、表格保留、隱私優先、全程本地。
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
55e3c472ac48 → 55e3c472ac48
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 55e3c472ac48
No earlier version was observed for comparison.
Verified commit 55e3c472ac4875c3bb923b2d82821fec15444cc0
git clone --filter=blob:none --no-checkout https://github.com/notoriouslab/doc-cleaner.git .hotskills/notoriouslab-doc-cleaner && git -C .hotskills/notoriouslab-doc-cleaner checkout --detach 55e3c472ac4875c3bb923b2d82821fec15444cc0
# Copy each selected skill directory from .hotskills/notoriouslab-doc-cleaner into .agents/skills/<skill-name>/Heat
0.3- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
doc-cleaner
When your agent uses it
Convert PDF, DOCX, XLSX, and text files to clean, structured Markdown. CJK-friendly, table-friendly, privacy-first.
What it loads into context
Frontmatter
79 tokensAlways available to the agent
SKILL.md
778 tokensWhen the skill is activated
Reference documents
12,420 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to use
- Commands
- Options
- Supported formats
- Exit codes
- Notes
Scripts executed separately
ai/__init__.pyai/base.pyai/gemini.pyai/groq.pyai/mlx.pyai/nvidia.pyai/ollama.pyclassifiers/__init__.pyclassifiers/noise.pyclassifiers/pdf_classifier.pyclassifiers/pii.pycleaner.pycore.pymacapp/__init__.pymacapp/__main__.pymacapp/app.pymacapp/mdpreview.pymacapp/settings.pyoutput/__init__.pyoutput/epub.pyoutput/markdown.pyparsers/__init__.pyparsers/_platform.pyparsers/_tableutil.pyparsers/_textutil.pyparsers/docx.pyparsers/dxf.pyparsers/epub.pyparsers/iwork.pyparsers/jsonl.pyparsers/numbers.pyparsers/pdf.pyparsers/pptx.pyparsers/text.pyparsers/xlsx.pyprompts/__init__.pyscripts/package_dmg.pyscripts/sign_and_notarize_macos.shscripts/verify_macos_signing.shtests/fixtures/make_pdf_table_fixtures.pytests/test_collect_files_recursive.pytests/test_core.pytests/test_dxf.pytests/test_e2e_custom_output.pytests/test_epub.pytests/test_epub_integration.pytests/test_epub_parser.pytests/test_epub_security.pytests/test_iwork_parser.pytests/test_jsonl_parser.pytests/test_macapp.pytests/test_mdpreview.pytests/test_numbers_parser.pytests/test_parsers_group2.pytests/test_pdf_routing.pytests/test_pdf_tables.pytests/test_platform.pytests/test_pptx.pytests/test_row_rebuild.pytests/test_settings.pytests/test_ssrf_allowlist.pytests/test_table_escaping.pytests/test_table_stitching.pytests/test_tableutil.pytests/test_version.py
Files
.env.exampleasset275 bytes.github/workflows/build-windows.ymlasset1,992 bytes.github/workflows/tests.ymlasset2,174 bytes.gitignoreasset550 bytesAGENTS.mdasset9 bytesCHANGELOG.mddoc8,947 bytesCONTRIBUTING.mddoc2,547 bytesLICENSEasset1,069 bytesREADME.en.mddoc15,073 bytesREADME.mddoc14,631 bytesReadMe.txtdoc5,634 bytesSECURITY.mddoc3,748 bytesSKILL.mdcore2,847 bytesSKILL.mdcore2,847 bytesSKILL.mdcore2,847 bytesSKILL.mdcore2,847 bytesSKILL.mdcore2,847 bytesSKILL.mdcore2,847 bytesSKILL.mdcore2,847 bytesai/__init__.pyruns0 bytesai/base.pyruns7,243 bytesai/gemini.pyruns1,984 bytesai/groq.pyruns4,121 bytesai/mlx.pyruns3,085 bytesai/nvidia.pyruns4,258 bytesai/ollama.pyruns3,998 bytesclassifiers/__init__.pyruns0 bytesclassifiers/noise.pyruns3,555 bytesclassifiers/pdf_classifier.pyruns4,789 bytesclassifiers/pii.pyruns3,841 bytescleaner.pyruns34,693 bytesconfig.example.jsonasset928 bytescore.pyruns5,222 bytesdocs/index.htmlasset21,037 bytesdocs/screenshots/app-done.pngasset65,410 bytesdocs/screenshots/app-main.pngasset52,138 bytesdocs/screenshots/app-preview.pngasset89,039 bytesmacapp/__init__.pyruns86 bytesmacapp/__main__.pyruns309 bytesmacapp/app.pyruns38,147 bytesmacapp/mdpreview.pyruns10,546 bytesmacapp/settings.pyruns5,026 bytesoutput/__init__.pyruns0 bytesoutput/epub.pyruns17,738 bytesoutput/markdown.pyruns2,832 bytesparsers/__init__.pyruns0 bytesparsers/_platform.pyruns5,208 bytesparsers/_tableutil.pyruns797 bytesparsers/_textutil.pyruns1,791 bytesparsers/docx.pyruns4,632 bytesparsers/dxf.pyruns4,206 bytesparsers/epub.pyruns11,561 bytesparsers/iwork.pyruns14,123 bytesparsers/jsonl.pyruns6,672 bytesparsers/numbers.pyruns4,019 bytesparsers/pdf.pyruns23,975 bytesparsers/pptx.pyruns3,757 bytesparsers/text.pyruns1,210 bytesparsers/xlsx.pyruns4,270 bytesprompts/__init__.pyruns0 bytesprompts/default.txtdoc835 bytesprompts/finance.txtdoc1,192 bytespyproject.tomlasset2,930 bytesrequirements.txtdoc1,309 bytesresources/icon.icnsasset129,102 bytesresources/icon.icoasset25,543 bytesresources/icon.pngasset17,735 bytesscripts/package_dmg.pyruns2,467 bytesscripts/sign_and_notarize_macos.shruns6,099 bytesscripts/verify_macos_signing.shruns7,427 bytestests/fixtures/crosspage_repeated_header.pdfasset4,439 bytestests/fixtures/header_grid_only.pdfasset2,730 bytestests/fixtures/make_pdf_table_fixtures.pyruns4,903 bytestests/fixtures/merged_cells.pdfasset2,939 bytestests/fixtures/mixed_content.pdfasset2,639 bytestests/fixtures/no_header.pdfasset2,525 bytestests/fixtures/special_chars.pdfasset2,630 bytestests/test_collect_files_recursive.pyruns3,500 bytestests/test_core.pyruns9,399 bytestests/test_dxf.pyruns4,588 bytestests/test_e2e_custom_output.pyruns3,627 bytestests/test_epub.pyruns4,922 bytestests/test_epub_integration.pyruns6,812 bytestests/test_epub_parser.pyruns17,570 bytestests/test_epub_security.pyruns3,392 bytestests/test_iwork_parser.pyruns13,062 bytestests/test_jsonl_parser.pyruns12,500 bytestests/test_macapp.pyruns24,510 bytestests/test_mdpreview.pyruns6,413 bytestests/test_numbers_parser.pyruns9,607 bytestests/test_parsers_group2.pyruns5,130 bytestests/test_pdf_routing.pyruns3,581 bytestests/test_pdf_tables.pyruns10,807 bytestests/test_platform.pyruns7,695 bytestests/test_pptx.pyruns4,155 bytestests/test_row_rebuild.pyruns3,897 bytestests/test_settings.pyruns5,318 bytestests/test_ssrf_allowlist.pyruns5,262 bytestests/test_table_escaping.pyruns4,968 bytestests/test_table_stitching.pyruns4,736 bytestests/test_tableutil.pyruns1,911 bytestests/test_version.pyruns2,748 bytesvendor_wheels/proxy_tools-0.1.0-py3-none-any.whlasset2,936 bytes
Read SKILL.md
# doc-cleaner
Convert documents (PDF, DOCX, XLSX, TXT) to clean, structured Markdown.
## When to use
- User asks to convert a document to Markdown
- User wants to extract text or tables from PDF/DOCX/XLSX files
- User wants to clean up bank statements or financial documents
- User asks to process a batch of documents in a directory
## Commands
### Convert a single file (no AI, fastest)View the complete source on GitHubSkills included
- doc-cleaner
Repository facts
- License
- MIT
- Created
- Mar 9, 2026
- Last pushed
- Aug 20, 2026
- Forks
- 40
- Open issues
- 0
- Project activity
- Slowing
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 7 notes
AGENTS.md:1Analysis incomplete: Symlink target missing or expansion limit reachedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 2 dangerous shell commandsin 2 files: parsers/pdf.py:301 scripts/sign_and_notarize_macos.sh:97
- 189 network referencesin 22 files: tests/test_ssrf_allowlist.py:14 docs/index.html:117 README.en.md:5 and 19 more
- 1 obfuscation signalin 1 file: output/epub.py:22
- No instruction overrides
- 65 executable scriptsin 65 files: ai/__init__.py:1 ai/base.py:1 ai/gemini.py:1 and 62 more
- 84 references to secretsin 20 files: cleaner.py:18 scripts/sign_and_notarize_macos.sh:22 README.en.md:92 and 17 more
- No requests to vote in Hot
Show all 341 signals by file
.env.example
.gitignore
- Access to secretsline 2
[Credential-related source omitted]
CONTRIBUTING.md
README.en.md
- Network accessline 5
[](https://github.com/notoriouslab/doc-cleaner/releases) - Network accessline 6
[](https://github.com/notoriouslab/doc-cleaner/releases) - Network accessline 7
[](LICENSE) - Network accessline 8
[](https://www.python.org/) - Network accessline 9
[](#supported-formats-reference) - Network accessline 10
[](https://github.com/notoriouslab/doc-cleaner) - Network accessline 14
Part of the [notoriouslab](https://github.com/notoriouslab) open-source toolkit · Requires Python 3.9+ - Network accessline 16
[中文 README](README.md) · [Landing page](https://notoriouslab.github.io/doc-cleaner/) (one-page overview and download, for non-GitHub users) - Network accessline 20
| Platform | Download | Architecture | |----------|----------|--------------| | **macOS** | [Doc Cleaner-1.7.1.dmg](https://github.com/notoriouslab/doc-cleaner/releases/download/v1.7.1/Doc.Cleaner-1.7.1.dmg) | Universal (Intel + Apple Silic - Network accessline 21
|----------|----------|--------------| | **macOS** | [Doc Cleaner-1.7.1.dmg](https://github.com/notoriouslab/doc-cleaner/releases/download/v1.7.1/Doc.Cleaner-1.7.1.dmg) | Universal (Intel + Apple Silicon) | | **Windows** | [Doc Cleaner-1.7. - Network accessline 22
| **macOS** | [Doc Cleaner-1.7.1.dmg](https://github.com/notoriouslab/doc-cleaner/releases/download/v1.7.1/Doc.Cleaner-1.7.1.dmg) | Universal (Intel + Apple Silicon) | - Network accessline 23
| **Windows** | [Doc Cleaner-1.7.1.msi](https://github.com/notoriouslab/doc-cleaner/releases/download/v1.7.1/Doc.Cleaner-1.7.1.msi) | x86_64 (runs on ARM Windows too) | - Network accessline 70
# 1. Clone git clone https://github.com/notoriouslab/doc-cleaner.git && cd doc-cleaner - Network accessline 71
git clone https://github.com/notoriouslab/doc-cleaner.git && cd doc-cleaner - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 93
[Credential-related source omitted] - Access to secretsline 130
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 226
[Credential-related source omitted] - Network accessline 248
"ollama": { "model": "qwen3.5:9b", "host": "http://localhost:11434" - Network accessline 249
"model": "qwen3.5:9b", "host": "http://localhost:11434" } - Network accessline 250
"host": "http://localhost:11434" - Access to secretsline 266
[Credential-related source omitted] - Access to secretsline 267
[Credential-related source omitted] - Access to secretsline 268
[Credential-related source omitted] - Network accessline 332
doc-cleaner is a standard CLI — any AI agent framework can shell-call it. Ships with `SKILL.md` for [OpenClaw](https://openclaw.ai/). - Network accessline 372
[](https://star-history.dera.page/#notoriouslab/doc-cleaner&type=Date)
README.md
- Network accessline 5
[](https://github.com/notoriouslab/doc-cleaner/releases) - Network accessline 6
[](https://github.com/notoriouslab/doc-cleaner/releases) - Network accessline 7
[](LICENSE) - Network accessline 8
[](https://www.python.org/) - Network accessline 9
[](#支援格式完整表) - Network accessline 10
[](https://github.com/notoriouslab/doc-cleaner) - Network accessline 14
屬於 [notoriouslab](https://github.com/notoriouslab) 開源工具組的一員 · 需要 Python 3.9+ - Network accessline 16
[English README](README.en.md) · [下載頁](https://notoriouslab.github.io/doc-cleaner/)(一頁式說明與下載,給不熟 GitHub 的使用者) - Network accessline 20
| 平台 | 下載 | 架構 | |------|------|------| | **macOS** | [Doc Cleaner-1.7.1.dmg](https://github.com/notoriouslab/doc-cleaner/releases/download/v1.7.1/Doc.Cleaner-1.7.1.dmg) | Universal(Intel + Apple Silicon) | - Network accessline 21
|------|------|------| | **macOS** | [Doc Cleaner-1.7.1.dmg](https://github.com/notoriouslab/doc-cleaner/releases/download/v1.7.1/Doc.Cleaner-1.7.1.dmg) | Universal(Intel + Apple Silicon) | | **Windows** | [Doc Cleaner-1.7.1.msi](https://gi - Network accessline 22
| **macOS** | [Doc Cleaner-1.7.1.dmg](https://github.com/notoriouslab/doc-cleaner/releases/download/v1.7.1/Doc.Cleaner-1.7.1.dmg) | Universal(Intel + Apple Silicon) | - Network accessline 23
| **Windows** | [Doc Cleaner-1.7.1.msi](https://github.com/notoriouslab/doc-cleaner/releases/download/v1.7.1/Doc.Cleaner-1.7.1.msi) | x86_64(含 ARM Windows) | - Network accessline 71
# 1. Clone git clone https://github.com/notoriouslab/doc-cleaner.git && cd doc-cleaner - Network accessline 72
git clone https://github.com/notoriouslab/doc-cleaner.git && cd doc-cleaner - Access to secretsline 93
[Credential-related source omitted] - Access to secretsline 94
[Credential-related source omitted] - Access to secretsline 130
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 223
[Credential-related source omitted] - Network accessline 245
"ollama": { "model": "qwen3.5:9b", "host": "http://localhost:11434" - Network accessline 246
"model": "qwen3.5:9b", "host": "http://localhost:11434" } - Network accessline 247
"host": "http://localhost:11434" - Access to secretsline 263
[Credential-related source omitted] - Access to secretsline 264
[Credential-related source omitted] - Access to secretsline 265
[Credential-related source omitted] - Network accessline 329
doc-cleaner 是標準 CLI,任何 AI agent 框架可透過 shell 呼叫。附帶 `SKILL.md` 供 [OpenClaw](https://openclaw.ai/) 使用。 - Network accessline 373
[](https://star-history.dera.page/#notoriouslab/doc-cleaner&type=Date)
ReadMe.txt
SECURITY.md
- Access to secretsline 11
[Credential-related source omitted] - Network accessline 24
- **PDF bombs**: PyMuPDF (fitz) handles page rendering; extremely large PDFs may consume memory. The text extraction cap (`max_chars=150,000`) limits exposure. - **Malicious DOCX/XLSX**: `python-docx` and `openpyxl`/`pandas` parse XML inter - Network accessline 26
- **ZIP bombs via pikepdf**: pikepdf operates on PDF streams, not ZIP archives. No decompression bomb risk here (that concern belongs to [gmail-statement-fetcher](https://github.com/notoriouslab/gmail-statement-fetcher)). - Network accessline 72
Email the maintainer directly (see profile) or open a [private security advisory](https://github.com/notoriouslab/doc-cleaner/security/advisories/new). - Network accessline 73
[private security advisory](https://github.com/notoriouslab/doc-cleaner/security/advisories/new).
SKILL.md
- Network accessline 3
description: Convert PDF, DOCX, XLSX, and text files to clean, structured Markdown. CJK-friendly, table-friendly, privacy-first. version: 1.0.0 metadata: {"openclaw":{"emoji":"📄","homepage":"https://github.com/notoriouslab/doc-cleaner","req - Network accessline 4
version: 1.0.0 metadata: {"openclaw":{"emoji":"📄","homepage":"https://github.com/notoriouslab/doc-cleaner","requires":{"bins":["python3"]}}} --- - Network accessline 5
metadata: {"openclaw":{"emoji":"📄","homepage":"https://github.com/notoriouslab/doc-cleaner","requires":{"bins":["python3"]}}}
ai/__init__.py
- Executable scriptline 1
Executable file
ai/base.py
ai/gemini.py
ai/groq.py
- Executable scriptline 1
Executable file - Network accessline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 30
model: str = "meta-llama/llama-4-scout-17b-16e-instruct", base_url: str = "https://api.groq.com/openai/v1", timeout: int = 120, - Network accessline 31
base_url: str = "https://api.groq.com/openai/v1", - Access to secretsline 34
[Credential-related source omitted]
ai/mlx.py
- Executable scriptline 1
Executable file
ai/nvidia.py
- Executable scriptline 1
Executable file - Network accessline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 30
model: str = "meta/llama-3.2-90b-vision-instruct", base_url: str = "https://integrate.api.nvidia.com/v1", timeout: int = 180, - Network accessline 31
base_url: str = "https://integrate.api.nvidia.com/v1", - Access to secretsline 35
[Credential-related source omitted]
ai/ollama.py
- Executable scriptline 1
Executable file - Network accessline 4
Runs entirely on your machine — no API key, no cloud, full privacy. Requires Ollama to be running locally (default: http://localhost:11434). - Network accessline 5
Requires Ollama to be running locally (default: http://localhost:11434). - Network accessline 22
def __init__(self, model: str = "qwen3.5:9b", host: str = "http://localhost:11434", - Network accessline 61
# chain-of-thought "thinking" mode, which otherwise generates a lengthy # <think>...</think> block before the actual answer. This saves 30-60% # inference time. See: https://huggingface.co/Qwen/Qwen3-8B#thinking-mode - Network accessline 63
# inference time. See: https://huggingface.co/Qwen/Qwen3-8B#thinking-mode
classifiers/__init__.py
- Executable scriptline 1
Executable file
classifiers/noise.py
- Executable scriptline 1
Executable file
classifiers/pdf_classifier.py
- Executable scriptline 1
Executable file
classifiers/pii.py
- Executable scriptline 1
Executable file
cleaner.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Access to secretsline 134
[Credential-related source omitted] - Access to secretsline 135
[Credential-related source omitted] - Access to secretsline 136
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 147
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 181
[Credential-related source omitted] - Access to secretsline 183
[Credential-related source omitted] - Access to secretsline 184
[Credential-related source omitted] - Access to secretsline 189
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 195
[Credential-related source omitted] - Access to secretsline 197
[Credential-related source omitted] - Access to secretsline 198
[Credential-related source omitted] - Network accessline 203
groq_config = ai_config.get("groq", {}) model = groq_config.get("model", "meta-llama/llama-4-scout-17b-16e-instruct") base_url = groq_config.get("base_url", "https://api.groq.com/openai/v1") - Network accessline 204
model = groq_config.get("model", "meta-llama/llama-4-scout-17b-16e-instruct") base_url = groq_config.get("base_url", "https://api.groq.com/openai/v1") timeout = groq_config.get("timeout", 120) - Network accessline 205
base_url = groq_config.get("base_url", "https://api.groq.com/openai/v1") - Access to secretsline 208
[Credential-related source omitted] - Access to secretsline 217
[Credential-related source omitted] - Access to secretsline 218
[Credential-related source omitted] - Network accessline 220
[Credential-related source omitted] - Access to secretsline 220
[Credential-related source omitted] - Network accessline 221
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted] - Network accessline 222
"Get a free key at https://build.nvidia.com" - Network accessline 226
nvidia_config = ai_config.get("nvidia", {}) model = nvidia_config.get("model", "meta/llama-3.2-90b-vision-instruct") base_url = nvidia_config.get("base_url", "https://integrate.api.nvidia.com/v1") - Network accessline 227
model = nvidia_config.get("model", "meta/llama-3.2-90b-vision-instruct") base_url = nvidia_config.get("base_url", "https://integrate.api.nvidia.com/v1") timeout = nvidia_config.get("timeout", 180) - Network accessline 228
base_url = nvidia_config.get("base_url", "https://integrate.api.nvidia.com/v1") - Access to secretsline 231
[Credential-related source omitted] - Network accessline 242
"Ollama backend requires the ollama package. " "Install with: pip install ollama\n" "Also ensure Ollama is running: https://ollama.com" - Network accessline 243
"Install with: pip install ollama\n" "Also ensure Ollama is running: https://ollama.com" ) - Network accessline 244
"Also ensure Ollama is running: https://ollama.com" - Network accessline 248
ollama_config = ai_config.get("ollama", {}) model = ollama_config.get("model", "qwen3.5:9b") host = ollama_config.get("host", "http://localhost:11434") - Network accessline 249
model = ollama_config.get("model", "qwen3.5:9b") host = ollama_config.get("host", "http://localhost:11434") vision_models = ollama_config.get("vision_models") - Network accessline 250
host = ollama_config.get("host", "http://localhost:11434") - Network accessline 273
openai_config = ai_config.get("openai", {}) model = openai_config.get("model", "gpt-4o") base_url = openai_config.get("base_url", "http://localhost:8000/v1") - Network accessline 274
[Credential-related source omitted] - Network accessline 275
base_url = openai_config.get("base_url", "http://localhost:8000/v1") - Access to secretsline 276
[Credential-related source omitted] - Access to secretsline 279
[Credential-related source omitted] - Access to secretsline 758
[Credential-related source omitted] - Access to secretsline 775
[Credential-related source omitted] - Access to secretsline 792
[Credential-related source omitted]
config.example.json
- Network accessline 9
"groq": { "model": "meta-llama/llama-4-scout-17b-16e-instruct", "base_url": "https://api.groq.com/openai/v1", - Network accessline 10
"model": "meta-llama/llama-4-scout-17b-16e-instruct", "base_url": "https://api.groq.com/openai/v1", "timeout": 120 - Network accessline 11
"base_url": "https://api.groq.com/openai/v1", - Network accessline 14
"ollama": { "model": "qwen3.5:9b", "host": "http://localhost:11434" - Network accessline 15
"model": "qwen3.5:9b", "host": "http://localhost:11434" } - Network accessline 16
"host": "http://localhost:11434"
core.py
- Executable scriptline 1
Executable file
docs/index.html
- Network accessline 117
<div class="gh-row"> <a class="gh-btn" href="https://github.com/notoriouslab/doc-cleaner" - Network accessline 118
<a class="gh-btn" href="https://github.com/notoriouslab/doc-cleaner" - Network accessline 120
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.75.75 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75 - Network accessline 121
星標<span class="gh-count" id="gh-stars"></span></a> <a class="gh-btn" href="https://github.com/notoriouslab/doc-cleaner/fork" title="到 GitHub 建立你自己的分支副本"> - Network accessline 122
<a class="gh-btn" href="https://github.com/notoriouslab/doc-cleaner/fork" - Network accessline 124
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v - Network accessline 125
分支<span class="gh-count" id="gh-forks"></span></a> <a class="gh-btn" href="https://github.com/notoriouslab/doc-cleaner/subscription" title="到 GitHub 關注這個專案的更新(需登入)"> - Network accessline 126
<a class="gh-btn" href="https://github.com/notoriouslab/doc-cleaner/subscription" - Network accessline 128
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1 - Network accessline 129
關注<span class="gh-count" id="gh-watch"></span></a> <a class="gh-btn" href="https://github.com/notoriouslab/doc-cleaner/releases" title="歷來所有版本的安裝檔下載總和"> - Network accessline 130
<a class="gh-btn" href="https://github.com/notoriouslab/doc-cleaner/releases" - Network accessline 139
<div class="dl-buttons"> <a class="dl-btn" id="btn-mac" href="https://github.com/notoriouslab/doc-cleaner/releases/latest"> - Network accessline 140
<a class="dl-btn" id="btn-mac" href="https://github.com/notoriouslab/doc-cleaner/releases/latest"> 下載 macOS 版<small>Universal(Intel 與 Apple Silicon).dmg</small></a> - Network accessline 141
href="https://github.com/notoriouslab/doc-cleaner/releases/latest"> - Network accessline 142
下載 macOS 版<small>Universal(Intel 與 Apple Silicon).dmg</small></a> <a class="dl-btn" id="btn-win" href="https://github.com/notoriouslab/doc-cleaner/releases/latest"> - Network accessline 143
<a class="dl-btn" id="btn-win" href="https://github.com/notoriouslab/doc-cleaner/releases/latest"> 下載 Windows 版<small>64 位元安裝程式 .msi</small></a> - Network accessline 144
href="https://github.com/notoriouslab/doc-cleaner/releases/latest"> - Network accessline 291
<details> <summary>遇到問題怎麼回報?</summary> <p>到 <a href="https://github.com/notoriouslab/doc-cleaner/issues">GitHub - Network accessline 292
<summary>遇到問題怎麼回報?</summary> <p>到 <a href="https://github.com/notoriouslab/doc-cleaner/issues">GitHub 的 Issues 頁</a>留言(這個需要免費註冊一個 GitHub 帳號),描述你轉的是 - Network accessline 293
<p>到 <a href="https://github.com/notoriouslab/doc-cleaner/issues">GitHub - Network accessline 299
<footer> <p>Doc Cleaner 屬於 notoriouslab 開源工具組 · <a href="https://github.com/notoriouslab/doc-cleaner">原始碼與完整說明(GitHub)</a> · - Network accessline 300
<p>Doc Cleaner 屬於 notoriouslab 開源工具組 · <a href="https://github.com/notoriouslab/doc-cleaner">原始碼與完整說明(GitHub)</a> · <a href="https://github.com/notoriouslab/doc-cleaner/releases">所有版本下載</a></p> - Network accessline 301
<a href="https://github.com/notoriouslab/doc-cleaner">原始碼與完整說明(GitHub)</a> · - Network accessline 302
<a href="https://github.com/notoriouslab/doc-cleaner/releases">所有版本下載</a></p> - Network accessline 314
var win = document.getElementById("btn-win"); var ver = document.getElementById("ver-line"); fetch("https://api.github.com/repos/notoriouslab/doc-cleaner/releases/latest") - Network accessline 315
var ver = document.getElementById("ver-line"); fetch("https://api.github.com/repos/notoriouslab/doc-cleaner/releases/latest") .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) - Network accessline 316
fetch("https://api.github.com/repos/notoriouslab/doc-cleaner/releases/latest") - Network accessline 341
// 真正的關注數是 subscribers_count。查不到(離線、限流)就不顯示數字, // 按鈕本身照樣可點。 fetch("https://api.github.com/repos/notoriouslab/doc-cleaner") - Network accessline 342
// 按鈕本身照樣可點。 fetch("https://api.github.com/repos/notoriouslab/doc-cleaner") .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) - Network accessline 343
fetch("https://api.github.com/repos/notoriouslab/doc-cleaner") - Network accessline 356
// 累計下載=歷來全部 release 資產的下載數加總(per_page=100 對本專案的 // 版本數綽綽有餘;超過再說)。查不到就留空,按鈕仍連到 releases 頁。 fetch("https://api.github.com/repos/notoriouslab/doc-cleaner/releases?per_page=100") - Network accessline 357
// 版本數綽綽有餘;超過再說)。查不到就留空,按鈕仍連到 releases 頁。 fetch("https://api.github.com/repos/notoriouslab/doc-cleaner/releases?per_page=100") .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) - Network accessline 358
fetch("https://api.github.com/repos/notoriouslab/doc-cleaner/releases?per_page=100")
macapp/__init__.py
- Executable scriptline 1
Executable file
macapp/__main__.py
- Executable scriptline 1
Executable file
macapp/app.py
macapp/mdpreview.py
- Executable scriptline 1
Executable file
macapp/settings.py
output/__init__.py
- Executable scriptline 1
Executable file
output/epub.py
- Executable scriptline 1
Executable file - Possible obfuscationline 22
_XML_INVALID = re.compile(r"[\x00-\x08\x0B\x0C\x0E-\x1F\ud800-\udfff\ufffe\uffff]") - Network accessline 224
content_opf = ( '<?xml version="1.0" encoding="UTF-8"?>\n' '<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="pub-id" version="3.0">\n' - Network accessline 225
'<?xml version="1.0" encoding="UTF-8"?>\n' '<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="pub-id" version="3.0">\n' ' <metadata xmlns:dc="http://purl.org/dc/elements/1.1/">\n' - Network accessline 226
'<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="pub-id" version="3.0">\n' - Network accessline 227
' <metadata xmlns:dc="http://purl.org/dc/elements/1.1/">\n' - Network accessline 249
toc_ncx = ( '<?xml version="1.0" encoding="UTF-8"?>\n' '<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">\n' - Network accessline 250
'<?xml version="1.0" encoding="UTF-8"?>\n' '<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">\n' ' <head>\n' - Network accessline 251
'<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">\n' - Network accessline 281
'<?xml version="1.0" encoding="UTF-8"?>\n' '<!DOCTYPE html>\n' f'<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="{xml_esc(language)}" xml:lang="{xml_esc(language)}">\n' - Network accessline 282
'<!DOCTYPE html>\n' f'<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="{xml_esc(language)}" xml:lang="{xml_esc(language)}">\n' '<head>\n' - Network accessline 283
f'<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="{xml_esc(language)}" xml:lang="{xml_esc(language)}">\n' - Network accessline 435
'<?xml version="1.0" encoding="UTF-8"?>\n' '<!DOCTYPE html>\n' f'<html xmlns="http://www.w3.org/1999/xhtml" lang="{xml_esc(language)}" xml:lang="{xml_esc(language)}">\n' - Network accessline 436
'<!DOCTYPE html>\n' f'<html xmlns="http://www.w3.org/1999/xhtml" lang="{xml_esc(language)}" xml:lang="{xml_esc(language)}">\n' '<head>\n' - Network accessline 437
f'<html xmlns="http://www.w3.org/1999/xhtml" lang="{xml_esc(language)}" xml:lang="{xml_esc(language)}">\n'
output/markdown.py
- Executable scriptline 1
Executable file
parsers/__init__.py
- Executable scriptline 1
Executable file
parsers/_platform.py
- Executable scriptline 1
Executable file - Network accessline 48
logger.warning( f"{format_label} 轉換需要 LibreOffice(Windows/Linux 平台)。" "請至 https://www.libreoffice.org 下載安裝。" - Network accessline 49
f"{format_label} 轉換需要 LibreOffice(Windows/Linux 平台)。" "請至 https://www.libreoffice.org 下載安裝。" ) - Network accessline 50
"請至 https://www.libreoffice.org 下載安裝。" - Access to secretsline 122
[Credential-related source omitted]
parsers/_tableutil.py
- Executable scriptline 1
Executable file
parsers/_textutil.py
- Executable scriptline 1
Executable file
parsers/docx.py
parsers/dxf.py
- Executable scriptline 1
Executable file
parsers/epub.py
- Executable scriptline 1
Executable file
parsers/iwork.py
parsers/jsonl.py
- Executable scriptline 1
Executable file
parsers/numbers.py
parsers/pdf.py
parsers/pptx.py
- Executable scriptline 1
Executable file
parsers/text.py
- Executable scriptline 1
Executable file
parsers/xlsx.py
- Executable scriptline 1
Executable file
prompts/__init__.py
- Executable scriptline 1
Executable file
pyproject.toml
scripts/package_dmg.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/sign_and_notarize_macos.sh
- Executable scriptline 1
#!/usr/bin/env bash - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Dangerous shell operationline 97
rm -f "$ZIP" - Access to secretsline 110
[Credential-related source omitted]
scripts/verify_macos_signing.sh
- Executable scriptline 1
#!/usr/bin/env bash
tests/fixtures/make_pdf_table_fixtures.py
- Executable scriptline 1
Executable file
tests/test_collect_files_recursive.py
- Executable scriptline 1
Executable file
tests/test_core.py
- Executable scriptline 1
Executable file
tests/test_dxf.py
- Executable scriptline 1
Executable file
tests/test_e2e_custom_output.py
- Executable scriptline 1
Executable file
tests/test_epub.py
- Executable scriptline 1
Executable file
tests/test_epub_integration.py
- Executable scriptline 1
Executable file
tests/test_epub_parser.py
- Executable scriptline 1
Executable file - Network accessline 16
CONTAINER_NS = "urn:oasis:names:tc:opendocument:xmlns:container" OPF_NS = "http://www.idpf.org/2007/opf" - Network accessline 17
OPF_NS = "http://www.idpf.org/2007/opf" - Network accessline 18
DC_NS = "http://purl.org/dc/elements/1.1/" - Network accessline 19
XHTML_NS = "http://www.w3.org/1999/xhtml" - Network accessline 20
ENC_NS = "http://www.w3.org/2001/04/xmlenc#"
tests/test_epub_security.py
- Executable scriptline 1
Executable file
tests/test_iwork_parser.py
tests/test_jsonl_parser.py
- Executable scriptline 1
Executable file - Network accessline 71
def test_tool_summary_url_priority_over_prompt(): block = {"name": "WebFetch", "input": {"url": "https://example.com", "prompt": "summarise this page"}} - Network accessline 72
block = {"name": "WebFetch", "input": {"url": "https://example.com", "prompt": "summarise this page"}} - Network accessline 73
assert _tool_summary(block) == "🔧 WebFetch: https://example.com"
tests/test_macapp.py
- Executable scriptline 1
Executable file
tests/test_mdpreview.py
- Executable scriptline 1
Executable file - Network accessline 91
def test_valid_link(self): out = r("[site](https://e.com)") - Network accessline 92
out = r("[site](https://e.com)") - Network accessline 93
assert '<a href="https://e.com">site</a>' in out - Network accessline 126
out = r('[x](https://e.com" onmouseover="alert(1))')
tests/test_numbers_parser.py
- Executable scriptline 1
Executable file
tests/test_parsers_group2.py
- Executable scriptline 1
Executable file
tests/test_pdf_routing.py
- Executable scriptline 1
Executable file
tests/test_pdf_tables.py
- Executable scriptline 1
Executable file
tests/test_platform.py
tests/test_pptx.py
- Executable scriptline 1
Executable file
tests/test_row_rebuild.py
- Executable scriptline 1
Executable file
tests/test_settings.py
- Executable scriptline 1
Executable file
tests/test_ssrf_allowlist.py
- Executable scriptline 1
Executable file - Network accessline 14
("http://localhost/v1", "loopback hostname"), - Network accessline 15
("http://localhost.localdomain/v1", "loopback alias"), - Network accessline 17
("http://127.0.0.1/v1", "loopback 127.0.0.1"), - Network accessline 18
("http://127.0.0.2/v1", "loopback 127.0.0.2 — old code missed this"), - Network accessline 19
("http://127.255.255.255/v1", "loopback upper end"), - Network accessline 21
("http://[::1]/v1", "IPv6 loopback ::1"), - Network accessline 23
("http://[::ffff:127.0.0.1]/v1", "IPv4-mapped IPv6 loopback"), - Network accessline 25
("http://0.0.0.0/v1", "INADDR_ANY — old code missed this"), - Network accessline 27
("http://10.0.0.1/v1", "RFC1918 10.x"), - Network accessline 28
("http://192.168.1.100/v1", "RFC1918 192.168.x"), - Network accessline 29
("http://172.16.0.1/v1", "RFC1918 172.16 — lower edge"), - Network accessline 30
("http://172.31.255.255/v1", "RFC1918 172.31 — upper edge"), - Network accessline 32
("http://[fd00::1]/v1", "IPv6 ULA — old code missed this"), - Network accessline 33
("http://[fc00::1]/v1", "IPv6 ULA fc00 — old code missed this"), - Network accessline 35
("http://169.254.1.1/v1", "link-local"), - Network accessline 36
("http://[fe80::1]/v1", "IPv6 link-local"), - Network accessline 38
("http://2130706433/v1", "decimal int 127.0.0.1"), - Network accessline 39
("http://0x7f000001/v1", "hex 127.0.0.1"), - Network accessline 40
("http:///v1", "empty host — resolves to loopback on many platforms"), - Network accessline 43
("http://127%2E0%2E0%2E1/v1", "percent-encoded loopback dots"), - Network accessline 44
("http://%31%32%37%2e%30%2e%30%2e%31/v1", "fully percent-encoded 127.0.0.1"), - Network accessline 45
("http://0%2E0%2E0%2E0/v1", "percent-encoded 0.0.0.0"), - Network accessline 46
("http://10%2E0%2E0%2E1/v1", "percent-encoded RFC1918 10.x"), - Network accessline 47
("http://192%2E168%2E1%2E1/v1", "percent-encoded RFC1918 192.168.x"), - Network accessline 63
ALLOWED = [ "https://api.groq.com/openai/v1", - Network accessline 64
"https://api.groq.com/openai/v1", - Network accessline 65
"https://integrate.api.nvidia.com/v1", - Network accessline 66
"http://my-proxy.internal.company.example.com/v1", # hostname, not IP - Network accessline 67
"https://1.2.3.4/v1", # public IP - Network accessline 68
"https://8.8.8.8/v1", # public IP (Google DNS) - Network accessline 71
"http://172.15.0.1/v1", - Network accessline 72
"http://172.32.0.1/v1", - Network accessline 87
[Credential-related source omitted] - Network accessline 89
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Network accessline 94
[Credential-related source omitted] - Network accessline 96
[Credential-related source omitted] - Access to secretsline 96
[Credential-related source omitted] - Network accessline 101
[Credential-related source omitted] - Network accessline 103
[Credential-related source omitted] - Access to secretsline 103
[Credential-related source omitted] - Network accessline 110
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted]
tests/test_table_escaping.py
- Executable scriptline 1
Executable file
tests/test_table_stitching.py
- Executable scriptline 1
Executable file
tests/test_tableutil.py
- Executable scriptline 1
Executable file
tests/test_version.py
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 12 facts
- Contacts api.groq.com, which SKILL.md, the README and the plugin manifest do not mentionai/groq.py:31High confidence
- Contacts integrate.api.nvidia.com, which SKILL.md, the README and the plugin manifest do not mentionai/nvidia.py:31High confidence
- Contacts api.groq.com, which SKILL.md, the README and the plugin manifest do not mentioncleaner.py:205High confidence
- Contacts build.nvidia.com, which SKILL.md, the README and the plugin manifest do not mentioncleaner.py:222High confidence
- Contacts integrate.api.nvidia.com, which SKILL.md, the README and the plugin manifest do not mentioncleaner.py:228High confidence
- Contacts ollama.com, which SKILL.md, the README and the plugin manifest do not mentioncleaner.py:244High confidence
- Contacts www.idpf.org, which SKILL.md, the README and the plugin manifest do not mentionoutput/epub.py:226High confidence
- Contacts purl.org, which SKILL.md, the README and the plugin manifest do not mentionoutput/epub.py:227High confidence
- Contacts www.daisy.org, which SKILL.md, the README and the plugin manifest do not mentionoutput/epub.py:251High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionoutput/epub.py:283High confidence
- Contacts www.libreoffice.org, which SKILL.md, the README and the plugin manifest do not mentionparsers/_platform.py:50High confidence
- Contacts schemas.openxmlformats.org, which SKILL.md, the README and the plugin manifest do not mentionparsers/docx.py:13High confidence
Signal confidence: 295 facts
- Network access in code of documentationCONTRIBUTING.md:47Low confidence
- Access to secrets in code of documentationCONTRIBUTING.md:55Low confidence
- Access to secrets in code of documentationCONTRIBUTING.md:60Low confidence
- Access to secrets in code of documentationCONTRIBUTING.md:61Low confidence
- Network access in prose of documentationREADME.en.md:5Low confidence
- Network access in prose of documentationREADME.en.md:6Low confidence
- Network access in prose of documentationREADME.en.md:7Low confidence
- Network access in prose of documentationREADME.en.md:8Low confidence
- Network access in prose of documentationREADME.en.md:9Low confidence
- Network access in prose of documentationREADME.en.md:10Low confidence
- Network access in prose of documentationREADME.en.md:14Low confidence
- Network access in prose of documentationREADME.en.md:16Low confidence
- Network access in prose of documentationREADME.en.md:20Low confidence
- Network access in prose of documentationREADME.en.md:21Low confidence
- Network access in prose of documentationREADME.en.md:22Low confidence
- Network access in prose of documentationREADME.en.md:23Low confidence
- Network access in code of documentationREADME.en.md:70Low confidence
- Network access in code of documentationREADME.en.md:71Low confidence
- Access to secrets in code of documentationREADME.en.md:92Low confidence
- Access to secrets in code of documentationREADME.en.md:93Low confidence
- Access to secrets in code of documentationREADME.en.md:130Low confidence
- Access to secrets in code of documentationREADME.en.md:131Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueREADME.en.md:226Low confidence
- Network access in code of documentationREADME.en.md:248Low confidence
- Network access in code of documentationREADME.en.md:249Low confidence
- Network access in code of documentationREADME.en.md:250Low confidence
- Access to secrets in code of documentationREADME.en.md:266Low confidence
- Access to secrets in code of documentationREADME.en.md:267Low confidence
- Access to secrets in code of documentationREADME.en.md:268Low confidence
- Network access in prose of documentationREADME.en.md:332Low confidence
- Network access in prose of documentationREADME.en.md:372Low confidence
- Network access in prose of documentationREADME.md:5Low confidence
- Network access in prose of documentationREADME.md:6Low confidence
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in prose of documentationREADME.md:8Low confidence
- Network access in prose of documentationREADME.md:9Low confidence
- Network access in prose of documentationREADME.md:10Low confidence
- Network access in prose of documentationREADME.md:14Low confidence
- Network access in prose of documentationREADME.md:16Low confidence
- Network access in prose of documentationREADME.md:20Low confidence
- Network access in prose of documentationREADME.md:21Low confidence
- Network access in prose of documentationREADME.md:22Low confidence
- Network access in prose of documentationREADME.md:23Low confidence
- Network access in code of documentationREADME.md:71Low confidence
- Network access in code of documentationREADME.md:72Low confidence
- Access to secrets in code of documentationREADME.md:93Low confidence
- Access to secrets in code of documentationREADME.md:94Low confidence
- Access to secrets in code of documentationREADME.md:130Low confidence
- Access to secrets in code of documentationREADME.md:131Low confidence
- Access to secrets in code of documentationREADME.md:223Low confidence
and 245 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.