Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

leandrocp/lumis

Syntax Highlighter powered by Tree-sitter and Neovim themes.

leandrocp/lumis.json
{
"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

Lumis Syntax Highlighter

lumis.sh - docs

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
Ruby with Catppuccin Frappe theme SQL with GitHub Light theme
Terminal window
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());
RuntimeInstallPackageDocs
CLIcargo install lumis-clicrates.io/lumis-cli[README.md]!(crates/lumis-cli/README.md)
Rustcargo add lumiscrates.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
JavaScriptnpm install @lumis-sh/lumisnpmjs.com/@lumis-sh/lumis[README.md]!(packages/javascript/lumis/README.md)
Browsers / CDNnpm install @lumis-sh/lumisnpmjs.com/@lumis-sh/lumis[README.md]!(packages/javascript/lumis/README.md)
Javaio.roastedroot:lumis4j:0.0.7io.roastedroot/lumis4jREADME.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-version is the major-minor version of the compatible Tree-sitter release
  • seq is 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]!(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