Skip to main content



  • Breaking: updated the method to take an object argument instead.


  • Added cardId to the AppEvents.RevealAnswer event data.


  • Added method which returns a promise that resolves when the initial sync is complete. This is useful for plugins that need to wait for the initial sync to complete before eg. syncing data from a third party service.


  • Added plugin.queue.getCurrentCard method to get the current card in the flashcard queue.


  • Small CSS changes to fix native plugins in dark mode.


  • Added WidgetLocation.FlashcardUnder widget location which allows you to add extra elements under the flashcard content.


  • Added a new queueItemTypeFilter for the register widget method.


  • Added a new reader namespace plugin.reader which contains methods related to the PDF reader and web reader.
  • Added SelectionType.PDF and SelectionType.WebReader to the SelectionType enum. Methods that return a SelectionType variable may now take these new values.
  • Added a DocumentViewer component to render a Rem using the full document editor.


  • Added parseAndInsertHtml method to the plugin.richText namespace.
  • Added plugin.rem.createTable method for creating table Rem.
  • Added rem.isTable method to check if a Rem is a table.
  • Added rem.setTableFilter method to set the filter of a table.
  • Added Query class to help build table filters. For example:
// Filter a table to show only Rem where the `column-id` column contains the text "hello" or "world".
const tableRem = ...
const query = Query.tableColumn('column-id', Query.or([
Query.text(TextMatcher.Contains, 'hello'),
Query.text(TextMatcher.Contains, 'world'),
await tableRem.setTableFilter(query);
  • Added property options to the method. This allows plugins to integrate nicely with tables. For example:
'Incremental Everything Powerup',
slots: [
code: prioritySlotCode,
name: 'Priority',
propertyType: PropertyType.NUMBER,
propertyLocation: PropertyLocation.RIGHT,
code: nextRepDateSlotCode,
name: 'Next Rep Date',
propertyType: PropertyType.DATE,
propertyLocation: PropertyLocation.RIGHT,
  • Added method to unregister menu items.
  • Added plugin.queue.inLookbackMode method to check if the user has gone back in the flashcard queue.
  • Added PluginCommandMenuLocation.DocumentMenu location to the method.



  • Added SpecialPluginCallback.GetNextCard callback which allows you to inject cards into the flashcard queue.
  • Added rem.allRemInFolderQueue method which returns all the Rem which are searched for cards in when practicing a specific Rem's cards in the flashcard queue.
  • Added WidgetLocation.FlashcardAnswerButtons widget location which allows you to override the flashcard answer buttons.
  • Added PluginCommandMenuLocation.ReaderMenu and PluginCommandMenuLocation.PDFHighlightPopupLocation locations to the method.



  • Added rem.getTagPropertyValue(propertyId: RemId) and rem.setTagPropertyValue(propertyId: RemId, value: any) methods to get and set the value of a cell in a table.
  • Added rem.getPropertyType() method to get the data type of a tag's property.
  • Added the ability to register menu item buttons in the table property menu using the method.



  • Added getPlatform and getOperatingSystem methods to the namespace.



  • Added the scheduled field to the RepetitionStatus interface.



  • Added the createdAt field to the Rem object.



  • Added window.isPageOpen method to check whether a user is on a particular page. Eg. window.isPageOpen(PageType.Queue).
  • Added a new plugin.queue namespace containing methods related to the flashcard queue.
  • Added plugin.queue.getNumRemainingCards method to check how many cards are left in the current queue.
  • Added plugin.queue.getCurrentStreak method to get the user's current streak.



  • Added widget mount locations for the Flashcard Home Deck Page and the Learning Progress Page.



  • Added data-plugin-id selectors to style specific plugins.
  • Plugins must update to >= SDK v0.0.23 for the selector to appear.


div[data-plugin-id='demo-tabs'] {
color: blue;



  • Custom CSS block styles will be applied to plugins.
  • Theme plugin styles will be applied to other plugins.
  • Plugins must update to >= SDK v0.0.22 to be styled by Custom CSS and themes.



  • Added cardId: string | undefined parameter to the SRSScheduleCard callback. Note that cardId is undefined when the method is called to calculate interval dates for the interval spacing visualization on the Custom Scheduler settings page. But when calculating scheduling dates for cards, the cardId should always be defined.


Note that this release contains a breaking change.


  • (BREAKING): removed the plugin.rem.createWithMarkdown method. It has been replaced by two new methods: plugin.rem.createSingleRemWithMarkdown and plugin.rem.createTreeWithMarkdown.


  • Added plugin.rem.createTreeWithMarkdown(markdown) method. This method creates a tree of Rem from your parsed markdown. Newlines will be turned into separate sibling/child Rem.
  • Added plugin.rem.createSingleRemWithMarkdown(markdown) method. This method creates a single Rem from your parsed markdown. Newlines will NOT be turned into separate sibling/child Rem.



  • Added a new namespace for accessing knowledge base information. To access a user's knowledge base information, your plugin needs to add the KnowledgeBaseInfo permission scope in the manifest.json file. See the permission scope docs for more detail.
  • Added plugin.kb.getCurrentKnowledgebaseData and plugin.kb.isPrimaryKnowledgeBase methods

Other Changes

  • We now support uploading unlisted plugins for personal use. See the unlisted plugins docs for a guide on how to upload and install unlisted plugins.



  • Added a new method called to run code inside a transaction. If the code throws an error, the transaction will be not be saved to disk. Be careful not to hold transactions open for extended periods of time, as this might block other parts of the app.

Theming and CSS

  • We now support uploading simpler CSS snippet plugins which only contain CSS. Simply copy and paste your CSS snippet into a snippet.css file, zip and upload. No need to mess around with GitHub or JS! See the Custom CSS docs for a guide on how to do this.

Other Changes

  • Updated the plugin.rem.createWithMarkdown function so that if the markdown string contains newlines, a single Rem is created containing newlines, rather than a separate Rem for each newline.
  • Added clickOutsideToClose?: boolean parameter to the plugin.widget.openPopup method.
  • Added addTitle?: boolean parameter to the plugin.rem.createLinkRem method.



  • Added a new method to create Rem representing web links called plugin.rem.createLinkRem.
    • If you want to include the link in rich text, use the plugin.richText.rem method and pass the link Rem's _id as an argument

Fixes and Improvements

  • Made some minor changes related to fix special callback handling. This should only affect custom SRS scheduler plugins.


Fixes and Improvements

  • Small fix to the RepetitionStatus interface, renaming the customData field to pluginData.


This version adds support for Plugin SRS Schedulers as well as some new features and bug fixes.


Plugin SRS Schedulers

With this release RemNote now supports Plugin SRS Schedulers. It will be possible to install Plugin Schedulers through the plugin marketplace and customize them in the Custom Scheduler settings page.

  • Added a new plugin.scheduler namespace.
  • Added a plugin.scheduler.registerCustomScheduler method to register a plugin scheduler with custom scheduler parameters.
  • Upated the command to optionally take a generic parameter. This is used to provide type inference for the special SRSScheduleCard callback.

Other Additions

  • Added a new parameter closeWhenClickOutside?: boolean to the plugin.window.openFloatingWidget method. It is true by default.
  • Added support for custom placeholders to the RichTextEditor components through a new placeholder prop.
  • Added a new QueueLoadCard event which fires each time a card changes in the queu so you can keep track of what the current card in the queue is.
  • Added a new widget location filter field called remId to the registerWidget options parameter. Plugins can now register widgets in locations filtered by a particular Rem Id.

Fixes and Improvements

  • Fixed an issue with localhost plugins failing to activate.
  • Fixed editor text not immediately updating when calling the rem.setBackText method.
  • Fixed the RichText component throwing an error and refusing to load.
  • Fixed button click events not working in native plugins.
  • Fixed registered plugin commands not always getting added to the Omnibar and Slash Command Menu.

0.0.14 - 2022-09-22


  • Fixed incompatibility of the npx scripts with lower node versions.

0.0.11..0.0.13 - 2022-09-22


0.0.10 - 2022-09-20

This version we focused on tooling around plugin creation.


  • npx scripts to initialise and validate a plugin before upload.
    • npx remnote-plugin init command to generate the manifest.json file with an interactive prompt.
    • npx remnote-plugin validate to validate the plugin before uploading.
  • Support plugin template npm scripts on Windows.
  • Json schema and linting for manifest.json.
  • richText.indexOfElementAt function to convert a string index to a rich text element array index.

Fixes and Improvements

  • Fix getSelectedRem and getSelectedText reactivity.
  • Removed stealKeys and releaseKeys methods from the editor namespace. They have already been moved into the app namespace.

Theming and CSS

  • Added data-rem-property and data-rem-container-property data attribute to target slot instances like [[Aliases]].

0.0.9 - 2022-08-31


  • Fix window.stealKeys, window.releaseKeys and app.unregisterWidget calling wrong endpoints.

0.0.8 - 2022-08-31


  • Manifest: repoUrl is required for now.
  • Manifest: enabledOnMobile (boolean) must be set if the plugin should run on mobile. Make sure the plugin does require any features not supported on mobile yet, like the right sidebar.
    • ✨ Completely refactored the editor namespace.
    • This makes it more suitable for programmatically modifying content. We plan to reintroduce methods to simulate user actions.
  • Rem class
    • Renamed Rem.tagAncestorRem to Rem.ancestorTagRem and Rem.tagDescendantRem to Rem.descendantTagRem.
    • Renamed Rem.u to Rem.updatedAt and Rem.o to Rem.localUpdatedAt.
    • Renamed (set)isCollapsedPortal to (set)isCollapsed.
  • RichTextBuilder normalizes rich text now. This turns value() into an async method.
  • Changed getFocusedPortalId(): RemId to getFocusedPortal(): Rem.
  • Removed getDescendantIds(): RemId[] in favor of getDescendants() : Rem[].
  • Moved stealKeys/releaseKeys into the app namespace.
  • Moved getWidgetContext into the widget namespace.
  • Flattened context data for WidgetLocation.Popup (context.openContext.focusedRemId -> context.focusedRemId)


  • ✨ Added 18 new methods to the richText namespace
    • General: empty, indexOf, length
    • Modification: replaceAllRichText, split, splitRichText, trim, trimStart, trimEnd
    • Formatting: removeTextFormatFromRange, applyTextFormatFromRange, applyTextFormatFromRange
    • Conversion: toHTML
    • Linking: getRemIdsFromRichText, deepGetRemIdsFromRichText, getRemAndAliasIdsFromRichText, deepGetRemAndAliasIdsFromRichText, findAllExternalURLs
  • ✨ Added experimental rem.getAll() and card.getAll() methods to get all rem or cards respectively. Use with care on large KBs😄.
  • ✨ Added experimental shotcut capturing system to implement custom keyboard controls, like a VIM mode.
  • Support reactivity in the index widget. Wrap your API calls in plugin.track() and they rerun automatically when something has changed.
  • Make focus.focusedRem() and focus.getFocusedPortal() reactive and add AppEvents.FocusedRemChange and AppEvents.FocusedPortalChange events for manual tracking.
  • Add AppEvent.PowerupSlotChanged event to watch for powerup changes, like todo status or highlight color.
  • Added date.getDailyDoc(date: Date).
  • Added Rem.removeTag(tagId: RemId, removeProperties = false). If removeProperties is specified all slots of the tag will be removed as well.
  • Added Rem.removePowerup(powerupCode). It will always remove all powerup slots.
  • Added onlyProgrammaticModifying: boolean and hidden: boolean powerup slot options. Set these to ensure data consistency.
  • Added widget.closeAllFloatingWidgets().

Fixes and Improvements

  • Many methods accept Rem as parameter in addition to RemId. Rem wrapper objects are the preferred way to work with rem and we want to abstract away RemIds as best as possible.
  • Fix AppEvents.QueueCompleteCard event being triggered too often.
  • Fix RichTextBuilder duplicating references.
  • Make searchContextRemId optional in If you omit the context rem searches globally.
  • Typings: Add return type for all methods that were still returning Promise<any>.
  • Typings: Type Rem.setHighlightColor with the available highlight colors.
  • Typings: Add RepetitionStatus type.

Theming and CSS

  • Added data-cloze-id data attribute to Fill-In-The-Blank elements.
  • Added rn-plugin-root class to the plugin iframe (sandboxed) or div (native) node.


  • Add Repository and Report bugs links to the marketplace details page.
  • Manifests are now validated on build.

0.0.7 - 2022-08-01


  • Change getFocusedRemId(): RemId to getFocusedRem(): Rem.


  • Added Rem.addPowerup(powerupCode: BuildInPowerupCodes).
  • Added widget.getDimensions(widgetInstanceId: number). You can get the widgetInstanceId from the getWidgetContext().
  • Added remId to the widget context of WidgetLocation.UnderRemEditor.

Fixes and Improvements

  • Some Rem methods had the wrong permission levels.


0.0.6 - 2022-07-14


  • Make settings.getSetting generic, e.g. plugin.settings.getSetting<string>('my-string-setting');

0.0.5 - 2022-07-14

0.0.4 - 2022-07-14


  • Move addListener and removeListener into new event namespace.
  • Move register* and toast into new app namespace.
  • Move unregisterWidget and getWidgetContext to the widget namespace.

0.0.3 - 2022-07-14


  • Refactored useReactiveAPI to useTracker replacing individual hooks.

0.0.2 - 2022-07-11


  • useReactiveAPI hook.

0.0.1 - 2022-07-09

Initial release 🎉.