This release rolls up dozens of small patches and bug fixes. For typical inputs and use cases, we expect outputs and behavior to remain largely unchanged from version 0.1.7.
The markitdown-ocr plugin has also been refactored to simplify future maintenance.
What's Changed
- Mitigate UnicodeDecodeError due to wrong ASCII charset guess for long files by Fabio Catalano (@fcatalan92) in #2360
- fix: support extended content-disposition filenames by Rāna(Bass Ver.) (@cat0825) in #2045
- fix: fall back to plain text when RSS item content triggers RecursionError by Jeremy Schoemaker (@shoemoney) in #2333
- fix(cli): allow Content Understanding conversion from stdin by Tyyyy (@uczltw6) in #2318
- fix: correct \underleftarrow macro and map math italic h in equation conversion by Guillermo Dols (@gdols) in #2293
- feat(cli): support MARKITDOWN_CU_ENDPOINT / MARKITDOWN_DOCINTEL_ENDPOINT by Sinan Olsson-Pasic (@seenws) in #2358
- fix(csv): strip the UTF-8 BOM and skip blank rows before building the table by Ruiming Zhao (@uuzzrm) in #2303
- Preserve strikethrough from <strike> and CSS line-through by Gyanu Mayank (@gyanu2507) in #2342
- Fix percent-encoded Windows drive paths in file URIs by Zhewen Tan (@tandede) in #2315
- fix: escape pipes and newlines in CSV values by Asjad Abbas (@asjad3) in #2266
- fix(epub): safely extract metadata text without crashing on None nodeValue or nested elements by Henry Su (@hsusul) in #2247
- fix: handle math run with no text child in OMML->LaTeX conversion by S1MS4 in #2189
- fix: IpynbConverter.accepts() catches UnicodeDecodeError on non-decodable content (fixes #1894) by hanhan761 in #1929
- fix(docx): ignore malformed styles missing type by S M (@gingerninja85) in #2190
- Preserve percent-encoded octets in href paths by Sonai Biswas (@Sonai124) in #2173
- fix: remove extra closing brace from caron and ring-above accent templates by Andrew Avery (@AndrewAvery7) in #2279
- fix: preserve strikethrough semantics for <strike>, line-through CSS, and w:dstrike by MOHAMMED WASIM KHAN (@wasim-builds) in #2356
- fix: buffer CLI stdin before format detection on Windows by Mo Hui (@mohui666) in #2351
- fix(rss): preserve Atom XHTML content by will wang (@weivwang) in #2297
- fix: initialize md_text in _parse_rss_type to prevent UnboundLocalError by Sai Medavarapu (@smedavarapu1) in #2164
- fix: ZipConverter renders '(unknown)' instead of literal 'None' when stream has no source info by JSap0914 in #2134
- fix: truncate uppercase data image URIs by Lucas Ma (@pony-maggie) in #2122
- fix(doc-intel): default api_version to None in DocumentIntelligenceConverter by Nefelibata (@MeiSiristhebest) in #2267
- fix(outlook): read .msg string properties saved in the non-Unicode format by Guillermo Dols (@gdols) in #2295
- fix: handle URI schemes case-insensitively by Lucas Ma (@pony-maggie) in #2121
- fix: normalize data URI parameter case by Lucas Ma (@pony-maggie) in #2120
- fix(xlsx): tolerate legacy showZeroes sheet views by Yufeng He (@he-yufeng) in #2064
- docs: use canonical markdown result property by Sheroy Cooper (@CooperSheroy) in #2259
- fix(youtube): handle missing title metadata without raising AssertionError by Henry Su (@hsusul) in #2238
- fix(ipynb): preserve leading # in notebook heading titles by Cpthimself (@Alphaxiaoteng) in #2371
- fix(docx): preserve underlined text by Yufeng He (@he-yufeng) in #2017
- fix(pptx): ignore empty llm captions by Lubrsy (@Lubrsy706) in #1886
- fix: PptxConverter tolerates None shape.text and notes text by Alvin Tang (@alvinttang) in #2059
- fix(pptx): prevent crash in PptxConverter when chart title lacks a text frame by aoright (@aoright) in #2194
- fix: catch OSError when exiftool binary is missing (#1960) by 王艺霖 (@doitgo) in #2082
- Fix exiftool JSON decoding to use UTF-8 by Vedant (@Vedant43hh) in #2067
- fix: WikipediaConverter renders hash None heading when page has no title by hanhan761 in #1990
- fix: guard against missing oMath element in DOCX math converter (#1979) by hanhan761 in #1995
- fix: handle DOCX files with inconsistent ZIP filename casing (#1812) by liyrds (@lyydsheep) in #2016
- Support short YouTube URLs by Mukunda Rao Katta (@MukundaKatta) in #1882
- fix: suppress pydub RuntimeWarning when ffmpeg is missing (fixes #1685) by hanhan761 in #1985
- chore: remove unused mammoth import from PlainTextConverter (#1951) by hanhan761 in #1953
- fix(rss): treat Atom text content and summary as plain text by Lazizbek Ergashev (@lazerg) in #2374
- fix: ImageConverter gracefully handles LLM API failures (fixes #1942) by hanhan761 in #1948
- fix(docx): handle unknown math functions in OMML converter without crashing by Nefelibata (@MeiSiristhebest) in #2268
- Update README to help scope PRs. by afourney in #2376
- Be sure to run the proper Python version. by afourney in #2379
- fix(pptx): chart_title.text_frame is never None — use has_text_frame instead by kapil971390 in #2385
- Preserve all CSV columns by matching the widest row by afourney in #2430
- Fix CSV parsing for CR-only line endings by Kim Do Yeon (@tkv00) in #2412
- fix(rss): support namespace-prefixed Atom feeds by Xing Zheng (@Elysium-Seeker) in #2429
- fix(rss): drop layout whitespace from feed and entry titles by kevin (@kevin9327) in #2428
- fix(pptx): do not emit a Notes heading for a slide with no notes by kevin (@kevin9327) in #2427
- fix(ipynb): strip the UTF-8 BOM so a notebook is not emitted as raw JSON by kevin (@kevin9327) in #2425
- fix(rss): preserve complete feed content and resolve relative link by afourney in #2432
- fix(epub): forward conversion options to the HTML converter by kevin (@kevin9327) in #2426
- Update Docker images to Debian trixie (Python 3.13-slim-trixie) by Erwin Kersten (@erwinkersten) in #2421
- Fix Zip converter forwarding kwargs to nested conversions by SpongeBob (@As9xm) in #2409
- Do not convert an undecodable file to the word "None" by kevin (@kevin9327) in #2418
- Fix PPTX shape sorting treating top-zero as missing by SpongeBob (@As9xm) in #2408
- fix(epub): resolve percent-encoded manifest hrefs to ZIP entries by Sushant Lokhande (@sushantlokhande14) in #2413
- Fix --list-plugins help text to reference correct --use-plugins flag by freetg71527152-ui in #2381
- fix: prefer data-src over placeholder data URI in img src by Machen John (@macjayz) in #2417
- fix(zip): preserve content of entries with duplicate filenames by liyrds (@lyydsheep) in #2434
- fix(pptx): do not emit a heading for a slide with an empty title by kevin (@kevin9327) in #2442
- fix(mcp): migrate to MCP SDK 2.x so 2026-07-28 clients can connect by Çağdaş Yürekli (@cagdasyurekli) in #2363
- Reject UNC and Windows device paths (similar to how netlocks are alre… by afourney in #2452
- Expand test matrix to include windows-latest by afourney in #2453
- Added file paths tests. by afourney in #2454
- Add arm to matrix. Simplify matrix. by afourney in #2459
- Workaround for ARM CI tests. by afourney in #2460
- Fix ANSI Outlook MSG decoding for Japanese code pages and padded strings by afourney in #2462
- Trim CSV blank runs without repeatedly shifting the row list by dickbown (@ROTl24) in #2450
- Improve efficiency of escaping pipes in CSVs by afourney in #2464
- fix: avoid splitting UTF-8 characters during charset detection by afourney in #2466
- fix(docx): preserve namespaces when repairing stylesheets by afourney in #2467
- fix(youtube): fall back to HTML when no video content is extracted by afourney in #2469
- Throw an error when llm client fails with image converter. by afourney in #2476
- Preserve whitespace underlines by afourney in #2477
- Refactor Office OCR converters to reuse core conversion pipelines by afourney in #2506
- fix: bump youtube-transcript-api to >=1.2.3 for Python 3.14 support by Nithin Jambula (@nithin434) in #2407
New Contributors
- Dan Fiedler (@danfiedler-msft) made their first contribution in #2316
- Fabio Catalano (@fcatalan92) made their first contribution in #2360
- Rāna(Bass Ver.) (@cat0825) made their first contribution in #2045
- Jeremy Schoemaker (@shoemoney) made their first contribution in #2333
- Tyyyy (@uczltw6) made their first contribution in #2318
- Guillermo Dols (@gdols) made their first contribution in #2293
- Sinan Olsson-Pasic (@seenws) made their first contribution in #2358
- Ruiming Zhao (@uuzzrm) made their first contribution in #2303
- Gyanu Mayank (@gyanu2507) made their first contribution in #2342
- Zhewen Tan (@tandede) made their first contribution in #2315
- Asjad Abbas (@asjad3) made their first contribution in #2266
- Henry Su (@hsusul) made their first contribution in #2247
- S1MS4 made their first contribution in #2189
- hanhan761 made their first contribution in #1929
- S M (@gingerninja85) made their first contribution in #2190
- Sonai Biswas (@Sonai124) made their first contribution in #2173
- Andrew Avery (@AndrewAvery7) made their first contribution in #2279
- MOHAMMED WASIM KHAN (@wasim-builds) made their first contribution in #2356
- Mo Hui (@mohui666) made their first contribution in #2351
- will wang (@weivwang) made their first contribution in #2297
- Sai Medavarapu (@smedavarapu1) made their first contribution in #2164
- JSap0914 made their first contribution in #2134
- Lucas Ma (@pony-maggie) made their first contribution in #2122
- Nefelibata (@MeiSiristhebest) made their first contribution in #2267
- Yufeng He (@he-yufeng) made their first contribution in #2064
- Sheroy Cooper (@CooperSheroy) made their first contribution in #2259
- Cpthimself (@Alphaxiaoteng) made their first contribution in #2371
- Lubrsy (@Lubrsy706) made their first contribution in #1886
- Alvin Tang (@alvinttang) made their first contribution in #2059
- aoright (@aoright) made their first contribution in #2194
- 王艺霖 (@doitgo) made their first contribution in #2082
- Vedant (@Vedant43hh) made their first contribution in #2067
- liyrds (@lyydsheep) made their first contribution in #2016
- Mukunda Rao Katta (@MukundaKatta) made their first contribution in #1882
- Lazizbek Ergashev (@lazerg) made their first contribution in #2374
- kapil971390 made their first contribution in #2385
- Kim Do Yeon (@tkv00) made their first contribution in #2412
- Xing Zheng (@Elysium-Seeker) made their first contribution in #2429
- kevin (@kevin9327) made their first contribution in #2428
- Erwin Kersten (@erwinkersten) made their first contribution in #2421
- SpongeBob (@As9xm) made their first contribution in #2409
- Sushant Lokhande (@sushantlokhande14) made their first contribution in #2413
- freetg71527152-ui made their first contribution in #2381
- Machen John (@macjayz) made their first contribution in #2417
- Çağdaş Yürekli (@cagdasyurekli) made their first contribution in #2363
- dickbown (@ROTl24) made their first contribution in #2450
- Nithin Jambula (@nithin434) made their first contribution in #2407
Full Changelog: v0.1.7...v0.1.8