github standardnotes/desktop v2.3.0-beta2

This release includes a very much improved architecture that is shared across all versions of the Standard Notes applications, including desktop and mobile. Previously, the web/desktop application contained its own code related to managing sync and items, and the mobile app contained this same code, but duplicated manually. This leads to difficulty in maintaining, and potential for inconsistent behavior.

Version 2.3.0 on all platforms leverages SFJS, which is a separated client-side library we maintain which contains the code related to syncing, authenticating, duplicating, and encrypting/decrypting. With this, we expect to see improved and more consistent syncing behavior, as well as conflict resolution, and general data handling.

SFJS also includes several unit tests, which runs automated tests against every aspect of how the system is intended to function. This means we can make sure there weren't unnecessary regressions in every new release, and also leads to higher levels of confidence in new releases, both for you, and for us.


This release includes a change to how new relationships are managed between notes and tags. New notes tagged on version 2.3.0 will not appear as tagged in versions earlier than 2.3.0, including on mobile. It's recommended to participate in this beta on all platforms for best tag consistency.

Android beta:
iOS beta: Request invite in Slack.

Smart Tags

2.3.0 includes support for the Folders Smart Tags. Using the Folders extension, you can create dynamic tags that query your notes for a certain condition.

For example, if you wanted to see a list of all "untagged" notes, you would create a smart tag like so:

!["Untagged", "tags.length", "=", 0]

Simple enter this value as you would enter any value using the Folders extension (click + to add a new Folder, then paste this value in.)

The components of the smart tag syntax are as follows:

!: The beginning of a smart tag
[...]: A JSON array

  • The first item in that JSON array is the display label.
  • The second item is the property you are targeting.
  • The third is the operator.
  • And the last is the expected value.

Other examples:

!["Untagged", "tags.length", "=", 0]
!["B-tags", "tags", "includes", ["title", "startsWith", "b"]]
!["Foo Notes", "title", "startsWith", "Foo"]
!["Archived", "archived", "=", true]
!["Pinned", "pinned", "=", true]
!["Not Pinned", "pinned", "=", false]
!["Last Day", "updated_at", ">", "1.days.ago"]
!["Long", "text.length", ">", 500]

Regex is also supported. But be sure to escape your / and \ as necessary.

!["Only Letters", "title", "matches", "^[a-zA-Z]+$"]
latest releases: v3.5.16, v3.5.15, v3.5.14...
pre-release2 years ago