nathan
v0.0.11
Published
Nathan Duarte, on npm! An interactive terminal résumé.
Maintainers
Readme
nathan
My résumé, on npm — as an interactive terminal app that opens like my Neovim.
$ npx nathan # the full TUI (LazyVim-style)It boots into a snacks.nvim-style
dashboard — ANSI-shadow banner, quick-keys, and a bonsai growing in a floating
window — with a bufferline of résumé sections, a line-number gutter, markdown-
styled content, and a lualine statusline. Themed tokyonight-night, to match my
actual editor and nathanduarte.dev.
Commands
| command | what it does |
| --------------- | ------------------------------------------------------- |
| nathan | opens the interactive TUI résumé |
| nathan resume | alias for the TUI |
| nathan card | prints the colored business card (no native deps) |
| nathan json | prints contact info as JSON |
| nathan help | usage |
Piped / non-interactive runs always emit JSON, so it stays scriptable:
$ npx nathan | jq .emailKeys (vim-ish)
| keys | action |
| ----------------- | ------------------------------- |
| s e k d c | jump to a section (anywhere) |
| 1–6 | jump to a buffer |
| H L / Tab | previous / next buffer |
| ↑ ↓ | scroll |
| ⌃U ⌃D / PgUp PgDn | half-page / page |
| gg / G | top / bottom |
| : | command mode (:q :qa :help) |
| ? | keymaps |
| q / Esc | quit |
How it works
The TUI is a SolidJS app rendered to the terminal
with OpenTUI, whose renderer is a native (Zig) library.
The bonsai is a self-contained port of
cbonsai/rbonsai's growth model, so it
grows on any machine without that binary installed.
To keep npx nathan / npm i -g nathan working on any Node — with no Bun or
FFI required on the user's machine — the package ships the same way opencode-ai
does: a tiny plain-Node launcher (bin/nathan.js) plus prebuilt, standalone
per-platform binaries published as optionalDependencies:
nathan (this package) → bin/nathan.js (launcher, resolves + execs the binary)
nathan-linux-x64 → bin/nathan (standalone binary, native lib embedded)
nathan-linux-arm64
nathan-darwin-x64
nathan-darwin-arm64
nathan-win32-x64npm installs only the platform package matching the user's OS/arch; the launcher
execs it. Each binary is produced with bun build --compile, which embeds both
the Bun runtime and OpenTUI's native lib — so there's nothing to resolve at
runtime.
Develop
Requires Bun.
bun install
bun run dev # the TUI (JSON when piped)
bun run resume # the TUI
bun run typecheckSource layout:
src/
index.ts entry — routes TUI / card / json
app.tsx TUI shell: modes, buffer nav, keymaps
components.tsx bufferline, dashboard, bonsai, statusline, buffer view
bonsai.ts procedural cbonsai/rbonsai grower
ascii.ts the ANSI-shadow banner + dashboard keys
content.ts résumé "buffers" (styled markdown lines)
lines.ts styled-span model + gutter-aware word wrap
data.ts résumé content (single source of truth)
theme.ts tokyonight-night palette
card.ts the colored card + JSON (no native deps)Build & release
A single machine can build every target: bun build --compile cross-compiles,
and scripts/fetch-natives.ts pulls each platform's OpenTUI native lib via
npm pack (they're platform-gated optional deps a normal install skips).
bun run build # current host only
bun run build:all # all platforms → dist/<platform-pkg>/
bun run release:dry # build all + show what would publish
bun run release # build all + npm publish (platform pkgs first, then root)Versions stay in lockstep: the root version and the optionalDependencies
pins must match the platform packages' version when publishing.
