Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
kreuzberg-dev avatar

Kreuzberg

  • 772 installs
  • 8.9k repo stars
  • Updated August 4, 2026
  • kreuzberg-dev/kreuzberg

kreuzberg is a Claude Code skill that helps developers add robust, extensible document parsing and semantic extraction to AI agents and automation workflows via Kreuzberg's plugin-based extraction pipeline.

About

kreuzberg is a Claude Code skill for the Kreuzberg document extraction library, focused on advanced customization and semantic processing for AI pipelines. The skill explains Kreuzberg's plugin system for registering custom post-processors, validators, and OCR backends that run inside the extraction pipeline with direct access to ExtractionResult objects. Post-processors enrich parsed output non-destructively—failures are logged without breaking extraction. Python examples show register_post_processor usage and pipeline integration patterns. Developers reach for kreuzberg when building RAG ingest, agent document tools, or automation that must parse heterogeneous files with custom enrichment steps. It targets pipeline extension and semantic extraction, not general web scraping or simple text file reads.

  • Plugin system with custom post-processors, validators, and OCR backends
  • Non-destructive post-processors that run at early, middle, or late stages
  • Direct access to extraction results for metadata enrichment and semantic processing
  • Graceful error handling where post-processor failures do not break the main extraction
  • Python-first SDK with register_post_processor and extract_file_sync APIs

Kreuzberg by the numbers

  • 772 all-time installs (skills.sh)
  • Ranked #1,356 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/kreuzberg-dev/kreuzberg --skill kreuzberg

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs772
repo stars8.9k
Security audit3 / 3 scanners passed
Last updatedAugust 4, 2026
Repositorykreuzberg-dev/kreuzberg

How do you extend document parsing pipelines for AI agents?

Add robust, extensible document parsing and semantic extraction capabilities to their AI agents and automation workflows.

Who is it for?

Python developers building agent ingest pipelines that need pluggable document parsing, OCR backends, and semantic extraction hooks.

Skip if: Teams needing only plain file reads without custom extraction plugins or semantic enrichment in an agent pipeline.

When should I use this skill?

The developer is integrating Kreuzberg document parsing, writing post-processors or validators, or configuring OCR backends in an extraction pipeline.

What you get

Custom Kreuzberg post-processors, validators, OCR backends, and enriched ExtractionResult outputs wired into agent automation workflows.

  • Custom post-processors
  • Validator plugins
  • OCR backend configuration

Files

SKILL.mdMarkdownGitHub ↗

Kreuzberg Document Extraction

Kreuzberg is a high-performance document intelligence library with a Rust core and native bindings for Python, Node.js/TypeScript, Ruby, Go, Java, C#, PHP, and Elixir. It extracts text, tables, metadata, and images from 91+ file formats including PDF, Office documents, images (with OCR), HTML, email, archives, and academic formats.

Use this skill when writing code that:

  • Extracts text or metadata from documents
  • Performs OCR on scanned documents or images
  • Batch-processes multiple files
  • Configures extraction options (output format, chunking, OCR, language detection)
  • Implements custom plugins (post-processors, validators, OCR backends)

Installation

Python

pip install kreuzberg
# Optional OCR backends:
pip install kreuzberg[easyocr]    # EasyOCR

Node.js

npm install @kreuzberg/node

Rust

# Cargo.toml
[dependencies]
kreuzberg = { version = "4", features = ["tokio-runtime"] }
# features: tokio-runtime (required for sync + batch), pdf, ocr, chunking,
#           embeddings, language-detection, keywords-yake, keywords-rake

CLI

# Download from GitHub releases, or:
cargo install kreuzberg-cli

Quick Start

Python (Async)

from kreuzberg import extract_file

result = await extract_file("document.pdf")
print(result.content)       # extracted text
print(result.metadata)      # document metadata
print(result.tables)        # extracted tables

Python (Sync)

from kreuzberg import extract_file_sync

result = extract_file_sync("document.pdf")
print(result.content)

Node.js

import { extractFile } from "@kreuzberg/node";

const result = await extractFile("document.pdf");
console.log(result.content);
console.log(result.metadata);
console.log(result.tables);

Node.js (Sync)

import { extractFileSync } from "@kreuzberg/node";

const result = extractFileSync("document.pdf");

Rust (Async)

use kreuzberg::{extract_file, ExtractionConfig};

#[tokio::main]
async fn main() -> kreuzberg::Result<()> {
    let config = ExtractionConfig::default();
    let result = extract_file("document.pdf", None, &config).await?;
    println!("{}", result.content);
    Ok(())
}

Rust (Sync) — requires tokio-runtime feature

use kreuzberg::{extract_file_sync, ExtractionConfig};

fn main() -> kreuzberg::Result<()> {
    let config = ExtractionConfig::default();
    let result = extract_file_sync("document.pdf", None, &config)?;
    println!("{}", result.content);
    Ok(())
}

CLI

kreuzberg extract document.pdf
kreuzberg extract document.pdf --format json
kreuzberg extract document.pdf --output-format markdown

Configuration

All languages use the same configuration structure with language-appropriate naming conventions.

Python (snake_case)

