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.
hydrogen-next requires Jupyter kernels to be installed on your system. A kernel is a language-specific backend that executes your code. You can install kernels for many languages — see the full list of available kernels on the Jupyter wiki.
Python is the most common kernel. Install it with:
pip install ipykernel
python -m ipykernel install --user
To register a kernel from a virtual environment, activate it first and install with a display name:
source myenv/bin/activate # Linux/macOS
myenv\Scripts\activate # Windows
pip install ipykernel
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
The --name flag sets the kernel directory name (used in magic comments), and --display-name sets the label shown in the kernel picker. Once registered, the kernel remains available even when the venv is not activated — it points directly to the venv's Python interpreter.
To remove a kernel you no longer need:
jupyter kernelspec uninstall myenv
See the IPython kernel documentation for more details.
Install the IRkernel package from R and register it with Jupyter:
R -e "install.packages('IRkernel'); IRkernel::installspec()"
See the IRkernel documentation for more details.
Several JavaScript runtimes provide Jupyter kernels. For IJavascript:
npm install -g ijavascript
ijsinstall
For Deno, the kernel is built-in:
deno jupyter --install
Install the IJulia package from the Julia REPL:
using Pkg; Pkg.add("IJulia")
To list all installed kernels:
jupyter kernelspec list
For general information on installing and managing kernels, see the Jupyter documentation.
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. After selecting a gateway, you'll be prompted to choose an authentication method:
If you prefer to skip the prompt, you can include the token directly in the gateway config:
[
{
"name": "Local Jupyter",
"options": {
"baseUrl": "http://localhost:8888",
"token": "your-server-token-here"
}
}
]
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).
hydrogen.providerAllows other packages to interact with Jupyter kernels — execute code, get completions, inspect objects, and monitor kernel state.
In your package.json:
{
"consumedServices": {
"hydrogen.provider": {
"versions": {
"^1.3.0": "consumeHydrogen"
}
}
}
}
In your main module:
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!