Nushell
Get Nu!
Getting Started
  • The Nushell Book
  • Command Reference
  • Cookbook
  • Language Reference Guide
  • Contributing Guide
Blog
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
  • 한국어
GitHub
Get Nu!
Getting Started
  • The Nushell Book
  • Command Reference
  • Cookbook
  • Language Reference Guide
  • Contributing Guide
Blog
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
  • 한국어
GitHub

Nushell 0.112.1

Today, we're releasing version 0.112.1 of Nu. This release adds structured markdown parsing with from md, a new % sigil to explicitly call internal commands, and a bunch of new config options to better shape Nu to your workflow, along with improvements to type checking for cell paths.

Note

Some crates failed to release properly, so we skip 0.112.0.

Where to get it

Nu 0.112.1 is available as pre-built binaries or from crates.io. 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 you can install and use with Nushell.

Table of contents

Highlights and themes of this release [toc]

Parse markdown via from md

Breaking change

The from md is considered a breaking change as previously open *.md would return a string.

We added a new from md command that lets you parse markdown into structured data. Instead of manually pulling pieces out of a markdown string and hoping it works, you now get something much more reliable to work with.

Info

Since from commands affect how open behaves, we'd love your input on whether the name still makes sense. Join the discussion on Github and share your thoughts.

Check out the example output here.

No more shadows, call internals with %

Nushell already has the ^ sigil to explicitly call external commands. That way you can still run a binary even if there's a built-in or custom command with the same name.

A lot of people asked for something similar for internal commands and now we have it. Thanks to @fdncred, the new % sigil lets you explicitly call built-ins.

It always uses the initial scope and won't fall back to externals. That means you can reliably call internal commands, even if they're hidden.