from kreuzberg import (
    ExtractionConfig, OcrConfig, TesseractConfig,
    PdfConfig, ChunkingConfig,
)

config = ExtractionConfig(
    ocr=OcrConfig(
        backend="tesseract",
        language="eng",
        tesseract_config=TesseractConfig(psm=6, enable_table_detection=True),
    ),
    pdf_options=PdfConfig(passwords=["secret123"]),
    chunking=ChunkingConfig(max_chars=1000, max_overlap=200),
    output_format="markdown",
)

result = await extract_file("document.pdf", config=config)

Node.js (camelCase)

import { extractFile, type ExtractionConfig } from "@kreuzberg/node";

const config: ExtractionConfig = {
  ocr: { backend: "tesseract", language: "eng" },
  pdfOptions: { passwords: ["secret123"] },
  chunking: { maxChars: 1000, maxOverlap: 200 },
  outputFormat: "markdown",
};

const result = await extractFile("document.pdf", null, config);

Rust (snake_case)

use kreuzberg::{ExtractionConfig, OcrConfig, ChunkingConfig, OutputFormat};

let config = ExtractionConfig {
    ocr: Some(OcrConfig {
        backend: "tesseract".into(),
        language: "eng".into(),
        ..Default::default()
    }),
    chunking: Some(ChunkingConfig {
        max_characters: 1000,
        overlap: 200,
        ..Default::default()
    }),
    output_format: OutputFormat::Markdown,
    ..Default::default()
};

let result = extract_file("document.pdf", None, &config).await?;

Config File (TOML)

output_format = "markdown"

[ocr]
backend = "tesseract"
language = "eng"

[chunking]
max_chars = 1000
max_overlap = 200

[pdf_options]
passwords = ["secret123"]
# CLI: auto-discovers kreuzberg.toml in current/parent directories
kreuzberg extract doc.pdf
# or explicit:
kreuzberg extract doc.pdf --config kreuzberg.toml
kreuzberg extract doc.pdf --config-json '{"ocr":{"backend":"tesseract","language":"deu"}}'

Batch Processing

Python

from kreuzberg import batch_extract_files, batch_extract_files_sync

# Async
results = await batch_extract_files(["doc1.pdf", "doc2.docx", "doc3.xlsx"])

# Sync
results = batch_extract_files_sync(["doc1.pdf", "doc2.docx"])

for result in results:
    print(f"{len(result.content)} chars extracted")

Node.js

import { batchExtractFiles } from "@kreuzberg/node";

const results = await batchExtractFiles(["doc1.pdf", "doc2.docx"]);

Rust — requires tokio-runtime feature

use kreuzberg::{batch_extract_file, ExtractionConfig};

let config = ExtractionConfig::default();
let paths = vec!["doc1.pdf", "doc2.docx"];
let results = batch_extract_file(paths, &config).await?;

CLI

kreuzberg batch *.pdf --format json
kreuzberg batch docs/*.docx --output-format markdown

OCR

OCR runs automatically for images and scanned PDFs. Tesseract is the default backend (native binding, no external install required).

Backends

  • Tesseract (default): Built-in native binding. All Tesseract languages supported.
  • EasyOCR (Python only): pip install kreuzberg[easyocr]. Pass easyocr_kwargs={"gpu": True}.
  • PaddleOCR (Python only): Bundled since 4.8.5, no extra install needed. Pass paddleocr_kwargs={"use_angle_cls": True}.
  • Guten (Node.js only): Built-in OCR backend via GutenOcrBackend.

Language Codes

config = ExtractionConfig(ocr=OcrConfig(language="eng"))       # English
config = ExtractionConfig(ocr=OcrConfig(language="eng+deu"))   # Multiple
config = ExtractionConfig(ocr=OcrConfig(language="all"))       # All installed

Force OCR

config = ExtractionConfig(force_ocr=True)  # OCR even if text is extractable

ExtractionResult Fields

FieldPythonNode.jsRustDescription
Text contentresult.contentresult.contentresult.contentExtracted text (str/String)
MIME typeresult.mime_typeresult.mimeTyperesult.mime_typeInput document MIME type
Metadataresult.metadataresult.metadataresult.metadataDocument metadata (dict/object/HashMap)
Tablesresult.tablesresult.tablesresult.tablesExtracted tables with cells + markdown
Languagesresult.detected_languagesresult.detectedLanguagesresult.detected_languagesDetected languages (if enabled)
Chunksresult.chunksresult.chunksresult.chunksText chunks (if chunking enabled)
Imagesresult.imagesresult.imagesresult.imagesExtracted images (if enabled)
Elementsresult.elementsresult.elementsresult.elementsSemantic elements (if element_based format)
Pagesresult.pagesresult.pagesresult.pagesPer-page content (if page extraction enabled)
Keywordsresult.keywordsresult.keywordsresult.keywordsExtracted keywords (if enabled)

Error Handling

Python

from kreuzberg import (
    extract_file_sync, KreuzbergError, ParsingError,
    OCRError, ValidationError, MissingDependencyError,
)

try:
    result = extract_file_sync("file.pdf")
except ParsingError as e:
    print(f"Failed to parse: {e}")
except OCRError as e:
    print(f"OCR failed: {e}")
except ValidationError as e:
    print(f"Invalid input: {e}")
except MissingDependencyError as e:
    print(f"Missing dependency: {e}")
except KreuzbergError as e:
    print(f"Extraction failed: {e}")

Node.js

import {
  extractFile,
  KreuzbergError,
  ParsingError,
  OcrError,
  ValidationError,
  MissingDependencyError,
} from "@kreuzberg/node";

try {
  const result = await extractFile("file.pdf");
} catch (e) {
  if (e instanceof ParsingError) {
    /* ... */
  } else if (e instanceof OcrError) {
    /* ... */
  } else if (e instanceof ValidationError) {
    /* ... */
  } else if (e instanceof KreuzbergError) {
    /* ... */
  }
}

