Polybar modules are almost always
written in either bash or python. Bash offers an ubiquitous, stable
platform and python, a large ecosystem and much nicer syntax. I want to show
how nushell can serve as another
alternative.
Building the Module Link to heading
The sample module is simple. It queries a GitHub repository for an RSS document and prints how much time has elapsed since the last update.
# elapsed.nu
#!/usr/bin/env nu
# Returns how long it has been since a repository received its last update.
def main [
--user: string, # GitHub username
--repository: string # User repository
] {
let elapsed = (http get $"https://github.com/($user)/($repository)/releases.atom"
| from xml
| get content
| where { |it| $it.tag == `updated` }
| $in.content.0.content.0
| into datetime
| date humanize)
print $"($user)/($repository) was updated ($elapsed)."
}
I’m not going to get into the syntax of nushell but here is a summary of what
this script does:
- Make a web request.
- Load the RSS response as structured data.
- Filter and traverse the data structure to access values.
- Convert a string into a workable datetime object.
- Determine the amount of elapsed time.
- Print an interpolated message.
This isn’t anything that couldn’t be done with python or bash, but
nushell has some advantages that makes it a compelling option in this
instance.
First, nushell is able to do all of this without any external dependencies.
An http call would need a dependency or significantly more lines in python
and bash would offload the task to curl. Deserialization is also
non-trivial in python and bash even with dependencies.
Nushell also has a nice syntax, certainly better than bash. With a
functional approach and lots of high-level functionality, powerful operations
can be done with relatively small amounts of code.
There are also constant improvements and changes to the language/shell because
nushell is fairly young and still in very active development. The downside is
that this does result in nushell being far less stable than the others.
Using the Module Link to heading
Polybar uses the module the same way it would any other module.
[module/elapsed]
type = custom/script
interval = 600
exec = ~/scripts/elapsed.nu --user nushell --repository nushell
Now its ready to be added to your bar. Here it is in my config.

This isn’t a very useful module and only meant as a demonstration, but the
weather and clock modules are also written in nushell.
#clock.nu
#!/usr/bin/env nu
# Get date and time as string with format.
def main [
--format: string = "%a ● %D ● %r"; # Output string display format. Default: `%a ● %D ● %r`.
] {
date now | date format $"($format)"
}
#weather.nu
#!/usr/bin/env nu
# Query `wttr.in` for weather report with location and format.
def main [
--location: string, # Can be city name or ICAO code.
--format: string = "%c%t ● %h ● %w ● %m"; # Optional output string display format. Default: `%c%t ● %h ● %w ● %m`.
] {
http get $"https://wttr.in/($location)?format=($format)"
}
Conclusion Link to heading
You could really use whatever you wanted to build these simple modules. You
could build a java app and run the jar in the configuration file as long as
it prints to stdout. The reason people choose python or bash is the same
reason they choose them for any other script. Nushell is nice to work with on
both the command line and when building scripts and it makes a great tool to
build polybar modules.