Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 24 additions & 24 deletions blog/2026-08-15-nushell_v0_115_0.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Today, we're releasing version 0.115.0 of Nu. This release brings a major YAML r

# Where to get it

Nu 0.115.0 is available as [pre-built binaries](https://github.com/nushell/nushell/releases/tag/0.115.0) or from [crates.io](https://crates.io/crates/nu). If you have Rust installed you can install it using `cargo install nu`.
Nu 0.115.0 is available as [pre-built binaries](https://github.com/nushell/nushell/releases/tag/0.115.0) or from [crates.io](https://crates.io/crates/nu). If you have Rust installed, you can install it using `cargo install nu`.

As part of this release, we also publish a set of optional [plugins](https://www.nushell.sh/book/plugins.html) you can install and use with Nushell.

Expand Down Expand Up @@ -56,11 +56,11 @@ As always, a big shoutout to everyone contributing and making Nushell better. Th

### YAML got a proper rework <JumpToc/> <PrBy :pr="18487" user="cptpiepmatz" />

YAML has been a problem child for quite some time now. This release replaces the old `serde_yaml`-based implementation with a new one built on `serde-saphyr` and `granit-parser`. With that we now get clearer YAML behavior, better round-tripping, proper tag support, multi-document streams, anchors, aliases, merge keys, and a few new options for configuring how the output should look like.
YAML has been a problem child for quite some time now. This release replaces the old `serde_yaml`-based implementation with a new one built on `serde-saphyr` and `granit-parser`. With that, we now get clearer YAML behavior, better round-tripping, proper tag support, multi-document streams, anchors, aliases, merge keys, and a few new options for configuring how the output should look like.

#### Breaking changes

The big breaking change is that Nu no longer tries to parse YAML as an awkward mix of YAML 1.1 and YAML 1.2. We now default to YAML 1.2, which is usually the the less crazy choice. If your files or scripts relied on old YAML 1.1 scalar magic, pass `--spec 1.1`.
The big breaking change is that Nu no longer tries to parse YAML as an awkward mix of YAML 1.1 and YAML 1.2. We now default to YAML 1.2, which is usually the less crazy choice. If your files or scripts relied on old YAML 1.1 scalar magic, pass `--spec 1.1`.

```nushell
use std/assert
Expand Down Expand Up @@ -90,7 +90,7 @@ assert equal ("0247" | from yaml --spec 1.2) 0247
assert equal ("0o247" | from yaml --spec 1.2) 0o247
```

Did you know that YAML 1.1 supports sexagesimal values like `190:20:30`? No, well in the 1.1 spec these as base-60 numbers that can be used to represent time but noone knows that, so 1.2 got rid of them. And as Nushell now defaults to 1.2 we interpret these as strings.
Did you know that YAML 1.1 supports sexagesimal values like `190:20:30`? No, well, in the 1.1 spec, these are base-60 numbers that can be used to represent time, but no one knows that, so 1.2 got rid of them. And as Nushell now defaults to 1.2, we interpret these as strings.

```nushell
use std/assert
Expand All @@ -112,7 +112,7 @@ assert equal ("02472256" | from yaml --spec 1.1) 685230
# => {true: enabled}
```

Tags also mean tags now. Previously, tagged scalars weren't really handled properly, often they were just ignored and handled as plain strings but in YAML they describe the data, usually as some types. Now unknown tags error by default but you can use `--ignore-tags` to just ignore the tags and deal with them yourself.
Tags also mean tags now. Previously, tagged scalars weren't really handled properly; often they were just ignored and handled as plain strings, but in YAML they describe the data, usually as some types. Now unknown tags error by default, but you can use `--ignore-tags` to just ignore the tags and deal with them yourself.

```nushell
'Key: !Sub ${AWS::StackName}' | from yaml
Expand Down Expand Up @@ -148,7 +148,7 @@ modified: !!timestamp 2026-08-14T23:30:19.144306+02:00
path: !cell-path $.items.0.name
```

Here, `!filesize` and `!cell-path` are Nushell tags, while `!!timestamp` is a standard YAML tag. When you read this back with `from yaml`, those fields come back as proper typed values instead of plain strings or integers.
Here, `!filesize` and `!cell-path` are Nushell tags, while `!!timestamp` is a standard YAML tag. When you read this back with `from yaml`, those fields come back as properly typed values instead of plain strings or integers.

If you want the YAML version and Nushell tag prefix written out explicitly, use `to yaml --add-directives` or `to yaml -d`.

Expand Down Expand Up @@ -217,7 +217,7 @@ name: prod

#### Anchors, aliases, and merge keys

Anchors and aliases are handled more completely now, including merge keys. Previously this just did not work at all.
Anchors and aliases are handled more completely now, including merge keys. Previously, this just did not work at all.

```yaml
defaults: &defaults
Expand Down Expand Up @@ -372,7 +372,7 @@ In addition to the current closure syntax, `any` and `all` can now be given row
[9 8 7 6] | enumerate | any item == index * 2
```

Just like with `where`, you can reference column names directly, and use the `$it` variable to construct predicates given to both commands, or continue to use closures for more extensive constructions.
Just like with `where`, you can reference column names directly and use the `$it` variable to construct predicates given to both commands, or continue to use closures for more extensive constructions.

```nushell
[1sec 1min 1hr] | all ($it | describe) == 'duration'
Expand Down Expand Up @@ -553,7 +553,7 @@ true
### Improved completion caching, dispatch, and reliability <JumpToc/> <PrBy :pr="18761" user="philocalyst" />

- Added `$env.config.completions.cache_size` (default: `100`) to control that cap.
- Completion results now persist across prompts instead of being discarded on every new prompt,.
- Completion results now persist across prompts instead of being discarded on every new prompt.
- Fixed a potential panic when narrowing file/directory completions on a path containing multi-byte (non-ASCII) characters.
- `commandline complete --type` now validates its `--type` argument and no longer panics on an out-of-range cursor.
- `use`, `overlay use`, `export use`, `source-env`, `hide-env`, `attr complete`, and `which` now go through the same completion dispatch as other builtins, fixing inconsistent/missing completions in a few of them
Expand Down Expand Up @@ -608,7 +608,7 @@ job spawn { sleep 1sec; commandline set-prompt $"(git branch --show-current) > "

The amount of memory used to store the last output can be controlled with `$env.config.max_last_result_size`. It accepts a filesize and defaults to `0b`, which disables storing the output in `$ans.last` and makes that part of the feature opt-in. The rest of the `$ans` record remains available.

To enable `$ans.last`, set `$env.config.max_last_result_size` to a reasonable value such as `1Mb`. If the configured limit is reached, the stored output is truncated and a warning is shown when you access it.
To enable `$ans.last`, set `$env.config.max_last_result_size` to a reasonable value such as `1Mb`. If the configured limit is reached, the stored output is truncated, and a warning is shown when you access it.

```ansi :no-line-numbers
> $env.config.max_last_result_size = 10mb
Expand Down Expand Up @@ -657,7 +657,7 @@ $env.config.color_config.selection = { attr: r } # default
$env.config.color_config.selection_cursor = { attr: n } # default
```

With the defaults a block cursor looks as before; `underscore` and `line` cursor shapes are now visible inside selections.
With the defaults, a block cursor looks as before; `underscore` and `line` cursor shapes are now visible inside selections.

### Added KDL v1/v2 support and JSON-in-KDL output <JumpToc/> <PrBy :pr="18779" user="fdncred" />

Expand Down Expand Up @@ -755,12 +755,12 @@ Accessing a small part of a large list, such as `$list.0`, no longer copies the
### Other performance improvements <JumpToc/>

- Improved performance of `str replace --regex` and `str replace --multiline` when working with lists, tables, and records with many string values, roughly a 10x speed boost. ([#18508](https://github.com/nushell/nushell/pull/18508))
- `lines` command with string _value_ (non-stream) input no longer eagerly creates a list. Instead it returns a list stream, producing items lazily just like it does with text/byte stream inputs. ([#18753](https://github.com/nushell/nushell/pull/18753))
- `lines` command with string _value_ (non-stream) input no longer eagerly creates a list. Instead, it returns a list stream, producing items lazily just like it does with text/byte stream inputs. ([#18753](https://github.com/nushell/nushell/pull/18753))
- Using built-in commands with `--regex` parameters should be faster in tight loops now because they are able to use the LRU cache for regex. ([#18797](https://github.com/nushell/nushell/pull/18797))

## Other changes <JumpToc/>

- It is now not allowed to have `export main` in a module that is named to shadow an keyword. This shows and error now. ([#18619](https://github.com/nushell/nushell/pull/18619))
- It is now not allowed to have `export main` in a module that is named to shadow a keyword. This now shows an error. ([#18619](https://github.com/nushell/nushell/pull/18619))
- The default left and right prompts no longer include ansi color escapes if the user has disabled color. ([#18506](https://github.com/nushell/nushell/pull/18506))
- Improved `hash md5` and `hash sha256` help to show that both commands support `list<string>` and `list<binary>` inputs. ([#18638](https://github.com/nushell/nushell/pull/18638))

Expand Down Expand Up @@ -812,15 +812,15 @@ outer

### Fixed negative arguments for `oneof` parameters <JumpToc/> <PrBy :pr="18514" user="Tyarel8" />

Parameters with `int`, `float` and `number` types can be supplied negative arguments:
Parameters with `int`, `float`, and `number` types can be supplied with negative arguments:

```ansi
> def foo [p: int] { $p }
> foo -2
-2
```

However this didn't work with parameters with types like `oneof<int, ...>`:
However, this didn't work with parameters with types like `oneof<int, ...>`:

```ansi :no-line-numbers
> def foo [p: oneof<int, string>] { $p }
Expand Down Expand Up @@ -1016,7 +1016,7 @@ glob --dbg-matches '*/*' '1' # false

### Fixed `scope` commands to include local scopes <JumpToc/> <PrBy :pr="18684" user="fdncred" />

Fixed `scope variables`, `scope commands`, `scope aliases`, `scope modules`, and `scope externs` so they report **both the current local scope and the global/permanent scope**. Nested definitions inside `do`, `if`/`for` bodies, and custom commands now appear while that scope is active (and disappear afterward). Outer variables remain visible inside closures (for example `let a = 1; do { let b = 2; scope variables }` lists both `$a` and `$b`).
Fixed `scope variables`, `scope commands`, `scope aliases`, `scope modules`, and `scope externs` so they report **both the current local scope and the global/permanent scope**. Nested definitions inside `do`, `if`/`for` bodies, and custom commands now appear while that scope is active (and disappear afterward). Outer variables remain visible inside closures (for example, `let a = 1; do { let b = 2; scope variables }` lists both `$a` and `$b`).

### After this change

Expand Down Expand Up @@ -1078,7 +1078,7 @@ let x = "second"

### Fixed `source` losing visibility of outer variables <JumpToc/> <PrBy :pr="18538" user="fdncred" />

Fixes the bugs found when a script or REPL input used `source` to run a `.nu` file, variables defined before the `source` call could become invisible inside the sourced file, producing a "variable not found" error.
Fixes the bugs found when a script or REPL input used `source` to run a `.nu` file; variables defined before the `source` call could become invisible inside the sourced file, producing a "variable not found" error.

#### Example reproducing the bug

Expand Down Expand Up @@ -1115,7 +1115,7 @@ The same error could also appear in the REPL after re-declaring a variable:
❯ source sss.nu # Error: variable not found
```

After this change the last statement above would print `value 2`. See the tests and the issue to see more variations.
After this change, the last statement above would print `value 2`. See the tests and the issue to see more variations.

### Errors for... `error make`? <JumpToc/> <PrBy :pr="18755" user="Bahex" />

Expand Down Expand Up @@ -1169,9 +1169,9 @@ Error: nu::shell::error

```

So `error make` succeeded instead of throwing an error. Well, it _did_ throw an error, the one user was trying to, not the one it should due to `error make` receiving an invalid argument.
So `error make` succeeded instead of throwing an error. Well, it _did_ throw an error; the one the user was trying to throw, not the one it should throw due to `error make` receiving an invalid argument.

From now on `error make` will raise an error of its own when receiving an invalid argument.
From now on, `error make` will raise an error of its own when receiving an invalid argument.

```ansi :no-line-numbers title="After w/o start + end"
> open first.nu | nu-highlight
Expand Down Expand Up @@ -1318,7 +1318,7 @@ On the commands that make sense, I added int, float, duration, filesize. On othe

### Fixed `math max` on empty streams <JumpToc/> <PrBy :pr="18772" user="fdncred" />

Previously the empty list (top) would display and error but the empty stream (bottom) would not. This should now be fixed.
Previously, the empty list (top) would display an error, but the empty stream (bottom) would not. This should now be fixed.

```nushell
[] | math max
Expand All @@ -1331,7 +1331,7 @@ Nushell now reports **unclosed** and **unbalanced** delimiters with:

- The **kind** of delimiter involved (`{`, `}`, `[`, `]`, `(`, `)`, `"`, `'`, `>`, `|`, …)
- **Where it opened** and **where the closer was expected** (when known)
- Help text that suggests a fix, sometimes with a structure hint (e.g. which `def` or record field is open)
- Help text that suggests a fix, sometimes with a structure hint (e.g., which `def` or record field is open)

Common mistakes such as forgetting `[` before list elements, forgetting `(` before a grouped expression, forgetting `{` after `if`/`while`/`for`/`try`/`match`, or writing bare record fields without `{` point **near the mistake** instead of only at a distant `}` or EOF.

Expand All @@ -1341,7 +1341,7 @@ Common mistakes such as forgetting `[` before list elements, forgetting `(` befo

### Fixed passing quoted `#` strings as script parameters <JumpToc/> <PrBy :pr="18782" user="fdncred" />

Quotes strings with `"#"` in them like `"#00abcd"` are now allowed to be passed as parameters.
Quoted strings with `"#"` in them, like `"#00abcd"`, are now allowed to be passed as parameters.

#### Example

Expand Down Expand Up @@ -1372,7 +1372,7 @@ Set `event: null` on a matching binding to unbind a key.
- Fixed `idx` so deleted files and directories no longer appear as live index entries. ([#18673](https://github.com/nushell/nushell/pull/18673))
- Fixed watched `idx import` runtimes so filesystem changes appear consistently in listings, find results, status, content search, and watch events. ([#18674](https://github.com/nushell/nushell/pull/18674))
- Nushell now reports incompatible right-hand-side uses of `$in` in typed math expressions during parsing, matching the existing behavior for the left-hand side. ([#18723](https://github.com/nushell/nushell/pull/18723))
- With the `dc-glob` experimental option enabled `ls **` now works again. ([#18724](https://github.com/nushell/nushell/pull/18724))
- With the `dc-glob` experimental option enabled, `ls **` now works again. ([#18724](https://github.com/nushell/nushell/pull/18724))
- If you have a broken symlink for startup files in nushell, that should not prevent nushell from starting up with defaults. ([#18726](https://github.com/nushell/nushell/pull/18726))
- Now it's easier to see what the default settings are when you don't have them configured. Show (nearly) all settings in `$env.config`. If you haven't set any, or launched with `nu -n`, it will show defaults. ([#18747](https://github.com/nushell/nushell/pull/18747))
- Fixed `generate` rejecting `null` value pipeline input despite working with "empty" pipeline input. ([#18751](https://github.com/nushell/nushell/pull/18751))
Expand Down