This package provides:
This package consumes:
Made for Pulsar!
This package was written specifically for Pulsar and did not exist in the Atom package repository.
Run code interactively with Jupyter kernels. Supports Python, R, JavaScript, and other languages with rich output including plots, images, HTML, and LaTeX.

To install hydrogen-next search for hydrogen-next in the Install pane of the Pulsar settings or run ppm install hydrogen-next. Alternatively, you can run ppm install asiloisad/pulsar-hydrogen-next to install a package directly from the GitHub repository.
When multiple kernels are available for a language, you can specify which kernel to use with a magic comment <comment>:: kernelname on the first line. The comment character is automatically detected based on the language:
#:: python3
import numpy as np
//:: deno
console.log("Hello from Deno");
Matching rules:
python3 not Python3)jupyter kernelspec list (e.g., python3)Python 3.13)If no match is found, falls back to normal behavior (picker or auto-select).
In the kernel picker, press Ctrl+Enter to insert the selected kernel as a magic comment instead of starting it.
Connect to remote or local Jupyter servers by configuring kernel gateways in settings.
Example of local jupyter server:
jupyter server --ServerApp.token='test123'
In the hydrogen-next settings, add gateway entries as JSON:
[
{
"name": "Local Jupyter",
"options": {
"baseUrl": "http://localhost:8888"
}
}
]
Use Hydrogen: Connect to Remote Kernel command to select a gateway and kernel.
When you run code without a selection, hydrogen-next intelligently detects what to execute based on cursor position.
(), [], {}| Cursor Position | What Gets Executed |
|---|---|
On def/class line |
Entire function/class (with decorators) |
On @decorator line |
Decorated function/class |
On if/elif/else line |
Entire if-elif-else chain |
On try/except/finally line |
Entire try block |
On for/while line |
Loop with optional else |
On with/match line |
Entire block |
| Inside body | Single line only |
| Cursor Position | What Gets Executed |
|---|---|
On line ending with [, (, { |
Entire bracket block |
On line starting with ], ), } |
Entire bracket block |
| Inside bracket block | Single line only |
# Cursor on "if" → executes entire if-elif-else
if x > 0:
print("positive")
elif x < 0:
print("negative")
else:
print("zero")
# Cursor on "print" inside body → executes only that line
if x > 0:
print("positive") # ← cursor here = single line
# Cursor on "[" → executes entire list
data = [
1,
2,
3,
]
# Cursor on "2," inside list → executes only "2,"
data = [
1,
2, # ← cursor here = single line
3,
]
This allows you to execute entire blocks from control lines, while still being able to inspect individual lines inside bodies.
Click on output results to interact with them:
| Action | Effect |
|---|---|
| Click | Copy to clipboard (image or text) |
| Ctrl+Click (Cmd+Click on macOS) | Open in editor (images open in image-editor) |
Images opened via Ctrl+Click are displayed in the image-editor package with full editing capabilities (zoom, pan, filters, save-as).
The package provides a hydrogen.provider service for other packages to interact with Jupyter kernels.
In your package.json:
{
"consumedServices": {
"hydrogen.provider": {
"versions": {
"^1.3.0": "consumeHydrogen"
}
}
}
}
In your package:
module.exports = {
consumeHydrogen(hydrogen) {
this.hydrogen = hydrogen;
},
async example() {
const kernel = this.hydrogen.getActiveKernel();
const result = await kernel.execute("print('Hello')");
console.log(result.status); // 'ok' or 'error'
}
};
| Method | Description |
|---|---|
getActiveKernel() |
Get the kernel for the active editor |
onDidChangeKernel(callback) |
Subscribe to kernel changes |
getCellRange(editor) |
Get the current cell range |
| Method | Description |
|---|---|
execute(code) |
Execute code, returns Promise<{status, outputs, error}> |
executeWithCallback(code, callback) |
Execute with streaming callback |
| Property/Method | Description |
|---|---|
executionState |
Current state: 'idle', 'busy', 'starting' |
executionCount |
Current execution count |
lastExecutionTime |
Last execution time string (e.g., "1.23s") |
onDidChangeExecutionState(callback) |
Subscribe to state changes, returns Disposable |
interrupt() |
Interrupt running execution |
restart([callback]) |
Restart the kernel |
shutdown() |
Shutdown the kernel |
| Method | Description |
|---|---|
complete(code) |
Get completions, returns Promise<{matches, ...}> |
inspect(code, cursorPos) |
Get documentation, returns Promise<{data, found}> |
| Property/Method | Description |
|---|---|
language |
Kernel language (e.g., "python") |
displayName |
Kernel display name (e.g., "Python 3") |
kernelSpec |
Full kernel spec object |
getConnectionFile() |
Path to kernel connection file |
| Method | Description |
|---|---|
onDidDestroy(callback) |
Called when kernel is destroyed |
addMiddleware(middleware) |
Add execution middleware |
async function runCode(hydrogen) {
const kernel = hydrogen.getActiveKernel();
// Simple execution
const result = await kernel.execute("x = 42\nprint(x)");
if (result.status === "ok") {
console.log("Outputs:", result.outputs);
} else {
console.error(`${result.error.ename}: ${result.error.evalue}`);
}
// Monitor state
const disposable = kernel.onDidChangeExecutionState((state) => {
console.log("Kernel state:", state);
});
// Get completions
const completions = await kernel.complete("import nu");
console.log(completions.matches); // ['numpy', 'numbers', ...]
// Cleanup
disposable.dispose();
}
hydrogen-next exposes a shared module that allows dependent packages (like jupyter-next) to reuse kernel management and rendering components.
External packages can register their kernels with hydrogen-next, making them visible to tools like Variable Explorer, Kernel Monitor, and Inspector:
const hydrogen = atom.packages.getLoadedPackage('hydrogen-next');
const shared = require(path.join(hydrogen.path, 'lib', 'shared'));
// Register a kernel
shared.registerKernel(kernel, filePath, editor, grammar);
// Set as current kernel (for Variable Explorer, etc.)
shared.setCurrentKernel(kernel);
// Unregister on shutdown
shared.unregisterKernel(kernel);
| Category | Exports |
|---|---|
| Kernel | KernelManager, registerKernel, unregisterKernel, setCurrentKernel, getStore |
| Output Rendering | Display, Output, RichMedia, StreamText, KernelOutputError |
| Output Utilities | reduceOutputs, normalizeOutput, getBestMimeType, truncateOutput |
| ANSI Handling | AnsiText, escapeCarriageReturn |
| Timing | formatExecutionTime, createExecutionTimeTracker |
| Utilities | kernelSpecProvidesGrammar, tildify, sanitizeHtml |
Got ideas to make this package better, found a bug, or want to help add new features? Just drop your thoughts on GitHub — any feedback's welcome!