HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
davejarvis
keenwrite
HISTORICAL RECORD2020–2023
davejarvis / keenwrite · Not publicly available

keenwrite

Discover this repository through its Hacker News conversations.

4Distinct people
78Mentions
0Explicit recommenders
REPOSITORY AT A GLANCE

What to know before exploring

What it is

A public description has not been verified.

Where it is used

The source check is incomplete. Verified examples will appear here.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year78 dated mentions

Observed mentions: 2020-09-20 00:20:50 UTC to 2023-08-17 04:21:56 UTC.

01020302020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 6 mentions; 1 submissions, 5 comments20202021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 18 mentions; 2 submissions, 16 comments20212022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 30 mentions; 3 submissions, 27 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 24 mentions; 3 submissions, 21 comments2023

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC615
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC18216
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC30327
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC24321

What Hacker News says

78 sources
KeenWrite is my free, open-source, cross-platform desktop Markdown editor that can produce beautifully typeset PDFs. I started working on it years ago to help write a novel having a complex timeline and I couldn't find a text editor that allowed me to integrate a character sheet with the story itself. https://github.com/DaveJarvis/keenwrite Here's what I mean by using variables from the character sheet directly: https://www.youtube.com/watch?v=CFCqe3A5dFg Tutorials: https://www.youtube.com/playlist?list=PLB-WIt1cZYLm1MMx2FBG9... CommonMark doesn't propose a standard for bibliographic references. I'm wondering if anyone would find cross-references and citations in Markdown to be useful?
In Ask HN: Tell us about your project that's not done yet but you want feedback on
My Typesetting Markdown series goes into creating a number of scripts that use pandoc, knitr, and a YAML interpolator to do just that: https://dave.autonoma.ca/blog/2019/05/22/typesetting-markdow... Later, I wrote KeenWrite, which is both a GUI and command-line application for converting Markdown documents to PDF. KeenWrite separates the content layer from the presentation layer and uses ConTeXt to do so. I've tried to keep my software backwards compatible with pandoc. https://github.com/DaveJarvis/keenwrite
In LaTeX3: Programming in LaTeX with Ease (2020)
> modern languages like Markdown Markdown was created in 2004. From the creator: > ... the single biggest source of inspiration for Markdown’s syntax is the format of plain text email. Email goes back to 1965, though I suspect Markdown's influence stems from the more widely adopted email usage of the 1990s. I'm not sure if I'd call Markdown "modern". Quite popular though! > Part of LaTeX's success was the absolutely beautiful documents it can make with nothing but a personal computer. I'd say that was TeX's success, with LaTeX bolted on later to greatly improve TeX's extensibility. Keep in mind, there are a number of TeX-centric implementations beyond LaTeX. For example, my fork of NTS, called KeenType, is a pure Java version of TeX that can typeset beautifully and has at its core Knuth's original TeX files. I specifically avoided integra
Read the rest
ting LaTeX. https://github.com/DaveJarvis/KeenType/tree/main/tex/src/mai... My Markdown text editor, KeenWrite, uses KeenType to preview math in documents. https://github.com/DaveJarvis/KeenWrite/blob/main/docs/scree... When exporting to PDF, KeenWrite uses ConTeXt to typeset the final document. ConTeXt being another TeX-based system. This is the reason why KeenWrite only uses TeX: to give users the ability to choose what TeX flavour to use for typesetting the PDF. https://wiki.contextgarden.net/Main_Page
In LaTeX3: Programming in LaTeX with Ease (2020)
My cross-platform desktop text editor, KeenWrite, allows users to define variables in an external YAML file. The editor calls out to Kroki[1] to convert text-based diagrams to SVG. The diagrams can reference variables and are rendered using EchoSVG[2]. KeenWrite[3] can produce PDF documentation from Markdown documents that has PlantUML diagrams with elements stored in an external, machine-readable file. Here are screenshots showing variables on the left, diagram text in the middle, and a real-time render on the right: * https://raw.githubusercontent.com/DaveJarvis/KeenWrite/main/... * https://raw.githubusercontent.com/DaveJarvis/KeenWrite/main/... KeenWrite supports all diagrams offered by Kroki, which includes "diagram-plantuml". [1]: https://kroki.io/ [2]: https://github.com/css4j/echosvg/ [3]: https://github.com/DaveJarvis/keenwrite
In Documentation as Code for Cloud Using PlantUML
> Thanks again for posting and replying. Pleased to make your acquaintance. Likewise! > I use a Front Matter header to pass structured data The impetus for developing that shell script (ergo KeenWrite) was using variables in documents. KeenWrite injects structured, interpolated YAML strings back into documents by replacing Moustache syntax (or `r# ...` syntax for R docs). This means that the same structured data can be reused for multiple documents, allowing for single sources of truth and a clean separation of content from presentation. Also, variables can be used in diagrams. As for Front Matter, data can be passed in from the command line[1]: -v metadata.yaml \ --metadata="title={{book.title}}" \ --metadata="author={{book.author}}" Under the hood, KeenWrite places the metadata inside the intermediate XHTML document as <met
Read the rest
a> tags inside the <head>. These are parsed by ConTeXt using an XSLT-like syntax that converts them into TeX instructions[2]. Do post any questions you may have on the discussions forum[3]. [1]: https://github.com/DaveJarvis/keenwrite/blob/main/docs/cmd.m... [2]: https://github.com/DaveJarvis/keenwrite-themes/blob/main/xht... [3]: https://github.com/DaveJarvis/keenwrite/discussions/
In On why Markdown is not a good, or even a half-decent, markup language
Here are a few Markdown documents I've typeset into PDF: * https://impacts.to/downloads/lowres/impacts.pdf * https://pdfhost.io/v/4FeAGGasj_SepiSolar_Highlevel_Software_... * https://dave.autonoma.ca/blog/2020/04/28/typesetting-markdow... My text editor, KeenWrite[1] (see tutorials[3] for details), converts from Markdown to XHTML. The XHTML is then typeset using the ConTeXt typesetting software to create a PDF. The PDF is stylized using a theme[2]. What Markdown is missing, in particular flexmark-java, is a standard CommonMark extension for cross-references and citations[4]. [1]: https://github.com/DaveJarvis/keenwrite [2]: https://github.com/DaveJarvis/keenwrite-themes/tree/main/exa... [3]: https://www.youtube.com/playlist?list=PLB-WIt1cZYLm1MMx2FBG9... [4]: https://talk.commonmark.org/t/cross-references-and-citations...
In On why Markdown is not a good, or even a half-decent, markup language
In MdBook – A command line tool to create books with Markdown
I wrote KeenWrite, a free and open-source cross-platform tool, to create Markdown-based books. KeenWrite calls out to ConTeXt to typeset the documents and uses my KeenType fork for typesetting math while in preview mode. KeenWrite can generate PDF files from the command-line. * https://github.com/DaveJarvis/keenwrite For example: java -jar keenwrite.jar \ --all \ --r-dir=$PWD/bin \ --r-script=$PWD/bin/editor.R \ --image-dir=$PWD/images \ --variables=$PWD/variables.yaml \ --theme-dir=$HOME/dev/java/keenwrite/themes/boschet \ --metadata=title={{book.title}} \ --metadata=byline={{book.author.byline}} \ --metadata=keywords={{book.keywords}} \ --metadata=copyright={{book.copyright}} \ --metadata="reviewer=$1 $2, $3" \ --chapters="-14" \ --input="$PWD/chapter/01.R
Read the rest
md" \ --output="${TEMP_NAME}" That mouthful compiles the book that I'm writing. The book defines numerous variables that are referenced throughout the prose and defined in an external file. Variables can also be passed in as metadata, which tells ConTeXt various PDF properties to embed. The chapters argument allows selecting a subset of chapters to build (e.g., 1-3,5,9-15,22). Lastly, the theme directory points ConTeXt to the instructions to use when typesetting the document, which controls colours, fonts, layout, annotations, etc. Some sample outputs: * https://github.com/DaveJarvis/keenwrite-themes/tree/main/exa...
In MdBook – A command line tool to create books with Markdown
Although not interactive, I've created a video series that shows advanced usage of Markdown. Namely R, external variables, diagrams, math, annotations, and a different approach to metadata: * https://www.youtube.com/playlist?list=PLB-WIt1cZYLm1MMx2FBG9... Tutorial 4 shows basic Markdown: * https://www.youtube.com/watch?v=qNbGSiRzx-0 The top-right of each video shows keyboard and mouse clicks to help follow along.[1] My desktop text editor, KeenWrite[2], is used in the tutorials. [1]: https://github.com/DaveJarvis/kmcaster [2]: https://github.com/DaveJarvis/keenwrite
In Interactive CommonMark Tutorial
https://github.com/DaveJarvis/keenwrite/blob/main/scripts/bu... My template script provides a way to make user-friendly shell scripts. In a script that uses the template, you define the dependencies and their sources as comma-separated values: DEPENDENCIES=( "gradle,https://gradle.org" "warp-packer,https://github.com/Reisz/warp/releases" "tar,https://www.gnu.org/software/tar" "wine,https://www.winehq.org" "unzip,http://infozip.sourceforge.net" ) You define the command-line arguments: ARGUMENTS+=( "a,arch,Target operating system architecture (amd64)" "o,os,Target operating system (linux, windows, mac)" "u,update,Java update version number (${ARG_JAVA_UPDATE})" "v,version,Full Java version (${ARG_JAVA_VERSION})" ) You define the "execute()" method that is called after t
Read the rest
he arguments are parsed: execute() { // Make the computer do the work. return 1 } If the script takes arguments, handle each one individually: argument() { local consume=2 case "$1" in -a|--arch) ARG_JAVA_ARCH="$2" ;; -o|--os) ARG_JAVA_OS="$2" ;; esac return ${consume} } Then call the template's main to start the script rolling: main "$@" For 99% of the scripts I write, this provides: * Built-in software dependencies verification. * Instructions to the user when requirements are missing. * Simple command-line argument parsing. * Help and logging using ANSI colour. Here's a complete script that builds the Windows, Linux, and Mac installers for my Markdown editor: https://github.com/DaveJarvis/KeenWrite/blob/main/installer.... There's a write-up about creating the script that has a lot more details about how the template works: https://dave.autonoma.ca/blog/2019/05/22/typesetting-markdow... Note that it is technically possible to improve the scripts such that handling individual arguments can be done in the template itself. This would require a slightly different argument definition semantics: ARGUMENTS+=( "ARG_JAVA_ARCH,a,arch,Target operating system architecture (amd64)" "ARG_JAVA_OS,o,os,Target operating system (linux, windows, mac)" "usage=utile_usage,h,help,Show this help message then exit" ) By detecting an `=` symbol for the first item in the lists, it's possible to know whether a command-line argument is assigning a variable value, or whether it means to perform additional functionality. (PR welcome!)
In “Exit traps” can make your Bash scripts more robust and reliable (2013)
RichTeXtFX[1] has these abilities[2] along with demo code[3] that provides an entry point for sleuthing. My text editor, KeenWrite[4], uses RichTeXtFX, but takes a different approach due to its usage of inline variable references. Rather than edit the document in a WYSIWYG-like fashion, users edit the Markdown document as plain text then export as PDF by selecting a theme to apply for typesetting. This cleanly separates content from presentation. The "themes" video tutorial demonstrates how theme selection works.[5] [1]: https://github.com/FXMisc/RichTextFX/tree/master/richtextfx/... [2]: https://gluonhq.com/presenting-a-new-richtextarea-control/ [3]: https://github.com/gluonhq/rich-text-area/blob/master/sample... [4]: https://github.com/DaveJarvis/keenwrite [5]: https://www.youtube.com/watch?v=3QpX70O5S30&list=PLB-WIt1cZY...
In Text Editor Data Structures
KeenWrite Themes[1] are instructions that tell ConTeXt how to typeset XHTML documents (content) into PDF files (presentation). I made a tutorial[2] that shows how my FOSS desktop text editor, KeenWrite[3], allows users to write in Markdown to typeset a document against a particular theme. Before it can be used for scientific papers, KeenWrite (by way of a flexmark-java extension) needs cross-references, which, unfortunately, aren't part of the CommonMark specification. I posit that the vast majority of LaTeX users don't grok how to separate content from presentation. When I asked a question on TeX.SE[4] about how to adjust the line spacing between enumerated items (spanning a couple dozen enumerated lists), the vast majority of people voted for the answer of using `\itemsep0em` to tweak each list individually. The correct answer, IMO, is
Read the rest
In Cost of ‘reformatting’ prompts a call for journals to change their requirements
I developed KeenWrite[1] to make using variables in documents trivial[2]. My editor has no search and replace function. For my sci-fi novel, there's a variable {{location.protagonist.tertiary.Type}} that has the value "Bavarian Village". I could change this to "apartment" and every instance throughout the document prose and reference diagrams would update automatically and contextually. My typical example for explaining the use case is changing the name "May" to "June", but flat/apartment is hilarious. [1]: https://github.com/DaveJarvis/keenwrite [2]: https://youtu.be/CFCqe3A5dFg?list=PLB-WIt1cZYLm1MMx2FBG9KWzP...
In Windows 11 calls a zip file a 'postcode file' in UK English

Showing the 15 most recent of 78 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.