---
# System prepended metadata

title: v0.80 Plugin Installation+Registry

---

# v0.80 Plugin Installation+Registry

{%hackmd theme-dark %}

As part of v0.80, we are considering moving a lot of Nu's functionality into plugins.

This has some advantages, but one big disadvantage is that we lose Nu's ability to be deployed as a single executable. Copying 1 executable to a server is much simpler than copying multiple files and running `register`.

If we move most of Nu's functionality into plugins, we should consider streamlining the current process of acquiring+registering plugins.

## Installation UX

As discussed [here](https://github.com/nushell/nushell.github.io/pull/656#issuecomment-1304642002), it would be nice to have a command (`install plugin`?) that handles downloading and registering plugins. For example:

```bash
install plugin --all # install all official plugins
install plugin --list # show all official plugins
install plugin excel # install the official Excel plugin
```

A nice-to-have: when a user tries to run a command that is present in an uninstalled plugin, Nu could suggest installing the plugin.

## Plugin Registry (Nu Plugin Manager?) MVP

To implement something like `install plugin`, we will need to host plugin DLLs somewhere. Let's call it NPM for now. A minimal viable product could be something like:

1. Plugins are built in CI as part of Nu's release pipeline, then uploaded to an S3 bucket
2. A server-side process monitors for new files in the bucket, and then:
    1. Checks the OS+architecture of the DLL and moves it to the correct location
    2. Updates a JSON file containing a list of available plugins

For example:

1. CI builds v0.81 of the dataframe plugin for Windows x64
2. CI uploads `nu_dataframe_plugin_v0.81.dll` to a known S3 bucket
3. A serverless function notices the new file, and then:
    1. Checks the DLL's OS+architecture with `goblin`
    2. Copies the DLL to a location acessible at https://npm.nushell.sh/dataframe/0.81/win-x64/nu_dataframe_plugin.dll
    3. Updates https://npm.nushell.sh/all.json to include the new DLL
4. A user runs `install plugin dataframe` on Windows x64
    1. `install plugin` downloads https://npm.nushell.sh/all.json and finds the URL for the latest version of the `dataframe` plugin
    2. `install plugin` downloads `nu_dataframe_plugin.dll` to a known location
    3. `install plugin` registers the plugin in `plugin.nu`

## Open Questions

- Will users be comfortable with `install plugin` downloading+running executable code?
    - Downloading plugins may be blocked in some corporate environments
    - Linux distros tend to want to compile everything from scratch; should we support that?
- Are we capable of committing enough time+energy to run a package manager?
    - I've never run something like this for the public; I worry about the maintenance burden and unknown unknowns
    - We should reach out to someone who has worked on a package manager before (like Kat) and get their thoughts
- How should we handle versioning?
    - How do plugin versions map to Nu versions?
    - When a user upgrades/replaces their Nu exe, do we automatically upgrade their plugins?
- We can automate plugin builds for Linux+macOS+Windows; what's the install story like for other platforms (like BSD?)
- Should we attempt to streamline installation of third-party plugins?
    - Perhaps something like `install plugin --url https://files.reillywood.com/my_nu_plugin.dll`?
- Are we missing any security considerations?
    - As long as we're careful about access to the S3 bucket, I don't *think* this is meaningfully less secure than our current plugin model