inkhaven 1.3.7

Inkhaven — TUI literary work editor for Typst books
inkhaven-1.3.7 is not a library.

Inkhaven (blackInkhaven)

Inkhaven is a standalone terminal application for writing books and long-form technical documentation. It pairs a full-screen Typst editor with a local semantic index, an AI writing assistant, versioned snapshots, and a backup pipeline — so the entire writing workflow lives inside one binary, without leaving the terminal.

Your manuscript is organised as a hierarchy of .typ files (Book → Chapter → Subchapter → Paragraph), with first-class image (.png / .jpg / …), HJSON data (.hjson), and Bund script (.bund) leaves alongside paragraphs. Inkhaven stores metadata in a local DuckDB database, indexes every text node for full-text and semantic search, keeps versioned snapshots, embeds the Bund scripting language for hooks + custom rules, and streams answers from your chosen LLM provider — six are bundled (Gemini, Claude, OpenAI, DeepSeek, Grok, Ollama) and any model genai routes is one HJSON line away.

Inkhaven screenshot

Latest release · 1.3.7 — Close the loop: AI rewrite-in-place

Read the full notes: Documentation/RELEASE_NOTES/1.3.7.md

The Editorial Pass (1.3.6) finds every problem and jumps you to it; 1.3.7 lets the AI fix the prose-level ones. Pure-Rust, no new dependencies.

f — rewrite-in-place

In the Ctrl+V Shift+R Editorial Pass cockpit, a marks the rewritable findings — echo (vary the over-repeated word), pacing (tighten an overlong paragraph), show-don't-tell (rewrite telling to showing). Press f and it opens the finding's paragraph, streams a category-specific AI rewrite, and pops the diff review (the same one the sentence-rhythm rewrite uses): a snapshots the paragraph then replaces it, r discards. The rewrite prompt is yours to tune (3-tier editorial-fix-<category>). Judgment findings — structure, continuity, a fact contradiction, a weak scene — stay jump-only; there's no honest rewrite for "the midpoint sags."

Show-don't-tell joins the worklist

The marquee rewritable category was only a live editor overlay; now the same regex runs over every paragraph in inkhaven edit, emitting a show-tell finding per telling phrase with a paragraph + char-range location — jumpable and f-rewritable. No new detection.

The Editorial Pass (1.3.6)

inkhaven edit is the underlying worklist — one ranked list unifying the editorial doctor classes, plan check's structural findings, the Facts-scan contradictions, and now show-don't-tell. Deterministic and CI-able (--json); inkhaven edit --deep re-runs the AI scans first.

Test stats

Tests 1326 → 1328, zero new dependencies. Tutorial 68 refreshed (the Editorial Pass).

Every prior release lives under Documentation/RELEASE_NOTES/.

Why Inkhaven

  • Terminal-first. Inkhaven runs over SSH, in tmux, on a tiling WM — no browser, no Electron. The TUI uses ratatui and tui-textarea.
  • Your manuscript is plain files. A paragraph lives in a .typ file on disk; the metadata database tracks hierarchy and search but the prose is text — you can read it, diff it, version-control it, and edit it with another tool any time.
  • Semantic search out of the box. Embeddings via fastembed and HNSW are computed locally. Search for "the moment the lighthouse fails" and find the paragraph even if it never uses those exact words.
  • AI is a co-author you steer. Inferences stream live; you control the scope (selection / paragraph / subchapter / chapter / book), the mode (Local-only RAG vs. Full general knowledge), and the destination (replace, insert, top, bottom, copy, grammar-apply). Inkhaven does NOT provide inherent privacy when external providers (Gemini / Claude / OpenAI / DeepSeek / Grok) are used — prompts travel to their servers under their terms. For privacy, set llm.default_provider: "ollama" and run a local model; every other inkhaven subsystem (RAG embedding, semantic search, snapshot diff) is already on-device.
  • Multilingual. Snowball stemmers and multilingual embeddings make Russian, German, French, Spanish, Italian and others first-class. The shipped defaults cover English and Russian.
  • Help, characters, places, artefacts, scripts — built in. Nine system books are seeded on every project: Notes, Research, Prompts, Places, Characters, Artefacts, Typst, Scripts, Help. Mentions of names from the lexicon books light up in the editor (cyan / amber / peach / underline). Ctrl+B P / C / Y / G query each via RAG. F1 answers questions about Inkhaven itself by RAG over Help. Scripts (added in 1.2) holds .bund source files auto-loaded into the embedded Bund scripting VM at project open — see Documentation/Bund/.
  • First-class images. Drop PNG / JPG / WebP / SVG into the tree; Book assembly emits the right wrap_image_* calls and ships the bytes into the typst tree. Ctrl+B P inside #image("…") opens a sibling picker. Enter on an Image row pops a ratatui-image preview (kitty / sixel / iterm2 / half-block).
  • From buffer to PDF in two chords. Ctrl+B A assembles your tree into a typst-compilable directory; Ctrl+B B compiles it; Ctrl+B O builds and copies the PDF into your shell's cwd as <book>-YYYYDDMM-HHMM.pdf. Compile failures route the captured stderr into a fresh AI chat with a typst-aware system prompt.