Rust

use kreuzberg::{extract_file, ExtractionConfig, KreuzbergError};

let config = ExtractionConfig::default();
match extract_file("file.pdf", None, &config).await {
    Ok(result) => println!("{}", result.content),
    Err(KreuzbergError::Parsing(msg)) => eprintln!("Parse error: {msg}"),
    Err(KreuzbergError::Ocr(msg)) => eprintln!("OCR error: {msg}"),
    Err(e) => eprintln!("Error: {e}"),
}

Common Pitfalls

1. Python ChunkingConfig fields: Use max_chars and max_overlap, NOT max_characters or overlap. 2. Rust extract_file signature: Third argument is &ExtractionConfig (a reference), not Option. Use &ExtractionConfig::default() for defaults. 3. Rust feature gates: extract_file_sync, batch_extract_file, and batch_extract_file_sync all require features = ["tokio-runtime"] in Cargo.toml. 4. Rust async context: extract_file is async. Use #[tokio::main] or call from an async context. 5. CLI --format vs --output-format: --format controls CLI output (text/json). --output-format controls content format (plain/markdown/djot/html). 6. Node.js extractFile signature: extractFile(path, mimeType?, config?) — mimeType is the second arg (pass null to skip). 7. Python detect_mime_type: The function for detecting from bytes is detect_mime_type(data). For paths use detect_mime_type_from_path(path). 8. Config file field names: Use snake_case in TOML/YAML/JSON config files (e.g., max_chars, max_overlap, pdf_options).

Supported Formats (Summary)

CategoryExtensions
PDF.pdf
Word.docx, .odt
Spreadsheets.xlsx, .xlsm, .xlsb, .xls, .xla, .xlam, .xltm, .ods
Presentations.pptx, .ppt, .ppsx
eBooks.epub, .fb2
Images.png, .jpg, .jpeg, .gif, .webp, .bmp, .tiff, .tif, .jp2, .jpx, .jpm, .mj2, .jbig2, .jb2, .pnm, .pbm, .pgm, .ppm, .svg
Markup.html, .htm, .xhtml, .xml
Data.json, .yaml, .yml, .toml, .csv, .tsv
Text.txt, .md, .markdown, .djot, .rst, .org, .rtf
Email.eml, .msg
Archives.zip, .tar, .tgz, .gz, .7z
Academic.bib, .biblatex, .ris, .nbib, .enw, .csl, .tex, .latex, .typ, .jats, .ipynb, .docbook, .opml, .pod, .mdoc, .troff

See references/supported-formats.md for the complete format reference with MIME types.

Additional Resources

Detailed reference files for specific topics:

  • [Python API Reference](references/python-api.md) — All functions, config classes, plugin protocols, exact signatures
  • [Node.js API Reference](references/nodejs-api.md) — All functions, TypeScript interfaces, worker pool APIs
  • [Rust API Reference](references/rust-api.md) — All functions with feature gates, structs, Cargo.toml examples
  • [CLI Reference](references/cli-reference.md) — All commands, flags, config precedence, exit codes
  • [Configuration Reference](references/configuration.md) — TOML/YAML/JSON formats, auto-discovery, env vars, full schema
  • [Supported Formats](references/supported-formats.md) — All 85+ formats with file extensions and MIME types
  • [Advanced Features](references/advanced-features.md) — Plugins, embeddings, MCP server, API server, security limits
  • [Other Language Bindings](references/other-bindings.md) — Go, Ruby, Java, C#, PHP, Elixir, WASM, Docker

Full documentation: <https://docs.kreuzberg.dev> GitHub: <https://github.com/kreuzberg-dev/kreuzberg>

Related skills

How it compares

Choose kreuzberg over generic PDF-reading skills when you need a pluggable extraction pipeline with custom post-processors and OCR backends, not one-off text extraction.

FAQ

What does the kreuzberg skill cover?

The kreuzberg skill documents Kreuzberg advanced features: a plugin system for custom post-processors, validators, and OCR backends inside document extraction pipelines. It includes Python integration patterns for AI agents and automation workflows.

How do Kreuzberg post-processors behave on failure?

Kreuzberg post-processors run non-destructively after document parsing. If a post-processor fails, the extraction still succeeds and errors are logged, preserving base ExtractionResult output for downstream agent steps.

Is Kreuzberg safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

AI & Agent Buildingagentsautomation

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.