Powering SmartScribe Pro — Now Available to Developers

The DOCX Engine That
Gets the Spec Right

A native C++ library for reading and writing DOCX files with correct ECMA-376 compliance. Call it from C, Python, C#, or any language with a C FFI. Free to develop. Pay when you deploy.

28API Functions
v1.1.0Current Version
C / Python / .NETLanguage Bindings
FreeTo Develop

Why Another DOCX Library?

Because virtually every existing library gets the spec wrong in ways that matter.

The Six-Layer Style Cascade

Most libraries ignore the correct cascade order: docDefaults → table → numbering → paragraph style chain → character style → direct formatting. SmartScribe.Docx implements all six layers correctly.

Toggle Property XOR Behavior

Bold and italic applied at the run level must XOR against the paragraph default, not simply override it. Getting this wrong produces documents that look different in Word than they should.

Four-Slot Font Resolution

DOCX specifies fonts per script slot — ASCII, East Asian, Complex Script, High ANSI — resolved through theme font references. Wrong font resolution is the source of most rendering differences between libraries and Word.

Everything You Need

A complete read/write API covering every document element that matters in production.

📄

Full Read / Write Pipeline

Open existing DOCX files, modify them, and save. Create new documents from scratch. Full round-trip fidelity.

🖊️

HTML Body Authoring

Write document body from HTML — paragraphs, headings, bold, italic, lists, hyperlinks, inline images. One function call, complete document.

📐

Precise Margin Control

All eight margin values including gutter, header/footer distance, and mirror margins for duplex printing. Twips or inches.

🔢

Headers & Footers

Default, even-page, and first-page variants. Template builder with {PAGE}, {NUMPAGES}, {TITLE}, {AUTHOR}, {CHAPTER} variables.

Pure C API

28 functions with pure C linkage. Call from C, C++, Python (ctypes), C# (P/Invoke), Rust (FFI), Java (JNI), or any language with a foreign function interface.

🔒

Offline & Air-Gapped

No network calls, no license server, no telemetry. Works on air-gapped machines, offline development, and locked-down enterprise environments.

Simple, Honest API

Three lines to open a document. Three more to set margins and save.

Python
import smartscribe_docx as ss

# Production: call init_licensed() once at startup
ss.init_licensed("SSDX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX")

# Open, modify, save
with ss.DocxDocument("manuscript.docx") as doc:
    doc.set_margins(top=1440, bottom=1440, left=1440, right=1440)
    doc.set_doc_property("title", "My Novel")

    ftr = ss.DocxDocument.build_hf_xml(
        is_header=False,
        template="Page {PAGE} of {NUMPAGES}",
        alignment="center")
    doc.set_footer_xml(ss.HF_DEFAULT, ftr)
    doc.save_as("output.docx")

# One-shot: HTML string directly to DOCX
ss.DocxDocument.write_html("report.docx",
    "<h1>Q3 Report</h1><p>Revenue grew <b>42%</b> YoY.</p>")
C#
using SmartScribe;

// Production init — call once before any DocxDocument
DocxDocument.InitLicensed("SSDX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX");

using var doc = new DocxDocument("manuscript.docx");

doc.SetMargins(new DocxMargins {
    Top=1440, Bottom=1440, Left=1440, Right=1440 });

doc.SetDocProperty("title", "My Novel");

var ftr = DocxDocument.BuildHfXml(
    isHeader: false,
    template: "Page {PAGE} of {NUMPAGES}",
    alignment: "center");
doc.SetFooterXml(HfType.Default, ftr);
doc.SaveAs("output.docx");
C
#include "SmartScribeDocx.h"

ssDocx_init_licensed("SSDX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX");

SsDocxHandle h = ssDocx_open("manuscript.docx");

ssDocx_set_margins(h, 1440, 1440, 1440, 1440, 720, 720, 0, 0);
ssDocx_set_doc_property(h, "title", "My Novel");