Features at a glance

Editor

  • Typst syntax highlighting via tree-sitter-typst.
  • Regex find / replace with same-line current-match highlighting.
  • Split-edit with versioned snapshots — see two versions of a paragraph side by side, accept either.
  • Word-aware navigation and deletion shortcuts.
  • Vertical block selection (Alt+arrows) with rectangular copy.
  • System-clipboard cut / copy / paste, plus per-doc undo / redo.
  • Live "changes since last save" bolding; grammar-correction highlights what changed after a g apply.

Tree

  • Multi-level folding ( / / Z / X).
  • Per-kind row colours (book / chapter / subchapter / paragraph / image)
    • open-paragraph marker.
  • Plain-letter shortcuts for add (B/C/V/A/S/+/P), delete (D/-), reorder (U/J).
  • Document status badge column — one character per row colour- coded to the workflow stage (n / 1 / 2 / 3 / F / R).
  • Mouse: click to focus + select; scroll wheel scrolls.

AI pane

  • Streaming markdown rendering — bold / italic / headings / code / lists.
  • Six scope modes (cycled by F9): None, Selection, Paragraph, Subchapter, Chapter, Book — each prepends the matching content to the next prompt.
  • Two inference modes (F10): Local (use only supplied context) and Full (augment with general knowledge). Help inferences are pinned to Local automatically.
  • Persistent chat history with one-key clear (Ctrl+B C).
  • Full-screen AI layout (Ctrl+B K) — AI pane + scrollable chat history + AI prompt; persisted to .inkhaven-chat.json between sessions; Ctrl+F searches; Ctrl+C enters a turn-selection mode.
  • Lexicon RAGCtrl+B P / C / G / Y in the editor sweep the selection through Places / Characters / Notes / Artefacts and prepend the lookup to the next AI prompt.
  • F1 Help-manual floating query → grounded answer over the Help book. inkhaven import-typst-help seeds Help with a curated typst reference.
  • F7 Grammar check with deterministic correction extraction (g replaces the buffer with just the corrected text, preserving Typst markup).

Storage and backup

  • DuckDB metadata + DuckDB blobs + HNSW semantic vectors. No inverted full-text index — search is semantic-only via embedded vectors.
  • Snapshots: F5 captures the buffer; F6 opens the snapshot history picker.
  • inkhaven backup --out <dir> zips the entire project.
  • inkhaven restore <archive> --to <dir> puts it back.
  • Auto-backup on TUI exit when the last backup is older than backup.max_age (humantime: 7d, 12h, 30m, …) — splash screen with a progress bar.
  • Session persistence: cursor position, focus, tree-scroll, open paragraph all survive restarts. Per-paragraph cursor memory: switch around and every paragraph remembers where you were.

