Nota is a language for writing documents, like academic papers and blog posts. The goal of Nota is to bring documents into the 21st century.

Documents contain a lot of structure — for example, "Nota" is a reference to a term defined in the preceding paragraph. Nota enables authors to represent that structure, which allows the reading medium (the browser) to understand that structure, which in turn empowers readers to use that structure. Try clicking on any "Nota" reference to see this idea in action. (Then try double-clicking!)

A Nota document compiles to a JavaScript program, meaning it's easy to:

  • View documents on any device that has a web browser.

  • Use variables, functions, and data structures to simplify document writing.

  • Integrate with JavaScript libraries like KaTeX, Vega-Lite, and Penrose.

  • Support accessibility needs like screen readers.

// This code is editable!
% let nota = @Smallcaps{**Nota**}
.@Definition[name: "nota", label: nota]{
#nota is a language for writing documents, like academic papers and blog posts.
}
The goal of &nota is to **bring documents into the #(20 1)st century.**

Documents contain a lot of structure --- for example, "&nota" is a reference to a term defined in the preceding paragraph. &nota enables authors to *represent* that structure, which allows the reading medium (the browser) to *understand* that structure, which in turn empowers readers to *use* that structure. Try clicking on any "&nota" reference to see this idea in action. (Then try double-clicking!)

A &nota document compiles to a JavaScript program, meaning it's easy to:

* View documents on any device that has a web browser.
* Use variables, functions, and data structures to simplify document writing.
* Integrate with JavaScript libraries like [KaTeX](https://katex.org/), [Vega-Lite](https://vega.github.io/vega-lite/), and [Penrose](https://github.com/penrose/penrose).
* Support accessibility needs like screen readers.

1 Usage

You can use Nota by installing the nota executable via the @nota-lang/nota package. You need NodeJS ≥ 16 and npm ≥ 6. The NodeJS global binary directory must be on your shell's PATH, e.g. by running

export PATH="$(npm config get prefix)/bin:$PATH"

Then you can build a single Nota document by running these shell commands:

npm install --global @nota-lang/nota
echo "@Title: Hello world" > index.nota
nota build index.nota
open dist/index.html

You can interactively edit a Nota file by running the Nota editor, like so:

nota edit index.nota

To learn more about how to write Nota documents, you can read through the Reference. To add Nota to your website or to learn more about Nota's architecture, read the Integration guide.

Nota is a new and evolving technology. The architecture and API are continually changing. Tooling will have bugs and missing features. Documentation will be incomplete or incorrect. Right now, I am seeking early adopters that want to help make Nota the document language of the future.

2 Why Nota?

There are two main mediums for digital documents: PDFs and web pages. PDFs were designed to mirror physical documents, so they impose the real-world constraints of paper: page breaks, fixed width, and immutable styling. Web pages, by contrast, provides an essential dynamism. Web pages can be dynamically formatted: resized for phones, translated into other languages, colors changed for color-blindness. Web pages can be dynamically interactive: text prompted for more context, diagrams shifted for a new perspective, annotations added for posterity. Web pages are undeniably the future of digital documents.

But currently, that dynamism is only accessible to professional web developers. Existing document tools like LaTeX, Pandoc, Markdown, and Scribble can (for the most part) only generate static web pages. Nota's goal is to bridge that gap by providing authors with a document language that has a low floor, a high ceiling, and a smooth ramp up.

Part of this design is identifying components that are easy to use for authors and have high impact for the reader. For instance, the @Definition and @Ref components in the example above require a small amount of document annotation on the author's part. Then the Nota runtime can provide features like presenting a reference's definition in context via tooltip. Future Nota versions could include more advanced features like find all references to this definition.

For more on this design philosophy, you can read my original paper "A New Medium for Communicating Research on Programming Languages".