unsigned int sz = 0;
const unsigned char* ftr = ssDocx_build_hf_xml(
    0, "Page {PAGE} of {NUMPAGES}", "center", &sz);
ssDocx_set_footer_xml(h, SS_HF_DEFAULT, ftr, sz);

ssDocx_save_as(h, "output.docx");
ssDocx_close(h);

Download & Try It Free

No registration. No credit card. No time limit. The notice goes away when you license it.

ℹ️ The free download prints one line to stderr on init: [SmartScribe.Docx 1.1.0] Development License — not licensed for production deployment.
Your end users never see this. It only appears in developer log output.
⬇ Download SmartScribe.Docx SDK 1.1.0    Windows x64 • 24 MB

Includes DLL, C header, Python binding, .NET binding, examples, and three demo programs.

Straightforward Pricing

Develop for free. Pay when your users do.

Tier 0

Development

Free
Full API access. Development notice prints to stderr. No time limit.
  • Complete API — no feature restrictions
  • No registration required
  • No time limit
  • One-line stderr notice only
Download
Tier 1

Indie

Free + registration
For projects grossing under $100,000/year. Attribution required.
  • License key suppresses the notice
  • Annual free re-registration
  • Single application
  • "Built with SmartScribe.Docx" attribution
  • Binding agreement: <$100k gross/year
Register Free
Tier 3

Studio

$899 one-time
Up to 5 production applications.
  • Up to 5 applications
  • Up to 5 developer seats
  • No revenue cap
  • 1 year maintenance included
Buy — $899
Tier 4

OEM / Unlimited

$2,499 one-time
Unlimited applications. For ISVs and document processing companies.
  • Unlimited applications
  • Unlimited developer seats
  • Ship in products you sell
  • 1 year maintenance included
Buy — $2,499
Tier 5

Source License

$9,999 one-time
Full C++ source. One company, unlimited developers, right to modify.
  • Complete C++ source code
  • Right to modify and extend
  • One company, unlimited devs
  • 1 year maintenance included
  • Manual fulfillment
Buy — $9,999

All licenses are perpetual. Your version works forever. Maintenance renewal (updates) is 20% annually and optional.

Frequently Asked Questions

Will my end users ever see the development notice?
No. The notice prints to stderr. In a deployed Windows GUI application, stderr is invisible to the user. In a console application or web service, it goes to log files that only developers or administrators see. Your end users are completely insulated from anything related to licensing.
Does the library phone home or require internet access?
Never. License validation is entirely local — we compute an HMAC against the key bytes using a secret embedded in the DLL. No network socket is opened, no DNS lookup happens, no data leaves the machine. Works fully offline and in air-gapped enterprise environments.
What happens when maintenance expires?
Nothing breaks. The library continues to function normally on the version you licensed. The only change is that a one-line notice prints to stderr (again, invisible to your users). You stop receiving updates until you renew maintenance at 20% of the original price. Your license is perpetual — you keep what you paid for indefinitely.
Do I need Qt installed to use the DLL?
No. The download package includes all necessary Qt runtime files alongside the DLL. Unzip, add to your project, and it works. Your users don't need Qt installed.
How does the Indie license work exactly?
Register for free with your name, email, and project name. You receive a license key that suppresses the development notice. The registration is a binding legal agreement capping your use at projects grossing under $100,000 USD per year. You must include "Built with SmartScribe.Docx" in your About box or documentation. Re-register free each year to renew the key.
Can I use this in a commercial product I sell?
Yes, with the right tier. Single Application (Tier 2, $299) lets you ship one product. Studio (Tier 3, $899) covers up to five products. OEM/Unlimited (Tier 4, $2,499) covers unlimited products. All tiers allow unlimited deployment of your product to your customers.
Is the key the same across all my deployments?
Yes. You call ssDocx_init_licensed() with your key in your application code. Every copy of your application uses the same key. The key is tied to your license tier, not to individual machines or users.