▍ humdrum codex / glint v1.0.1
license AGPL-3.0

glint

A modeless terminal markdown editor with live styling — a Bubble Tea TUI built for a notes vault. Type in a centered iA-Writer-style writing canvas with soft-wrapping and live markdown coloring, flip to a Glamour read preview, fuzzy-find notes with a live preview pane, and theme it to match your terminal (Flexoki light/dark + charm). Open any file, jump to today's daily note, or start a fresh document from anywhere. Code files open with calm, minimal syntax highlighting (strings, comments, and numbers only) so glint works as a quick $EDITOR too. Prose gets light inline spellcheck — a red curly underline under obvious typos, with one-key suggestions.

Install

brew tap humdrum/tap https://codex.humdrum.me/git/homebrew-tap.git
brew trust humdrum/tap   # Homebrew gates third-party taps
brew install glint

Upgrade later:

brew update && brew upgrade glint

Usage

glint                 # fuzzy picker over the current directory
glint notes.md        # open a file
glint -n [name]       # new note in the current dir (-n -i → inbox, -n -v → vault)
glint -p [file]       # open straight into the read preview (glow-style reader)
glint -e <file>       # export a file to printable house-style HTML and open it
glint -t              # today's daily note
glint -d              # browse the daily-notes folder
glint -v              # fuzzy picker over your vault, from anywhere
glint -i              # fuzzy picker over your inbox
glint -c              # interactive config walkthrough
glint -h              # help: all commands and keys
glint --version       # print version

Every command flag accepts a short letter or the full word, with one or two dashes: -n / --n / -new / --new, -t / --today, -v / --vault, etc.

Keys

