Enso IDE is the main product of the Enso project. The packages are stand-alone,
they contain both GUI and the backend.
This is the recommended download for most users.
If you are interested in using Enso Engine command line tools only, download the
Enso Engine bundle.
These are archives containing the
Enso portable distribution.
User is responsible for setting up the environment variables and adding the
bin directory to the
Note that these distributions do not allow you to use the Enso IDE.
It is recommended only for advanced users, who want to just try the compiler
Anonymous Data Collection
Please note that this release collects anonymous usage data which will be used
to improve Enso and prepare it for a stable release. We will switch to opt-in
data collection in stable version releases. The usage data will not contain your
code (expressions above nodes), however, reported errors may contain brief
snippets of out of context code that specifically leads to the error, like "the
method 'foo' does not exist on Number". The following data will be collected:
- Session length.
- Graph editing events (node creation, deletion, position change, connect,
disconnect, collapse, edit start, edit end). This will not include any
information about node expressions used.
- Navigation events (camera movement, scope change).
- Visualization events (visualization open, close, switch). This will not
include any information about the displayed data nor the rendered
- Project management events (project open, close, rename).
- Errors (IDE crashes, WASM panics, Project Manager errors, Language Server
errors, Compiler errors).
- Performance statistics (minimum, maximum, average GUI refresh rate).
- Camera is panned to newly created nodes.
- Long names on the Node Searcher's list are truncated. The part of the
name that doesn't fit in the Searcher's window is replaced with an ellipsis
- Magnet Alignment algorithm is used while placing new nodes. When we
find an available free space for a new node, the node gets aligned with the
surrounding nodes horizontally and vertically. This helps to preserve a nice
grid-like layout for all the nodes.
- Nodes created via the <kbd>TAB</kbd> key or by clicking the (+) button on the
screen are now placed below all the selected nodes when more than one node is
selected. (Previously, they were placed below the first node that was
selected.) This makes it easier to achieve a compact, vertical layout of the
- Nodes created near existing nodes via the <kbd>TAB</kbd> key or by dropping a
connection are now repositioned and aligned to existing nodes. This is
to make the resulting graph prettier and avoid overlapping. In such cases,
created nodes will be placed below an existing node or on the bottom-left
diagonal if there is no space underneath.
- Nodes can be added to the graph by double-clicking the output ports of
existing nodes (or by clicking them with the right mouse button).
- Node Searcher preserves its zoom factor. The visible size of the node
searcher and edited node is now fixed. It simplifies node editing on
non-standard zoom levels.
- Nodes can be added to the graph by clicking (+) button on the screen.
The button is in the bottom-left corner. Node is added at the center or pushed
down if the center is already occupied by nodes.
- Maximum zoom factor is limited to 1.0x if IDE is not in Debug Mode.
- Debug Mode for Graph Editor can be activated/deactivated using a
shortcut. It allows access to a set of restricted features. See
- New nodes can be created by dragging and dropping a connection on the
- Node connections can be dropped by pressing the Esc key while dragging
- Added support of source maps for JS-based visualizations.
- Fixed the alignment of newly created nodes to existing nodes with
visualizations enabled. When applicable, new nodes are now placed below
visualizations. (Previously, they were placed to the left of the
- Fixed histograms coloring and added a color legend.
- Lazy visualization for scatter plot.
- Fixed broken node whose expression contains non-ASCII characters.
- Fixed developer console warnings about views being created but not
- Fixed developer console errors related to Language Server (mentioning code
3003 and "Invalid version"), occurring during project opening and after new
- Fixed developer console error about failing to decode a notification
- New Version of the Node Searcher - the Component Browser The available
methods, atoms and functions are presented in nice, categorized view. The most
popular tools are available at hand. The panel is unstable, and can be
disabled with the `--enable-new-component-browser=false` flag.
- Fixed error handling during startup. This prevents entering IDE into a
"zombie" state, where processes were started but not visible to user. They
could cause issues with starting further IDE instances.
- New nodes are created in the project source when the searcher is opened and a
new node is created.
- Proper Polyglot Vector and Array Support
- IDE uses new visualization API.
- Visualization of long textual values improved
- Selecting a suggestion from the searcher or component browser now updates the
visualisation of the edited node to preview the results of applying the
- Remove here keyword from IDE.
- Shortcut changes: Pressing `Enter` when no node is edited opens
Component Browser. Entering node shortcut changed to `cmd` + `Enter`.
- Added support for scrolling by pressing and holding a mouse button on a
- Added scroll bounce animation which activates when scrolling past the
end of scrollable content.
- The default text visualisation now loads its content lazily from the
backend. This means that the visualisation cannot be overwhelmed by
large amounts of data.
- Added project snapshot saving on shortcut
- The color of the displayed project name indicates whether the project's
current state is saved in a snapshot. The project name is darker when
the project is changed from the last saved snapshot and lighter when the
snapshot matches the current project state.
- Added shortcut to interrupt the program
- Added suggestion dropdown for function arguments. The dropdown is
present only when the argument is of type that has a predefined set of values.
- Separate component browser navigator sections for modules imported from
- Internal components (private API) are not displayed in the component
- The correct default visualisation for tables is shown on new nodes.
- Added restoring of last project snapshot on shortcut.
- Added contextual suggestions to argument dropdowns. Dropdowns will now
contain suggestions which are based on evaluated data.
- Added a shortcut to show internal components (private API) in the component
- Improved component browser entry filtering and sorting. The component
browser will now provide suggestions matching either the component's label or
the corresponding code.
- Improved argument placeholder resolution in more complex expressions.
It is now possible to drop node connections onto missing arguments of chained
and nested function calls.
- The component browser suggestions take into account entry aliases. The
searcher input is now matched to entry aliases too. The alias match is used to
filter and sort component browser entries.
- The Component Browser icons are cached on texture improving its
performance on slower machines.
- Fixed missing result preview when editing nodes.
- Application retries its initialization after failures, allowing a
reconnecting after connectivity problems.
- Improved Component Browser Filtering. The best match is always
selected first, and the groups are rearranged, so the best matches are on the
- Named arguments syntax is now recognized in IDE. Connections to
function arguments will now use named argument syntax instead of inserting
wildcards on all preceding arguments.
- Added boilerplate React app for authorization via Cognito+AWS Amplify.
This PR adds a React app that renders the dashboard (which has been ported
from the cloud. The dashboard displays a list of projects, and allows users to
open them in the IDE (which is not part of the React app, but can be switched
to from the dashboard). The PR also adds authentication+authorization (i.e.,
sign up and sign in for users), via either email/password or GitHub/Google.
- New Enso documentation parser. Smaller and faster; enables planned
improvements to internal documentation representation.
- Dropdown widgets now support custom labels and automatically generate
shortened labels for entries with long module paths. When an option is
selected from the dropdown, the necessary module imports are inserted,
eliminating the need for fully qualified names.
- The IDE now has a new UI element for selecting the execution mode of the
- Added tooltips to icon buttons for improved usability. Users can now
quickly understand each button's function.
- File associations are created on Windows and macOS. This allows
opening Enso files by double-clicking them in the file explorer.
- Added capability to create node widgets with complex UI. Node widgets
such as dropdown can now be placed in the node and affect the code text flow.
- The IDE UI element for selecting the execution mode of the project is now
sending messages to the backend..
- Feedback when renaming a project. When the user tries to rename the
project to an invalid name, a helpful error message is shown and the text
field stays the same as to give the user the opportunity to fix the mistake.
- Area selectionof nodes no longer takes into account the visualisation that
belongs to the node..
- List Editor Widget. Now you can edit lists by clicking buttons on
nodes or by dragging the elements.
- Visualisations now show a loading spinner while waiting on data..
- Fixed text visualisations which were being cut off at the last line.
- Fixed a bug where, when scrolling or dragging on a full-screen visualization,
the view of the graph changed as well.
- Changed the shortcut for restoring to the last saved version of a project
from <kbd>cmd</kbd>+<kbd>r</kbd> to
<kbd>cmd</kbd>+<kbd>shift</kbd>+<kbd>r</kbd> to make it less likely
that it would be triggered by accident. As a consequence, the program
execution shortcuts changed from
- Fixed a bug where selecting a nested breadcrumb would cause the order of
breadcrumbs to change incorrectly.
- Changed the shortcut to show the full-screen visualization for a node from
<kbd>space</kbd> <kbd>space</kbd> to <kbd>shift</kbd>+<kbd>space</kbd>.
so that it doesn't interfere with the shortcut for toggling the small
- Cloud dashboard, which supersedes the startup screen. Features also
added in various other PRs. The new dashboard includes tables for projects,
folders, files and secrets, a list of templates from which new projects can be
created, a user menu, and a search bar.
EnsoGL (rendering engine)
- You can change font and set letters bold in the <code>text::Area</code>
component. Use the <code>set_font</code> and
- Fixed a text rendering issue in nested sublayer.
- Added a new component: Grid View. It's parametrized by Entry object,
display them arranged in a Grid. It does not instantiate all entries, only
those visible, and re-use created entries during scrolling thus achieving
great performance. There are variants of grid view with selection and
highlight, scrollbars, and both.
- Massive improvements of text rendering performance. Different text
instances are now reusing the shape shaders and the same sprite system under
the hood. This drastically reduces the amount of required draw calls for
scenes with a lot of text.
- Text rendering quality improvements. Glyphs are now hinted in a better
way. Also, additional fine-tuning is performed per font and per host operating
- Display objects can now emit and receive events in the same style as
behavior to the one described here:
- Added a new component: Slider. It allows adjusting a numeric value
with the mouse. The precision of these adjustments can be increased or
- Slider component functionality improvements. The slider component now
supports multiple ways to handle out-of-range values. The slider's value can
be edited as text, and a new vertical slider layout is available.
- Added ProjectsGrid view for Cloud Dashboard. It provides the first
steps towards migrating the Cloud Dashboard from the existing React (web-only)
implementation towards a shared structure that can be used in both the Desktop
and Web versions of the IDE.
- Removed Cloud Dashboard. The Cloud Dashboard was being rewritten in
EnsoGL but after internal discussion we've decided to rewrite it in React,
with a shared implementation between the Desktop and Web versions of the IDE.
- Added a new component: Dropdown. A list of selectable labeled entries,
suitable for single and multi-select scenarios.
- Compile-time shader optimizer was implemented. It is capable of
extracting non-optimized shaders from the compiled WASM artifacts, running
stand-alone optimization toolchain (glslc, spirv-opt, spirv-cross), and
injecting optimized shaders back to WASM during its initialization process.
Unfortunately, it caused our theme system to stop working correctly, because
generated shaders differ per theme (only light theme is available, the dark
theme has been disabled). We will support multiple themes in the future, but
this is not on our priority list right now.
- Performance monitor was extended with the ability to print details of actions
performed in a given frame. In particular, you can now inspect names of
all symbols rendered in a given frame. You can also pause the performance
monitor and inspect results recorded in the past.
- ToggleButtons can now have tooltips.
- Rendering of tooltips was improved. Their text is now more vertically
centered and the delay before showing them was extended.
Enso Standard Library
- Implemented `Vector.distinct` allowing to remove duplicate elements from a
- Implemented `Duration.time_execution` allowing timing of the execution of an
expression within the UI
- Improved performance of `Vector.filter` and `Vector.each`; implemented
`Vector.filter_with_index`. Made `Vector.at` accept negative indices and
ensured it fails with a dataflow error on out of bounds access instead of an
internal Java exception.
- Implemented the `Table.select_columns` operation.
- Implemented the `Table.remove_columns` and `Table.reorder_columns`
- Implemented the `Table.sort_columns` operation.
- Fixed `Vector.sort` to handle tail-recursive comparators
- Implemented `Range.find`, `Table.rename_columns` and
- Implemented `Text.at` and `Text.is_digit` methods
- Implemented `Runtime.get_stack_trace` together with some utilities to process
stack traces and code locations
- Implemented `Vector.flatten`
- Significant performance improvement in `Natural_Order` and new `Faker`
methods added to `Standard.Test`
- Implemented `Integer.parse`
- Made `Text.compare_to` correctly handle Unicode normalization
- Extend `Text.contains` API to support regex and case insensitive
- Implemented new `Text.take` and `Text.drop` functions, replacing existing
- Implemented new `Text.starts_with` and `Text.ends_with` functions, replacing
- Implemented `Text.to_case`, replacing `Text.to_lower_case` and
- Implemented initial `Table.group_by` function on Standard.Table
- Implemented `Text.pad` and `Text.trim`
- Updated `Text.repeat` and added `*` operator shorthand
- General improved Vector performance and new `Vector.each_with_index`,
`Vector.fold_with_index` and `Vector.take` methods.
- Implemented new `Text.insert` method
- Implemented `Bool.compare_to` method
- Implemented `Map.first`, `Map.last` functions. Expanded `Table.group_by` to
also compute mode, percentile, minimum, maximum.
- Implemented `Text.location_of` and `Text.location_of_all` methods.
- Replaced `Table.group_by` with `Table.aggregate`
- Implemented `Panic.catch` and helper functions for handling errors. Added a
type parameter to `Panic.recover` to recover specific types of errors.
- Added warning handling to `Table.aggregate`
- Improved performance of `Table.aggregate` and full warnings
- Implemented `Text.reverse`
- Implemented support for most Table aggregations in the Database
- Update `Text.replace` to new API.
- Add encoding support to `Text.bytes` and `Text.from_bytes`. Renamed and added
encoding to `File.read_text`. New `File.read` API.
- Improved the `Range` type. Added a `down_to` counterpart to `up_to` and
`with_step` allowing to change the range step.
- Aligned `Text.split` API with other methods and added `Text.lines`.
- Implemented a basic reader for the `Delimited` file format.
- Implemented a reader for the `Excel` file format.
- Added custom encoding support to the `Delimited` file format reader.
- Implemented `compute` method on `Vector` for statistics calculations.
- Promote get and put to be methods of Ref type rather than of Ref
- Implemented `Table.parse_values`, parsing text columns according to a
- Promote with, take, finalize to be methods of Managed_Resource
- Implemented automatic type detection for `Table.parse_values`.
- Integrated value parsing with the `Delimited` file reader.
- Implemented the `Infer` setting for headers in the `Delimited` file format
and made it the default.
- Implemented a `Table.from Text` conversion allowing to parse strings
representing `Delimited` files without storing them on the filesystem.
- Added rank data, correlation and covariance statistics for `Vector`
- Implemented `Table.order_by` for the SQLite backend.
- Implemented `Table.order_by` for the PostgreSQL backend.
- Implemented `Table.order_by` for the in-memory table.
- Renamed `File_Format.Text` to `Plain_Text`, updated `File_Format.Delimited`
API and added builders for customizing less common settings.
- Allow control of sort direction in `First` and `Last` aggregations.
- Implemented `Text.write`, replacing `File.write_text`.
- Removed obsolete `select`, `group`, `sort` and releated types from
- Removed obsolete `from_xls` and `from_xlsx` functions. Added support for
reading column names from first row in `File_Format.Excel`
- Added `File_Format.Delimited` support to `Table.write` for new files.
- Adjusted `Database.connect` API to new design.
- Added `File_Format.Excel` support to `Table.write` for new files.
- identity,const,flip,curry,uncurry functions
- Added append support for `File_Format.Excel`.
- Added support for custom encodings in `File_Format.Delimited` writing.
- Allow filtering caught error type in `Error.catch`.
- Implemented `Append` mode for `File_Format.Delimited`.
- Added `Vector.write_bytes` function and removed old `File.write_bytes`
- Added `line_endings` and `comment_character` options to
- Fixed the case of various type names and library paths
- Added support for parsing `.pgpass` file and `PG*` environment variables for
the Postgres connection
- Added `Regression` to the `Standard.Base` library and removed legacy `Model`
type from `Standard.Table`.
- Created `Index_Sub_Range` type and updated `Text.take` and
- Added `Vector.from_polyglot_array` to make `Vector`s backed by polyglot
- Updated `Vector.take` and `Vector.drop` and removed their obsolete
- Short-hand syntax for `order_by` added.
- Expanded `Table.at` to support index access and added `Table.column_count`
- Removed `Array.set_at`.
- Added various date part functions to `Date` and `Date_Time`.
- Implemented `Table.take` and `Table.drop` for the in-memory backend.
- Implemented specialized storage for the in-memory Table.
- Implemented `Table.distinct` for the in-memory backend.
- Added `databases`, `schemas`, `tables` support to database Connection.
- Implemented `start_of` and `end_of` methods for date/time types allowing to
find start and end of a period of time containing the provided time.
- Implemented `type_of` and `is_of_type` methods for getting the type of a
value and comparing types, respectively.
- Implemented `work_days_until` for counting work dys between dates and
`add_work_days` which allows to shift a date by a number of work days.
- Added `query` and `read` functions to Database connections.
- Added `Date_Period.Week` to `start_of` and `end_of` methods.
- Replaced `Table.where` with a new API relying on `Table.filter`.
- Added `Filter_Condition` to `Vector`, `Range` and `List`.
- Extended `Filter_Condition` with `Is_Empty`, `Not_Empty`, `Like` and
- Reimplemented `Duration` as a built-in type.
- Implemented `Table.replace_text` for in-memory table.
- Extended `Filter_Condition` with `Is_In` and `Not_In`.
- Replaced `Table.drop_missing_rows` with `filter_blank_rows` with an updated
- Replaced `Table.drop_missing_columns` with
`Table.remove_columns Column_Selector.Blank_Columns` by adding the new column
- Implemented `Table.rows` giving access to a vector of rows.
- Define Enso epoch start as 15th October 1582
- Implemented `Period` type
- Implemented new functions on Column and added expression syntax support to
create derived Columns.
- Added support for milli and micro seconds, new short form for rename_columns
and fixed issue with compare_to versus Nothing
- Aligned `Text.match`/`Text.locate` API
- There is a new API to lazily feed visualisation information to the
- Added `transpose` and `cross_tab` to the In-Memory Table.
- Improvements to JSON, Pair, Statistics and other minor tweaks.
- Enable Date, Time and DateTime to be read and written to Excel.
- Aligning core APIs for Vector, List and Range. Adding some missing functions
to the types.
- Implemented `Table.distinct` for Database backends.
- Implemented `Table.union` for the in-memory backend.
- Implemented `Table.cross_join` and `Table.zip` for the in-memory
- Updated `Text.starts_with`, `Text.ends_with` and `Text.contains` to new
- Updated `Table.set` to new API. New `Column.parse` function and added case
sensitivity to `Filter_Condition` and column functions.
- Updated column selector APIs and new `Excel_Workbook` type.
- Moved regex functionality out of `Text.locate` and `Text.locate_all` into
`Text.match` and `Text.match_all`.
- `File.parent` may return `Nothing`.
- Removed non-regex functionality from `is_match`, `match`, and `match_all`,
and renamed them to `match`, `find`, `find_all` (respectively).
- Updated `rename_columns` to new API. Added `first_row`, `second_row` and
`last_row` to Table types
- Introducing `Meta.Type`.
- Remove many regex compile flags; separated `match` into `match` and
- Aligned names of columns created by column operations.
- Improved `cross_tab`. Renamed `fill_missing` and `is_missing` to
`fill_nothing` and `is_nothing`. Added `fill_empty`.
- Removed many regex compile flags from `replace`; added `only_first` and
- Implemented proper support for Value Types in the Table library.
- Removed many regex compile flags from `split`; added `only_first` and
- Added `Text.tokenize`
- Added support for Date/Time columns in the Postgres backend and added
`year`/`month`/`day` operations to Table columns.
- `Text.split` can now take a vector of delimiters.
- Add `has_warnings`, `remove_warnings` and `throw_on_warning` extension
- Implemented `Table.union` for the Database backend.
- Array & Vector have the same methods & behavior
- Implemented `Table.split` and `Table.tokenize` for in-memory tables.
- Added `trim` and `replace` to `Column`. Enhanced number parsing with support
for thousands and decimal point automatic detection.
- Implemented `Table.parse_text_to_table`.
- Added `Table.parse_to_columns`.
- Added parsing methods for `Integer`, `Decimal`, `Json`, `Date`, `Date_Time`,
`Time_Of_Day`, `Time_Zone`, and `URI` to `Text`.
- Implemented `create_database_table` allowing upload of in-memory
- Added execution context control to writing files and dry run capabilities to
- Implemented `create_database_table` allowing saving queries as database
- Implemented `Column.format` for in-memory `Column`s.
- Added `at_least_one` flag to `Table.tokenize_to_rows`.
- Moved `Redshift` connector into a separate `AWS` library.
- Added `Date_Range`.
- Added overloaded `from` conversions.
- Upgraded to Graal VM 21.3.0
- Added the ability to decorate values with warnings.
- Fixed issues related to constructors' default arguments
- Fixed compiler issue related to module cache.
- Fixed execution of defaulted arguments of Atom Constructors
- Converting Enso Date to java.time.LocalDate and back
- Incremental Reparsing of a Simple Edits
- Functions with all-defaulted arguments now execute automatically
- Provide `tagValues` for function arguments in the language server
- Delay construction of Truffle nodes to speed initialization
- Frgaal compiler integration to allow for latest Java constructs
- Support for Chrome developer tools --inspect option
- Move Builtin Types and Methods definitions to stdlib
- Reduce boilerplate by generating BuiltinMethod nodes from simple method
- Generate boilerplate classes related to error handling and varargs in
builtins from method signatures
- Avoid needless concatenations of warning/error messages
- Added a full-blown DSL for builtins
- Integration of Enso with Ideal Graph Visualizer
- Lazy evaluation of RHS argument for || and &&
- Drop Core implementation of IR
- Replace `this` with `self`
- Introduce a smaller version of the standard library, just for testing
- Remove `here` and make method name resolution case-sensitive
- Explicit `self`
- Added benchmarking tool for the language server
- Support module imports using a qualified name
- Using parser written in Rust.
- Enable caching in visualisation functions
- Update Scala compiler and libraries
- Support importing module methods
- Support Autosave for open buffers
- Generate native-image for engine-runner
- Support pattern matching on constants
- Builtin Date_Time, Time_Of_Day and Zone types for better polyglot
- Implement new specification of data types: `type` has a runtime
representation, every atom has a type
- main = "Hello World!" is valid Enso sample
- Invalidate module's IR cache if imported module changed
- Don't rename imported Main module that only imports names
- Notify node status to the IDE
- Make instance methods callable like statics
- Distinguish static and instance methods
- By-type pattern matching
- Fix performance of method calls on polyglot arrays
- Improved support for static and non-static builtins
- Missing foreign language generates proper Enso error
- Connecting IGV 4 Enso with Engine sources
- Made Vector performance to be on par with Array
- Introduced IO Permission Contexts
- Accept Array-like object seamlessly in builtins
- Initialize Builtins at Native Image build time
- Split Atom suggestion entry to Type and Constructor
- Any number can be converted to double
- Update to GraalVM 22.3.0
- Connecting IGV 4 Enso with Engine sources
- Add the `Self` keyword referring to current type
- Support VCS for projects in Language Server
- Support multiple exports of the same module
- Import modules' extension methods only with unqualified imports
- Support expression evaluation in chromeinspector console
- Don't export polyglot symbols
- From/all import must not include module in name resolution
- Vector returns warnings of individual elements
- Enso.getMetaObject, Type.isMetaInstance and Meta.is_a consolidation
- Add executionContext/interrupt API command
- Any.== is a builtin method
- Simplify exception handling for polyglot exceptions
- Simplify compilation of nested patterns
- IGV can jump to JMH sources & more
- Basic support of VSCode integration
- Sync language server with file system after VCS restore
- `ArrayOverBuffer` behaves like an `Array` and `Array.sort` no longer sorts in
- Implement hashing functionality for all objects
- Introducing Meta.atom_with_hole
- Report failures in name resolution in type signatures
- Attach visualizations to sub-expressions
- Add Meta.get_annotation method
- Resolve Fully Qualified Names
- Optimize Atom storage layouts
- Make instance methods callable like statics for builtin types
- Convert large longs to doubles, safely, for host calls
- Consistent ordering with comparators
- Profile engine startup
- Report type of polyglot values
- Engine can now recover from serialization failures
- Use sbt runEngineDistribution
- Update to GraalVM 22.3.1
- Cache library bindings to optimize import/export resolution
- Comparators support partial ordering
- Merge ordered and unordered comparators
- Use SHA-1 for calculating hashes of modules' IR and bindings
- Don't install Python component on Windows
- Detect potential name conflicts between exported types and FQNs
- Ensure calls involving warnings remain instrumented
- One can define lazy atom fields
- Replace IOContexts with Execution Environment and generic Context
- Vector.sort handles incomparable types
- Removing need for asynchronous thread to execute ResourceManager
- Warning.get_all returns only unique warnings
- Reimplement `enso_project` as a proper builtin
- Limit number of reported warnings per value
- Suggestions are updated only when the type of the expression changes