> version | get version
0.112.1
> hide version
> version | get version
Error: nu::shell::external_command

  × External command failed
   ╭─[repl_entry #17:1:1]
 1 │ version | get version
   · ───┬───
   ·    ╰── Command `version` not found
   ╰────
  help: Did you mean `version check`?

> %version | get version
0.112.1

More details in the main entry.

Configure Nushell how you like

This release comes with a bunch of new config options to tweak things to your liking.

$env.config.history.path

# history.path (string): Path to the history file.
# If not set, Nushell will use the default location.
# You can also provide a custom path for your history file.
# Examples:
# Use a custom location (e.g., in your home directory):
$env.config.history.path = "~/custom/my-history.txt"
# Default behavior:
# If not set (null), Nushell stores history in the default config directory.
# If set to a directory, the appropriate file name (e.g., history.txt) is used.
# If set to a filename only, the file will be stored in $nu.default-config-dir.

Thanks to @kx0101, you can now choose exactly where your history file lives. This ignores the file format, so make sure your config matches. You can also set it to null to disable history entirely. Read more.

$env.config.history.ignore_space_prefixed

# history.ignore_space_prefixed (bool): Whether commands starting with leading whitespace are saved to history.
# true: Commands starting with one or more spaces or tabs will NOT be saved.
# false: All commands are saved, including those with any amount of leading whitespace.
# Default: true
$env.config.history.ignore_space_prefixed = true

@guluo2016 added an option to control whether commands starting with a space end up in your history. Read more.

$env.config.auto_cd_implicit

# auto_cd_implicit (bool): Gives precedence to auto-cd when command string is
# an existing directory path.
# false: A relative (e.g.  './dirname') or absolute path is required to auto-cd.
# true: If the command string matches a subdirectory in the current directory
# (e.g. 'src'), auto-cd will be triggered without needing './' or '/'.
$env.config.auto_cd_implicit = false

@dxrcy added a config option that lets you automatically cd into directories when you type their name. Read more.

$env.config.hinter.closure

# hinter.closure (closure|null): Custom hint closure.
# Closure input: one record argument {|ctx| ... } where
#   $ctx.line (string): current line buffer
#   $ctx.pos (int): current cursor position
#   $ctx.cwd (string): current working directory
# Return:
#   string -> hint suffix to render and accept
#   record -> {hint: string, next_token?: string} for custom token splitting
#   null   -> no hint (equivalent to "")
# Any closure error or unsupported return type yields no hint.
# To use the built-in hinter instead, set hinter.closure = null in config.
# This closure runs frequently while typing, so keep it lightweight.
# Default: null
$env.config.hinter.closure = null

# Example:
# $env.config.hinter.closure = {|ctx|
#   let last = (history | last 1 | get command_line? | get 0?)
#   if $last == null or not ($last | str starts-with $ctx.line) {
#     null
#   } else {
#     ($last | str substring ($ctx.line | str length)..)
#   }
# }

Thanks to @stuartcarnie, you can now plug in your own hinter using a closure. Read more.

$env.config.table.mode = "frameless"

# table.mode (string): Visual border style for tables.
# One of: "rounded", "basic", "compact", "compact_double", "light", "thin",
# "with_love", "reinforced", "heavy", "none", "psql", "markdown", "dots",
# "restructured", "ascii_rounded", "basic_compact", "single", "double",
# "frameless".
# Can be overridden with `| table --theme/-t`.
# Default: "rounded"
$env.config.table.mode = "rounded"

@Benjas333 added a new table style called "frameless". Take a look here.

$env.config.color_config.binary_*

# color_config.binary_null_char: Style for null characters (\0) in binary hex viewer.
# Default: grey42
$env.config.color_config.binary_null_char = "grey42"

# color_config.binary_printable: Style for printable ASCII characters in binary hex viewer.
# Default: cyan_bold
$env.config.color_config.binary_printable = "cyan_bold"

# color_config.binary_whitespace: Style for whitespace ASCII characters in binary hex viewer.
# Default: green_bold
$env.config.color_config.binary_whitespace = "green_bold"

# color_config.binary_ascii_other: Style for other ASCII characters in binary hex viewer.
# Default: purple_bold
$env.config.color_config.binary_ascii_other = "purple_bold"

# color_config.binary_non_ascii: Style for non-ASCII characters in binary hex viewer.
# Default: yellow_bold
$env.config.color_config.binary_non_ascii = "yellow_bold"

@ian-h-chamberlain added more color options for binary data in the hex viewer in #17887.

Types via cell.paths! - cell-path-types

Experimental option

This feature is behind an experimental option. Run Nushell with --experimental-option=cell-path-types or set before running Nushell the environment variable to NU_EXPERIMENTAL_OPTIONS=cell-path-types.

@blindFS introduced a new experimental option that makes type inference smarter when working with cell paths.

Before this, issues with nested types would only show up at runtime. Now they can already be caught during parsing.

Check out some examples here.

Changes [toc]

Breaking changes [toc]

Parse markdown via from md [toc]

PR #17937 by @fdncred

Info

The introduction of from md caused some discussion whether Nushell should automatically parse text formats like markdown. We want to encourage discussion whether this is a fitting name or not in a Github discussion. Please state your opinion on this.

Added new command from md to parse markdown into an AST. This is considered a breaking change as opening a markdown file now no longer returns a raw string but rather a structured AST.

Use open --raw to open without conversion or hide the command using hide 'from md'.

> '# Title' | from md | table -e
╭───────┬──────────┬────────────────────────────────┬──────────────────┬───────────────────────────────────────────────────────────────────────────────────╮
│     # │   type   │            position            │      attrs       │                                     children                                      │
├───────┼──────────┼────────────────────────────────┼──────────────────┼───────────────────────────────────────────────────────────────────────────────────┤
│     0 │ h1       │ ╭───────┬────────────────╮     │ ╭───────┬───╮    │ ╭───┬──────┬────────────────────────────┬───────────────────┬────────────────╮    │
│       │          │ │       │ ╭────────┬───╮ │     │ │ depth │ 1 │    │ │ # │ type │          position          │       attrs       │    children    │    │
│       │          │ │ start │ │ line   │ 1 │ │     │ │ level │ 1 │    │ ├───┼──────┼────────────────────────────┼───────────────────┼────────────────┤    │
│       │          │ │       │ │ column │ 1 │ │     │ ╰───────┴───╯    │ │ 0 │ text │ ╭───────┬────────────────╮ │ ╭───────┬───────╮ │ [list 0 items] │    │
│       │          │ │       │ ╰────────┴───╯ │     │                  │ │   │      │ │       │ ╭────────┬───╮ │ │ │ value │ Title │ │                │    │
│       │          │ │       │ ╭────────┬───╮ │     │                  │ │   │      │ │ start │ │ line   │ 1 │ │ │ ╰───────┴───────╯ │                │    │
│       │          │ │ end   │ │ line   │ 1 │ │     │                  │ │   │      │ │       │ │ column │ 3 │ │ │                   │                │    │
│       │          │ │       │ │ column │ 8 │ │     │                  │ │   │      │ │       │ ╰────────┴───╯ │ │                   │                │    │
│       │          │ │       │ ╰────────┴───╯ │     │                  │ │   │      │ │       │ ╭────────┬───╮ │ │                   │                │    │
│       │          │ ╰───────┴────────────────╯     │                  │ │   │      │ │ end   │ │ line   │ 1 │ │ │                   │                │    │
│       │          │                                │                  │ │   │      │ │       │ │ column │ 8 │ │ │                   │                │    │
│       │          │                                │                  │ │   │      │ │       │ ╰────────┴───╯ │ │                   │                │    │
│       │          │                                │                  │ │   │      │ ╰───────┴────────────────╯ │                   │                │    │
│       │          │                                │                  │ ╰───┴──────┴────────────────────────────┴───────────────────┴────────────────╯    │
╰───────┴──────────┴────────────────────────────────┴──────────────────┴───────────────────────────────────────────────────────────────────────────────────╯

Other breaking changes [toc]

  • Mutable cell assignment now respects experimental option reorder-cell-paths. (#17696)
  • job tag is now called job describe, the --tag flag in job spawn and the tag column in job list, as tag was renamed to description for these. (#17496)
  • random choice from std-rfc now behaves more similar to first, so that random choice returns a single element and random choice 1 returns a list with one element. (#17983)

Additions [toc]

New flag --list-of-records for to nuon [toc]

PR #17660 by @fdncred

Add support for list-of-records serialization in to nuon command to return tables as a list of records instead of inline tables.

> ls | to nuon --list-of-records
[{name: ".cargo", type: dir, size: 0b, modified: 2026-04-11T14:28:01.485060+02:00}, {name: ".gitattributes", type: file, size: 113b, modified: 2026-04-11T14:28:01.485565900+02:00}, {name: ".githooks", type: dir, size: 0b, modified: 2026-04-11T14:28:01.486572700+02:00}, {name: ".github", type: dir, size: 0b, modified: 2026-04-11T14:28:01.490573100+02:00}, {name: ".gitignore", type: file, size: 834b, modified: 2026-04-11T14:28:01.497597200+02:00}, {name: "AGENTS.md", type: file, size: 2115b, modified: 2026-04-11T14:28:01.498597200+02:00}, {name: "CITATION.cff", type: file, size: 838b, modified: 2026-04-11T14:28:01.498597200+02:00}, {name: "CLAUDE.md", type: symlink, size: 0b, modified: 2026-04-11T14:28:01.499597100+02:00}, {name: "CODE_OF_CONDUCT.md", type: file, size: 3520b, modified: 2026-04-11T14:28:01.499597100+02:00}, {name: "CONTRIBUTING.md", type: file, size: 18714b, modified: 2026-04-11T14:28:01.500597200+02:00}, {name: "Cargo.lock", type: file, size: 257047b, modified: 2026-04-11T14:28:01.501597200+02:00}, {name: "Cargo.toml", type: file, size: 11950b, modified: 2026-04-11T14:28:01.502596700+02:00}, {name: "Cross.toml", type: file, size: 684b, modified: 2026-04-11T14:28:01.502596700+02:00}, {name: LICENSE, type: file, size: 1115b, modified: 2026-04-11T14:28:01.502596700+02:00}, {name: "README.md", type: file, size: 12742b, modified: 2026-04-11T14:28:01.504102900+02:00}, {name: "SECURITY.md", type: file, size: 2710b, modified: 2026-04-11T14:28:01.504102900+02:00}, {name: assets, type: dir, size: 0b, modified: 2026-04-11T14:28:01.512623900+02:00}, {name: ast-grep, type: dir, size: 0b, modified: 2026-04-11T14:28:01.522645800+02:00}, {name: benches, type: dir, size: 0b, modified: 2026-04-11T14:28:01.524151300+02:00}, {name: "clippy.toml", type: file, size: 170b, modified: 2026-04-11T14:28:01.525159300+02:00}, {name: crates, type: dir, size: 0b, modified: 2026-04-11T14:28:02.451098600+02:00}, {name: devdocs, type: dir, size: 0b, modified: 2026-04-11T14:28:02.457631100+02:00}, {name: docker, type: dir, size: 0b, modified: 2026-04-11T14:28:02.458631500+02:00}, {name: "rust-toolchain.toml", type: file, size: 956b, modified: 2026-04-11T14:28:02.459632800+02:00}, {name: "rustfmt.toml", type: file, size: 18b, modified: 2026-04-11T14:28:02.459632800+02:00}, {name: scripts, type: dir, size: 0b, modified: 2026-04-11T14:28:02.466730800+02:00}, {name: "sgconfig.yml", type: file, size: 218b, modified: 2026-04-11T14:28:02.466730800+02:00}, {name: src, type: dir, size: 0b, modified: 2026-04-11T14:28:02.472540600+02:00}, {name: target, type: dir, size: 0b, modified: 2026-04-11T14:30:48.430795700+02:00}, {name: tests, type: dir, size: 0b, modified: 2026-04-11T14:28:02.629683500+02:00}, {name: toolkit, type: dir, size: 0b, modified: 2026-04-11T14:28:02.641237300+02:00}, {name: "toolkit.nu", type: file, size: 61b, modified: 2026-04-11T14:28:02.635231400+02:00}, {name: "typos.toml", type: file, size: 732b, modified: 2026-04-11T14:28:02.642236500+02:00}, {name: wix, type: dir, size: 0b, modified: 2026-04-11T14:28:02.645247500+02:00}]
> ls | to nuon --list-of-records --indent 2
[
  {name: ".cargo", type: dir, size: 0b, modified: 2026-04-11T14:28:01.485060+02:00},
  {name: ".gitattributes", type: file, size: 113b, modified: 2026-04-11T14:28:01.485565900+02:00},
  {name: ".githooks", type: dir, size: 0b, modified: 2026-04-11T14:28:01.486572700+02:00},
  {name: ".github", type: dir, size: 0b, modified: 2026-04-11T14:28:01.490573100+02:00},
  {name: ".gitignore", type: file, size: 834b, modified: 2026-04-11T14:28:01.497597200+02:00},
  {name: "AGENTS.md", type: file, size: 2115b, modified: 2026-04-11T14:28:01.498597200+02:00},
  {name: "CITATION.cff", type: file, size: 838b, modified: 2026-04-11T14:28:01.498597200+02:00},
  {name: "CLAUDE.md", type: symlink, size: 0b, modified: 2026-04-11T14:28:01.499597100+02:00},
  {name: "CODE_OF_CONDUCT.md", type: file, size: 3520b, modified: 2026-04-11T14:28:01.499597100+02:00},
  {name: "CONTRIBUTING.md", type: file, size: 18714b, modified: 2026-04-11T14:28:01.500597200+02:00},
  {name: "Cargo.lock", type: file, size: 257047b, modified: 2026-04-11T14:28:01.501597200+02:00},
  {name: "Cargo.toml", type: file, size: 11950b, modified: 2026-04-11T14:28:01.502596700+02:00},
  {name: "Cross.toml", type: file, size: 684b, modified: 2026-04-11T14:28:01.502596700+02:00},
  {name: LICENSE, type: file, size: 1115b, modified: 2026-04-11T14:28:01.502596700+02:00},
  {name: "README.md", type: file, size: 12742b, modified: 2026-04-11T14:28:01.504102900+02:00},
  {name: "SECURITY.md", type: file, size: 2710b, modified: 2026-04-11T14:28:01.504102900+02:00},
  {name: assets, type: dir, size: 0b, modified: 2026-04-11T14:28:01.512623900+02:00},
  {name: ast-grep, type: dir, size: 0b, modified: 2026-04-11T14:28:01.522645800+02:00},
  {name: benches, type: dir, size: 0b, modified: 2026-04-11T14:28:01.524151300+02:00},
  {name: "clippy.toml", type: file, size: 170b, modified: 2026-04-11T14:28:01.525159300+02:00},
  {name: crates, type: dir, size: 0b, modified: 2026-04-11T14:28:02.451098600+02:00},
  {name: devdocs, type: dir, size: 0b, modified: 2026-04-11T14:28:02.457631100+02:00},
  {name: docker, type: dir, size: 0b, modified: 2026-04-11T14:28:02.458631500+02:00},
  {name: "rust-toolchain.toml", type: file, size: 956b, modified: 2026-04-11T14:28:02.459632800+02:00},
  {name: "rustfmt.toml", type: file, size: 18b, modified: 2026-04-11T14:28:02.459632800+02:00},
  {name: scripts, type: dir, size: 0b, modified: 2026-04-11T14:28:02.466730800+02:00},
  {name: "sgconfig.yml", type: file, size: 218b, modified: 2026-04-11T14:28:02.466730800+02:00},
  {name: src, type: dir, size: 0b, modified: 2026-04-11T14:28:02.472540600+02:00},
  {name: target, type: dir, size: 0b, modified: 2026-04-11T14:30:48.430795700+02:00},
  {name: tests, type: dir, size: 0b, modified: 2026-04-11T14:28:02.629683500+02:00},
  {name: toolkit, type: dir, size: 0b, modified: 2026-04-11T14:28:02.641237300+02:00},
  {name: "toolkit.nu", type: file, size: 61b, modified: 2026-04-11T14:28:02.635231400+02:00},
  {name: "typos.toml", type: file, size: 732b, modified: 2026-04-11T14:28:02.642236500+02:00},
  {name: wix, type: dir, size: 0b, modified: 2026-04-11T14:28:02.645247500+02:00}
]

New command str escape-regex [toc]

PR #17703 by @Juhan280

A new command, str escape-regex, has been added. It allows us to sanitize strings before inserting them into a regular-expression pattern.

# Check if the input matches the data exactly (not using `==` for demonstration)

# User input used directly in a regex
def bad [str: string] {
  $in like $"^($str)$"
}

"hello" | bad ".*"   # true (incorrect)

# Escape the input before inserting it into the regex
def good [str: string] {
  $in like $"^($str | str escape-regex)$"
}

"hello" | good ".*"  # false

Add polars selector ends-with [toc]

PR #17722 by @ayax79

Introduces polars selector ends-with allowing columns to be selected by a suffix:

> {
    "foo": ["x", "y"],
    "bar": [123, 456],
    "baz": [2.0, 5.5],
    "zap": [false, true],
}
| polars into-df --as-columns
| polars select (polars selector ends-with z)
| polars sort-by baz
| polars collect
╭───┬──────╮
│ # │ baz  │
├───┼──────┤
│ 0 │ 2.00 │
│ 1 │ 5.50 │
╰───┴──────╯

This is is part of an effort to add selectors available in the python API.

History file path can now be configured [toc]

PR #17425 by @kx0101

Nushell now supports configuring the history file path using $env.config.history.path. This value can be null or any custom location, which is particularly useful for TTY login scenarios where the --no-history flag cannot be used.

$env.config.history.path = null  # disable history
$env.config.history.path = "/custom/history.txt"  # custom location

New experimental option cell-path-types [toc]

PR #17673 by @blindFS

Experimental option

This feature is behind an experimental option. Run Nushell with --experimental-option=cell-path-types or set before running Nushell the environment variable to NU_EXPERIMENTAL_OPTIONS=cell-path-types.

Added a new experimental option named cell-path-types which enforces type inferencing on cell path expressions like {foo: 1}.foo if enabled. That means the following examples (previously caused runtime errors or ran successfully) will be rejected by the parser:

> let foo: string = [1].0
Error: nu::parser::type_mismatch

  × Type mismatch.
   ╭─[repl_entry #1:1:19]
 1 │ let foo: string = [1].0
   ·                   ──┬──
   ·                     ╰── expected string, found int
   ╰────
> mut foo = {bar: 0}
> $foo.bar = 1.0
Error: nu::parser::operator_incompatible_types

  × Types 'int' and 'float' are not compatible for the '=' operator.
   ╭─[repl_entry #4:1:1]
 1 │ $foo.bar = 1.0
   · ────┬─── ┬ ─┬─
   ·     │    │  ╰── float
   ·     │    ╰── does not operate between 'int' and 'float'
   ·     ╰── int
   ╰────
> let foo = [1]
> def bar [baz: string] { }
> bar $foo.0
Error: nu::parser::type_mismatch

  × Type mismatch.
   ╭─[repl_entry #8:1:5]
 1 │ bar $foo.0
   ·     ───┬──
   ·        ╰── expected string, found int
   ╰────

Implement selector commands for numeric types [toc]

PR #17723 by @ayax79

  • Added command polars selector numeric to select all numeric columns.
  • Added command polars selector integer to select all integer columns.
  • Added command polars selector signed-integer to select signed integer columns.
  • Added command polars selector unsigned-integer to select unsigned integer columns.
  • Added command polars selector float to select unsigned float columns.

Added testbin "bins" to nushell help [toc]

PR #17728 by @fdncred

Updates the nushell command help by adding the testbin "bins" to the nu --help screen. Now you see this output in the --testbin section of the help.

  --testbin <string>
      run an internal test binary (see available bins below)
      Example: nu --testbin cococo
      Available test bins:
      chop -> With no parameters, will chop a character off the end of each line
      cococo -> Cross platform echo using println!()(e.g: nu --testbin cococo a b c)
      echo_env -> Echo's value of env keys from args(e.g: nu --testbin echo_env FOO BAR)
      echo_env_mixed -> Mix echo of env keys from input(e.g: nu --testbin echo_env_mixed out-err FOO BAR; nu --testbin echo_env_mixed err-out FOO BAR)
      echo_env_stderr -> Echo's value of env keys from args to stderr(e.g: nu --testbin echo_env_stderr FOO BAR)
      echo_env_stderr_fail -> Echo's value of env keys from args to stderr, and exit with failure(e.g: nu --testbin echo_env_stderr_fail FOO BAR)
      fail -> Exits with failure code <c>, if not given, fail with code 1(e.g: nu --testbin fail 10)
      iecho -> Another type of echo that outputs a parameter per line, looping infinitely(e.g: nu --testbin iecho 3)
      input_bytes_length -> Prints the number of bytes received on stdin(e.g: 0x[deadbeef] | nu --testbin input_bytes_length)
      meow -> Cross platform cat (open a file, print the contents) using read_to_string and println!()(e.g: nu --testbin meow file.txt)
      meowb -> Cross platform cat (open a file, print the contents) using read() and write_all() / binary(e.g: nu --testbin meowb sample.db)
      nonu -> Cross platform echo but concats arguments without space and NO newline(e.g: nu --testbin nonu a b c)
      nu_repl -> Run a REPL with the given source lines, it must be called with `--testbin=nu_repl`, `--testbin nu_repl` will not work due to argument count logic
      relay -> Relays anything received on stdin to stdout(e.g: 0x[beef] | nu --testbin relay)
      repeat_bytes -> A version of repeater that can output binary data, even null bytes(e.g: nu --testbin repeat_bytes 003d9fbf 10)
      repeater -> Repeat a string or char N times(e.g: nu --testbin repeater a 5)

Added support for parsing hh:mm:ss formatted strings in into duration [toc]

PR #17781 by @fdncred

Added the ability to parse h:m:s with into datetime with optional .mmm for millis, .mmmmmm for micros, and .mmmmmmmmm for nanos.

It has to be in the format of h:m:s:

> "3:34" | into duration
Error: nu::shell::incorrect_value

  × Incorrect value.
   ╭─[repl_entry #12:1:1]
 1 │ "3:34" | into duration
   · ──┬─┬
   ·   │ ╰── encountered here
   ·   ╰── invalid clock-style duration; please use hh:mm:ss with optional .f up to .fffffffff
   ╰────

When it is, it should just work:

> "3:34:0" | into duration
3hr 34min

When minutes or seconds >= 60 there are errors:

> "3:61:0" | into duration
Error: nu::shell::incorrect_value

  × Incorrect value.
   ╭─[repl_entry #15:1:1]
 1 │ "3:61:0" | into duration
   · ───┬──┬
   ·    │  ╰── encountered here
   ·    ╰── invalid clock-style duration; hours must be >= 0 and minutes/seconds must be >= 0 and < 60
   ╰────

> "3:59:60" | into duration
Error: nu::shell::incorrect_value

  × Incorrect value.
   ╭─[repl_entry #16:1:1]
 1 │ "3:59:60" | into duration
   · ───┬───┬
   ·    │   ╰── encountered here
   ·    ╰── invalid clock-style duration; hours must be >= 0 and minutes/seconds must be >= 0 and < 60
   ╰────

Parsing h:m:s:

> "16:59:58" | into duration
16hr 59min 58sec
> "316:59:58" | into duration
1wk 6day 4hr 59min 58sec

With 100% more optional fractional time:

> "16:59:58.235" | into duration
16hr 59min 58sec 235ms
> "16:59:58.235123" | into duration
16hr 59min 58sec 235ms 123µs
> "16:59:58.235123456" | into duration
16hr 59min 58sec 235ms 123µs 456ns
> '2:45:31.2' | into duration
2hr 45min 31sec 200ms
> '2:45:31.23' | into duration
2hr 45min 31sec 230ms
> '2:45:31.234' | into duration
2hr 45min 31sec 234ms
> '2:45:31.2345' | into duration
2hr 45min 31sec 234ms 500µs

help now also shows command type [toc]

PR #17800 by @fdncred

Add "Command Type" information to help.

> help from ini
Parse text as .ini and create table.

Usage:
  > from ini {flags}

Flags:
  -h, --help: Display the help message for this command
  -q, --no-quote: Disable quote handling for values.
  -e, --no-escape: Disable escape sequence handling for values.
  -m, --indented-multiline-value: Allow values to continue on indented lines.
  -w, --preserve-key-leading-whitespace: Preserve leading whitespace in keys.

Command Type:
  > plugin

Input/output types:
  ╭───┬────────┬────────╮
  │ # │ input  │ output │
  ├───┼────────┼────────┤
  │ 0 │ string │ record │
  ╰───┴────────┴────────╯

Examples:
  Converts ini formatted string to record
  > '[foo]
a=1
b=2' | from ini
  ╭─────┬───────────╮
  │     │ ╭───┬───╮ │
  │ foo │ │ a │ 1 │ │
  │     │ │ b │ 2 │ │
  │     │ ╰───┴───╯ │
  ╰─────┴───────────╯

  Disable escaping to keep backslashes literal
  > '[start]
file=C:\Windows\System32\xcopy.exe' | from ini --no-escape
  ╭───────┬──────────────────────────────────────────╮
  │       │ ╭──────┬───────────────────────────────╮ │
  │ start │ │ file │ C:\Windows\System32\xcopy.exe │ │
  │       │ ╰──────┴───────────────────────────────╯ │
  ╰───────┴──────────────────────────────────────────╯

  Disable quote handling to keep quote characters
  > '[foo]
bar="quoted"' | from ini --no-quote
  ╭─────┬────────────────────╮
  │     │ ╭─────┬──────────╮ │
  │ foo │ │ bar │ "quoted" │ │
  │     │ ╰─────┴──────────╯ │
  ╰─────┴────────────────────╯

  Allow values to continue on indented lines
  > '[foo]
bar=line one
  line two' | from ini --indented-multiline-value
  ╭─────┬────────────────────╮
  │     │ ╭─────┬──────────╮ │
  │ foo │ │ bar │ line one │ │
  │     │ │     │ line two │ │
  │     │ ╰─────┴──────────╯ │
  ╰─────┴────────────────────╯

  Preserve leading whitespace in keys
  > '[foo]
  key=value' | from ini --preserve-key-leading-whitespace
  ╭─────┬───────────────────╮
  │     │ ╭───────┬───────╮ │
  │ foo │ │   key │ value │ │
  │     │ ╰───────┴───────╯ │
  ╰─────┴───────────────────╯

New flag --prune for group-by [toc]

PR #17787 by @pickx

Adds group-by --prune to delete the column(s) used for grouping when the arguments are cell paths; closure arguments are unaffected. If pruning leaves a parent empty (e.g., due to nested columns), the parent is removed as well.`

> let table = [
  [name, meta];
  [andres, {lang: rb, year: "2019"}],
  [jt, {lang: rs, year: "2019"}],
  [storm, {lang: rs, year: "2021"}],
  [kai, {lang: rb, year: "2021"}]
]

> $table
╭───┬────────┬─────────────────╮
│ # │  name  │      meta       │
├───┼────────┼─────────────────┤
│ 0 │ andres │ ╭──────┬──────╮ │
│   │        │ │ lang │ rb   │ │
│   │        │ │ year │ 2019 │ │
│   │        │ ╰──────┴──────╯ │
│ 1 │ jt     │ ╭──────┬──────╮ │
│   │        │ │ lang │ rs   │ │
│   │        │ │ year │ 2019 │ │
│   │        │ ╰──────┴──────╯ │
│ 2 │ storm  │ ╭──────┬──────╮ │
│   │        │ │ lang │ rs   │ │
│   │        │ │ year │ 2021 │ │
│   │        │ ╰──────┴──────╯ │
│ 3 │ kai    │ ╭──────┬──────╮ │
│   │        │ │ lang │ rb   │ │
│   │        │ │ year │ 2021 │ │
│   │        │ ╰──────┴──────╯ │
╰───┴────────┴─────────────────╯
> $table | group-by meta.year --prune
╭──────┬────────────────────────────────╮
│      │ ╭───┬────────┬───────────────╮ │
│ 2019 │ │ # │  name  │     meta      │ │
│      │ ├───┼────────┼───────────────┤ │
│      │ │ 0 │ andres │ ╭──────┬────╮ │ │
│      │ │   │        │ │ lang │ rb │ │ │
│      │ │   │        │ ╰──────┴────╯ │ │
│      │ │ 1 │ jt     │ ╭──────┬────╮ │ │
│      │ │   │        │ │ lang │ rs │ │ │
│      │ │   │        │ ╰──────┴────╯ │ │
│      │ ╰───┴────────┴───────────────╯ │
│      │ ╭───┬───────┬───────────────╮  │
│ 2021 │ │ # │ name  │     meta      │  │
│      │ ├───┼───────┼───────────────┤  │
│      │ │ 0 │ storm │ ╭──────┬────╮ │  │
│      │ │   │       │ │ lang │ rs │ │  │
│      │ │   │       │ ╰──────┴────╯ │  │
│      │ │ 1 │ kai   │ ╭──────┬────╮ │  │
│      │ │   │       │ │ lang │ rb │ │  │
│      │ │   │       │ ╰──────┴────╯ │  │
│      │ ╰───┴───────┴───────────────╯  │
╰──────┴────────────────────────────────╯
> $table | group-by meta.year meta.lang --prune # also removes the parent if it's now empty
╭──────┬─────────────────────────╮
│      │ ╭────┬────────────────╮ │
│ 2019 │ │    │ ╭───┬────────╮ │ │
│      │ │ rb │ │ # │  name  │ │ │
│      │ │    │ ├───┼────────┤ │ │
│      │ │    │ │ 0 │ andres │ │ │
│      │ │    │ ╰───┴────────╯ │ │
│      │ │    │ ╭───┬──────╮   │ │
│      │ │ rs │ │ # │ name │   │ │
│      │ │    │ ├───┼──────┤   │ │
│      │ │    │ │ 0 │ jt   │   │ │
│      │ │    │ ╰───┴──────╯   │ │
│      │ ╰────┴────────────────╯ │
│      │ ╭────┬───────────────╮  │
│ 2021 │ │    │ ╭───┬───────╮ │  │
│      │ │ rs │ │ # │ name  │ │  │
│      │ │    │ ├───┼───────┤ │  │
│      │ │    │ │ 0 │ storm │ │  │
│      │ │    │ ╰───┴───────╯ │  │
│      │ │    │ ╭───┬──────╮  │  │
│      │ │ rb │ │ # │ name │  │  │
│      │ │    │ ├───┼──────┤  │  │
│      │ │    │ │ 0 │ kai  │  │  │
│      │ │    │ ╰───┴──────╯  │  │
│      │ ╰────┴───────────────╯  │
╰──────┴─────────────────────────╯

New and improved xaccess! [toc]

PR #16804 by @Bahex

An experimental upgrade to std/xml xaccess, currently accessible as std-rfc/xml xaccess. It is completely backwards compatible, with the addition of:

  • using a ...rest parameter, removing the need to use a list (though still supporting it).
  • supporting cell-paths, rather than plain strings and ints.
  • supporting descendant-or-self::node() (aka //) with **
> use std-rfc/xml xaccess
> http get 'https://www.nushell.sh/rss.xml'
| xaccess rss.**.item  # grab all items
| update content {
    xaccess * { $in.tag? in [title, link] }  # only grab title and link
}
| first 3
| {tag: rss, content: $in}
| to xml -i 2
<rss>
  <item>
    <title>This week in Nushell #344</title>
    <link>https://www.nushell.sh/blog/2026-03-27-twin0344.html</link>
  </item>
  <item>
    <title>This week in Nushell #343</title>
    <link>https://www.nushell.sh/blog/2026-03-20-twin0343.html</link>
  </item>
  <item>
    <title>This week in Nushell #342</title>
    <link>https://www.nushell.sh/blog/2026-03-13-twin0342.html</link>
  </item>
</rss>

Added configurable external hinter closure [toc]

PR #17566 by @stuartcarnie

Added support for configurable external hinter closures via $env.config.hinter.closure. This allows users to provide a custom closure that receives the current line, cursor position, and working directory, and returns inline hint text (like fish-style autosuggestions). Closures can return a simple string or a record {hint: string, next_token?: string} for custom token-based hint acceptance.

Examples

Atuin-based hint closure
$env.config.line_editor.external.hinter = {
  enable: true
  closure: {|ctx|
    if ($ctx.line | str length) == 0 {
      null
    } else {
      let candidate = (try {
        ^atuin search --cwd $ctx.cwd --limit 1 --search-mode prefix --cmd-only $ctx.line
        | lines
        | first
      } catch {
        null
      })

      if $candidate == null or not ($candidate | str starts-with $ctx.line) {
        null
      } else {
        ($candidate | str substring (($ctx.line | str length))..)
      }
    }
  }
}
Simple deterministic test closure (good for validating script hinter behavior)
$env.config.line_editor.external.hinter = {
  enable: true
  closure: {|ctx|
    if ($ctx.line | str length) == 0 {
      null
    } else {
      let target = "zzhint from-script"
      if not ($target | str starts-with $ctx.line) {
        null
      } else {
        let remaining = ($target | str substring (($ctx.line | str length))..)
        if ($remaining | str length) == 0 { null } else { $remaining }
      }
    }
  }
}

New --base flag for url parse [toc]

PR #17833 by @smartcoder0777

url parse now supports an optional --base/-b flag to resolve relative URLs against a base URL (WHATWG-compatible). This makes it easier to normalize links from scraped pages while still returning the same structured URL record (scheme, host, path, query, fragment, and params).

MCP: Auto-promote long-running evaluations to background jobs [toc]

PR #17861 by @andrewgazelka

Evaluations that take longer than 10 seconds, or are cancelled by the client, are automatically promoted to background jobs instead of being discarded. Their results are delivered to job 0's mailbox, where they can be retrieved using job recv. These promoted jobs appear in job list with descriptions like mcp: <command>, and they can be terminated using job kill. The timeout for this behavior can be configured through the $env.NU_MCP_PROMOTE_AFTER setting.

New option to allow command with space prefixes to be recorded in history [toc]

PR #17350 by @guluo2016

Usually commands that start with a space are not recorded to the history. With $env.config.history.ignore_space_prefixed this can be changed.

table command now respects metadata of Custom values. [toc]

PR #17911 by @Juhan280

# before nushell didn't render the `cwd` column like paths
# now it does
history | metadata set --path-columns [cwd] | table --icons

New configuration option auto_cd_always [toc]

PR #17651 by @dxrcy

This release adds the configuration option $env.config.auto_cd_implicit, which allows auto-cd behavior as long as the command string is an existing directory.

Unordered par-each is now streaming [toc]

PR #17884 by @fdncred

Allow par-each to stream. The following example will print out a new value each second that passes.

New sigil % to explicitly call built-ins [toc]

PR #17956 by @fdncred

Nushell has a new sigil % that allows you to call a built-in even if you have the built-in shadowed by a custom command or alias.

> def ls [] { echo duck }
> ls
duck
> %ls
╭────┬─────────────────────┬─────────┬──────────┬──────────────╮
│  # │        name         │  type   │   size   │   modified   │
├────┼─────────────────────┼─────────┼──────────┼──────────────┤
│  0 │ .cargo              │ dir     │      0 B │ 7 months ago │
│  1 │ .gitattributes      │ file    │    113 B │ 7 months ago │
│  2 │ .githooks           │ dir     │      0 B │ 7 months ago │
│  3 │ .github             │ dir     │      0 B │ 3 weeks ago  │
│  4 │ .gitignore          │ file    │    834 B │ 2 weeks ago  │
│  5 │ .idea               │ dir     │      0 B │ 9 months ago │
│  6 │ .opencode           │ dir     │      0 B │ a month ago  │
│  7 │ .vscode             │ dir     │      0 B │ 8 months ago │
│  8 │ AGENTS.md           │ file    │   2,1 kB │ a day ago    │
│  9 │ CITATION.cff        │ file    │    838 B │ 6 months ago │
│ 10 │ CLAUDE.md           │ symlink │      0 B │ a day ago    │
│ 11 │ CODE_OF_CONDUCT.md  │ file    │   3,5 kB │ 7 months ago │
│ 12 │ CONTRIBUTING.md     │ file    │  18,7 kB │ 3 weeks ago  │
│ 13 │ Cargo.lock          │ file    │ 257,0 kB │ 4 hours ago  │
│ 14 │ Cargo.toml          │ file    │  11,9 kB │ a day ago    │
│ 15 │ Cross.toml          │ file    │    684 B │ 7 months ago │
│ 16 │ LICENSE             │ file    │   1,1 kB │ 3 weeks ago  │
│ 17 │ README.md           │ file    │  12,7 kB │ 3 weeks ago  │
│ 18 │ SECURITY.md         │ file    │   2,7 kB │ 3 weeks ago  │
│ 19 │ assets              │ dir     │      0 B │ 7 months ago │
│ 20 │ ast-grep            │ dir     │      0 B │ 3 weeks ago  │
│ 21 │ benches             │ dir     │      0 B │ a week ago   │
│ 22 │ clippy.toml         │ file    │    170 B │ a week ago   │
│ 23 │ crates              │ dir     │      0 B │ 3 weeks ago  │
│ 24 │ devdocs             │ dir     │      0 B │ 2 weeks ago  │
│ 25 │ docker              │ dir     │      0 B │ 3 weeks ago  │
│ 26 │ file.sqlite         │ file    │      3 B │ 2 weeks ago  │
│ 27 │ my_ls.sqlite        │ file    │   8,1 kB │ 6 months ago │
│ 28 │ notes.sqlite.md     │ file    │    670 B │ 7 months ago │
│ 29 │ opencode.json       │ file    │    809 B │ a day ago    │
│ 30 │ rust-toolchain.toml │ file    │    956 B │ 2 weeks ago  │
│ 31 │ rustfmt.toml        │ file    │     18 B │ 2 days ago   │
│ 32 │ scratch             │ dir     │      0 B │ 2 weeks ago  │
│ 33 │ script.nu           │ file    │    416 B │ 4 weeks ago  │
│ 34 │ scripts             │ dir     │      0 B │ 2 weeks ago  │
│ 35 │ sgconfig.yml        │ file    │    218 B │ 3 weeks ago  │
│ 36 │ src                 │ dir     │      0 B │ a day ago    │
│ 37 │ target              │ dir     │      0 B │ 3 hours ago  │
│ 38 │ tests               │ dir     │      0 B │ a week ago   │
│ 39 │ toolkit             │ dir     │      0 B │ a week ago   │
│ 40 │ toolkit.nu          │ file    │     61 B │ 3 weeks ago  │
│ 41 │ typos.toml          │ file    │    732 B │ 3 weeks ago  │
│ 42 │ wix                 │ dir     │      0 B │ 3 weeks ago  │
├────┼─────────────────────┼─────────┼──────────┼──────────────┤
│  # │        name         │  type   │   size   │   modified   │
╰────┴─────────────────────┴─────────┴──────────┴──────────────╯

If you try to call something that doesn't exist as a built-in you get an error:

> %lss
Error: nu::parser::error

  × percent sigil requires a built-in command
   ╭─[repl_entry #59:1:2]
 1 │ %lss
   ·  ─┬─
   ·   ╰── unknown built-in command
   ╰────
  help: remove `%` to use normal resolution, or use `^` to run an external command explicitly

New table style frameless [toc]

PR #17993 by @Benjas333

Added the "frameless" table theme.

> $env.config.table.mode = "frameless"
> [[a b, c]; [1 2 3] [4 5 6]] | table
 # │ a │ b │ c
───┼───┼───┼───
 0 │ 1 │ 2 │ 3
 1 │ 4 │ 5 │ 6

MCP: Promoted jobs now return full output [toc]

PR #17989 by @andrewgazelka

When an MCP evaluation gets auto-promoted to a background job (after timeout or client cancellation), the mailbox payload was the potentially-truncated MCP response. If output exceeded NU_MCP_OUTPUT_LIMIT, job recv would return a dangling $history.N reference instead of the actual data — $history is only populated for non-promoted evals.

This PR introduces an EvalOutput struct that separates the MCP response (possibly truncated with a $history note) from the full output string. Promoted jobs now send full_output through the mailbox so job recv always returns complete, usable data.

Also fixes a pipefail issue where external commands that write to both stdout and stderr would re-raise non_zero_exit_code after process_pipeline had already captured the output — solved by calling ignore_error(true) on the child.

Other additions [toc]

  • Added ctrl + p/n to move up and down the input list like with fzf. (#17707)
  • hide-env now autocompletes environment variable names when pressing tab. (#17658)
  • Add the ability for query web to parse the entire html document when using the --document flag. (#17759)
  • ansi command now has completions for its positional argument. (#17761)
  • into binary now has a completion for the --endian flag. (#17788)
  • ps -l output has two new columns: process_group_id and session_id. (#16357)
  • Binary hex colors are now configurable with $env.config.color_config.binary_* and $env.config.use_ansi_coloring. (#17887)
  • metadata set --content-type now also accepts null to unset the content_type metadata (#17944)
  • http get now also automatically parses x--prefixed mime types like application/x-nuon. (#17967)
  • The input list command now streams by consuming an upstream list or range incrementally vs collecting. (#17966)
  • Add --full (-f) and --allow-errors (-e) support to http head for parity with other HTTP verbs. (#17650)

Removals [toc]

Removed some deprecated commands and flags [toc]

PR #17731 by @Juhan280

Command removed:

  • random dice in favor of std/random dice

Flags removed:

  • metadata set --merge in favor of metadata set { merge {key: value} }
  • watch --debounce-ms in favor of watch --debounce
  • into value --columns --prefer-filesizes in favor of detect type --columns --prefer-filesizes

into value no longer infer nushell datatype form string. Use detect type in combination with update cells instead.

Other changes [toc]

$nu/$env/$in are now more aggressively reserved [toc]

PR #17741 by @blindFS

More aggressive reserved names ($nu/$env/$in) exclusion in implicit variable declaration. e.g.

for nu: int in [] {}

match [1, 2, 3] { [$in, $nu, $env] => { $in + $nu + $env }, _ => 0 }

On the other hand, $it is re-enabled in let it = 1 or 1 | let it

Improve alias expression error message to use user-friendly descriptions [toc]

PR #17751 by @CloveSVG

Error messages for invalid alias expressions now show user-friendly descriptions instead of internal Rust type names. The error code nu::parser::cant_alias_expression is unchanged.

Before
> alias foo = $bar.baz
Error: nu::parser::cant_alias_expression

  × Can't create alias to expression.
   ╭─[repl_entry #4:1:13]
 1 │ alias foo = $bar.baz
   ·             ────┬───
   ·                 ╰── aliasing FullCellPath is not supported
   ╰────
  help: Only command calls can be aliased.
After
> alias foo = $bar.baz
Error: nu::parser::cant_alias_expression

  × Can't create alias to expression.
   ╭─[repl_entry #65:1:13]
 1 │ alias foo = $bar.baz
   ·             ────┬───
   ·                 ╰── aliasing a cell path expression is not supported
   ╰────
  help: Only command calls can be aliased.

More compact output for to nuon --indent n [toc]

PR #17928 by @WookiesRpeople2

to nuon --indent n will print in a more compact output:

Before
> [{column1: 1, column2: 2}, {column1: 3, column2: 4}] | to nuon --indent 2
[
  [
    "column1",
    "column2"
  ];
  [
    1,
    2
  ],
  [
    3,
    4
  ]
]
After
> [{column1: 1, column2: 2}, {column1: 3, column2: 4}] | to nuon --indent 2
[
  ["column1", "column2"];
  [1, 2],
  [3, 4]
]

Some Polars upgrades [toc]

PR #17641 by @ayax79

  • Upgrades polars to 0.53.
  • Reimplemented polars pivot command to polars' updated pivot library. Introduced support for "element" type aggregates.
  • polars unpivot will now only work on LazyFrames. Eager dataframes will be converted to a LazyFrame.
  • Added flags --keep-nulls and --empty-as-null to polars concat.
  • Some improvements on list conversion from nushell to polars. Sub-lists should retain their type instead of being converted to type "object". Using NuDataFrame::try_from_value will convert a Value::List object directly and attempt use an appropriate DataType before falling back to "object".
  • Added additional selectors: polars selector not, polars selector matches, polars selector starts-with.

Additional changes [toc]

  • Type widening now flattens a bit more. (#17575)
  • keybindings list command is updated with new descriptions. CutFromStartLinewise / CutToEndLinewise now takes keep_line instead of value as its parameter for clarity. (#17859)
  • get command now removes the path_columns metadata if none of the cell paths are a index. (#17866)
  • first and last preserve pipeline metadata (such as content_type and path_columns) for list, range, and list-stream input. content_type is still cleared when the output is only part of a binary value (for example a single byte as an integer or a truncated binary value). (#17875)
  • Fixed a crash (“known external name not found”) when an alias reused the same name as an extern used for completions (for example wrapping an external with default flags). (#17878)
  • Update help text for the --ide-* commands in the nu --help screen. (#17905)
  • detect type now preserves content_type metadata if it cannot detect the input value (#17906)
  • Some code that was already known to be invalid early-on, will now be highlighted as an error. (#17917)
  • When --full is used, http head now returns the standard full response record (urls, headers.request, headers.response, body, status). (#17650)
  • When --allow-errors is used, http head no longer fails on non-2xx statuses and still exposes headers. (#17650)
  • skip command only removes content_type metadata if n > 0 and input is binary. (#17867)
  • reject command also removes the path from path_columns metadata when removing a column. (#17867)

Bug fixes [toc]

history now returns date values for sqlite-based history [toc]

PR #17680 by @fdncred

Update the sqlite output of the history file by adding column adapters so we can maintain speed but still get nushell values out of the command.

Before
> history | last
╭─────────────────┬─────────────────────╮
│ start_timestamp │ 1775933381705       │
│ command         │ history | last      │
│ cwd             │ D:\Projects\nushell │
│ duration        │                     │
│ exit_status     │                     │
╰─────────────────┴─────────────────────╯
> history | last 3
╭───┬─────────────────┬──────────────────┬─────────────────────┬──────────┬─────────────╮
│ # │ start_timestamp │     command      │         cwd         │ duration │ exit_status │
├───┼─────────────────┼──────────────────┼─────────────────────┼──────────┼─────────────┤
│ 0 │   1775933378360 │ clear            │ D:\Projects\nushell │        1 │           0 │
│ 1 │   1775933381705 │ history | last   │ D:\Projects\nushell │       17 │           0 │
│ 2 │   1775933392010 │ history | last 3 │ D:\Projects\nushell │          │             │
╰───┴─────────────────┴──────────────────┴─────────────────────┴──────────┴─────────────╯
After
> history | last
╭─────────────────┬─────────────────────╮
│ start_timestamp │ now                 │
│ command         │ history | last      │
│ cwd             │ D:\Projects\nushell │
│ duration        │                     │
│ exit_status     │                     │
╰─────────────────┴─────────────────────╯
> history | last 3
╭───┬─────────────────┬──────────────────┬─────────────────────┬──────────┬─────────────╮
│ # │ start_timestamp │     command      │         cwd         │ duration │ exit_status │
├───┼─────────────────┼──────────────────┼─────────────────────┼──────────┼─────────────┤
│ 0 │ now             │ clear            │ D:\Projects\nushell │      2ms │           0 │
│ 1 │ now             │ history | last   │ D:\Projects\nushell │     19ms │           0 │
│ 2 │ now             │ history | last 3 │ D:\Projects\nushell │          │             │
╰───┴─────────────────┴──────────────────┴─────────────────────┴──────────┴─────────────╯

Brought back missing --log-* flags for nushell [toc]

PR #17732 by @fdncred

Fixed the broken nushell executable logging flags.

Here's the new logging section.

Logging:
  --log-level <string>
      log level for diagnostic logs (error, warn, info, debug, trace). Off by default
      Example: nu --log-level info
  --log-target <string>
      set the target for the log to output. stdout, stderr(default), mixed or file (requires --log-file)
      Example: nu --log-target stdout
  --log-file <path>
      specify a custom log file path (requires --log-target file and --log-level <level>)
      Example: nu --log-target file --log-file ~/.local/share/nushell/nu.log --log-level info
  --log-include <string...>
      set the Rust module prefixes to include from the log output
      Example: nu --log-include info
  --log-exclude <string...>
      set the Rust module prefixes to exclude from the log output
      Example: nu --log-exclude info

Fix confusing type mismatch error in bytes collect [toc]

PR #17746 by @Bortlesboat

bytes collect now accepts table/stream input (e.g. from each), and type mismatch errors no longer repeat the same type multiple times.

Two changes:

  • Added Type::table() to bytes collect input types so pipelines like 0..128 | each {} | into binary --compact | bytes collect work without requiring an explicit collect first
  • Deduplicated types in combined_type_string so error messages say "binary, table, or record" instead of "binary, binary, binary, binary, table, or record"

built-in commands now support null for optional parameters [toc]

PR #17753 by @0xRozier

Optional positional parameters in built-in commands now accept null, treating it as if the argument was omitted. This allows custom commands to wrap built-ins and transparently forward optional parameters:

> def wraps-first [rows?: int] { [1, 2, 3] | first $rows }
> wraps-first
1
> wraps-first 2
╭───┬───╮
│ 0 │ 1 │
│ 1 │ 2 │
╰───┴───╯

finally block won't run twice if error produced in finally block [toc]

PR #17764 by @WindSoilder

> try {} finally {
  print "inside finally"
  error make
}
inside finally
Error: nu::shell::error

  × originates from here
   ╭─[repl_entry #6:3:3]
 2 │   print "inside finally"
 3 │   error make
   ·   ──────────
 4 │ }
   ╰────

It prints "inside finally" once.

finally block won't run before try/catch finished

> try {
  nu -c 'print before; sleep 3sec; print after'
} finally {
  print "finally ran"
}
before
after
finally ran

Finally won't run before try finished.

Notes about streaming

  • try does not stream if catch or finally exists.
  • catch does not stream if finally exists.

let ignores pipefail checking

> nu -c "print 'hello\nworld'; exit 1" | lines | let x
╭───┬───────╮
│ 0 │ hello │
│ 1 │ world │
╰───┴───────╯
> $x
╭───┬───────╮
│ 0 │ hello │
│ 1 │ world │
╰───┴───────╯

The variable x will be assigned.

Try doesn't produce output if it has an error

> try { nu -c 'exit 1' | is-empty } catch { 'result-on-catch' }
result-on-catch

It returns result-on-catch, and redundant true won't be returned.

Fixed some into datetime inconsistencies [toc]

PR #17855 by @fdncred

Before
> "2026-03-21_00:25" | into datetime --format "%F_%R" --timezone utc
Sat, 21 Mar 2026 00:25:00 +0100 (3 weeks ago)
> "2026-03-21_00:25" | into datetime --format "%F_%R" --timezone local
Sat, 21 Mar 2026 00:25:00 +0100 (3 weeks ago)
After
> "2026-03-21_00:25" | into datetime --format "%F_%R" --timezone utc
Sat, 21 Mar 2026 00:25:00 +0000 (3 weeks ago)
> "2026-03-21_00:25" | into datetime --format "%F_%R" --timezone local
Sat, 21 Mar 2026 00:25:00 +0100 (3 weeks ago)

Fixed argument parsing for strings non-space whitespace [toc]

PR #17826 by @fdncred

Update argument parsing to allow things like this without having an error.

nu test.nu a b "c\nd"

Fixed parsing optional cell paths on literal braced values [toc]

PR #17897 by @smartcoder0777

Nushell now correctly parses braced values followed by optional cell paths. Expressions like {}.foo? are handled as expected and return null for missing fields, instead of raising an unclosed-delimiter parse error.

Fixed error propagation for `reject [toc]

PR #17961 by @Juhan280

Fixed an error in reject command where an error value in the input would return column_not_found error instead of propagating the error.

Before
> ls | insert foo { error make { msg: 'boo' } } | reject name
Error: nu::shell::column_not_found

  × Cannot find column 'name'
   ╭─[repl_entry #2:1:6]
 1 │ ls | insert foo { error make { msg: 'boo' } } | reject name
   ·      ───┬──                                            ──┬─
   ·         │                                                ╰── cannot find column 'name'
   ·         ╰── value originates here
   ╰────
After
> ls | insert foo { error make { msg: 'boo' } } | reject name
Error: nu::shell::error

  × boo
   ╭─[repl_entry #1:1:30]
 1 │ ls | insert foo { error make { msg: 'boo' } } | reject name
   ·                              ──────────────
   ╰────

Other fixes [toc]

  • Fixed the problem where searching in the explore command was off by 1 which caused the hit to sometimes be hidden. (#17718)
  • There were rendering bugs when the prompt was at the bottom of the screen. Removing the custom rendering helped fix the problems. (#17691)
  • When in explore and :nu returns null, you can now q/esc out. (#17661)
  • Fixed a bug where numerical keys in records mess up type inference, e.g. let foo: string = {1: 1} is allowed before the fix. As a side effect, previously forbidden key names, like{1kb: 1}, are valid now. (#17684)
  • Nushell now resolves symlinks via $env.PWD if that dir is the same as std::env::current_dir to allow formatted paths. (#17720)
  • Fixed a bug where creating nushell scripts with subcommands would show duplicate subcommands. (#17727)
  • Fixed the variable_not_found error in scenarios with recursive functions. (#17726)
  • Default arguments now allowed to have the same name as the parameter. (#17697)
  • Avoided input listen --timeout panic from double counting. (#17744)
  • reject now preserves the stream metadata. For example, ls | reject ...[] will keep the LS_COLORS and ansi links. (#17775)
  • Reject format strings with tokens after ending quote. (#17777)
  • Fixed a regression of v0.111.0 that made http commands not respect environment variables for proxying like ALL_PROXY. (#17794)
  • Fixed an issue where read-only directories are unable to be copied due to the mode attribute being preserved by default. (#17791)
  • Nushell now resolves library paths with user‑provided -I entries before the default NU_LIB_DIRS, fixing cases where bundled modules shadowed user scripts. NU_LIB_DIRS is also correctly treated as immutable at startup to avoid unexpected mutation in config or scripts. (#17819)
  • Added a simple check to prevent histogram output from having overlapping names when a named column is passed to the histogram. So now histograms of columns named "count", "frequency" (or the frequency user-defined name), "quantile", "percentage" will have sensible output. (#17783)
  • group-by now correctly groups rows when the grouper values are compound types like lists or records. Previously, grouping could collapse distinct values into the same bucket due to a lossy abbreviation of the compound key. (#17837)
  • Fixed the command tee truncating the input for the inner closure when the output of tee is ignored by subsequent commands. (#17793)
  • Aligns http options with the other http verbs so flags and output shape match http head. (#17841)
  • Fixed a bug of lossy parsing of unclosed subexpressions in string interpolation, e.g. $'(foo', which blocks completions inside all kinds of string interpolation subexpressions. (#17851)
  • rm now errors when given a symlink path with a trailing slash, preventing accidental deletion of the underlying directory. Use rm foo-link without the trailing slash to remove the symlink itself. (#17847)
  • Fixed a bug of duration/filesize parsing with numbers started by ., e.g. .5sec (#17923)
  • Made MCP more responsive in stdio mode. (#17945)
  • Use strict comparison for float-based sorting to fix panics. (#17930)
  • nu --experimental-options ... script.nu now works correctly without requiring -- before the script path. Nushell no longer treats the script file as part of the --experimental-options values. (#17943)
  • parse simple patterns: literal { via (char lbrace) before a {name} capture works now. (#17962)
  • Fixed input list when stdin is redirected in Unix TTY environments. (#17987)

Notes for plugin developers [toc]

Replaced ShellError::GenericError with ShellError::Generic(GenericError) [toc]

PR #17864 by @cptpiepmatz

ShellError::GenericError is now deprecated, prefer to use ShellError::Generic instead.

Hall of fame [toc]

Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! 🙏

authorchangelink
@cptpiepmatzKitest-based Test Harness#17628
@cptpiepmatzUpdate winresource versions#17702
@ChrisDentonTests should not end cwd with a /#17721
@fdncredRefactor sqlite push down and apply to (nearly) all filter commands.#17737
@cptpiepmatzAdd in-process testing with nu_test_support::test()#17733
@cptpiepmatzMoved some tests around and applied some more nu_test_support::test#17740
@Juhan280Two new reedline events added: ToStart and ToEnd to jump to the start/end of the buffer.#17747
@cptpiepmatzUse std::panic::Location instead of custom Location type#17748
@cptpiepmatzUpdate more tests and use assert_contains()#17745
@Juhan280Users would not notice any difference other than that the error message when providing incorrect variant will preserve case#17749
@cptpiepmatzAdded TestResult::expect_value_eq and provide more comprehensive errors for test()#17750
@preiter93Bump edtui to 0.11.2 and remove workarounds#17752
@weirdanchar command now has completions for its positional argument.#17762
@cptpiepmatzMerge To/FromYaml and To/FromYml into one struct#17766
@cptpiepmatzRefactored most nested command integraiont tests in nu-command#17767
@BahexMake Span's Debug impl succinct#17782
@Juhan280Update reedline to commit 5c2f105#17785
@andrewgazelkaDocument automatic JSON parsing for HTTP commands#17158
@Bahextest_record! macro for convenience#17797
@cptpiepmatzRefactor usages of test_examples with a centralized example testing code (except plugins)#17801
@cptpiepmatzEnable env_shlvl_in_repl and env_shlvl_in_exec_repl tests#17803
@cptpiepmatzGive http get command tests with socks proxy more time to execute#17804
@cptpiepmatzWarn on clippy::push_format_string#17805
@cptpiepmatzBump toml crate to 1.0#17813
@zhiburtChange width estimation in case of header_on_border#17812
@tauanbinatoN/A — type signature correction only, no behavior change.#17811
@cptpiepmatzRefactored more command integration tests#17820
@hustcerExclude nu-test-support for loongarch64 to avoid build error of release script#17821
@cptpiepmatzWarn on clippy::needless_raw_strings#17822
@Rohan5commitN/A (devdocs wording fix).#17818
@cptpiepmatzFix clippy issues#17825
@cptpiepmatzRefactor more command integration tests#17858
@Juhan280Add take_metadata and with_path_columns#17862
@rayzellerReplaced Span::unknown() with real spans in the which command. Error messages from which now report accurate source locations.#17842
@cptpiepmatzAdd GenericError::new_internal_with_location#17868
@cptpiepmatzAllow showing an error source for generic errors#17869
@cptpiepmatzAdd From conversions for ErrorSite#17870
@cptpiepmatzApply #[doc(no_inline)] to prelude modules#17873
@cptpiepmatzOnly update PR labels on opened or ready PRs#17874
@rayzellerReplaced Span::unknown() with real spans in plugin crates. Plugin custom value comparison errors now report accurate source locations.#17871
@rayzellerReplaced Span::unknown() with real spans in nu-command filters and strings. This improves error messages by providing accurate source locations when errors occur in uniq, find, sort, detect columns, split list, and related commands.#17872
@rayzellerReplaced Span::unknown() with real spans in nu-cli and main binary. Interactive commands like keybindings listen, REPL error handling, and IDE support now provide accurate source locations in error messages.#17876
@cptpiepmatzRestructure nu-test-support crate and add lots of docs#17900
@Juhan280Deprecate PipelineData::metadata()#17891
@Juhan280Implement DerefMut for PipelineExecutionData#17909
@Juhan280Fix cargo doc warnings#17910
@Bahexhttp commands' output metadata properly includes content-type#17899
@cptpiepmatzBump rand and related to 0.10#17929
@xtqqczzeUpdate Cargo.toml files to use workspace edition and rust-version#17931
@xtqqczzeFailed to parse manifest error#17950
@fdncredRevert "detect lexer-stage errors at highlighting"#17955
@cptpiepmatzStreamline CI Cargo Checks#17954
@rayzellerInternal change only: test code now uses Span::test_data() instead of Span::unknown() to better distinguish test spans from genuinely unknown spans. No user-facing behavior changes.#17893
@rayzellerReplaced Span::unknown() with real spans in the polars plugin. DataFrame operations, type conversions, and custom value comparisons now provide accurate source locations in error messages.#17939
@cptpiepmatzMove conversion between nu_json::Value and nu_protocol::Value into nu-json#17980
@andrewgazelkaImprove model guidance#17996
@cptpiepmatzMark CustomValue::is_iterable as deprecated#18003
@sholderbachFix confusing double negation with empty else if#16708

Full changelog [toc]

authortitlelink
@0xRozierfix: allow passing null to optional positional params in built-in commands#17753
@Bahexfeat(std-rfc/xml xaccess): experimental rewrite of std/xml xaccess#16804
@Bahexfeat: make Span's Debug impl succinct#17782
@Bahexfeat: test_record! macro for convenience#17797
@Bahexfix(test_record!): specify $crate::record!#17848
@Bahexhttp commands' output metadata properly includes content-type#17899
@Benjas333Add frameless table theme#17993
@BortlesboatFix confusing type mismatch error in bytes collect#17746
@ChrisDentonPrefer PWD over current_dir if they're the same directory#17720
@ChrisDentonFix: Tests should not end cwd with a /#17721
@CloveSVGfix(parser): improve alias expression error message to use user-friendly descriptions#17751
@Dexterity104fix(parse): support char lbrace before trailing capture#17962
@Juhan280feat: add str escape-regex#17703
@Juhan280Add metadata_ref and metadata_mut methods to PipelineData#17706
@Juhan280refactor!: remove deprecated commands and flags#17731
@Juhan280feat: add ToStart/ToEnd reedline events#17747
@Juhan280refactor: move the display logic for ReedlineEvent and EditCommand to nushell#17749
@Juhan280update reedline to commit 5c2f105#17785
@Juhan280Update the names in keybindings list#17859
@Juhan280nu-protocol: add take_metadata and with_path_columns#17862
@Juhan280Update metadata handling for get command#17866
@Juhan280Update metadata handling for skip and reject command#17867
@Juhan280Deprecate PipelineData::metadata()#17891
@Juhan280build: fix cross compilation to/from windows#17894
@Juhan280Preserve pipeline metadata if detect type cannot determine the input#17906
@Juhan280nu-protocol: Implement DerefMut for PipelineExecutionData#17909
@Juhan280doc: fix cargo doc warnings#17910
@Juhan280fix: preserve metadata when rendering Custom value in table command#17911
@Juhan280Allow --content-type to accept null in metadata set#17944
@Juhan280fix(nu-command/reject): make reject command forward error value properly#17961
@Juhan280refactor(nu-command): update tests for reject command#17968
@Juhan280Add rustfmt.toml#17995
@Moayad717Fix rm symlink trailing slash#17847
@Rohan5commitdocs: fix devdocs wording#17818
@Rohan5commitdocs: fix typo in completer comment#17904
@Rohan5commitdocs: fix typo in flags section comment#17915
@Tyarel8feat(input list): add ctrl+p/n to go up/down#17707
@WindSoilderpipefail: avoid try outputs value when catch exists, avoid finally runs twice, avoid finally funs before try finish.#17764
@WookiesRpeople2chore: Update to noun output to be more compact when --indent n is used#17928
@amaanqcli: add hide-env autocompletion#17658
@andrewgazelkadocs(mcp): document automatic JSON parsing for HTTP commands#17158
@andrewgazelkafeat(mcp): auto-promote long-running evaluations to background jobs#17861
@andrewgazelkafix(nu-mcp): deliver full output for promoted background jobs#17989
@andrewgazelkaImprove model guidance#17996
@app/Add cross-shell search terms to 16 commands (bash/CMD/PowerShell)#17844
@app/dependabotbuild(deps): bump calamine from 0.32.0 to 0.33.0#17647
@app/dependabotbuild(deps): bump actions/upload-artifact from 6 to 7#17710
@app/dependabotbuild(deps): bump crate-ci/typos from 1.43.5 to 1.44.0#17711
@app/dependabotbuild(deps): bump interprocess from 2.3.1 to 2.4.0#17713
@app/dependabotbuild(deps): bump quickcheck_macros from 1.1.0 to 1.2.0#17771
@app/dependabotbuild(deps): bump calamine from 0.33.0 to 0.34.0#17772
@app/dependabotbuild(deps): bump sqlparser from 0.60.0 to 0.61.0#17774
@app/dependabotbuild(deps): bump scraper from 0.25.0 to 0.26.0#17830
@app/dependabotbuild(deps): bump winreg from 0.55.0 to 0.56.0#17831
@app/dependabotbuild(deps): bump ureq from 3.2.0 to 3.3.0#17879
@app/dependabotbuild(deps): bump toml from 1.0.6+spec-1.1.0 to 1.0.7+spec-1.1.0#17883
@app/dependabotbuild(deps): bump uuid from 1.22.0 to 1.23.0#17946
@app/dependabotbuild(deps): bump unicode-segmentation from 1.12.0 to 1.13.2#17949
@app/dependabotbuild(deps): bump crate-ci/typos from 1.44.0 to 1.45.0#17997
@app/dependabotbuild(deps): bump tokio from 1.50.0 to 1.51.0#17998
@app/dependabotbuild(deps): bump similar from 2.7.0 to 3.0.0#17999
@app/dependabotbuild(deps): bump tempfile from 3.25.0 to 3.27.0#18000
@ayax79Polars upgrade#17641
@ayax79Polars: added polars selector ends-with#17722
@ayax79Polars: Implement selector commands for numeric types#17723
@blackhat-hemsworthAdd a check to avoid duplicate histogram output column names#17783
@blindFSfeat!(parser): type inference following cell paths#17673
@blindFSfix(parser): record keys parsed as strings#17684
@blindFSfix!: respect reorder-cell-paths option in assignments#17696
@blindFSrefactor!(parser): move reserved variable name checking near is_variable and add_variable#17741
@blindFSfix(parser): string interpolation with unclosed )#17851
@blindFSfix(parser): do not check for reserved variable names in external signature#17903
@blindFSfix(parser): an edge case of parse_unit_value#17923
@blindFSrevert: allow default values in external signatures#17974
@cmtmAdd process_group_id and session_id to ps -l output#16357
@coravacavfix(input listen): calculate timeout using elapsed start time rather than subtraction#17744
@cosineblastReword job tag to job describe#17496
@cptpiepmatzKitest-based Test Harness#17628
@cptpiepmatzBump patch after release#17682
@cptpiepmatzUpdate winresource versions#17702
@cptpiepmatzBump kitest & remove RefUnwindSafe from experimental option markers#17716
@cptpiepmatzAdd in-process testing with nu_test_support::test()#17733
@cptpiepmatzrefactor(nu-command/tests): moved some tests around and applied some more nu_test_support::test#17740
@cptpiepmatzBump aws related crates#17742
@cptpiepmatzrefactor(nu-command/tests): update more tests and use assert_contains()#17745
@cptpiepmatzrefactor: use std::panic::Location instead of custom Location type#17748
@cptpiepmatzrefactor(testing): Added TestResult::expect_value_eq and provide more comprehensive errors for test()#17750
@cptpiepmatzBump some packages to handle security issues#17765
@cptpiepmatzrefactor(nu-command): Merge To/FromYaml and To/FromYml into one struct#17766
@cptpiepmatzrefactor(nu-command/testing): Refactored most nested command integraiont tests in nu-command#17767
@cptpiepmatzFix http not respecting proxy environment variables like ALL_PROXY#17794
@cptpiepmatzRefactor usages of test_examples with a centralized example testing code (except plugins)#17801
@cptpiepmatzEnable env_shlvl_in_repl and env_shlvl_in_exec_repl tests#17803
@cptpiepmatzGive http get command tests with socks proxy more time to execute#17804
@cptpiepmatzWarn on clippy::push_format_string#17805
@cptpiepmatzBump toml crate to 1.0#17813
@cptpiepmatzrefactor(nu-command/tests): Refactored more command integration tests#17820
@cptpiepmatzWarn on clippy::needless_raw_strings#17822
@cptpiepmatzFix clippy issues#17825
@cptpiepmatzApply security updates#17852
@cptpiepmatzrefactor(nu-command/testing): refactor more command integration tests#17858
@cptpiepmatzrefactor(nu-protocol): Replace ShellError::GenericError with ShellError::Generic(GenericError)#17864
@cptpiepmatzAdd GenericError::new_internal_with_location#17868
@cptpiepmatzAllow showing an error source for generic errors#17869
@cptpiepmatzAdd From conversions for ErrorSite#17870
@cptpiepmatzApply #[doc(no_inline)] to prelude modules#17873
@cptpiepmatzOnly update PR labels on opened or ready PRs#17874
@cptpiepmatzRestructure nu-test-support crate and add lots of docs#17900
@cptpiepmatzAdd test_cell_path!() macro#17927
@cptpiepmatzBump rand and related to 0.10#17929
@cptpiepmatzStreamline CI Cargo Checks#17954
@cptpiepmatzMove conversion between nu_json::Value and nu_protocol::Value into nu-json#17980
@cptpiepmatzLet random choice behave like first#17983
@cptpiepmatzMark CustomValue::is_iterable as deprecated#18003
@dxrcyfeat: add config.auto_cd_always option#17651
@fdncredfix type widening for describe#17575
@fdncredAdd support for list-of-records serialization in to nuon command#17660
@fdncredallow esc on :nu when having null response#17661
@fdncredupdate the sqlite history timestamp and duration with nushell values#17680
@fdncredfix one-off up/down arrow wrapping bug#17691
@fdncredremove bad which test, create better one#17692
@fdncredrevert 17606 make plugin handling more robust on startup#17699
@fdncredfix the off-by-1 jump scrolling in explore when searching#17718
@fdncredfix duplicate custom commands from showing up#17727
@fdncredAdd testbin "bins" to nushell help#17728
@fdncredfix re-add support for custom log file path and validation in CLI#17732
@fdncredchore: update Rust version to 1.92.0 and fix clippy warnings in configuration#17734
@fdncredFix select pushdown column aliasing#17737
@fdncredfeat(query_web): add 'document' flag to parse HTML as a full document#17759
@fdncredchore(deps): update dependencies and improve compatibility#17779
@fdncredfeat(duration): add support for parsing hh:mm:ss formatted strings in into duration#17781
@fdncreddocs: update command docs to include command type#17800
@fdncredSwap order of user and default library directories, ensure $NU_LIB_DIRS is const#17819
@fdncredfeat: enhance script argument parsing to handle newlines and whitespace correctly#17826
@fdncredUpgrade glob to use the latest wax crate version 0.7.0#17835
@fdncredupgrade rmcp to version 1.2.0#17836
@fdncredfix(datetime): enhance timezone and offset handling in datetime parsing#17855
@fdncredallow par-each to stream except with --keep-order via mspc#17884
@fdncredRefactor error handling for directory removal in rm command#17895
@fdncredUpdate IDE help text to specify cursor position and file context#17905
@fdncredUpdate rmcp to version 1.3.0 and adjust session manager configuration#17912
@fdncredfeat: add from md command to convert markdown text into structured data#17937
@fdncredfix: enhance MCP mode handling and output behavior across commands#17945
@fdncredRevert "detect lexer-stage errors at highlighting"#17955
@fdncredadd a new sigil % for built-ins like ^ is a sigil for externals#17956
@fdncredfeat(input): make input list streamable#17966
@fdncredrefactor(parser): consolidate span adjustment for external calls#17978
@fdncredfix(help): enhance help command to prefer built-in help over aliases#17979
@fdncredrefactor some commands and add tests#17988
@fdncreddeps: bump uu_* packages to 0.8.0#17994
@galuszkakuse strict comparison for float sorting to avoid panics - fixes #16750#17930
@guluo2016Add option to save leading-space commands to history.txt#17350
@hustcerExclude nu-test-support for loongarch64 to avoid build error of release script#17821
@hustcerFix parser scope leak in where $cond#17976
@hustcerFix input list when stdin is redirected in Unix TTY environments#17987
@ian-h-chamberlainCustomize binary hex styles with color_config#17887
@kiannidevAdd full and allow-errors flags to http head#17650
@kx0101feat: add support for custom history file path in config#17425
@musicinmybrainUpdate lscolors from 0.20 to 0.21#17832
@niklasmarderxfix(http): handle x- vendor prefix in Content-Type for automatic parsing#17967
@pickxfix: reject format strings with tokens after ending quote#17777
@pickxfeat: group-by flag to delete column after grouping by it#17787
@pickxdetect lexer-stage errors at highlighting#17917
@preiter93refactor(nu-explore): bump edtui to 0.11.2 and remove workarounds#17752
@rayzellerReplace Span::unknown() with real spans in which_.rs#17842
@rayzellerReplace Span::unknown() with real spans in plugin crates#17871
@rayzellerReplace Span::unknown() with real spans in nu-command filters and strings#17872
@rayzellerReplace Span::unknown() with real spans in nu-cli and main#17876
@rayzellerReplace Span::unknown() with real spans in nu-protocol and nu-mcp#17877
@rayzellerReplace Span::unknown() with real spans in remaining nu-command files#17888
@rayzellerReplace Span::unknown() with Span::test_data() in test code#17893
@rayzellerReplace Span::unknown() with real spans in nu-engine#17938
@rayzellerReplace Span::unknown() with real spans in nu_plugin_polars#17939
@rbranfix tee truncating input for inner closure if output is ignored#17793
@seropersonfix: allow default argument to have the same name as parameter#17697
@seropersonfix: block captures redundant variables#17726
@sholderbachFix confusing double negation with empty else if#16708
@smartcoder0777feat(url): add --base support to url parse#17833
@smartcoder0777fix(group-by): correct grouping for lists/records#17837
@smartcoder0777fix http head http options missing full and allow error#17841
@smartcoder0777Preserve pipeline metadata in first and last for list/range streams#17875
@smartcoder0777Fix known external name lookup under alias shadowing#17878
@smartcoder0777Fix parsing of braced-value optional cell paths#17897
@smartcoder0777Fix experimental-options consuming script path#17943
@stuartcarniefeat(repl): add configurable external hinter closure#17566
@tauanbinatoFix hash md5 and hash sha256 output type signatures#17811
@weirdanansi completions#17761
@weirdanchar completions#17762
@weirdanreject: preserve metadata#17775
@weirdanCompletions for into binary --endian#17788
@xtqqczzefix: update Cargo.toml files to use workspace edition and rust-version#17931
@xtqqczzefix: failed to parse manifest error#17950
@xtqqczzedeps: update git2 minimum to 0.20.4#17984
@ymcxDrop mode preservation in order to fix copying of read-only directories#17791
@ysthakurBump reedline to latest main#17834
@zhiburtnu-table: Change width estimation in case of header_on_border#17812
Edit this page on GitHub
Contributors: Piepmatz