Key Action
type / arrows / Enter / Backspace / Del edit and move (Up/Down move by visual line)
Enter on a list item continue the list (-/*/+, N./N), - [ ] checkboxes; numbers increment); empty item exits the list
Tab / Shift+Tab indent / outdent the current list item
Alt+↑ / Alt+↓ move the current line up / down (reorder list items; the cursor follows, so repeats walk it; one undo step per move)
Alt+x · click the box toggle the checkbox on the current line - [ ]- [x] (no-op off a checkbox line; key works with the cursor anywhere on the line)
mouse click move the cursor
mouse drag select text (press to anchor, drag to extend, release to keep)
mouse wheel scroll the view
Home / End smart Home (first non-blank, then column 0) / end of line
type ( [ ` with no selection auto-closes the pair with the cursor inside; type the closer over it to step past
Shift+arrows · Shift+Home/End select text (Ctrl+Shift+←/→ selects by word)
Ctrl+C / Ctrl+X / Ctrl+V copy / cut / paste (system clipboard); pasting a URL over a selection makes a [selection](url) link
Alt+s / Alt+i / Alt+c / Alt+k wrap the selection: bold ** · italic _ · code ` · link [sel]() (toggles off if already wrapped; no selection inserts the empty pair)
type * _ ` [ ( { < " ' with a selection surround the selection with that punctuation (repeat to nest, e.g. *** for bold)
Alt+← / Alt+→ move by word (also Alt+b / Alt+f)
Alt+Backspace / Ctrl+W delete the word before the cursor (Alt+d deletes the word after)
Ctrl+U / Ctrl+K delete to start / end of line
Ctrl+Z / Ctrl+Y undo / redo
Ctrl+S save (an unnamed buffer prompts for a name → inbox)
Ctrl+E export a printable HTML document and open it in the browser → Print → Save as PDF (see Export)
Ctrl+P toggle the Glamour read preview
Ctrl+F fuzzy file picker (with live preview); prefix the query with / to full-text search note contents — results show file:line text and open at the match
Ctrl+G find in document (Enter/ next, Shift+Tab/ prev, Esc close)
Ctrl+L go to line (type a number, Enter to jump, Esc to cancel)
Ctrl+D today's daily note
Ctrl+N new note in the current directory (a typed picker query becomes its name)
Ctrl+B new note in the inbox
Ctrl+T cycle theme (flexoki-light → flexoki-dark → charm)
Alt+; · click spellcheck popup on the misspelled word at the cursor (or click an underlined word): pick a suggestion 19, a add to dictionary, i ignore, t toggle spellcheck, Esc close
Ctrl+/ toggle the in-editor help overlay (keys + commands)
Ctrl+Q quit (press twice if there are unsaved changes)
Esc clear the selection, or close find / back to the editor

Configuration

Run glint -c for an interactive walkthrough that writes the file for you (no hand-editing, daily-format presets instead of raw Go layouts). The settings live in ~/.config/glint/config.toml (all keys optional):

vault_dir     = ""           # the vault `glint -v` opens from anywhere (e.g. "~/Notes"); unset = current dir
inbox_dir     = ""           # where `glint -n -i` / save-as land; "" = working dir, relative = under it
daily_subdir  = "Daily"      # daily notes live in <vault>/<daily_subdir>/ (absolute path used as-is)
daily_format  = "2006-01-02" # Go time layout for daily-note filenames
theme         = "auto"       # auto | flexoki-light | flexoki-dark | charm  (auto detects macOS appearance)
glamour_style = ""           # override the preview style; "" follows the theme
spellcheck    = "auto"       # auto | on | off  (auto = on for prose/notes, off for code files)
font_display  = ""           # PDF export heading/cover font stack; "" = Georgia serif
font_body     = ""           # PDF export body font stack; "" = system-ui sans
font_mono     = ""           # PDF export code font stack; "" = ui-monospace

Two roots. Bare glint, glint -n, and -d operate on the working directory — the folder you launched from (or $GLINT_VAULT if set), so glint works in whatever repo you're in. glint -v opens the picker on your configured vault_dir from anywhere — set it to your notes vault to reach it without cd-ing there.

Export (PDF)

Ctrl+E exports the current buffer to a clean, printable document in the Humdrum house style and opens it in your default browser — there you hit Print → Save as PDF. No external converter is required: the export is a single self-contained .html file (the house stylesheet and your rendered Markdown are baked in), written next to the source file (note.mdnote.html; an unnamed buffer lands in the temp dir). If the browser can't be opened automatically, glint prints the file path so you can open it yourself — the export still succeeds.

The print layout follows the kit's conventions: a leading # Title becomes a centered cover page, headings start new pages, {.page-break} on a heading forces a break, the page is US Letter with 1in margins, and printing collapses to black-on-white.

The stylesheet (doc.css) is vendored into the binary via go:embed, so a brew install glint on any machine has everything it needs. The kit's licensed display/body/mono faces are not bundled — the export ships portable open/system defaults (Georgia / system-ui / ui-monospace) and lets you point the three font slots at any fonts you have via the font_display / font_body / font_mono config keys above.

Fonts are embedded at export time. Set a custom font and glint finds it in your font directories (~/Library/Fonts, /Library/Fonts), reads the matching faces (regular + bold, roman + italic), and inlines them as base64 @font-face in the exported HTML. This is required because WebKit browsers (Safari, Orion) refuse to render locally-installed user fonts referenced only by name. A font glint can't find on disk falls back to a plain name reference (which still works in Chrome/Firefox), and nothing licensed is ever baked into the binary — it embeds only the fonts you configured and have installed.

To refresh the embedded style after the kit changes, run internal/export/assets/sync.sh.

Themes

Three palettes, every span explicitly colored so text stays readable on light and dark terminals: flexoki-light, flexoki-dark, and charm. auto picks light or dark from the macOS system appearance; Ctrl+T cycles live. The read preview and the whole canvas background follow the active theme.

Spellcheck

Misspelled prose gets a calm red curly underline (undercurl). It's deliberately light — an embedded ~60k common-English dictionary catches obvious typos without the false positives of a heavy morphological checker. Code fences, inline code, URLs, wikilinks, link targets, and frontmatter are never flagged, and recognized code files are skipped entirely (same extension routing as syntax highlighting).

Alt+; (or clicking an underlined word) opens a popup with up to five suggestions ranked by edit distance — pick one with 19 to replace in place, a to add the word to your personal dictionary, i to ignore it for the session, or t to toggle spellcheck off and on (Alt+; opens a toggle-only popup when no word is flagged). The personal dictionary is a plain, hand-editable file at ~/.config/glint/dict.txt (one word per line). Set spellcheck = off to disable it, or on to force it on.

The curly underline uses the 4:3 SGR underline-style and 58 underline-color codes — supported by Ghostty, kitty, WezTerm, foot, and recent VTE terminals. Terminals without them degrade to a straight underline or none. Inside tmux, enable passthrough so the styles reach the terminal:

set -as terminal-features ',*:usstyle'

License

glint — Copyright (C) 2026 humdrum-tiv.

Free software under the GNU Affero General Public License v3.0 (or, at your option, any later version). You may use, study, share, and modify it; any distributed derivative — or modified version offered to users over a network — must also be AGPL-licensed with source available. It comes with no warranty. See LICENSE for the full terms.