SoulDoc complements TenTags; it does not replace it.
TenTags is a compact declarative language and export engine for tables.
SoulDoc is a document layout engine that handles free positioning, geometry, pagination, and complete documents.
The souldoc.tentags module is independent from the DOCX renderer. It converts TenTags input into a neutral table model and semantic HTML. TenTags <cm> and <rm> markers become standard colspan and rowspan attributes, after which each renderer can create its native merged cells.
The parser supports the cell tags currently used by TenTags, including <b>, <i>, <u>, <s>, <color>, <bg>, <fs>, <left>, <center>, <right>, <cm>, <rm>, <url>, <img>, <mark>, <value>, and <br>. SoulDoc neither imports nor modifies the external tentags package.
Hi Product Hunt — I’m Zhandos, the maker of SoulDoc.
I built SoulDoc after repeatedly running into the same problem: a Python application needs to generate several document formats, but every renderer wants a different data model and a different set of layout rules.
SoulDoc adds one format-independent document model between application data and the final files. You define content, tables, styles, geometry, and pagination once, then render it to:
• printable HTML and PDF
• native, editable SVG
• editable DOCX
• visual XLSX
• versioned JSON
The core has no runtime dependencies, and format-specific renderers are optional. Version 1.0.3 is available now on PyPI under the Apache-2.0 license.
I’d especially value feedback from people building reporting tools, document editors, invoicing systems, or export-heavy Python applications:
I’ll be here throughout the launch and will answer technical questions directly. Thanks for taking a look.
Pazi
Congrats on shipping this! One document model exporting to HTML, PDF, DOCX, XLSX and more is a really elegant approach — nice work 📄
@zvonimir_sabljic1 Thank you! I really appreciate it.
The main goal behind SoulDoc is exactly that: define a document only once, compute its layout once, and then render the same document to multiple output formats while preserving geometry and editability whenever possible.
Thanks for your support!