# WordGrinder, a console word processor that refuses to become a GUI application

> WordGrinder is a Unicode-aware word processor that runs in a terminal, written in Lua and Luau, with a menu interface, HTML import and export, basic paragraph and character styles, and a spellchecker. The console build is the product, and the GUI frontends are optional extras layered on the same core.

**davidgiven/wordgrinder** — A word processor which gets the hell out of your way and lets you get some work done.

- Repository: https://github.com/davidgiven/wordgrinder
- Website: http://cowlark.com/wordgrinder
- Stars: 1,278 · Forks: 74
- Language: Lua
- License: not declared
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/davidgiven-wordgrinder

## A word processor that runs where your shell runs

WordGrinder describes itself as a simple, Unicode-aware word processor that runs on the console, designed to get out of your way and let you write. The pitch is deliberately narrow, and the feature list matches: basic paragraph styles, basic character styles, basic screen markup, HTML import and export, and a menu interface so you do not have to remember complex key sequences. The point of the menu is that it is a terminal program without terminal keybinding folklore, which is the usual failure mode of console editors. It does very little, the documentation says, but what it does it does well. The important structural fact is that the console build is the product and the GUI is optional: there are GUI versions for Unix systems, Windows and macOS, but the program does not require a GUI and can run in a terminal. That choice is what makes it usable over a slow link or inside a container.

## Building it with make, ninja and ncursesw

The build is a plain Unix build with a couple of prerequisites. You need ninja as the build tool and ncursesw, the wide-character version of curses, which most systems supply. zlib is listed as well, and an OpenGL or GLFW development kit if you want the OpenGL frontend. The distribution packages for the common systems are given: `libncursesw5-dev zlib1g-dev libglfw3-dev` on Debian and Ubuntu, `zlib-devel libglfw-devel ncurses ncurses-devel` on Fedora, `pkg-config glfw` with Homebrew on macOS, and a `pkgman install` line for Haiku. Then a plain `make` detects a sensible configuration and builds, and `sudo make install` puts the result in your home directory area, with a `PREFIX` variable for a different location if you are not installing globally. The Windows path is separate: build from MSYS2 with the Mingw64 toolchain and nsis installed, or use Cygwin, and the installer package ends up in `bin/`.

```bash
make

sudo make install
```

If you are not installing into a global location you do not need sudo, and you can set the prefix yourself with `PREFIX=/usr/local ./configure` followed by `make install`.

## The Makefile decides the platform and the toolchain for you

The top of the Makefile is where the platform support actually lives, and it is more revealing than the README on this point. If `BUILDTYPE` is not set, the makefile derives it from `uname -s`, mapping Darwin to osx and Haiku to haiku, and falling back to unix for anything else, then exports it so the rest of the build knows which target it is producing. For Windows it cross-compiles with an `i686-w64-mingw32-` prefix, using that toolchain's gcc and g++, static linking, and `makensis` for the installer, with the extension `.exe` on the outputs. For Unix it uses gcc and g++ with the C++20 standard, and on macOS it exports the Homebrew prefix so pkg-config finds the right libraries. Object files are placed under a `.obj` directory split by build type, and there is a separate `debian-distr` target that produces a tarball of the minimal dependencies for Debian packaging.

```make
export PREFIX = /usr/local

export REALOBJ = .obj
export OBJ = $(REALOBJ)/$(BUILDTYPE)
```

The install target is equally plain: it copies the console binary, the GUI binary and their man pages into the prefix.

## Two binaries, and the manual lives in the source tree

Installing puts two programs on your path, not one. The install target copies `bin/wordgrinder` and `bin/wordgrinder.1` into the prefix, and also copies `bin/xwordgrinder` and its man page, so the console program and the GUI program are installed side by side. Running the console version with no arguments gives you a blank document, and passing a filename opens that document, for example loading the project own README.wg. The manual is that README.wg file, and the documentation tells you to read it because it contains the manual; the man page exists but describes the command line interface specifically. There is a mailing list for users, with the archives and subscription on a SourceForge list page, and the project asks users to join it to ask questions and to hear about new releases.

## Luau replaced Lua, and 0.9 threw away two frontends

