Fesh 0.36.0

dotnet add package Fesh --version 0.36.0
                    
NuGet\Install-Package Fesh -Version 0.36.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Fesh" Version="0.36.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Fesh" Version="0.36.0" />
                    
Directory.Packages.props
<PackageReference Include="Fesh" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Fesh --version 0.36.0
                    
#r "nuget: Fesh, 0.36.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Fesh@0.36.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Fesh&version=0.36.0
                    
Install as a Cake Addin
#tool nuget:?package=Fesh&version=0.36.0
                    
Install as a Cake Tool

Logo

Fesh

Fesh on nuget.org Build

code size license

Fesh is an F# Editor & Scripting Host, for Windows.

I made it to embed F# as a scripting tool in other applications. But it works just as well on its own.

Screenshot Screenshot

Fesh is built on the excellent AvalonEdit. That is why it only runs on Windows (for now). It supports F# 10 and has the IDE features you would expect: semantic syntax highlighting, type info, autocomplete and go to definition.

Unlike a typical F# REPL, Fesh has the input and the output in two separate windows. Just like Don Syme always wanted it. You can even color the output with Fesher.

Unlike most F# editors, Fesh runs FSharp.Compiler.Service in the same process as the UI. There is no separate language server and no separate FSI process. That is what makes it easy to host Fesh inside other apps, as an embedded scripting editor. And that was in fact my main reason for building it.

I started prototyping Fesh in 2017, and I have used it professionally for scripting in Rhino3D since 2019. It has been public since 2024. Before that I used the Tsunami F# editor, as you can see in my talk on the Louvre Abu Dhabi Dome. But Tsunami is no longer available. So I built Fesh.

To host Fesh in your own app, there is the NuGet package Fesh. See Fesh.Rhino and Fesh.Revit for how I use it.

Features

Autocomplete

The completion list opens as you type and after a dot, also in the middle of a word. A dot after a closing bracket works too, like in xs[0]. or Guid.NewGuid()., and so does a dot at the start of the next line of a method chain.

Type info

Hover over a name to see its inferred signature, all of its xml docs, and the path of the assembly it comes from.

Go to Definition

Press F12, or right-click a name, to jump to where it is defined: in the same file, or in a file loaded with #load. For names from NuGet packages and other assemblies, Fesh offers to open their source in VS Code. It finds the source on your computer, via SourceLink, or by cloning the GitHub repository of the package at the commit it was built from.

NuGet

Type #r "nuget: and you get a list of the packages you used before, plus what nuget.org finds for the name you typed.

After each #r "nuget: ..." line Fesh shows if the version is the latest. One click updates it, pins a version, or takes you to a newer prerelease and back. It also fixes the casing of the package name. If you don't want this, set CheckNugetVersions=False in the Settings.txt file.

Dark and light theme

Switch between them in the View menu, without a restart. The dark colors follow F# in VS Code with the Ionide extension.

Syntax highlighting

Highlighting runs in two passes. First the regex rules of SyntaxHighlightingFSharp.xshd, then the semantic colors from the F# Compiler Service. Mutable values are underlined, so you see at a glance where state can change.

If you want different colors, go to About → Open and watch SyntaxHighlighting in VS Code. Each time you save the file in VS Code, all open tabs in Fesh update right away.

Running code

F5 evaluates the whole file, Ctrl + Enter the current lines, and Alt + Enter the selected text. Ctrl + Break cancels a running script, even one that waits in a blocking call like Thread.Sleep. Ctrl + Alt + R resets FSI. All the other shortcuts are listed in the menus.

Compile a script

When a script grows up, FSI → Compile Script turns it into an .fsproj and builds a dll from it, via the dotnet SDK or via MSBuild. The #r line for the new dll is copied to your clipboard.

Status bar

The status bar shows the number of compiler errors. Click on it to scroll to the first one.

Selection highlighting

Select some text and all its occurrences get highlighted, in the editor and in the output window. The status bar shows how many there are. Click on it to step through them.

Drag and drop

Drag any file or folder into the editor to get its full path as a string at the cursor position. For *.dll files it goes to the top, prefixed with #r. For *.fsx files it goes to the top, prefixed with #load.

Font

The default font is Cascadia Mono. Besides italic it also has a cursive script mode. I use it for comments. To get ligatures, set the font to Cascadia Code. You can change the font in the Settings.txt file, via the menu: About → Open Settings Folder.

How to install the standalone app

Installer

The easiest way is to run the Setup.exe from Releases. Fesh will offer to update itself when a new version is available. There is a .NET 10 and a .NET Framework 4.8 version. Apart from the runtime they are the same.

The installer is made with Velopack and is digitally signed.

No admin rights are needed to install or run Fesh. It gets installed in %LOCALAPPDATA%\Fesh (or %LOCALAPPDATA%\Fesh.net48), and it keeps its settings in %APPDATA%\Fesh\Settings (or %APPDATA%\Fesh.net48\Settings). A shortcut is created on the desktop.

Portable

Each release also has a portable zip. Extract it and put it wherever you like. It works just like the installed app, but keeps its Settings folder in its own folder. The .portable file in that folder tells Fesh to do so. It also offers to update itself when a new version is available.

Build from source

dotnet build FeshStandalone.fsproj

You still get notified about new releases, but you have to install them yourself.

How to host Fesh in another app

Use the NuGet package Fesh. Each release has a package version for each runtime: one with a -net472, -net8, -net9 or -net10 suffix. The version without a suffix is for .NET 10.

To build the package yourself, run:

dotnet build FeshHosting.fsproj

Release Notes

For the changes in each release, see the CHANGELOG.md.

License

Fesh is licensed under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net10.0-windows7.0 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.36.0 94 10/17/2026
0.36.0-net9 85 10/17/2026
0.36.0-net8 84 10/17/2026
0.36.0-net472 85 10/17/2026
0.36.0-net10 92 10/17/2026
0.35.0 91 10/11/2026
0.35.0-net9 87 10/11/2026
0.35.0-net8 87 10/11/2026
0.35.0-net472 95 10/11/2026
0.35.0-net10 103 10/11/2026
0.34.0 100 10/6/2026
0.34.0-net9 93 10/6/2026
0.34.0-net8 92 10/6/2026
0.34.0-net472 99 10/6/2026
0.34.0-net10 103 10/6/2026
0.33.5 100 10/5/2026
0.33.5-net9 94 10/5/2026
0.33.5-net8 96 10/5/2026
0.33.5-net472 100 10/5/2026
0.33.5-net10 100 10/5/2026
Loading failed

### Added

- a `defines` field in `HostedStartUpData`, for conditional compilation symbols of the host app. They are passed as `--define:` arguments to FSI and to the type checker, so that `#if` blocks for the host are evaluated and checked.
- `FESH` is always defined for FSI and the type checker, and `FESHFX` too when running on .NET Framework, for `#if FESH` blocks in scripts.
- when an evaluation with `#r "nuget: ..."` lines fails and no .NET SDK is installed, the Log says that these lines need the .NET SDK and where to get it. Without the SDK the packages are not restored, and if there is no dotnet.exe at all, F# Interactive reports no error for these lines, only the names from the package are not defined. The SDK is looked for on startup and on each reset of FSI, on a background thread