Umbra & Penumbra - Next-Generation Native macOS Code Editor

A fast macOS code editor and engine.

Umbra ships with Java and Gradle tooling, .http requests, Git, and Markdown preview. Penumbra is the Swift engine underneath.

Umbra editing a Java file with project explorer, minimap, and breadcrumbs

Languages and tools

Umbra app icon

Umbra, the editor app

A Sublime Text-style editor for macOS: open a folder, edit fast, and stay in one window for Java projects, API calls, docs, Git, and an AI coding agent. No Electron, no LSP server to configure for Java.

Java and Gradle

Native JavaIntelligence indexes your JDK, project sources, and Gradle-resolved JARs. Sync a trusted Gradle build to load modules, dependencies, and source sets, then build from the editor and see compiler errors in the Problems panel.

  • Smart completion with auto-import and parameter hints
  • Hover with Javadoc, go to definition, implementation, and super method
  • Find usages, rename, and type hierarchy
  • javac diagnostics, quick fixes, and optimize imports
  • Gradle tool window: tasks, dependencies, source sets, reload and run
  • Saved run configurations and classpath launch targets
  • Completion
  • Gradle sync
  • Build project
  • Run configs

HTTP client

Edit IntelliJ-style .http request files with tree-sitter highlighting. Place the caret on a request and send it; status, timing, headers, and body appear in the response panel.

  • .http files
  • Send at caret
  • Response panel

Markdown preview

Side-by-side Markdown editing with live preview, fenced code highlighting, blockquotes, and Mermaid sequence, class, and flow diagrams.

  • Live preview
  • Mermaid
  • Fenced code

Git and source control

File status colors in the explorer, a source-control panel for stage and commit, inline diffs, history, branch switch, push, and fast-forward pull.

  • Status colors
  • Diff
  • History

AI coding agent

Built on AgentKit: chat with local or cloud models, run tools against your project, and review file edits with accept or revert before they land on disk.

  • Agent
  • File edits
  • Local models

Editing and workbench

Tree-sitter highlighting for Swift, JS/TS, Python, JSON, YAML, HTML, and more. Multi-cursor editing, column selection, find and replace, optional Metal rendering, minimap, and folding.

  • Split editors, tab groups, and session restore
  • Integrated terminal and Problems panel (⌘⇧M)
  • Command palette, go to file, symbol, and line
  • Structure view, breadcrumbs, and navigation history
  • Multi-cursor
  • Splits
  • Terminal
  • ⌘P palette

Penumbra, the framework

Forked from Runestone and ported to macOS. Use the Swift package in your own AppKit app: text engine, Editor Intelligence platform, LSP bridge, and workbench layout APIs.

Text engine

AppKit-native editing with optional Metal rendering and piece-tree storage for large files.

  • Multi-cursor
  • Tree-sitter
  • Minimap
  • Folding

Editor Intelligence

Completion, hover, diagnostics, navigation, and rename through a provider-based platform.

  • LSP
  • Indexing
  • Command palette

Workbench

Split panes, tab groups, session restore, and native AppKit bridge views for IDE chrome.

JavaIntelligence

A separate Swift package wired into Umbra: JDK discovery, Gradle models, completion, diagnostics, navigation, refactoring, and semantic highlighting with no Penumbra dependency.

Umbra in action

Java and SwiftUI editing with live iOS Simulator preview, class diagrams, Markdown preview, Git source control, Gradle and terminal tooling, and an AI coding agent — all in one native macOS window.

Umbra Java class diagram blueprint showing types and relationships
Java class diagram blueprint

Get started

Download a release build of Umbra, or run it from source. To embed the editor engine in your own app, add Penumbra as a Swift package dependency.

Umbra app
GitHub Releases or swift run Umbra
Platform
macOS 26+, Swift 6.2, Xcode 26+
Tests
1,050+ in swift test
Package.swift
dependencies: [
    .package(url: "https://github.com/alex-cova/Penumbra.git", branch: "main")
]

.target(
    name: "YourAppTarget",
    dependencies: [
        .product(name: "Penumbra", package: "Penumbra"),
        .product(name: "EditorIntelligence", package: "Penumbra"),
        .product(name: "EditorIntelligenceLSP", package: "Penumbra"),
        .product(name: "PenumbraLanguages", package: "Penumbra")
    ]
)
AppKit
import AppKit
import Penumbra

let textView = TextView(frame: CGRect(x: 0, y: 0, width: 800, height: 600))
textView.theme = DefaultTheme()
textView.showLineNumbers = true
textView.isLineWrappingEnabled = true
textView.showMinimap = true
textView.isLineFoldingEnabled = true
textView.isMetalRenderingEnabled = true
textView.text = "// Welcome to Penumbra on macOS!"