Introduction Last updated: 2024-04-15

SharpNote is a modern desktop note-taking application built with Electron and React. It provides a clean and intuitive interface for managing notes, featuring a customizable layout, local file storage, and seamless organization.

General Info

This section lists various bits of general information related to SharpNote.

2.1 SharpNote Features

2.2 Logo's

Below is an overview of SharpNote's logo history. The logo is also used as the app icon for the corresponding version.

v1 (1.0.0 - 1.1.0)
v2 (1.2.0+)

Versions

3.1 Version Overview

Below is an overview of all SharpNote versions. All SharpNote releases are codenamed with the name of a color alphabetically.

# Version Release Name Release Date
 
1 1.0.0 Azure 23/02/2025
 
2 1.1.0 Blossom 03/03/2025
 
3 1.2.0 Crimson 13/04/2025
 
4 1.3.0 Emerald TBA

3.2 Download

All versions of SharpNote can be downloaded at https://kiyantk.nl/dev/sharpnote/downloads

3.3 Changelogs

You can view the changelogs per version over at https://kiyantk.nl/dev/sharpnote/changelog

3.4 Backward Compatibility

Below is an overview of the backward compatibility history for each version:

Version Backwards compatible with Reason Compatible with previous
1.0.0 - First release
 
1.1.0 - Changed database columns
 
1.2.0 1.2.0+ Major database & architecture changes
 

Below is an overview of the backward compatibility compared to the latest version for each version:

Version Compatible with latest
1.0.0
 
1.1.0
 
1.2.0
 

Parts of the app

This section documents the various parts of SharpNote.

4.1 Welcome popup

This is the onboarding popup shown when the user opens SharpNote for the first time. The primary use for this is asking the user whether they want to set a username to use in author fields.

SharpNote remembers whether the user has seen this popup with 'welcomePopupSeen' in the config file. Once the user submits the popup, this property is set to true.

The username can always be set, changed or removed in Settings.

4.2 Menu Bar

The Menu Bar is the bar shown at the very top of the application. It allows you to do various things, such as opening Settings, exporting, importing, toggling the left panel, toggling delete mode, among many other things.

From 1.3.0 onwards, the Menu Bar also serves as the app's title bar. As a part of UI v2, the default OS title bar is disabled. The Menu Bar directly serves its purpose now, allowing the user to drag and close the app through it.

4.3 Control Bar

The Control Bar is the bar shown at the very bottom of the application. This bar is designed to show important information and allows for easy access to important tasks.

The Control Bar consists of the following (from left to right):

  • Refresh Button
  • Note Counter
  • Text Statistics
  • Autosave Status
  • Manual Save Button

4.4 Note List

The Note List is the left panel and shows all your notes and folders.

Each note and folder is represented by a 'Note Item' or 'Folder Item'. This item contains an icon (sticky note for notes, folder for folders) and is colored according to the note/folder color.

Clicking on a folder will reveal the notes under it.

Notes and folders can be reordered by dragging and dropping them. The exact order is saved in your sharpnote-config.json file and can be included in Sharpbook exports.

Right-clicking a note or folder will show a context menu, with the following options:

Note Context Menu

  • Note Info
  • Edit Note
  • Move to Folder (if you have any)
  • Export Note
  • Delete Note

Folder Context Menu

  • Folder Info
  • Edit Folder
  • Export Folder Notes
  • Delete Folder

The 'Move to Folder' option opens a menu next to the context menu, with a list of all your folders. If the note is already under a folder, this menu also shows an option to remove it from the folder.

At the top of the Note List you can find buttons to create a new note or folder. At the bottom of the Note List, you can find a bar that allows you to collapse the Note List into a minimized form.

4.5 Note Editor

4.6 Settings

The Settings popup can be accessed through the File dropdown in the Menu Bar. It allows the user to customize specific parts of the app.

The popup consists of a tab list on the left side and the tab content on the right side. It also has buttons to close and save at the bottom.

Settings consists of the following tabs:

  • User
  • Display
  • Editor
  • Storage
  • Shortcuts
  • App