CLI tools

  • init — set up a fresh project (interactive confirmation if the directory exists).
  • add / delete / mv / list — manage the hierarchy from a script.
  • search "phrase" — semantic search from the shell.
  • reindex — re-walk .typ files into the database.
  • export typst / export pdf — produce a single Typst manuscript or a built PDF.
  • import-help --documents-directory <dir> — populate the Help book from a directory of markdown / text / typst files (wipes Help first).
  • backup / restore — see above.
  • ai "prompt" — one-shot inference from the shell (no TUI).

Configuration

A single inkhaven.hjson in each project root drives every knob: embedding model, LLM providers, autosave cadence, sync interval, hierarchy depth, language, snowball stemmers, the full visual theme (per-pane backgrounds and foregrounds, all syntax colours, lexicon highlight colours), key bindings, and backup policy.

Install

Inkhaven ships as a single static binary per platform. Three install paths:

1. cargo binstall (no compile)

If you already have cargo-binstall:

cargo binstall inkhaven

cargo-binstall reads [package.metadata.binstall] from Cargo.toml, picks the right asset off GitHub Releases, and drops the binary into ~/.cargo/bin. Works on Linux (x86_64), macOS (Intel + Apple Silicon), and Windows (x86_64).

2. GitHub Releases (direct download)

Grab the tarball for your platform from Releases, unpack, and put inkhaven somewhere on your PATH. Builds are produced by the release.yml workflow on every tag push.

3. cargo install inkhaven (compile from crates.io)

cargo install inkhaven

Inkhaven is published on crates.io — every release tag pushes a new version (latest: 1.2.19). The first build takes ~10 minutes on a modern laptop because of DuckDB + fastembed + ONNX-runtime compilation; cargo binstall above is the fast path.

4. cargo install --git (compile from a specific tag)

cargo install --git https://github.com/vulogov/blackInkhaven --tag v1.2.19

Useful when you want a specific tag, a pre-release branch, or a local fork.

Quick start

# Build (if installing from source)
cargo build --release

# Initialise a project (asks for confirmation if the directory exists)
./target/release/inkhaven init ~/Books/my-novel

# Build the hierarchy from the CLI…
./target/release/inkhaven --project ~/Books/my-novel add book "My Novel"
./target/release/inkhaven --project ~/Books/my-novel \
    add chapter "The Beginning" --parent my-novel
./target/release/inkhaven --project ~/Books/my-novel \
    add paragraph "Opening Scene" --parent my-novel/the-beginning

# …or skip the CLI and add everything from the TUI
./target/release/inkhaven --project ~/Books/my-novel
# Inside the TUI: B (book), C/V (chapter), A/S (subchapter), +/P (paragraph)

Use cases

  • Long-form fiction. Hierarchy fits novels naturally (Book → Part → Chapter → Scene). Places / Characters / Research system books keep worldbuilding next to prose.
  • Technical documentation. Each chapter is a .typ file; the tree doubles as a table of contents. Semantic search makes "where did I document the retry policy?" a one-keystroke question.
  • Translation work. Multilingual embeddings + per-language Snowball stemmers let you keep source and target in two parallel books.
  • Research notebooks. Snapshots track how a draft evolved; the AI pane can summarise a chapter when you come back after a week.
  • Help and onboarding writing. Ship docs as a directory and let Inkhaven build a Help book your readers can query through F1.

Documentation

The full docs live under Documentation/.

Start here:

Reference:

Built with

Licence

Apache 2.0 — see LICENSE.

Security Warning and Disclaimer

Inkhaven is provided "AS IS" with no warranty. The author cannot be held liable for personal, business, or financial damage arising from its use. Use is voluntary and at your own risk.

Before opening a project file you did not author — and before relying on Inkhaven for work you cannot afford to lose — please read Documentation/SECURITY_WARNING.md. It enumerates the security issues catalogued in the 1.2.15 audit (both fixed and pending), the design properties that are inherent rather than bugs, the unknown-risk classes that no audit can fully eliminate, and the limitation-of-liability terms under which Inkhaven is distributed.