# glint A modeless terminal markdown editor with live styling — a [Bubble Tea][bubbletea] 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][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 ```sh 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: ```sh brew update && brew upgrade glint ``` ## Usage ```bash 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 # 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](#export-pdf)) | | `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 `1`–`9`, `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): ```toml 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 // (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.md` → `note.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`](internal/export/assets/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 `1`–`9` 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: ```tmux set -as terminal-features ',*:usstyle' ``` ## License glint — Copyright (C) 2026 humdrum-tiv. Free software under the [GNU Affero General Public License v3.0](LICENSE) (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](LICENSE) for the full terms. [bubbletea]: https://github.com/charmbracelet/bubbletea [glamour]: https://github.com/charmbracelet/glamour