Below is an overview of all available settings per tab:


User

  • Username

Display

  • Note List item style (Normal/Slim/Big/Detailed)
  • Show icons in menubar
  • Show note counter
  • Disable Drag-and-drop ordering

Editor

  • Autosave (every minute)
  • Show unsaved changes warning
  • Show text statistics
  • Spell Check

Storage

  • Disable Import Checks (As a last resort, enable at your own risk)
  • Folder delete behaviour (Delete notes/Keep notes)
  • Storage Usage (App Storage, Notes Storage)
  • Storage Actions (Delete everything)

Shortcuts

  • Save opened note: CTRL + S
  • Refresh: CTRL + R
  • New note: CTRL + T
  • Close note: CTRL + W

App

  • SharpNote Version: <app version>
  • App location (Button that takes you to the app's directory on your PC)

Settings are saved in your sharpnote-config.json file.

4.7 Export

You can export your data out of SharpNote using the Export window, accessible through the menu bar or by right-clicking a note or folder.

Data can be exported to the following file formats:

Format Description
.sharp A single note
.sharpbook One or more notes and/or folders in one package
.txt A singular note's content as plain text
.pdf A singular note's content as a PDF
.docx A singular note's content as a Microsoft Word Document
.html A singular note's content as a web page
.db A copy of the database SharpNote uses to store notes and folders

The Export popup consists of multiple options. Firstly you can select the Export Type, with the following options:

  • Single Note: One singular note
  • All Notes: All of your notes
  • Selection of Notes: A specific selection of notes
  • Notes Database: A copy of the database SharpNote uses to store notes and folders

After that, the user can select their desired Export Format. The available options differ depending on your selected Export Type:

Export Type Available Export Format(s)
Single Note SharpNote Note File (*.sharp)
TXT (*.txt)
PDF (*.pdf)
Word Document (*.docx)
Single File Web Page (*.html)
All Notes Pack into a single file (*.sharpbook)
Seperate export (*.sharp's)
Selection of Notes Pack into a single file (*.sharpbook)
Seperate export (*.sharp's)
Notes Database SQLite Database (*.db)

The 'Seperate export' option exports each note as a seperate file. You will be prompted to choose a directory. Files with the same filename will be overwritten. To avoid overwriting the exports during the export process, notes with the same title will be appended with an incremental number.

A note browser (a simplified note list) is shown on the 'Single Note' and 'Selection of Notes' Export Types. Clicking on a note will select it. The 'Selection of Notes' Export Type allows for multiple notes to be selected in the note browser, while 'Single Note' will only allow one selection at a time.

A checkbox to include folders in the export is available on exports to a .sharpbook file.

A filename may be entered on the last step of the Export popup. When ready, the user can press the 'Export' button.

4.8 Import

You can import data into SharpNote using the Import window, accessible through the menu bar.

The popup starts with a file selector. SharpNote supports the following filetypes to be imported:

Format Description
.sharp A SharpNote Note File (a single note)
.sharpbook A SharpNote Notebook File (one or more notes and/or folders)
.txt A plain text file

If the user selects a .sharp file for importing, the note title will be shown.

If the user selects a .sharpbook file for importing, the amount of valid notes within the Sharpbook will be shown. If one or more notes contained in the Sharpbook are not valid, an additional counter of all invalid notes will be shown.

If the user select a .txt file for importing, the text will be shown in a textbox.

When importing a Sharpbook, the user has the option to use the structure saved within the Sharpbook. The notes/folders will still be added from the top of your list of notes, but their order will be decided by the structure property in the Sharpbook.

With every file selection, a validity status is shown. This can show a few things:

  • Valid SharpNote File: The file is a valid .sharp or .sharpbook file.
  • Valid File: The file is a valid .txt file.
  • Invalid SharpNote File: The file is not a valid .sharp or .sharpbook file.
  • SharpNote version not supported: The .sharp or .sharpbook file was exported in an incompatible version of SharpNote.

If a 'SharpNote version not supported' status occurs, a small explanation is given under it:
'The selected file was created in SharpNote version [version from the file], which isn't supported by your installed version ([your SharpNote version])

Every .sharp and .sharpbook file is checked on whether it is valid. The following criteria apply:

.sharp
  • Must have the property 'sharpnoteVersion'
  • Must have the property 'noteTitle'
  • Must have the property 'noteContent'
  • Must have the property 'noteColor'
  • Must have the property 'noteOriginalAuthor'; may be null or empty and must be less than 32 characters and may only use the supported characters
  • The property 'noteOriginalAuthor' may be null or empty and must be less than 32 characters
  • Must have the property 'created' within it's noteHistory
  • If 'noteOriginalAuthor', 'noteTitle', 'noteContent' or 'noteColor' are null, they will be converted to an empty string.
.sharpbook
  • Must have the property 'notes'
  • Must have the property 'sharpnoteVersion'
  • Must have 1 or more notes
  • Must have the property 'bookAuthor'; may be null or empty and must be less than 32 characters and may only use the supported characters

Every note contained in a .sharpbook is also checked against the validity criteria for a .sharp. If it passes, it is included in the import.

The validity checks may be disabled through Settings. This is only advised as a last resort, if the file should work but does not for some reason. SharpNote checks the validity of your imports to ensure data integrity and to avoid problems.

Technical Documentation

This section documents the technical architecture and data structure of SharpNote. All specifications in this section are based on the latest version of SharpNote, so it may look different for older versions.

5.1 Config

SharpNote uses a config file stored as JSON to remember user settings and actions.

The config file is named sharpnote-config.json and is located in the root folder of the app.

The following information is stored in the config file:

Property Description Datatype
username The username set by the user through the Welcome popup or through settings. Is optional. null | string
welcomePopupSeen Indicates whether the user has seen and submitted the Welcome popup. It shows the popup if this property is false. boolean
userSettings All the app settings. A JSON object containing properties like autoSave JSON object
structure Saves the order of the notelist. Contains two properties: 'folders' and 'rootOrder'. 'folders' contains all the folders with an array of noteIDs with order intact. 'rootOrder' defines the order of notes which are not under any folder, and the folders themselves. JSON object

Below is an overview of what is stored in userSettings:

Property Description Datatype Default Introduced
autoSave Whether autosaving is enabled. Notes will autosave if this is true. boolean true 1.0.0
showMenubarIcons Whether to show icons in the menubar dropdowns boolean true 1.1.0
noteItemStyle Which note item style the user has set. Either "normal", "slim", "big" or "detailed" string normal 1.1.0
showUnsavedChangesWarning Whether to show 'Unsaved Changes' warnings boolean true 1.1.0
disableImportChecks Option to disable validity checks within the import popup boolean false 1.1.0
folderDeleteBehaviour What to do when deleting a folder (either 'deletenotes' or 'keepnotes') string deletenotes 1.2.0
showTextStatistics Whether to show word/line count in Control Bar boolean true 1.2.0
showNoteCounter Whether to show Note Count in Control Bar boolean false 1.2.0
disableDnD Option to disable re-ordering in the Note List thru Drag and Drop boolean false 1.2.0
spellCheck Option to set whether the editor should highlight possible mistakes boolean true 1.2.0
createButtonsPosition Option to choose where the 'New ...' buttons should be placed string top 1.3.0

Below is an example of what a sharpnote-config.json file might look like:

{ "username": "user1", "welcomePopupSeen": true, "userSettings": { "autoSave": true, "showMenubarIcons": true, "noteItemStyle": "normal", "showUnsavedChangesWarning": true, "disableImportChecks": false, "folderDeleteBehaviour": "deletenotes", "showTextStatistics": true, "showNoteCounter": true, "disableDnD": false, "spellCheck": true, "createButtonsPosition": "top" }, "structure": { "rootOrder": [ "E28wk2v96LVOJsLj", "jy7M0g88cmd1cycb", "qg06EKMHYGEr9nnH", "aslMQjAzVpetKwty", "mHo9cDRI7rpC4gz4" ], "folders": [ { "folderID": "aslMQjAzVpetKwty", "folderOrder": [ "gRencFsIPjxGEYwh", "mhxRk7jOiiVXf7M9", "HAtlDV5oFfx7k6n8" ] } ] } }


5.2 Database

Your notes and folders are stored in a database called sharpnote.db, which is located in the root folder of the app.

This is the only database the app communicates with. Any new notes and changes to existing notes are saved here.

The table looks slightly different from a .sharp file. Namely, it has seperate columns for properties in noteHistory.

notes Table

Column Description Datatype Example
noteID The ID of the note. TEXT (PK) 3N5W47EDZOX2Ri9e
sharpnoteVersion The version of SharpNote in which the note was created. TEXT 1.0.0
sharpnoteType The type of the item for internal app usage. In this table always set to "note" TEXT note
noteTitle The name (title) of the note. TEXT Example Title
noteContent The content of the note, base64 encoded. TEXT VGhpcyBpcyBhIHF1aWNrIGV4YW1wbGU=
noteColor The color of the note, stored as HEX value. TEXT #FF0000
noteAttachments Stores the attachments embedded into a note, like images or PDF's. TEXT
noteOriginalAuthor The username of the original creator of the note. Is set upon creation and not changed thereafter. TEXT user1
noteLastAuthor The username of the person who last saved the note. Changes everytime a note is saved. TEXT pacman77
noteFolder The ID of the folder the note is under TEXT jbL4j0X8DhYjVhK2
created The datetime of when the note was originally created. TEXT 2024-05-12T23:50:21.817Z
lastSaved The datetime of when the note was last saved. TEXT 2024-05-12T23:50:21.817Z
lastOpened The datetime of when the note was last opened in SharpNote TEXT 2024-05-12T23:50:21.817Z
lastExported The datetime of when the note was last exported out of SharpNote. TEXT 2024-05-12T23:50:21.817Z
noteVersion The note revision. Increases on every save and edit. INTEGER 17
noteTags Optional tags/labels assigned to the note. A string array. TEXT ["Work", "Important", "To-Do"]
isReadonly Whether the note is set as Readonly. 0 = false, 1 = true BOOL 0

folders Table

Column Description Datatype Example
folderID The ID of the folder. TEXT (PK) zeQ6dAQE0jdt53Df
sharpnoteType The type of the item for internal app usage. In this table always set to "folder" TEXT folder
folderTitle The name (title) of the folder. TEXT Example Folder
folderNotes String array of note IDs TEXT ["I1pEt6b7ZEkMWC8n","3N5W47EDZOX2Ri9e"]
folderColor The color of the folder, stored as HEX value. TEXT #FF0000
folderOriginalAuthor The username of the original creator of the folder. Is set upon creation and not changed thereafter. TEXT user1
created The datetime of when the folder was originally created. TEXT 2024-05-12T23:50:21.817Z

5.3 Note

This section documents the Note object. A Note is a singular note created in SharpNote. This is what a .sharp file contains.

Below is an overview of all properties stored in a Note.

Property Description Datatype Example
noteID The ID of the note. 16-characters using a-z, A-Z and 0-9. string 3N5W47EDZOX2Ri9e
sharpnoteVersion The version of SharpNote in which the note was created. string 1.0.0
sharpnoteType The type of the item for internal app usage. string note
noteTitle The name (title) of the note. string Example Title
noteContent The content of the note, base64 encoded. string VGhpcyBpcyBhIHF1aWNrIGV4YW1wbGU=
noteColor The color of the note, stored as HEX value. string #FF0000
noteAttachments Stores the attachments embedded into a note, like images or PDF's. Array of JSON objects
noteOriginalAuthor The username of the original creator of the note. Is set upon creation and not changed thereafter. string | null user1
noteLastAuthor The username of the person who last saved the note. Changes everytime a note is saved. string | null pacman77
noteFolder The ID of the folder the note is under string | null jbL4j0X8DhYjVhK2
noteTags Optional tags/labels assigned to the note. A string array. Array of strings ["Work", "Important", "To-Do"]
isReadonly Whether the note is set as Readonly. 0 = false, 1 = true number 0
noteHistory Logs historical data for the note, such as when it was created, when it was last saved, and which revision it is currently on. JSON object

The following information is stored in noteHistory:

Property Description Datatype
created The datetime of when the note was originally created. string 2024-05-12T23:50:21.817Z
lastSaved The datetime of when the note was last saved. string 2024-05-12T23:50:21.817Z
lastOpened The datetime of when the note was last opened in SharpNote string 2024-05-12T23:50:21.817Z
lastExported The datetime of when the note was last exported out of SharpNote. string | null 2024-05-12T23:50:21.817Z
noteVersion The note revision. Increases on every save and edit. number 17

Below is an example of what a .sharp file might look like:

{ noteID: "5ze1h7UZG9znrhBq", sharpnoteVersion: "1.0.0", sharpnoteType: "note", noteTitle: "Work Notes 21/02/2025", noteContent: "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQWxpcXVhbSBibGFuZGl0IG9ybmFyZSBudWxsYS4=", noteColor: "#FF0000", noteAttachments: [{},{}], noteOriginalAuthor: "pacman77", noteLastAuthor: "pacman77", noteFolder: "jbL4j0X8DhYjVhK2", noteTags: ["work", "meetings", "important"], isReadonly: 0, noteHistory: { created: "2025-05-12T23:50:21.817Z", lastSaved: "2025-05-12T23:50:21.817Z", lastOpened: "2025-05-12T23:50:21.817Z", lastExported: "2025-05-12T23:50:21.817Z", noteVersion: 17, } }


The noteContent is encoded in base64 to accurately store the note content in a way that it always results in the same output. Because the noteContent is stored as base64, notes written in SharpNote will be somewhat larger than just regular plaintext. The noteContent is not readable when looking at just the file contents, but base64 can easily be decoded by anyone. Base64 also comes with the added benefit of having very low security risks, something which a method like HTML encoding would suffer from.

5.4 Folder

This section documents the Folder object. A Folder is a collection of notes created in SharpNote. They can be included in .sharpbook exports.

Below is an overview of all properties stored in a Folder.

Property Description Datatype Example
folderID The ID of the folder. 16-characters using a-z, A-Z and 0-9. string RQHOUOMnKnwuHeqj
sharpnoteType The type of the item for internal app usage. string folder
folderTitle The name (title) of the folder. string Example Folder
folderNotes The IDs of all notes contained in the folder Array of strings ["GG9RSXBxMyRkSqUb","7UFZpTxeRrRrl0dX"]
folderColor The color of the folder, stored as HEX value. string #FF0000
folderOriginalAuthor The username of the original creator of the folder. Is set upon creation and not changed thereafter. string | null user1
created The datetime of when the folder was originally created. string 2024-05-12T23:50:21.817Z

5.5 Sharpbook

This section documents the Sharpbook (notebook) object. A Sharpbook is a collection of multiple notes created in SharpNote. This is what a .sharpbook file contains.

Both export options 'All Notes' and 'Selection of notes/folders' result in a .sharpbook file.

Below is an overview of all properties stored in a Sharpbook.

Property Description Datatype Example
sharpbookID The ID of the notebook. 16-characters using a-z, A-Z and 0-9. string 1.0.0
sharpnoteVersion The version of SharpNote in which the note was created. string 1.0.0
bookExported The datetime of when the notebook was exported. string 2024-05-12T23:50:21.817Z
bookAuthor The username of the person who exported the notebook. string | null pacman77
bookType The type of the exported notebook based on the Export option. 'All Notes' would be 'all' and 'Selection of notes/folders' would be 'selection' string all
notes All the notes included in the notebook. Array of Note JSON objects
folders All the folders included in the notebook. Array of Folder JSON objects | null
structure Contains the structure object from sharpnote-config with only the relevant IDs JSON object | null

Below is an example of what a .sharpbook file might look like:

{ sharpbookID: "nFEUu0Txsp1lnknd", sharpnoteVersion: "1.0.0", bookExported: 2024-05-12T23:50:21.817Z, bookAuthor: "pacman77", bookType: "all" notes: [ { noteID: "5ze1h7UZG9znrhBq", sharpnoteVersion: "1.0.0", sharpnoteType: "note", noteTitle: "Work Notes 21/02/2025", noteContent: "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQWxpcXVhbSBibGFuZGl0IG9ybmFyZSBudWxsYS4=", noteColor: "#FF0000", noteAttachments: [{},{}], noteOriginalAuthor: "pacman77", noteLastAuthor: "pacman77", noteFolder: null, noteTags: ["work", "meetings", "important"], isReadonly: 0, noteHistory: { created: "2025-05-12T23:50:21.817Z", lastSaved: "2025-05-12T23:50:21.817Z", lastOpened: "2025-05-12T23:50:21.817Z", lastExported: "2025-05-12T23:50:21.817Z", noteVersion: 17, } }, { noteID: "TLLaeGmBxAQSR6fL", sharpnoteVersion: "1.0.0", sharpnoteType: "note", noteTitle: "Work Notes 25/02/2025", noteContent: "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQWxpcXVhbSBibGFuZGl0IG9ybmFyZSBudWxsYS4=", noteColor: "#FF0000", noteAttachments: [{},{}], noteOriginalAuthor: "pacman77", noteLastAuthor: "pacman77", noteFolder: "jbL4j0X8DhYjVhK2", noteTags: ["work", "meetings", "important"], isReadonly: 0, noteHistory: { created: "2025-05-12T23:50:21.817Z", lastSaved: "2025-05-12T23:50:21.817Z", lastOpened: "2025-05-12T23:50:21.817Z", lastExported: "2025-05-12T23:50:21.817Z", noteVersion: 2, } }, ], folders: [ { folderID: "jbL4j0X8DhYjVhK2", sharpnoteType: "folder", folderTitle: "New Folder", folderNotes: [ "TLLaeGmBxAQSR6fL" ], folderColor: "#FFFFFF", folderOriginalAuthor: "kiyan2", created: "2025-03-18T21:01:19.975Z" } ], structure: { rootOrder: [ "5ze1h7UZG9znrhBq", "TLLaeGmBxAQSR6fL", "jbL4j0X8DhYjVhK2" ], folders: [ { folderID: "jbL4j0X8DhYjVhK2", folderOrder: [ "TLLaeGmBxAQSR6fL" ] } ] } }


A Sharpbook essentially creates an exact archive of your notes, folders and their order.

5.6 FolderStructure Folder

This section documents the FolderStructure Folder object. A FolderStructure Folder is a collection of multiple notes in the Note List to keep your notes organized.

Below is an overview of all properties stored in a Folder.

Property Description Datatype Example
folderID The folder's ID. 16-characters using a-z, A-Z and 0-9. string k9Az72bpr4r00qax
folderOrder A string array of all note IDs contained in the folder, in exact order string array ["5ze1h7UZG9znrhBq", "TLLaeGmBxAQSR6fL"]

5.7 Filetypes

The following filetypes are associated with SharpNote for exporting and importing notes:

Extension Description
.sharp A SharpNote Note File. Stores a singular note from SharpNote.
.sharpbook A SharpNote Notebook File. Stores multiple notes/folders.

Other

This section describes miscellaneous information related to SharpNote.

6.1 UI v2

Introduced in 1.3.0, UI v2 overhauls the UI. OneNote was used as inspiration.

UI v2 introduces the following changes compared to UI v1:

  • A darker theme
  • Borderless items in the Note List
  • Smaller font size in Note List
  • Uses Menu Bar as title bar instead of OS default
  • Smaller font size and no borders in Context Menu's
  • Less usage of gray borders to seperate sections, most notably seen in the Menu Bar, which now has no hard border but a shadow instead for a smoother transition.