Fesh 0.37.0

dotnet add package Fesh --version 0.37.0
                    
NuGet\Install-Package Fesh -Version 0.37.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.37.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Fesh" Version="0.37.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.37.0
                    
#r "nuget: Fesh, 0.37.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.37.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.37.0
                    
Install as a Cake Addin
#tool nuget:?package=Fesh&version=0.37.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# 11 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 11 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.

Run from source

After building the standalone app from source, you can run it with:

dotnet run --project FeshStandalone.fsproj -f net11.0-windows

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, -net10 or -net11 suffix. The version without a suffix is for .NET 11. Each .NET version comes with its own F# version: F# 8 for -net8, F# 9 for -net9, F# 10 for -net10 and F# 11 for -net11. -net472 uses F# 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 net11.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.37.0 0 11/14/2026
0.37.0-net9 0 11/14/2026
0.37.0-net8 0 11/14/2026
0.37.0-net472 0 11/14/2026
0.37.0-net11 0 11/14/2026
0.37.0-net10 0 11/14/2026
0.36.0 179 10/17/2026
0.36.0-net9 106 10/17/2026
0.36.0-net8 113 10/17/2026
0.36.0-net472 116 10/17/2026
0.36.0-net10 120 10/17/2026
0.35.0 112 10/11/2026
0.35.0-net9 104 10/11/2026
0.35.0-net8 109 10/11/2026
0.35.0-net472 113 10/11/2026
0.35.0-net10 121 10/11/2026
0.34.0-net9 112 10/6/2026
0.34.0-net8 110 10/6/2026
0.34.0-net472 116 10/6/2026
0.34.0-net10 115 10/6/2026
Loading failed

### Added

- hosting NuGet package for .NET 11 and F# 11, with a `-net11` suffix
- icons in the completion list for the kind of each item, e.g. method, function, property, event, record field, type, union case, namespace, keyword, directive and NuGet package. Like in the menus, most of each icon is gray and one detail shows the family of the kind in color: purple for methods and functions, blue for properties, fields, values and union cases, amber for types and events, and red for exceptions. The names have the color the editor uses for their kind, from the `Semantic.` and keyword colors in SyntaxHighlightingFSharp.xshd. Keywords are italic like in the editor. In the light theme the selected item has a pale blue background instead of the dark blue one, so that its colors stay readable
- icons in the main menu and in the context menus of the editor, the log and the status bar. Most of each icon is in the text color, one detail shows the kind of command in color: green for evaluating in FSI, red for stop, close, delete and errors, blue for files and selections, amber for new, open, find and build, purple for view and folding, teal for text changes and olive for comments. The icons change color with the theme and fade when the menu item is disabled

### Changed

- the standalone app uses F# 11, with FSharp.Compiler.Service `43.13.101` and FSharp.Core `11.0.101`, for .NET Framework 4.8 and for .NET 11. The .NET version needs the .NET 11 Desktop Runtime and updates from the .NET 10 version
- the package without a suffix is for .NET 11 and F# 11 now. Hosts on .NET 10 should use the package with the `-net10` suffix
- Hide AutoOpen modules from editor completion lists with EditorBrowsable(EditorBrowsableState.Never).
- "Auto-Reload External Changes" in the File menu shows a checkbox, also when it is off, so that it looks like a setting and not like a command. The menu stays open when you click it, so that you see the checkbox change
- the group headers in the recent files list of the File menu, like "Yesterday", are dim labels aligned with the file names. The mouse doesn't highlight them and the arrow keys skip them