leandrocp/lumis
{ "createdAt": "2025-02-14T19:40:42Z", "defaultBranch": "main", "description": "Syntax Highlighter powered by Tree-sitter and Neovim themes.", "fullName": "leandrocp/lumis", "homepage": "https://lumis.sh", "language": "CSS", "name": "lumis", "pushedAt": "2026-06-18T03:34:26Z", "stargazersCount": 95, "topics": [ "cli", "code-highlighter", "elixir", "java", "neovim", "rust", "syntax-highlighter", "syntax-highlighting", "tree-sitter", "tree-sitter-highlight" ], "updatedAt": "2026-06-17T11:29:23Z", "url": "https://github.com/leandrocp/lumis"}Lumis
Features
Section titled “Features”- 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
Quick Start
Section titled “Quick Start”cargo install lumis-cli
lumis highlight app.js --theme draculause 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());Documentation
Section titled “Documentation”| Runtime | Install | Package | Docs |
|---|---|---|---|
| CLI | cargo install lumis-cli | crates.io/lumis-cli | [README.md]!(crates/lumis-cli/README.md) |
| Rust | cargo add lumis | crates.io/lumis | [README.md]!(crates/lumis/README.md) • docs.rs |
| Elixir | {:lumis, "~> 0.3"} | hex.pm/lumis | [README.md]!(packages/elixir/lumis/README.md) • hexdocs |
| JavaScript | npm install @lumis-sh/lumis | npmjs.com/@lumis-sh/lumis | [README.md]!(packages/javascript/lumis/README.md) |
| Browsers / CDN | npm install @lumis-sh/lumis | npmjs.com/@lumis-sh/lumis | [README.md]!(packages/javascript/lumis/README.md) |
| Java | io.roastedroot:lumis4j:0.0.7 | io.roastedroot/lumis4j | README.md |
Architecture
Section titled “Architecture”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.
WASM Versions
Section titled “WASM Versions”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).
Contributing
Section titled “Contributing”Contributions are welcome. Feel free to open issues or PRs for bugs, features, new themes, or languages.
See [CONTRIBUTING.md]!(CONTRIBUTING.md)
Acknowledgements
Section titled “Acknowledgements”- 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
License
Section titled “License”MIT