Likhit is
Jawafdehi's public
MarkItDown
plugin for Nepal-specific document support. It adds Nepali PDF
repair, layout-aware Markdown assembly, optional OCR for
image-dominant pages, and legacy .doc support. For PDFs
it evaluates several extraction paths and returns the best result
rather than trusting one fixed pipeline.
pip install likhit
Then enable plugins when you convert:
MarkItDown(enable_plugins=True), or from the CLI
markitdown --use-plugins document.pdf.
Plenty of published records are page images with no usable text layer
— nothing but a vision model can read them. Likhit adds an OCR
candidate when it finds such a page and OCR is configured.
It talks to any endpoint that speaks the OpenAI chat API, so the same
three variables cover a model on your own machine, Bedrock behind a
gateway, or a hosted API.
OPENAI_BASE_URL points at the endpoint,
OPENAI_API_KEY authenticates to it, and
MARKITDOWN_OCR_MODEL names the model. Leave them unset
and Likhit still converts — it just records that a page needed OCR
and carries on with the text it could extract.
No API cost
A model on your own machine
Ollama, llama.cpp or vLLM — all three serve an OpenAI-compatible
endpoint, and no page image leaves the machine.
ollama pull qwen2.5vl:7b
# Ollama ignores the key; the client refuses to start without one
export OPENAI_API_KEY=ollama
export OPENAI_BASE_URL=http://127.0.0.1:11434/v1
export MARKITDOWN_OCR_MODEL=qwen2.5vl:7b
likhit-save scanned-notice.pdf --out notice.md
AWS
Bedrock, through a gateway
Bedrock does not speak the OpenAI API, so run a translating proxy
in front of it. The proxy picks up your AWS credentials the usual
way — AWS_PROFILE, environment variables or an
instance role — and Likhit only ever sees an OpenAI endpoint.
pip install 'litellm[proxy]'
litellm --model bedrock/anthropic.claude-sonnet-5
# whatever you configured the proxy to accept
export OPENAI_API_KEY=local-proxy-key
export OPENAI_BASE_URL=http://127.0.0.1:4000/v1
export MARKITDOWN_OCR_MODEL=bedrock/anthropic.claude-sonnet-5
likhit-save scanned-notice.pdf --out notice.md
Any vision-capable model your account has enabled will do — swap
the model id for the one you have access to.
Hosted
A hosted API
Point at any OpenAI-compatible provider. For Gemini, set the
Google key alone and Likhit selects Google's OpenAI-compatible
base URL for you.
export OPENAI_API_KEY=your-api-key
export OPENAI_BASE_URL=https://api.example.com/v1
export MARKITDOWN_OCR_MODEL=your-vision-model
# or Gemini, where the base URL is filled in for you
export GEMINI_API_KEY=your-gemini-key
export GEMINI_MODEL=gemini-2.5-flash
Benchmark
Every result below comes from a real, published government document —
no synthetic fixtures. Each one is converted three ways, recorded on a
machine where all three OCR backends work, and replayed here; the
banner below says when. Pick a document to read what Likhit extracted,
compare the configurations, and check the assertions that gate the
build.