Crates.io npm Hex.pm Maven Central License
- 110+ Tree-sitter languages - Fast, accurate, and updated syntax parsing
- 250+ built-in Neovim themes - Updated and curated themes from the Neovim community
- 6 runtimes - CLI, Rust, Elixir, JavaScript, Browsers / CDN, Java
- Multiple outputs - HTML (inline/linked), Terminal (ANSI), Multi-theme (light/dark), BBCode, and custom formatters
- Language auto-detection - File extension, shebang, and emacs-mode support
- Streaming-friendly - Handles incomplete code
cargo install lumis-cli lumis highlight app.js --theme dracula
use lumis::{highlight, HtmlInlineBuilder, languages::Language, themes}; let theme = themes::get("dracula").unwrap(); let formatter = HtmlInlineBuilder::new() .language(Language::Javascript) .theme(Some(theme)) .build() .unwrap(); let html = highlight("const x = 1", formatter);
Works in JavaScript runtimes including Node.js, Bun, and Deno.
import { highlight } from '@lumis-sh/lumis' import { htmlInline } from '@lumis-sh/lumis/formatters' import javascript from '@lumis-sh/lumis/langs/javascript' import dracula from '@lumis-sh/themes/dracula' const html = await highlight('const x = 1', htmlInline({ language: javascript, theme: dracula }))
Works in Browsers through bundlers or CDN imports.
import { highlight } from 'https://esm.sh/@lumis-sh/lumis' import { htmlInline } from 'https://esm.sh/@lumis-sh/lumis/formatters' import javascript from 'https://esm.sh/@lumis-sh/lumis/langs/javascript' import dracula from 'https://esm.sh/@lumis-sh/themes/dracula' const html = await highlight('const x = 1', htmlInline({ language: javascript, theme: dracula }))
Lumis.highlight!("const x = 1", formatter: {:html_inline, language: "javascript", theme: "dracula"})
By @andreaTP. More details at https://chicory.dev/blog/syntax-highlight
import io.roastedroot.lumis4j.core.Lumis; import io.roastedroot.lumis4j.core.Lang; import io.roastedroot.lumis4j.core.Theme; var lumis = Lumis.builder().build(); var highlighter = lumis.highlighter() .withLang(Lang.JAVASCRIPT) .withTheme(Theme.DRACULA) .build(); var result = highlighter.highlight("const x = 1"); System.out.println(result.string());
| Runtime | Install | Package | Docs |
|---|---|---|---|
| CLI | cargo install lumis-cli |
crates.io/lumis-cli | README.md |
| Rust | cargo add lumis |
crates.io/lumis | README.md • docs.rs |
| Elixir | {:lumis, "~> 0.3"} |
hex.pm/lumis | README.md • hexdocs |
| JavaScript | npm install @lumis-sh/lumis |
npmjs.com/@lumis-sh/lumis | README.md |
| Browsers / CDN | npm install @lumis-sh/lumis |
npmjs.com/@lumis-sh/lumis | README.md |
| Java | io.roastedroot:lumis4j:0.0.7 |
io.roastedroot/lumis4j | README.md |
Every Lumis package is built around the same three pieces:
- themes extracted from Neovim
- languages backed by Tree-sitter grammars
- formatters that turn highlighted tokens into output
Given some source code, Lumis parses it with the selected Tree-sitter language, resolves styles from the chosen theme, and then formats the highlighted result into HTML, ANSI, or any custom output.
The npm WASM package versions follow the pattern <tree-sitter-version>.<seq> where:
tree-sitter-versionis the major-minor version of the compatible Tree-sitter releaseseqis a patch number for Lumis own updates
For example, @lumis-sh/wasm-rust@0.26.0 is the first published version compatible with Tree-sitter 0.26,
while @lumis-sh/wasm-javascript@0.26.1 is a patch update compatible with Tree-sitter 0.26 (usually containing upstream parser updates).
Contributions are welcome. Feel free to open issues or PRs for bugs, features, new themes, or languages.
See CONTRIBUTING.md
- Makeup for setting up the baseline for the Elixir package
- Inkjet for the Rust implementation in the initial versions
- Shiki and syntect for the hard work defining how syntax highlighters should work
MIT