The 0.9 revision, dated 2025-01-22 in the revision history, is the substantive one. It threw away the X11 and Windows GDI frontends and replaced them with OpenGL, which is why there is now a GUI version for macOS, and it brought a new colour scheme and a revised ruler layout. The interpreter underneath changed too: the switch from Lua to Luau came with a refactor of all the code to be type safe in strict mode, and the author notes that this found and fixed a large number of minor bugs on the way. Other changes are of the small, real kind that accumulate over two decades of use. Documents with CRLF line endings can be read. There is a `--recent` option to load the last edited document. A default template is used for new documents. Adding a paragraph after a heading style returns to normal body text. TAB and Ctrl-I both work for autocompletion in file dialogues, ESCAPE cancels operations, the cursor shape changes for visibility, and the spellchecker on Unix systems now looks for its dictionary in the default place and works better.

## A GPL question that the metadata does not answer

The licence situation here is layered and worth reading carefully. The project own documentation states that WordGrinder is copyright 2007-2020 David Given and available under the MIT licence, and the licence field in the repository metadata is not filled in. On top of that core, the distribution embeds a set of third-party libraries, and the full licence texts are in the `third_party` directory. Luau is included, MIT licensed, copyright Roblox Corporation and PUC-Rio. The MiniZip library is BSD licensed. The SCOWL wordlist for British and American-Canadian English comes from Kevin Atkinson and J. Ross Beresford. The xpattern module is MIT licensed. The Fantasque Sans Mono font is included in a large line height variant under the Open Font License. Parts of the libstb utility library are public domain where possible, the clip clipboard library is MIT licensed, and cut-down versions of the cmark Markdown library and the fmt library are included. A word processor that ships a dictionary, a font and a clipboard layer inherits obligations from each of them.

## What this program is not

There is no collaboration, no revision history and no rich layout engine, and the documentation does not claim otherwise. The styling support is described as basic for both paragraph and character styles, and the markup support is described in the same terms, so this is a plain text or lightly styled writer rather than a layout engine that positions floating objects. There is no plugin ecosystem described and no scripting API for extending the document model, so the extension point is the source. The spellchecker exists and got better in 0.9, but the dictionary story is the SCOWL wordlist, so the coverage is what that wordlist provides. The final limitation is the one the authors chose to state plainly: the tool does very little, and the value of the tool is that it does that little without opening a window.

## Conclusion

Adopt WordGrinder if you write in a terminal and want a word processor that does not open a window, and skip it if you need collaborative editing, tracked changes or a rich text model, because none of those are part of what this program attempts. Verify three things before you build it: that your terminal handles UTF-8, since the documentation calls this out and says the wrong choice makes the text look wrong; that ninja, ncursesw and zlib are present, since the build needs them; and that you read README.wg, because the manual lives there rather than in a man page, and the man page only covers the command line.

## FAQ

### What is WordGrinder and what does it run on?

It is a simple, Unicode-aware word processor that runs on the console, with basic paragraph and character styles, screen markup, HTML import and export and a menu interface. It does not require a GUI, and GUI versions exist for Unix systems, Windows and macOS.

### How do I build and install WordGrinder?

Install the build prerequisites, which are ninja, ncursesw, zlib and an OpenGL or GLFW kit for the OpenGL frontend, then run `make` to detect a sensible configuration and `sudo make install` to install, or set PREFIX for a non-global location. On Windows you build from MSYS2 with the Mingw64 toolchain and nsis, or use Cygwin.

### Where is the WordGrinder manual?

In the repository, in the README.wg file, and the documentation tells you to read it because it contains the manual. A man page is also installed, but it describes the command line interface.

### What licence is WordGrinder under?

The project documentation states that WordGrinder is copyright 2007-2020 David Given and available under the MIT licence. The distribution also embeds Luau, MiniZip, the SCOWL wordlist, the xpattern module, the Fantasque Sans Mono font, libstb, the clip library, cmark and fmt, with their texts in the `third_party` directory.

### What changed in WordGrinder 0.9?

The X11 and Windows GDI frontends were thrown away and replaced with OpenGL, which added a GUI version for macOS, along with a new colour scheme and ruler layout. The interpreter switched from Lua to Luau and the code was refactored to be type safe in strict mode, and the release also added CRLF file reading, a `--recent` option, a default template, mouse support and multiple scroll modes.

## Sources

- [davidgiven/wordgrinder on GitHub](https://github.com/davidgiven/wordgrinder)
- [Issues](https://github.com/davidgiven/wordgrinder/issues)
- [Project website](http://cowlark.com/wordgrinder)
- [README](https://github.com/davidgiven/wordgrinder/blob/master/README.md)
- [Releases](https://github.com/davidgiven/wordgrinder/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/davidgiven-wordgrinder
