OmniMark
OmniMark is the streaming, rule-based text- and markup-processing language that Sam Wilmott designed at Exoterica Corporation in Ottawa for turning SGML (and later XML) documents into other things: a program is a set of find, element and translate rules that fire as data flows past, with an English-like pattern language in place of regular expressions and an element stack maintained by the built-in parser. Dated by its copyright notices to 1988 and sold commercially ever since - by Exoterica, by OmniMark Technologies (which gave version 5 away free in 1999 to challenge Perl), and since April 2001 by Stilo - it is a mainstay of the publishing industry's conversion pipelines and reached version 13 in May 2026
Created by Sam Wilmott (language design and specification) at Exoterica Corporation, Ottawa, with John McFadden (president of Exoterica and later of OmniMark Technologies) sharing the product concept; the 1997 Version 3 Programmer's Guide credits Norbert Winklareth with project management and Roy Amodeo, Omar Essa, Klaus Harbo, Habib Khalfallah, Eric Promislow and Winklareth as its developers. Wilmott, who had led typesetting-system development for the Canadian Government Printing Office in the 1970s and implemented one of the first SGML parsers, based OmniMark on his earlier HUGO text-processing language
OmniMark is a programming language for moving text from one shape into another, built around the idea that a document is a stream of events rather than a data structure in memory. An OmniMark program is a collection of rules. find rules match patterns in a stream of characters; element rules fire when the built-in SGML or XML parser encounters an element, with the parser keeping an element stack that the rule can interrogate (parent is "body", attribute id); translate rules act on text on its way into the parser. Unmatched input passes through to the output untouched, which makes a one-rule program a useful filter and a thousand-rule program a publishing system. Designed by Sam Wilmott at Exoterica Corporation in Ottawa, and dated by its copyright notices to 1988 - when Exoterica was documenting an SGML toolkit called XGML and a processor called XTRAN - it was one of the first languages written specifically for ISO 8879 SGML, and for the decade before XSLT existed it was the way large publishers, standards bodies and defence contractors converted legacy documents into SGML and SGML into print, CD-ROM and HTML.
It has never been free for long. Exoterica became OmniMark Technologies Corporation in the mid-1990s; in May 1999 the company gave version 5 away (“It costs a heck of a lot less than Perl!”) in a bid to become a general web-programming language, then withdrew the offer; and in April 2001 the company was bought by the UK’s Stilo, whose Ottawa subsidiary still sells it. What began, in Stilo’s own words, “as a very simple rule-based SGML scripting language” grew through versions 5 to 8 into a general-purpose language with modules, records, catch and throw, coroutine-style stream functions, database and web-service libraries and an Eclipse IDE, and it is still being released - version 13 shipped in May 2026 with Red Hat Enterprise Linux 10 and Ubuntu 24.04 support. Wilmott’s own verdict, at Balisage 2019, was that “OmniMark’s basic design and most useful features date from 30 years ago” and that its obscurity next to XSLT “is as much as anything else because of the high cost of acquiring it.” The language the encyclopedia lists as dormant is better described as a maintained proprietary product with a small, loyal, mostly publishing-industry user base.
History and origins
Sam Wilmott, HUGO and Exoterica (1970s-1988)
Sam Wilmott “designed his first programming language in the winter of 1967-1968 and was using early non-standardized markup languages in the late 1960’s.” In the 1970s he led the development of typesetting and text-formatting systems for the Canadian Government Printing Office, where he designed and helped implement HUGO, “a text processing and electronic publishing language”; in the 1980s he did similar work for a large real-estate company, and along the way he implemented what he describes as “one of the first SGML parsers (which was also the first pull-model markup parser).” OmniMark, he wrote in 2019, has “syntax, processing model and text processing capabilities” that “are based on the HUGO language” - which is why, by then, its style struck him as “more like 40 years old” than 30.
The commercial vehicle was Exoterica Corporation of Ottawa, whose president was John McFadden. The company’s earliest visible product is an SGML toolkit: the 1988 paper “SGML-based markup for literary texts: Two problems and some solutions” in Computers and the Humanities, co-authored by McFadden with David Barnard, Ron Hayter, Maria Karababa and George Logan, cites “Software Exoterica Corporation. XGML Application Developer’s Manual… 1988.” Wikipedia, citing page vii of Brian Travis’s 1997 book, records that OmniMark “was originally created in the 1980s by Exoterica… as a SGML processing program called XTRAN,” later renamed. That is why every OmniMark manual from the 1997 Version 3 guide to the 2026 Version 13 documentation opens its copyright at 1988.
The first OmniMark (c. 1989-1993)
When exactly XTRAN became OmniMark is not documented in public sources. OmniMark Technologies’ 1999 press release said the language “was first introduced 10 years ago,” Wilmott’s biography places his origination of it “in the early 1990’s,” and his 2012 Balisage paper describes the SGML parser at its core as “in use for over twenty years.” The machine it was built on tells its own story: “when OmniMark was first designed and implemented, the largest machine in the office was a 2 megabyte memory desktop Macintosh.” A streaming design that never holds the whole document was a necessity before it was a philosophy.
By 1993 OmniMark was an established SGML tool. The Kuopio technical report on SGML software lists it from Exoterica Corp. at 1545 Carling Avenue, Ottawa, with a French office at Issy-les-Moulineaux, as “a programming language specialized in text processing, including SGML texts” - “data/event driven,” recognising elements by their parent-child context, with its own SGML parser and versions for MS-DOS, Windows, Unix, Macintosh, OS/2, DEC VMS and IBM CMS/MVS. When Electronic Book Technologies announced the Rainbow DTD at SGML ‘93 in Boston on 8 December 1993, the vendors it lined up in support were ArborText, SoftQuad and “John McFadden, President of Exoterica, which develops and markets OmniMark, a specialized SGML text-manipulation language.” The same year, according to Michael Popham’s report on SGML ‘93, Exoterica released its Compleat SGML CD-ROM of SGML reference material, with a conformance-suite CD-ROM promised for 1994.
The conversion engine of the SGML decade (1993-1998)
OmniMark’s territory was conversion: “up-translation” from word-processor and typesetting files into valid SGML, “down-translation” from SGML into print, CD-ROM and, from 1994, HTML, and “cross-translation” between formats. François Chahuneau’s 1994 survey of up-translation approaches treats OmniMark’s explicit pattern matching as one of the main techniques of the field. The best-documented deployment is OCLC’s STEPS system for the ACM’s journals, where OmniMark programs turned RTF exported from authors’ word processors into SGML conforming to ACM’s DTD; “ACM specified use of OMNIMARK where applicable.”
The company renamed itself OmniMark Technologies Corporation around 1995-96 - the Cover Pages database lists it as “formerly Exoterica Corporation,” and it reportedly appears under the new name in the February 1996 Branham 200 ranking of Canadian software companies. Its Version 3 Programmer’s Guide (release 2, 11 April 1997) is the earliest documentation still online, and its credits fix the authorship: “Product Concept: John McFadden and Sam Wilmott. Language Design and Specification: Sam Wilmott.” Version 3 introduced the => operator for binding pattern variables, replacing an overloaded =. Two books appeared - Travis’s OmniMark at Work: Getting Started (1997) and Norman Smith’s Practical Guide to SGML/XML Filters (1998).
Free OmniMark and the web (1999-2000)
XML arrived in 1998, and with it XSLT and a flood of free tools. OmniMark Technologies responded on 17 May 1999, at its Developers Conference in New Orleans, by making OmniMark 5 free. “A high level language, OmniMark is a clear alternative to Perl for developing server-based web or network applications and CGI scripts without having to make the leap to Java,” the press release said; McFadden told the mailing list that “free means free” - the interpreter (renamed OmniMark C/VM), the byte-code virtual machine and a Home and School IDE cost nothing, while the Windows Developer IDE (US$995) and the OmniMark C byte-code compiler for Unix (US$2,995, still bound to a machine by FlexLM) were the company’s only remaining revenue. “OmniMark 5 is mind bending. We hope you enjoy it. It costs a heck of a lot less than Perl!”
Version 5 was a substantial language: catch and throw, nested pattern matching on #current-input, pattern-matching functions, a #! directive for CGI scripts, and database, CGI and OMX component libraries; 5.2 added UTF-8 and case-sensitive XML parsing and HTML 4.0 support, 5.3 removed the type heralds and added integer, int32 and BCD types and an LDAP library, and 5.4 added parsing of well-formed XML without a DTD. Mark Baker’s Internet Programming with OmniMark (Kluwer, 31 October 2000) - hit counters, form handlers, “XML middleware” - was written for this audience. The free period was short: Rosetta Code notes that “for a brief period, in 1999-2000, OmniMark was available free of charge (versions 4 and 5, including a ‘Lite edition’ of version 4, which was limited to 200 actions),” and Wikipedia adds that “OmniMark is no longer distributed under such a model.”
Stilo (2001-)
In April 2001 OmniMark Technologies was acquired by Stilo Technology, an AIM-quoted UK company. Stilo had begun as Stilo Associates, “established in 1992 as a partnership bringing together skills in scientific publishing, project management and software development” to build STILO, an SGML editing and viewing package; Stilo Technology Ltd was incorporated on 2 October 1995, and the group floated as Stilo International plc in 2000. Corum Group, which advised OmniMark, describes the target as an Ottawa company that “develops and markets software used to process and transform non XML data into XML format, and XML data into other formats.” The Ottawa office became Stilo Corporation and the development home of the language; the documentation copyright switches from OmniMark Technologies (2002) to Stilo Corporation (2005) to Stilo International plc (2008-2019).
Under Stilo the language went through its biggest changes. OmniMark 6 (6.5 documentation dated 23 December 2002) added the ** and ++ occurrence operators, repeat for and repeat to, take and drop, assert, and W3C Schema validation through an external-parser interface. OmniMark 7 (7.1.2 documentation 28 June 2005) introduced modules, constants, records, overloaded and infix functions, filter and input functions, an XSLT library, a Web Services Broker and the OmniMark Studio for Eclipse IDE, and split the product into a compiler and a VM engine running platform-independent .xvc files. OmniMark 8 (beta 1 documented 5 October 2005; 8.2 in March 2008) replaced stream with string, turned input functions into coroutines - string source and string sink functions with signal throw - and added the Sedna XML database with XQuery. OmniMark 9 (9.1.0, August 2010) added markup-event streaming; OmniMark 10 (April 2012) made DTDs first-class values and added a Java VM; 10.1.x releases followed in 2013, 2014 and 2016.
Stilo International plc left AIM on 8 October 2019 after a buyback and tender offer, and re-registered as a private company; OmniMark 11 was announced on 25 November 2019 with 64-bit Windows and RHEL 6-8 support. On 15 February 2023 the Ottawa management - CEO Bryan Tipper and CTO Jackson Klein - bought Stilo Corporation outright, and OmniMark 12 followed within weeks. OmniMark 13 shipped in May 2026.
Design philosophy
OmniMark’s Beginner’s Guide (Stilo, 2004) opens with the sentence that defines it: “OmniMark is a streaming programming language. As a starting point, you can think of OmniMark as either a rule-based language or an event-based language.” The comparison it draws is with GUI programming - programs are “a collection of responses to events,” but “the events an OmniMark program responds to are not user events or hardware events, but data events,” and “Who decides what is an event in a stream of data? You do.”
- Data flows; the program does not hold it. OmniMark “treats input as a flow that can be scanned once, rather than as a static collection of data that supports random access.” There is always a current input and a current output; rules apply to the current input without being told to, and
outputgoes to the current output. Memory use is bounded by what the program chooses to keep in variables, not by document size - the reason a 2 MB Macintosh could process books. - Rules, not control flow. A program is a set of
process,find,element,translate,document-start,document-endandmarkup-errorrules. Order matters only when two rules could match the same event, in which case the first wins and “eats” the text. - The parser is in the language. SGML and XML parsing is not a library call but the engine that drives
elementrules. The parser maintains the element stack, supplies attribute values, infers omitted SGML tags, and hands content to the rule through%c- which the rule may output, scan with patterns, or suppress. - Patterns in English. Where Perl writes
/\$(\d+)\.(\d{2})/, OmniMark writes"$" digit+ => dollars "." digit{2} => cents. On his own website Wilmott credits Icon’s style of pattern - itself a development of SNOBOL4’s - as the inspiration for OmniMark’s; the goal was patterns that can be read aloud and composed without escaping. - Generic handling first.
element #impliedcatches any element without a rule of its own, so “much of a document can be handled by a well-designed generic action” and a program is “very tolerant of changes in the structure of the input document.” - Correctness over speed of writing. Static types, explicit
formatconversions, theassertaction (from version 6), compiler warning classes (7.1) and a runtime that reports a function-call stack trace (8.2) reflect a language sold to organisations converting millions of pages who need conversions to be right.
Key features
Find rules: unstructured text
; Change prices from English to French format
process
submit file "prices.txt"
find "$" digit+ => dollars "." digit{2} => cents
output dollars || "," || cents || "$"
submit feeds a stream to the find rules; whatever the rules do not consume is copied to the output unchanged. => binds the matched text to a pattern variable, || concatenates, and %n in a string is a newline. The classic word counter from the Beginner’s Guide needs one rule:
global counter wordcount initial {0}
process
submit "Mary had a little lamb"
output "d" format wordcount || "%n"
find letter+
increment wordcount
Element rules: XML and SGML
; List first- and second-level headings from an XHTML file
process
do xml-parse
scan file "example.html"
output "%c"
done
element "head"
suppress
element "h1"
output "%c" || "%n"
element "h2"
output " " || "%c" || "%n"
element #implied
do when parent is "body"
suppress
else
output "%c"
done
An element rule “gets control just after the start tag has been parsed,” asks the parser for the content with %c, and gets control again at the end tag - so nested elements are handled by nested rule activations, each with the whole ancestor stack available (parent is, element is, attribute, content is (empty | conref)). do sgml-parse document does the same with a DTD and full SGML tag inference, which is how OmniMark could turn terse SGML with omitted tags into explicit XML. translate rules act on text before it reaches the parser (the standard example is translate "&" output "&"), and repeat scan "%c" ... match ... again applies patterns to parsed content.
Shelves, streams and referents
Variables live on shelves - arrays of one type addressed by index or key (global counter tally variable, tally{"total"}). Output is directed with using output as and open ... as buffer/as file; referents let a program emit a placeholder now and fill it later, the way a table of contents needs page numbers that are not yet known - a device from the typesetting world OmniMark came from.
The later language
| Version | Addition |
|---|---|
| 5 (1999) | catch/throw, #current-input, pattern functions, CGI #!, database/CGI libraries |
| 5.3 (c. 2000) | Type heralds dropped (counter x became integer x); BCD arithmetic |
| 6 (2001-02) | **/++ occurrence operators, repeat for/repeat to, take/drop, assert |
| 7 (2003-05) | Modules, constants, records (7.1), overloaded and infix functions, filter functions, XSLT and MQSeries libraries, Studio for Eclipse, .xvc VM |
| 8 (2005-08) | string type, string source/string sink coroutines, Sedna/XQuery, OMPROCESS |
| 9 (2010) | Markup-event streaming, OMXMLWRITE/OMSGMLWRITE |
| 10 (2012) | First-class DTDs, OASIS catalogs, Java VM |
| 11 (2019) | Abstract records, document-type-declaration rule, beta XML Schema and regex libraries |
| 12-13 (2023, 2026) | Platform and library modernisation |
Compiled programs are byte code (.xvc) that the VM runs unchanged on any supported platform; the product has shipped as a Desktop Compiler, a Single Processing VM, a Concurrent Processing Engine and, from version 10, a Java VM class (JOmniVM). Stilo currently lists Windows and Linux/UNIX platforms, with version 13 covering RHEL 10, Amazon Linux 2023, Ubuntu 22.04/24.04 and Windows Server 2022/2025.
Evolution
Stilo’s own 2017 guide to migrating legacy programs summarises the arc: OmniMark “started out as a very simple rule-based SGML scripting language” and became “a general-purpose programming language with modern software-engineering features,” while keeping backward compatibility to the point that programs written in the version 2 style still run with modest changes. The documentation still ships a “Backwards Compatibility” page tracing changes since version 2, and the four “aided translation types” of the early language - up-translate, down-translate, cross-translate and context-translate - are now deprecated in favour of process rules with explicit parsing, because the rigid forms “cannot always be extended to handle new requirements, without polluting the existing (working!) program.”
The other axis of evolution is what it parses: SGML from the start, XML from version 5 (well-formed XML in 5.4, W3C Schema via external parsers in 6.5, namespaces in 7), RTF via the OMRTF library (7.1), and, as Wilmott notes, “more recently, JSON.”
Current relevance
OmniMark is alive as a product and quiet as a language. Stilo Corporation, Canadian-owned since the 2023 buyout, released OmniMark 13 on 12 May 2026 - platform updates, curl 8.19.0, host libcurl and LDAP on Linux, better schema error reporting - and continues to sell licences with a 60-day evaluation, annual maintenance, and a “migrating legacy OmniMark programs” service for customers with decades-old code. Its Migrate conversion service uses OmniMark “under the hood.” Customers named by Stilo include Airbus, Embraer, the European Parliament, IBM, Thomson Reuters, Wolters Kluwer and Pitney Bowes.
Outside that circle the footprint is small: about twenty Rosetta Code tasks, an Emacs omnimark-mode on SourceForge, Wikipedia’s article, and the Balisage papers. There is no free implementation, no package on any public registry and no Docker image; the language’s future is tied to one company. Wilmott, after “leaving OmniMark,” worked on an XSLT compiler in the early 2000s, and his 2019 “Beyond OmniMark” paper proposes Bobbee, a new language for markup and text processing that would keep OmniMark’s strengths without its age.
Why it matters
OmniMark is the language in which a great deal of the world’s SGML - and therefore the first generation of structured publishing, from ACM’s journals to defence technical manuals to parliamentary records - was made and unmade. Three of its ideas deserve remembering. The first is streaming: treating a document as a flow of events, with the parser driving the program, a decade before SAX and two decades before streaming XSLT 3.0 - and doing so on 2 MB machines because there was no alternative. The second is the rule as unit of program, with generic #implied handling so that a converter degrades gracefully when the input’s structure changes; the fragility of hand-written conversions is exactly what this design attacks. The third is readable patterns: digit+ => dollars, letter*, any except "$" - a serious attempt, following Icon, to give text processing a notation that people who are not programmers can read.
That it never became the Perl alternative its owners hoped for in 1999 says more about pricing and timing than about design; Wilmott’s own diagnosis was cost, and the free XSLT that arrived the same year handled the XML half of the job well enough for most. But XSLT “only supports input in XML and is somewhat weak in its text processing features,” and the messy half - RTF, typesetting codes, word-processor exports, SGML with omitted tags - is where OmniMark still earns its keep, thirty-eight years after the first copyright notice.
Timeline
Notable Uses & Legacy
ACM journals via OCLC STEPS
In the mid-1990s OCLC's Office of Research built the capture-and-conversion component of its STEPS electronic publishing system for the Association for Computing Machinery around OmniMark: accepted articles in WordPerfect, Word, FrameMaker and LaTeX were converted to RTF by their word processors and then, by 'Exoterica Corporation's OMNIMARK programming language', into SGML conforming to ACM's DTD, with authors pre-tagging 26 major structures to make the up-translation tractable. 'ACM specified use of OMNIMARK where applicable in the conversion processes'
European Parliament and other Stilo customers
Stilo's interim results for the first half of 2016 reported 'significant OmniMark software orders received from Toshiba Solutions (Japan) and the European Parliament' and an increase in OmniMark sales; its 2017 interims named Boeing, Pratt and Whitney, EADS, Thomson Publishing and Wolters Kluwer as users, and its current product page lists Airbus, Embraer, the European Parliament, IBM, Thomson Reuters, Wolters Kluwer and Pitney Bowes among users of its content-conversion pipelines. Two decades earlier, OmniMark Technologies said Boeing, IBM, Nokia Telecommunications, Airborne Express and Underwriters Laboratories were represented at its 1999 developers conference
Stilo Migrate
Stilo's cloud service for converting FrameMaker, InDesign, Word, RoboHelp, DocBook and other legacy content to DITA and custom XML runs OmniMark 'under the hood', bringing 'the power of OmniMark into play for the analysis and processing of complex content, while shielding its complexity from non-technical users'; by 2014 Stilo reported more than 400,000 legacy pages converted to DITA through it for customers including IBM Sterling Commerce, Cisco and Oracle. Migrate 5.0 was announced on 3 April 2023
UK Ministry of Defence publication conversion
Consultant Graham Every 'provided setup scripts and ongoing support for a UK MoD project' converting a range of MoD publications from a legacy format into XML: exported files were transformed into a single valid SGML file per volume conforming to the target MoD DTD, and 'these tasks were performed using OmniMark' - a typical example of the SGML-era conversion work in defence, aerospace and publishing that kept the language in service