[![Donate using PayPal](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Donate-PayPal-green.svg)](https://www.paypal.com/donate/?business=E8JMYD2LQ8MMA&no_recurring=0&item_name=I+rely+on+donations+to+maintain+and+improve+the+Joplin+open+source+project.+Thank+you+for+your+help+-+it+makes+a+difference%21¤cy_code=EUR) [![Sponsor on GitHub](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/GitHub-Badge.svg)](https://github.com/sponsors/laurent22/) [![Become a patron](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Patreon-Badge.svg)](https://www.patreon.com/joplin) [![Donate using IBAN](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/badges/Donate-IBAN.svg)](https://joplinapp.org/donate/#donations)
**Joplin** is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in [Markdown format](#markdown).
Notes exported from Evernote [can be imported](#importing) into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported.
The notes can be securely [synchronised](#synchronisation) using [end-to-end encryption](#encryption) with various cloud services including Nextcloud, Dropbox, OneDrive and [Joplin Cloud](https://joplinapp.org/plans/).
Full text search is available on all platforms to quickly find the information you need. The app can be customised using plugins and themes, and you can also easily create your own.
The application is available for Windows, Linux, macOS, Android and iOS. A [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md), to save web pages and screenshots from your browser, is also available for [Firefox](https://addons.mozilla.org/firefox/addon/joplin-web-clipper/) and [Chrome](https://chrome.google.com/webstore/detail/joplin-web-clipper/alofnhikmmkdbbbgpnglcpdollgjjfek?hl=en-GB).
# Installation
Three types of applications are available: for **desktop** (Windows, macOS and Linux), for **mobile** (Android and iOS) and for **terminal** (Windows, macOS, Linux and FreeBSD). All the applications have similar user interfaces and can synchronise with each other.
## Desktop applications
Operating System | Download
---|---
Windows (32 and 64-bit) |
macOS |
Linux |
**On Windows**, you may also use the Portable version. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
**On Linux**, the recommended way is to use the following installation script as it will handle the desktop icon too:
wget -O - https://raw.githubusercontent.com/laurent22/joplin/dev/Joplin_install_and_update.sh | bash
The install and update script supports the [following flags](https://github.com/laurent22/joplin/blob/dev/Joplin_install_and_update.sh#L50) (around line 50 at the time of this writing).
## Mobile applications
Operating System | Download | Alt. Download
---|---|---
Android | | or download the [APK file](https://objects.joplinusercontent.com/v2.11.31/joplin-v2.11.31.apk?source=JoplinWebsite&type=New)
iOS | | -
## Terminal application
Operating system | Method
-----------------|----------------
macOS, Linux, or Windows (via [WSL](https://msdn.microsoft.com/en-us/commandline/wsl/faq?f=255&MSPPError=-2147217396)) | **Important:** First, [install Node 12+](https://nodejs.org/en/download/package-manager/).
`NPM_CONFIG_PREFIX=~/.joplin-bin npm install -g joplin`
`sudo ln -s ~/.joplin-bin/bin/joplin /usr/bin/joplin`
By default, the application binary will be installed under `~/.joplin-bin`. You may change this directory if needed. Alternatively, if your npm permissions are setup as described [here](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-2-change-npms-default-directory-to-another-directory) (Option 2) then simply running `npm -g install joplin` would work.
To start it, type `joplin`.
For usage information, please refer to the full [Joplin Terminal Application Documentation](https://joplinapp.org/terminal/).
## Web Clipper
The Web Clipper is a browser extension that allows you to save web pages and screenshots from your browser. For more information on how to install and use it, see the [Web Clipper Help Page](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md).
## Unofficial Alternative Distributions
There are a number of unofficial alternative Joplin distributions. If you do not want to or cannot use appimages or any of the other officially supported releases then you may wish to consider these.
However these come with a caveat in that they are not officially supported so certain issues may not be supportable by the main project. Rather support requests, bug reports and general advice would need to go to the maintainers of these distributions.
A community maintained list of these distributions can be found here: [Unofficial Joplin distributions](https://discourse.joplinapp.org/t/unofficial-alternative-joplin-distributions/23703)
# Sponsors
* * *
| | | | |
| :---: | :---: | :---: | :---: |
| [avanderberg](https://github.com/avanderberg) | [chr15m](https://github.com/chr15m) | [CyberXZT](https://github.com/CyberXZT) | [dbrandonjohnson](https://github.com/dbrandonjohnson) |
| [dchecks](https://github.com/dchecks) | [fats](https://github.com/fats) | [fourstepper](https://github.com/fourstepper) | [Hegghammer](https://github.com/Hegghammer) |
| [iamwillbar](https://github.com/iamwillbar) | [jknowles](https://github.com/jknowles) | [KentBrockman](https://github.com/KentBrockman) | [kianenigma](https://github.com/kianenigma) |
| [konishi-t](https://github.com/konishi-t) | [marcdw1289](https://github.com/marcdw1289) | [matmoly](https://github.com/matmoly) | [maxtruxa](https://github.com/maxtruxa) |
| [mcejp](https://github.com/mcejp) | [saarantras](https://github.com/saarantras) | [sif](https://github.com/sif) | [taskcruncher](https://github.com/taskcruncher) |
| [tateisu](https://github.com/tateisu) | | | |
# Table of contents
- Applications
- [Desktop application](https://github.com/laurent22/joplin/blob/dev/readme/desktop.md)
- [Mobile applications](https://github.com/laurent22/joplin/blob/dev/readme/mobile.md)
- [Terminal application](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md)
- [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md)
- Support
- [Joplin Forum](https://discourse.joplinapp.org)
- [Markdown Guide](https://github.com/laurent22/joplin/blob/dev/readme/markdown.md)
- [How to enable end-to-end encryption](https://github.com/laurent22/joplin/blob/dev/readme/e2ee.md)
- [What is a conflict?](https://github.com/laurent22/joplin/blob/dev/readme/conflict.md)
- [How to enable debug mode](https://github.com/laurent22/joplin/blob/dev/readme/debugging.md)
- [About the Rich Text editor limitations](https://github.com/laurent22/joplin/blob/dev/readme/rich_text_editor.md)
- [External links](https://github.com/laurent22/joplin/blob/dev/readme/external_links.md)
- [FAQ](https://github.com/laurent22/joplin/blob/dev/readme/faq.md)
- Joplin Cloud
- [Sharing a notebook](https://github.com/laurent22/joplin/blob/dev/readme/share_notebook.md)
- [Publishing a note](https://github.com/laurent22/joplin/blob/dev/readme/publish_note.md)
- [Email to Note](https://github.com/laurent22/joplin/blob/dev/readme/email_to_note.md)
- Joplin API - Get Started
- [Joplin API Overview](https://github.com/laurent22/joplin/blob/dev/readme/api/overview.md)
- [Plugin development](https://github.com/laurent22/joplin/blob/dev/readme/api/get_started/plugins.md)
- [Plugin tutorial](https://github.com/laurent22/joplin/blob/dev/readme/api/tutorials/toc_plugin.md)
- Joplin API - References
- [Plugin API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html)
- [Data API](https://github.com/laurent22/joplin/blob/dev/readme/api/references/rest_api.md)
- [Plugin manifest](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_manifest.md)
- [Plugin loading rules](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_loading_rules.md)
- [Plugin theming](https://github.com/laurent22/joplin/blob/dev/readme/api/references/plugin_theming.md)
- Development
- [How to build the apps](https://github.com/laurent22/joplin/blob/dev/BUILD.md)
- [Writing a technical spec](https://github.com/laurent22/joplin/blob/dev/readme/technical_spec.md)
- [Desktop application styling](https://github.com/laurent22/joplin/blob/dev/readme/spec/desktop_styling.md)
- [Note history spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/history.md)
- [Synchronisation spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync.md)
- [Sync Lock spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync_lock.md)
- [Synchronous Scroll spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/sync_scroll.md)
- [Overall Architecture spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/architecture.md)
- [Plugin Architecture spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/plugins.md)
- [Search Sorting spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/search_sorting.md)
- [E2EE: Technical spec](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee.md)
- [E2EE: Workflow](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee/workflow.md)
- [Server: File URL Format](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_file_url_format.md)
- [Server: Delta Sync](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_delta_sync.md)
- [Server: Sharing](https://github.com/laurent22/joplin/blob/dev/readme/spec/server_sharing.md)
- [Read-only items](https://github.com/laurent22/joplin/blob/dev/readme/spec/read_only.md)
- Google Summer of Code 2022
- [Google Summer of Code 2022](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/index.md)
- [How to submit a GSoC pull request](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/pull_request_guidelines.md)
- [Project Ideas](https://github.com/laurent22/joplin/blob/dev/readme/gsoc2022/ideas.md)
- About
- [Changelog (Desktop App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog.md)
- [Changelog (Android)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_android.md)
- [Changelog (iOS)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_ios.md)
- [Changelog (CLI App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md)
- [Changelog (Server)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_server.md)
- [Guiding principles](https://github.com/laurent22/joplin/blob/dev/readme/principles.md)
- [Stats](https://github.com/laurent22/joplin/blob/dev/readme/stats.md)
- [Brand guidelines](https://joplinapp.org/brand)
- [Donate](https://github.com/laurent22/joplin/blob/dev/readme/donate.md)
# Features
- Desktop, mobile and terminal applications.
- [Web Clipper](https://github.com/laurent22/joplin/blob/dev/readme/clipper.md) for Firefox and Chrome.
- End To End Encryption (E2EE).
- Note history (revisions).
- Synchronisation with various services, including Nextcloud, Dropbox, WebDAV and OneDrive.
- Offline first, so the entire data is always available on the device even without an internet connection.
- Import Enex files (Evernote export format) and Markdown files.
- Export JEX files (Joplin Export format) and raw files.
- Support notes, to-dos, tags and notebooks.
- Sort notes by multiple criteria - title, updated time, etc.
- Support for alarms (notifications) in mobile and desktop applications.
- Markdown notes, which are rendered with images and formatting in the desktop and mobile applications. Support for extra features such as math notation and checkboxes.
- Choice of both Markdown and Rich Text (WYSIWYG) editors.
- File attachment support - images are displayed, other files are linked and can be opened in the relevant application.
- Inline display of PDF, video and audio files.
- Goto Anything feature.
- Search functionality.
- Geo-location support.
- Supports multiple languages.
- External editor support - open notes in your favorite external editor with one click in Joplin.
- Extensible functionality through plugin and data APIs.
- Custom CSS support for customisation of both the rendered markdown and overall user interface.
- Customisable layout allows toggling, movement and sizing of various elements.
- Keyboard shortcuts are editable and allow binding of most Joplin commands with export/import functionality.
- Multiple profile support.
# Importing
## Importing from Evernote
Joplin was designed as a replacement for Evernote and so can import complete Evernote notebooks, as well as notes, tags, resources (attached files) and note metadata (such as author, geo-location, etc.) via ENEX files. In terms of data, the only two things that might slightly differ are:
- Recognition data - Evernote images, in particular scanned (or photographed) documents have [recognition data](https://en.wikipedia.org/wiki/Optical_character_recognition) associated with them. It is the text that Evernote has been able to recognise in the document. This data is not preserved when the note are imported into Joplin. However, should it become supported in the search tool or other parts of Joplin, it should be possible to regenerate this recognition data since the actual image would still be available.
- Colour, font sizes and faces - Evernote text is stored as HTML and this is converted to Markdown during the import process. For notes that are mostly plain text or with basic formatting (bold, italic, bullet points, links, etc.) this is a lossless conversion, and the note, once rendered back to HTML should be very similar. Tables are also imported and converted to Markdown tables. For very complex notes, some formatting data might be lost - in particular colours, font sizes and font faces will not be imported. The text itself however is always imported in full regardless of formatting. If it is essential that this extra data is preserved then Joplin also allows import of ENEX files as HTML.
To import Evernote data, first export your Evernote notebooks to ENEX files as described [here](https://help.evernote.com/hc/en-us/articles/209005557-How-to-back-up-export-and-restore-import-notes-and-notebooks). Then follow these steps:
In the **desktop application**, open File > Import > ENEX and select your file. The notes will be imported into a new separate notebook. If needed they can then be moved to a different notebook, or the notebook can be renamed, etc.
In the **terminal application**, in [command-line mode](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode), type `import /path/to/file.enex`. This will import the notes into a new notebook named after the filename.
## Importing from Markdown files
Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files.
In the **desktop application**:
* **File import**: Go to File > Import > MD - Markdown (file) and select the Markdown file. This file will then be imported to the currently selected Notebook.
* **Directory import**: Go to File > Import > MD - Markdown (directory) and select the top level of the directory that is being imported. Directory (folder) structure will be preserved in the Notebook > Subnotebook > Note structure within Joplin.
In the **terminal application**, in [command-line mode](https://github.com/laurent22/joplin/blob/dev/readme/terminal.md#command-line-mode), type `import --format md /path/to/file.md` or `import --format md /path/to/directory/`.
## Importing from other applications
In general the way to import notes from any application into Joplin is to convert the notes to ENEX files (Evernote format) and to import these ENEX files into Joplin using the method above. Most note-taking applications support ENEX files so it should be relatively straightforward. For help about specific applications, see below:
* Standard Notes: Please see [this tutorial](https://programadorwebvalencia.com/migrate-notes-from-standard-notes-to-joplin/)
* Tomboy Notes: Export the notes to ENEX files [as described here](https://askubuntu.com/questions/243691/how-can-i-export-my-tomboy-notes-into-evernote/608551) for example, and import these ENEX files into Joplin.
* OneNote: First [import the notes from OneNote into Evernote](https://discussion.evernote.com/topic/107736-is-there-a-way-to-import-from-onenote-into-evernote-on-the-mac/). Then export the ENEX file from Evernote and import it into Joplin.
* NixNote: Synchronise with Evernote, then export the ENEX files and import them into Joplin. More info [in this thread](https://discourse.joplinapp.org/t/import-from-nixnote/183/3).
# Exporting
Joplin can export to the JEX format (Joplin Export file), which is a tar file that can contain multiple notes, notebooks, etc. This is a lossless format in that all the notes, but also metadata such as geo-location, updated time, tags, etc. are preserved. This format is convenient for backup purposes and can be re-imported into Joplin. A "raw" format is also available. This is the same as the JEX format except that the data is saved to a directory and each item represented by a single file.
Joplin is also capable of exporting to a number of other formats including HTML and PDF which can be done for single notes, notebooks or everything.
# Synchronisation
One of the goals of Joplin is to avoid being tied to any particular company or service, whether it is Evernote, Google or Microsoft. As such the synchronisation is designed without any hard dependency to any particular service. Most of the synchronisation process is done at an abstract level and access to external services, such as Nextcloud or Dropbox, is done via lightweight drivers. It is easy to support new services by creating simple drivers that provide a filesystem-like interface, i.e. the ability to read, write, delete and list items. It is also simple to switch from one service to another or to even sync to multiple services at once. Each note, notebook, tags, as well as the relation between items is transmitted as plain text files during synchronisation, which means the data can also be moved to a different application, can be easily backed up, inspected, etc.
Currently, synchronisation is possible with Nextcloud, WebDAV, Dropbox, OneDrive or the local filesystem. To enable synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on "Synchronise" to start a synchronisation manually. Joplin will background sync automatically after any content change is made on the local application.
If the **terminal client** has been installed, it is possible to also synchronise outside of the user interface by typing `joplin sync` from the terminal. This can be used to setup a cron script to synchronise at a regular interval. For example, this would do it every 30 minutes:
` */30 * * * * /path/to/joplin sync`
## Nextcloud synchronisation
Nextcloud is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.
In the **desktop application** or **mobile application**, go to the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally `https://example.com/nextcloud/remote.php/webdav/Joplin` (**make sure to create the "Joplin" directory in Nextcloud**), and set the username and password. If it does not work, please [see this explanation](https://github.com/laurent22/joplin/issues/61#issuecomment-373282608) for more details.
In the **terminal application**, you will need to set the `sync.target` config variable and all the `sync.5.path`, `sync.5.username` and `sync.5.password` config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:
:config sync.5.path https://example.com/nextcloud/remote.php/webdav/Joplin
:config sync.5.username YOUR_USERNAME
:config sync.5.password YOUR_PASSWORD
:config sync.target 5
If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.
## WebDAV synchronisation
Select the "WebDAV" synchronisation target and follow the same instructions as for Nextcloud above (for the **terminal application** you will need to select sync target 6 rather than 5)
WebDAV-compatible services that are known to work with Joplin:
- [Apache WebDAV Module](https://httpd.apache.org/docs/current/mod/mod_dav.html)
- [DriveHQ](https://www.drivehq.com)
- [Fastmail](https://www.fastmail.com/)
- [HiDrive](https://www.strato.fr/stockage-en-ligne/) from Strato. [Setup help](https://github.com/laurent22/joplin/issues/309)
- [Nginx WebDAV Module](https://nginx.org/en/docs/http/ngx_http_dav_module.html)
- [Nextcloud](https://nextcloud.com/)
- [OwnCloud](https://owncloud.org/)
- [Seafile](https://www.seafile.com/)
- [Stack](https://www.transip.nl/stack/)
- [Synology WebDAV Server](https://www.synology.com/en-us/dsm/packages/WebDAVServer)
- [WebDAV Nav](https://www.schimera.com/products/webdav-nav-server/), a macOS server.
- [Zimbra](https://www.zimbra.com/)
## Dropbox synchronisation
When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in `/Apps/Joplin` and reads/writes the notes and notebooks in it. The application does not have access to anything outside this directory.
In the **desktop application** or **mobile application**, select "Dropbox" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application.
## OneDrive synchronisation
When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and reads/writes the notes and notebooks in it. The application does not have access to anything outside this directory.
In the **desktop application** or **mobile application**, select "OneDrive" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.
In the **terminal application**, to initiate the synchronisation process, type `:sync`. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).
## S3 synchronisation
As of Joplin 2.x.x, Joplin supports multiple S3 providers. We expose some options that will need to be configured depending on your provider of choice. We have tested with UpCloud, AWS, and Linode. others should work as well.
In the **desktop application** or **mobile application**, select "S3 (Beta)" as the synchronisation target in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md).
- **S3 Bucket:** The name of your Bucket, such as `joplin-bucket`
- **S3 URL:** Fully qualified URL; For AWS this should be `https://s3..amazonaws.com/`
- **S3 Access Key & S3 Secret Key:** The User's programmatic access key. To create a new key & secret on AWS, visit [IAM Security Credentials](https://console.aws.amazon.com/iam/home#/security_credentials). For other providers follow their documentation.
- **S3 Region:** Some providers require you to provide the region of your bucket. This is usually in the form of "eu-west1" or something similar depending on your region. For providers that do not require a region, you can leave it blank.
- **Force Path Style**: This setting enables Joplin to talk to S3 providers using an older style S3 Path. Depending on your provider you may need to try with this on and off.
While creating a new Bucket for Joplin, disable **Bucket Versioning**, enable **Block all public access** and enable **Default encryption** with `Amazon S3 key (SSE-S3)`. Some providers do not expose these options, and it could create a syncing problem. Do attempt and report back so we can update the documentation appropriately.
To add a **Bucket Policy** from the AWS S3 Web Console, navigate to the **Permissions** tab. Temporarily disable **Block all public access** to edit the Bucket policy, something along the lines of:
```
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::joplin-bucket",
"arn:aws:s3:::joplin-bucket/*"
]
}
]
}
```
### Configuration settings for tested providers
All providers will require a bucket, Access Key, and Secret Key.
If you provide a configuration and you receive "success!" on the "check config" then your S3 sync should work for your provider. If you do not receive success, you may need to adjust your settings, or save them, restart the app, and attempt a sync. This may reveal more clear error messaging that will help you deduce the problem.
### AWS
- URL: `https://s3..amazonaws.com/` (fill in your region, a complete list of endpoint adresses can be found [here](https://docs.aws.amazon.com/general/latest/gr/s3.html))
- Region: required
- Force Path Style: unchecked
### Linode
- URL: `https://.linodeobjects.com` (region is in the URL provided by Linode; this URL is also the same as the URL provided by Linode with the bucket name removed)
- Region: Anything you want to type, can't be left empty
- Force Path Style: unchecked
### UpCloud
- URL: `https://..upcloudobjects.com` (They will provide you with multiple URLs, the one that follows this pattern should work.)
- Region: required
- Force Path Style: unchecked
# Encryption
Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the notes, notebooks, tags or resources can read them. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the [End-To-End Encryption Tutorial](https://github.com/laurent22/joplin/blob/dev/readme/e2ee.md) for more information about this feature and how to enable it.
For a more technical description, mostly relevant for development or to review the method being used, please see the [Encryption specification](https://github.com/laurent22/joplin/blob/dev/readme/spec/e2ee.md).
# Note history
The Joplin applications automatically save previous versions of your notes at regular intervals. These versions are synced across devices and can be viewed from the desktop application. To do so, click on the "Information" button on a note, then click on "Previous version of this note". From this screen you can view the previous versions of the note as well as restore any of them.
This feature can be disabled from the "Note history" section in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md), and it is also possible to change for how long the history of a note is saved.
More information please see the [Note History page](https://github.com/laurent22/joplin/blob/dev/readme/note_history.md).
# External text editor
Joplin notes can be opened and edited using an external editor of your choice. It can be a simple text editor like Notepad++ or Sublime Text or an actual Markdown editor like Typora. In that case, images will also be displayed within the editor. To open the note in an external editor, click on the icon in the toolbar or press Ctrl+E (or Cmd+E). Your default text editor will be used to open the note. If needed, you can also specify the editor directly in the General Options, under "Text editor command".
# Attachments
Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment, clicking on this link will open the file in the default application. In the case of audio, video and pdf files, these will be displayed inline with the note and so can be viewed or played within Joplin.
In the **desktop application**, files can be attached either by clicking the "Attach file" icon in the editor or via drag and drop. If you prefer to create a link to a local file instead, hold the ALT key while performing the drag and drop operation. You can also copy and paste images directly in the editor via Ctrl+V.
Resources that are not attached to any note will be automatically deleted in accordance to the [Note History](#note-history) settings.
**Important:** Resources larger than 10 MB are not currently supported on mobile. They will crash the application when synchronising so it is recommended not to attach such resources at the moment. The issue is being looked at.
## Downloading attachments
The way the attachments are downloaded during synchronisation can be customised in the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md), under "Attachment download behaviour". The default option ("Always") is to download all the attachments, all the time, so that the data is available even when the device is offline. There is also the option to download the attachments manually (option "Manual"), by clicking on it, or automatically (Option "Auto"), in which case the attachments are downloaded only when a note is opened. These options should help saving disk space and network bandwidth, especially on mobile.
# Notifications
In the desktop and mobile apps, an alarm can be associated with any to-do. It will be triggered at the given time by displaying a notification. How the notification will be displayed depends on the operating system since each has a different way to handle this. Please see below for the requirements for the desktop applications:
- **Windows**: >= 8. Make sure the Action Center is enabled on Windows. Task bar balloon for Windows < 8. Growl as fallback. Growl takes precedence over Windows balloons.
- **macOS**: >= 10.8 or Growl if earlier.
- **Linux**: `notify-send` tool, delivered through packages `notify-osd`, `libnotify-bin` or `libnotify-tools`. GNOME should have this by default, but install `libnotify-tools` if using KDE Plasma.
See [documentation and flow chart for reporter choice](https://github.com/mikaelbr/node-notifier/blob/master/DECISION_FLOW.md)
On mobile, the alarms will be displayed using the built-in notification system.
If for any reason the notifications do not work, please [open an issue](https://github.com/laurent22/joplin/issues).
# Sub-notebooks
Sub-notebooks allow organising multiple notebooks into a tree of notebooks. For example it can be used to regroup all the notebooks related to work, to family or to a particular project under a parent notebook.
![](https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/SubNotebooks.png)
- In the **desktop application**, to create a subnotebook, drag and drop it onto another notebook. To move it back to the root, drag and drop it on the "Notebooks" header. Currently only the desktop app can be used to organise the notebooks.
- The **mobile application** supports displaying and collapsing/expanding the tree of notebooks, however it does not currently support moving the subnotebooks to different notebooks.
- The **terminal app** supports displaying the tree of subnotebooks but it does not support collapsing/expanding them or moving the subnotebooks around.
# Markdown
Joplin uses and renders a Github-flavoured Markdown with a few variations and additions. In particular it adds math formula support, interactive checkboxes and support for note links. Joplin also supports Markdown plugins which allow enabling and disabling various advanced Markdown features. Have a look at the [Markdown Guide](https://github.com/laurent22/joplin/blob/dev/readme/markdown.md) for more information.
# Custom CSS
Rendered markdown can be customized by placing a userstyle file in the profile directory `~/.config/joplin-desktop/userstyle.css` (This path might be different on your device - check at the top of the `General` page of the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md) for the exact path). This file supports standard CSS syntax. Joplin ***must*** be restarted for the new css to be applied, please ensure that Joplin is not closing to the tray, but is actually exiting. Note that this file is used for both displaying the notes and printing the notes. Be aware how the CSS may look printed (for example, printing white text over a black background is usually not wanted).
The whole UI can be customized by placing a custom editor style file in the profile directory `~/.config/joplin-desktop/userchrome.css`.
Important: userstyle.css and userchrome.css are provided for your convenience, but they are advanced settings, and styles you define may break from one version to the next. If you want to use them, please know that it might require regular development work from you to keep them working. The Joplin team cannot make a commitment to keep the application HTML structure stable.
# Plugins
The **desktop app** has the ability to extend beyond its standard functionality by the way of plugins. These plugins adhere to the Joplin [plugin API](https://joplinapp.org/api/references/plugin_api/classes/joplin.html) and can be installed & configured within the application via the `Plugins` page of the [Configuration screen](https://github.com/laurent22/joplin/blob/dev/readme/config_screen.md).
From this menu you can search for plugins uploaded to the [Joplin plugins](https://github.com/joplin/plugins) repository as well as manual installation of plugins using a 'Joplin Plugin Archive' (*.jpl) file.
Once the application is reloaded the plugins will appear within the plugins menu where they can be toggled on/off or removed entirely.
For more information see [Plugins](https://github.com/laurent22/joplin/blob/dev/readme/plugins.md)
# Searching
Joplin implements the SQLite Full Text Search (FTS4) extension. It means the content of all the notes is indexed in real time and search queries return results very fast. Both [Simple FTS Queries](https://www.sqlite.org/fts3.html#simple_fts_queries) and [Full-Text Index Queries](https://www.sqlite.org/fts3.html#full_text_index_queries) are supported. See below for the list of supported queries:
One caveat of SQLite FTS is that it does not support languages which do not use Latin word boundaries (spaces, tabs, punctuation). To solve this issue, Joplin has a custom search mode, that does not use FTS, but still has all of its features (multi term search, filters, etc.). One of its drawbacks is that it can get slow on larger note collections. Also, the sorting of the results will be less accurate, as the ranking algorithm (BM25) is, for now, only implemented for FTS. Finally, in this mode there are no restrictions on using the `*` wildcard (`swim*`, `*swim` and `ast*rix` all work). This search mode is currently enabled if one of the following languages are detected:
- Chinese
- Japanese
- Korean
- Thai
## Supported queries
Search type | Description | Example
------------|-------------|---------
Single word | Returns all the notes that contain this term. | For example, searching for `cat` will return all the notes that contain this exact word. Note: it will not return the notes that contain the substring - thus, for "cat", notes that contain "cataclysmic" or "prevaricate" will **not** be returned.
Multiple word | Returns all the notes that contain **all** these words, but not necessarily next to each other. | `dog cat` - will return any notes that contain the words "dog" and "cat" anywhere in the note, no necessarily in that order nor next to each other. It will **not** return results that contain "dog" or "cat" only.
Phrase | Add double quotes to return the notes that contain exactly this phrase. | `"shopping list"` - will return the notes that contain these **exact terms** next to each other and in this order. It will **not** return for example a note that contains "going shopping with my list".
Prefix | Add a wildcard to return all the notes that contain a term with a specified prefix. | `swim*` - will return all the notes that contain eg. "swim", but also "swimming", "swimsuit", etc. IMPORTANT: The wildcard **can only be at the end** - it will be ignored at the beginning of a word (eg. `*swim`) and will be treated as a literal asterisk in the middle of a word (eg. `ast*rix`)
Switch to basic search | One drawback of Full Text Search is that it ignores most non-alphabetical characters. However in some cases you might want to search for this too. To do that, you can use basic search. You switch to this mode by prefixing your search with a slash `/`. This won't provide the benefits of FTS but it will allow searching exactly for what you need. Note that it can also be much slower, even extremely slow, depending on your query. | `/"- [ ]"` - will return all the notes that contain unchecked checkboxes.
## Search filters
You can also use search filters to further restrict the search.
| Operator | Description | Example |
| --- | --- | --- |
|**-**|If placed before a text term, it excludes the notes that contain that term. You can also place it before a filter to negate it. |`-spam` searches for all notes without the word `spam`.
`office -trash` searches for all notes with the word `office` and without the word `trash`.|
|**any:**|Return notes that satisfy any/all of the required conditions. `any:0` is the default, which means all conditions must be satisfied.|`any:1 cat dog` will return notes that have the word `cat` or `dog`.
`any:0 cat dog` will return notes with both the words `cat` and `dog`. |
| **title:**
**body:**|Restrict your search to just the title or the body field.|`title:"hello world"` searches for notes whose title contains `hello` and `world`.
`title:hello -body:world` searches for notes whose title contains `hello` and body does not contain `world`.
| **tag:** |Restrict the search to the notes with the specified tags.|`tag:office` searches for all notes having tag office.
`tag:office tag:important` searches for all notes having both office and important tags.
`tag:office -tag:spam` searches for notes having tag `office` which do not have tag `spam`.
`any:1 tag:office tag:spam` searches for notes having tag `office` or tag `spam`.
`tag:be*ful` does a search with wildcards.
`tag:*` returns all notes with tags.
`-tag:*` returns all notes without tags.|
| **notebook:** | Restrict the search to the specified notebook(s). |`notebook:books` limits the search scope within `books` and all its subnotebooks.
`notebook:wheel*time` does a wildcard search.|
| **created:**
**updated:**
**due:**| Searches for notes created/updated on dates specified using YYYYMMDD format. You can also search relative to the current day, week, month, or year. | `created:20201218` will return notes created on or after December 18, 2020.
`-updated:20201218` will return notes updated before December 18, 2020.
`created:20200118 -created:20201215` will return notes created between January 18, 2020, and before December 15, 2020.
`created:202001 -created:202003` will return notes created on or after January and before March 2020.
`updated:1997 -updated:2020` will return all notes updated between the years 1997 and 2019.
`created:day-2` searches for all notes created in the past two days.
`updated:year-0` searches all notes updated in the current year.
`-due:day+7` will return all todos which are due or will be due in the next seven days.
`-due:day-5` searches all todos that are overdue for more than 5 days.|
| **type:** |Restrict the search to either notes or todos. | `type:note` to return all notes
`type:todo` to return all todos |
| **iscompleted:** | Restrict the search to either completed or uncompleted todos. | `iscompleted:1` to return all completed todos
`iscompleted:0` to return all uncompleted todos|
|**latitude:**
**longitude:**
**altitude:**|Filter by location|`latitude:40 -latitude:50` to return notes with latitude >= 40 and < 50 |
|**resource:**|Filter by attachment MIME type|`resource:image/jpeg` to return notes with a jpeg attachment.
`-resource:application/pdf` to return notes without a pdf attachment.
`resource:image/*` to return notes with any images.|
|**sourceurl:**|Filter by source URL|`sourceurl:https://www.google.com`
`sourceurl:*joplinapp.org` to perform a wildcard search.|
|**id:**|Filter by note ID|`id:9cbc1b4f242043a9b8a50627508bccd5` return a note with the specified id |
Note: In the CLI client you have to escape the query using `--` when using negated filters.
Eg. `:search -- "-tag:tag1"`.
The filters are implicitly connected by and/or connectives depending on the following rules:
- By default, all filters are connected by "AND".
- To override this default behaviour, use the `any` filter, in which case the search terms will be connected by "OR" instead.
- There's an exception for the `notebook` filters which are connected by "OR". The reason being that no note can be in multiple notebooks at once.
Incorrect search filters are interpreted as a phrase search, e.g. misspelled `nootebook:Example` or non-existing `https://joplinapp.org`.
## Search order
Notes are sorted by "relevance". Currently it means the notes that contain the requested terms the most times are on top. For queries with multiple terms, it also matters how close to each other the terms are. This is a bit experimental so if you notice a search query that returns unexpected results, please report it in the forum, providing as many details as possible to replicate the issue.
# Goto Anything
In the desktop application, press Ctrl+P or Cmd+P and type a note title or part of its content to jump to it. Or type # followed by a tag name, or @ followed by a notebook name.
# Multiple profile support
To create a new profile, open File > Switch profile and select Create new profile, enter the profile name and press OK. The app will automatically switch to this new profile, which you can now configure.
To switch back to the previous profile, again open File > Switch profile and select Default.
Note that profiles all share certain settings, such as language, font size, theme, etc. This is done so that you don't have reconfigure every details when switching profiles. Other settings such as sync configuration is per profile.
The feature is available on desktop only for now, and should be ported to mobile relatively soon.
# Donations
Donations to Joplin support the development of the project. Developing quality applications mostly takes time, but there are also some expenses, such as digital certificates to sign the applications, app store fees, hosting, etc. Most of all, your donation will make it possible to keep up the current development standard.
Please see the [donation page](https://github.com/laurent22/joplin/blob/dev/readme/donate.md) for information on how to support the development of Joplin.
# Community
Name | Description
--- | ---
[Support Forum](https://discourse.joplinapp.org/) | This is the main place for general discussion about Joplin, user support, software development questions, and to discuss new features. Also where the latest beta versions are released and discussed.
[Twitter feed](https://twitter.com/joplinapp) | Follow us on Twitter
[Mastodon feed](https://mastodon.social/@joplinapp) | Follow us on Mastodon
[Patreon page](https://www.patreon.com/joplin) |The latest news are often posted there
[Discord server](https://discord.gg/VSj7AFHvpq) | Our chat server
[LinkedIn](https://www.linkedin.com/company/joplin) | Our LinkedIn page
[Lemmy Community](https://sopuli.xyz/c/joplinapp) | Also a good place to get help
# Contributing
Please see the guide for information on how to contribute to the development of Joplin: https://github.com/laurent22/joplin/blob/dev/CONTRIBUTING.md
# Localisation
Joplin is currently available in the languages below. If you would like to contribute a **new translation**, it is quite straightforward, please follow these steps:
- [Download Poedit](https://poedit.net/), the translation editor, and install it.
- [Download the file to be translated](https://raw.githubusercontent.com/laurent22/joplin/dev/packages/tools/locales/joplin.pot).
- In Poedit, open this .pot file, go into the Catalog menu and click Configuration. Change "Country" and "Language" to your own country and language.
- From then you can translate the file.
- Once it is done, please [open a pull request](https://github.com/laurent22/joplin/pulls) and add the file to it.
This translation will apply to the three applications - desktop, mobile and terminal.
To **update a translation**, follow the same steps as above but instead of getting the .pot file, get the .po file for your language from the table below.
Current translations:
| Language | Po File | Last translator | Percent done
---|---|---|---|---
| Arabic | [ar](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ar.po) | [Whaell O](mailto:Whaell@protonmail.com) | 77%
| Basque | [eu](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/eu.po) | juan.abasolo@ehu.eus | 22%
| Bosnian (Bosna i Hercegovina) | [bs_BA](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/bs_BA.po) | [Derviš T.](mailto:dervis.t@pm.me) | 56%
| Bulgarian (България) | [bg_BG](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/bg_BG.po) | | 44%
| Catalan | [ca](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ca.po) | [Xavi Ivars](mailto:xavi.ivars@gmail.com) | 86%
| Croatian (Hrvatska) | [hr_HR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/hr_HR.po) | [Milo Ivir](mailto:mail@milotype.de) | 98%
| Czech (Česká republika) | [cs_CZ](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/cs_CZ.po) | Fejby | 96%
| Dansk (Danmark) | [da_DK](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/da_DK.po) | ERYpTION | 96%
| Deutsch (Deutschland) | [de_DE](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/de_DE.po) | [Mr-Kanister](mailto:viger_gtrc@simplelogin.com) | 98%
| Eesti Keel (Eesti) | [et_EE](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/et_EE.po) | | 43%
| English (United Kingdom) | [en_GB](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/en_GB.po) | | 100%
| English (United States of America) | [en_US](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/en_US.po) | | 100%
| Español (España) | [es_ES](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/es_ES.po) | [Francisco Villaverde](mailto:teko.gr@gmail.com) | 95%
| Esperanto | [eo](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/eo.po) | Marton Paulo | 25%
| Finnish (Suomi) | [fi_FI](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/fi_FI.po) | mrkaato0 | 96%
| Français (France) | [fr_FR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/fr_FR.po) | Laurent Cozic | 100%
| Galician (España) | [gl_ES](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/gl_ES.po) | [Marcos Lans](mailto:marcoslansgarza@gmail.com) | 28%
| Indonesian (Indonesia) | [id_ID](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/id_ID.po) | [Wisnu Adi Santoso](mailto:waditos@gmail.com) | 86%
| Italiano (Italia) | [it_IT](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/it_IT.po) | [Manuel Tassi](mailto:mannivuwiki@gmail.com) | 78%
| Magyar (Magyarország) | [hu_HU](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/hu_HU.po) | [Magyari Balázs](mailto:balmag@gmail.com) | 75%
| Nederlands (België, Belgique, Belgien) | [nl_BE](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/nl_BE.po) | | 76%
| Nederlands (Nederland) | [nl_NL](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/nl_NL.po) | [MHolkamp](mailto:mholkamp@users.noreply.github.com) | 86%
| Norwegian (Norge, Noreg) | [nb_NO](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/nb_NO.po) | [Mats Estensen](mailto:code@mxe.no) | 85%
| Persian | [fa](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/fa.po) | [Kourosh Firoozbakht](mailto:kourox@protonmail.com) | 53%
| Polski (Polska) | [pl_PL](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/pl_PL.po) | [X3NO](mailto:X3NO@disroot.org) | 88%
| Português (Brasil) | [pt_BR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/pt_BR.po) | [Douglas Leão](mailto:djlsplays@gmail.com) | 85%
| Português (Portugal) | [pt_PT](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/pt_PT.po) | [Diogo Caveiro](mailto:dcaveiro@yahoo.com) | 70%
| Română | [ro](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ro.po) | [Cristi Duluta](mailto:cristi.duluta@gmail.com) | 49%
| Slovenian (Slovenija) | [sl_SI](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/sl_SI.po) | [Martin Korelič](mailto:martin.korelic@protonmail.com) | 78%
| Svenska | [sv](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/sv.po) | [Jonatan Nyberg](mailto:jonatan@autistici.org) | 97%
| Thai (ประเทศไทย) | [th_TH](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/th_TH.po) | | 35%
| Tiếng Việt | [vi](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/vi.po) | | 75%
| Türkçe (Türkiye) | [tr_TR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/tr_TR.po) | [Arda Kılıçdağı](mailto:arda@kilicdagi.com) | 97%
| Ukrainian (Україна) | [uk_UA](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/uk_UA.po) | [Vyacheslav Andreykiv](mailto:vandreykiv@gmail.com) | 98%
| Ελληνικά (Ελλάδα) | [el_GR](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/el_GR.po) | [Harris Arvanitis](mailto:xaris@tuta.io) | 97%
| Русский (Россия) | [ru_RU](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ru_RU.po) | [Dmitriy K](mailto:dmitry@atsip.ru) | 97%
| српски језик (Србија) | [sr_RS](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/sr_RS.po) | | 63%
| 中文 (简体) | [zh_CN](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/zh_CN.po) | [qx100](mailto:ztymaxwell@gmail.com) | 98%
| 中文 (繁體) | [zh_TW](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/zh_TW.po) | [Kevin Hsu](mailto:kevin.hsu.hws@gmail.com) | 86%
| 日本語 (日本) | [ja_JP](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ja_JP.po) | [genneko](mailto:genneko217@gmail.com) | 88%
| 한국어 | [ko](https://github.com/laurent22/joplin/blob/dev/packages/tools/locales/ko.po) | [Ji-Hyeon Gim](mailto:potatogim@potatogim.net) | 86%
# Contributors
Thank you to everyone who've contributed to Joplin's source code!
| | | | | |
| :---: | :---: | :---: | :---: | :---: |
| [laurent22](https://github.com/laurent22) | [tessus](https://github.com/tessus) | [CalebJohn](https://github.com/CalebJohn) | [mic704b](https://github.com/mic704b) | [roman-r-m](https://github.com/roman-r-m) |
| [genneko](https://github.com/genneko) | [j-krl](https://github.com/j-krl) | [tanrax](https://github.com/tanrax) | [naviji](https://github.com/naviji) | [PackElend](https://github.com/PackElend) |
| [rtmkrlv](https://github.com/rtmkrlv) | [fmrtn](https://github.com/fmrtn) | [potatogim](https://github.com/potatogim) | [devonzuegel](https://github.com/devonzuegel) | [anjulalk](https://github.com/anjulalk) |
| [gabcoh](https://github.com/gabcoh) | [matsest](https://github.com/matsest) | [abonte](https://github.com/abonte) | [Abijeet](https://github.com/Abijeet) | [ishantgupta777](https://github.com/ishantgupta777) |
| [JackGruber](https://github.com/JackGruber) | [Ardakilic](https://github.com/Ardakilic) | [rabeehrz](https://github.com/rabeehrz) | [coderrsid](https://github.com/coderrsid) | [foxmask](https://github.com/foxmask) |
| [innocuo](https://github.com/innocuo) | [Rahulm2310](https://github.com/Rahulm2310) | [readingsnail](https://github.com/readingsnail) | [mablin7](https://github.com/mablin7) | [XarisA](https://github.com/XarisA) |
| [jonath92](https://github.com/jonath92) | [alexdevero](https://github.com/alexdevero) | [Runo-saduwa](https://github.com/Runo-saduwa) | [marcosvega91](https://github.com/marcosvega91) | [petrz12](https://github.com/petrz12) |
| [rnbastos](https://github.com/rnbastos) | [ProgramFan](https://github.com/ProgramFan) | [zblesk](https://github.com/zblesk) | [vsimkus](https://github.com/vsimkus) | [moltenform](https://github.com/moltenform) |
| [nishantwrp](https://github.com/nishantwrp) | [zuphilip](https://github.com/zuphilip) | [Rishabh-malhotraa](https://github.com/Rishabh-malhotraa) | [metbril](https://github.com/metbril) | [WhiredPlanck](https://github.com/WhiredPlanck) |
| [milotype](https://github.com/milotype) | [yaozeye](https://github.com/yaozeye) | [ylc395](https://github.com/ylc395) | [RenatoXSR](https://github.com/RenatoXSR) | [RedDocMD](https://github.com/RedDocMD) |
| [q1011](https://github.com/q1011) | [amitsin6h](https://github.com/amitsin6h) | [Atalanttore](https://github.com/Atalanttore) | [Mannivu](https://github.com/Mannivu) | [martonpaulo](https://github.com/martonpaulo) |
| [mmahmoudian](https://github.com/mmahmoudian) | [rccavalcanti](https://github.com/rccavalcanti) | [ShaneKilkelly](https://github.com/ShaneKilkelly) | [sinkuu](https://github.com/sinkuu) | [stweil](https://github.com/stweil) |
| [conyx](https://github.com/conyx) | [anihm136](https://github.com/anihm136) | [archont00](https://github.com/archont00) | [bradmcl](https://github.com/bradmcl) | [tfinnberg](https://github.com/tfinnberg) |
| [amandamcg](https://github.com/amandamcg) | [marcushill](https://github.com/marcushill) | [nathanleiby](https://github.com/nathanleiby) | [RaphaelKimmig](https://github.com/RaphaelKimmig) | [Vaso3](https://github.com/Vaso3) |
| [sensor-freak](https://github.com/sensor-freak) | [lkiThakur](https://github.com/lkiThakur) | [infinity052](https://github.com/infinity052) | [BartBucknill](https://github.com/BartBucknill) | [mrwulf](https://github.com/mrwulf) |
| [chrisb86](https://github.com/chrisb86) | [chrmoritz](https://github.com/chrmoritz) | [Daeraxa](https://github.com/Daeraxa) | [Elaborendum](https://github.com/Elaborendum) | [ethan42411](https://github.com/ethan42411) |
| [JOJ0](https://github.com/JOJ0) | [jalajcodes](https://github.com/jalajcodes) | [jblunck](https://github.com/jblunck) | [jdrobertso](https://github.com/jdrobertso) | [Jesssullivan](https://github.com/Jesssullivan) |
| [jmontane](https://github.com/jmontane) | [johanhammar](https://github.com/johanhammar) | [solariz](https://github.com/solariz) | [maicki](https://github.com/maicki) | [mjjzf](https://github.com/mjjzf) |
| [rt-oliveira](https://github.com/rt-oliveira) | [sebastienjust](https://github.com/sebastienjust) | [sealch](https://github.com/sealch) | [StarFang208](https://github.com/StarFang208) | [Subhra264](https://github.com/Subhra264) |
| [SubodhDahal](https://github.com/SubodhDahal) | [TobiasDev](https://github.com/TobiasDev) | [Whaell](https://github.com/Whaell) | [jyuvaraj03](https://github.com/jyuvaraj03) | [kowalskidev](https://github.com/kowalskidev) |
| [alexchee](https://github.com/alexchee) | [axq](https://github.com/axq) | [barbowza](https://github.com/barbowza) | [eresytter](https://github.com/eresytter) | [lightray22](https://github.com/lightray22) |
| [lscolombo](https://github.com/lscolombo) | [mrkaato](https://github.com/mrkaato) | [pf-siedler](https://github.com/pf-siedler) | [ruuti](https://github.com/ruuti) | [s1nceri7y](https://github.com/s1nceri7y) |
| [kornava](https://github.com/kornava) | [ShuiHuo](https://github.com/ShuiHuo) | [ikunya](https://github.com/ikunya) | [Ahmad45123](https://github.com/Ahmad45123) | [bedwardly-down](https://github.com/bedwardly-down) |
| [dcaveiro](https://github.com/dcaveiro) | [hexclover](https://github.com/hexclover) | [2jaeyeol](https://github.com/2jaeyeol) | [thackeraaron](https://github.com/thackeraaron) | [aaronxn](https://github.com/aaronxn) |
| [xUser5000](https://github.com/xUser5000) | [iamabhi222](https://github.com/iamabhi222) | [Aksh-Konda](https://github.com/Aksh-Konda) | [alanfortlink](https://github.com/alanfortlink) | [AverageUser2](https://github.com/AverageUser2) |
| [afischer211](https://github.com/afischer211) | [a13xk](https://github.com/a13xk) | [apankratov](https://github.com/apankratov) | [teterkin](https://github.com/teterkin) | [avanderberg](https://github.com/avanderberg) |
| [serenitatis](https://github.com/serenitatis) | [lex111](https://github.com/lex111) | [Alkindi42](https://github.com/Alkindi42) | [Jumanjii](https://github.com/Jumanjii) | [AlphaJack](https://github.com/AlphaJack) |
| [Lord-Aman](https://github.com/Lord-Aman) | [richtwin567](https://github.com/richtwin567) | [ajilderda](https://github.com/ajilderda) | [adrynov](https://github.com/adrynov) | [andrewperry](https://github.com/andrewperry) |
| [tekdel](https://github.com/tekdel) | [anshuman9999](https://github.com/anshuman9999) | [rasklaad](https://github.com/rasklaad) | [Technik-J](https://github.com/Technik-J) | [Shaxine](https://github.com/Shaxine) |
| [antonio-ramadas](https://github.com/antonio-ramadas) | [heyapoorva](https://github.com/heyapoorva) | [assimd](https://github.com/assimd) | [Atrate](https://github.com/Atrate) | [Beowulf2](https://github.com/Beowulf2) |
| [bimlas](https://github.com/bimlas) | [brenobaptista](https://github.com/brenobaptista) | [brttbndr](https://github.com/brttbndr) | [carlbordum](https://github.com/carlbordum) | [carlosedp](https://github.com/carlosedp) |
| [chaifeng](https://github.com/chaifeng) | [charles-e](https://github.com/charles-e) | [cyy5358](https://github.com/cyy5358) | [Chillu1](https://github.com/Chillu1) | [Techwolf12](https://github.com/Techwolf12) |
| [cloudtrends](https://github.com/cloudtrends) | [idcristi](https://github.com/idcristi) | [damienmascre](https://github.com/damienmascre) | [daniellandau](https://github.com/daniellandau) | [danil-tolkachev](https://github.com/danil-tolkachev) |
| [darshani28](https://github.com/darshani28) | [daukadolt](https://github.com/daukadolt) | [NeverMendel](https://github.com/NeverMendel) | [dervist](https://github.com/dervist) | [diego-betto](https://github.com/diego-betto) |
| [erdody](https://github.com/erdody) | [domgoodwin](https://github.com/domgoodwin) | [b4mboo](https://github.com/b4mboo) | [donbowman](https://github.com/donbowman) | [sirnacnud](https://github.com/sirnacnud) |
| [dflock](https://github.com/dflock) | [drobilica](https://github.com/drobilica) | [educbraga](https://github.com/educbraga) | [eduardokimmel](https://github.com/eduardokimmel) | [VodeniZeko](https://github.com/VodeniZeko) |
| [ei-ke](https://github.com/ei-ke) | [einverne](https://github.com/einverne) | [eodeluga](https://github.com/eodeluga) | [fathyar](https://github.com/fathyar) | [fer22f](https://github.com/fer22f) |
| [fpindado](https://github.com/fpindado) | [FleischKarussel](https://github.com/FleischKarussel) | [talkdirty](https://github.com/talkdirty) | [gmaubach](https://github.com/gmaubach) | [gmag11](https://github.com/gmag11) |
| [Jackymancs4](https://github.com/Jackymancs4) | [Glandos](https://github.com/Glandos) | [vibraniumdev](https://github.com/vibraniumdev) | [gusbemacbe](https://github.com/gusbemacbe) | [HOLLYwyh](https://github.com/HOLLYwyh) |
| [Fvbor](https://github.com/Fvbor) | [bennetthanna](https://github.com/bennetthanna) | [harshitkathuria](https://github.com/harshitkathuria) | [Vistaus](https://github.com/Vistaus) | [ianjs](https://github.com/ianjs) |
| [iahmedbacha](https://github.com/iahmedbacha) | [IrvinDominin](https://github.com/IrvinDominin) | [ishammahajan](https://github.com/ishammahajan) | [ffadilaputra](https://github.com/ffadilaputra) | [JRaiden16](https://github.com/JRaiden16) |
| [jacobherrington](https://github.com/jacobherrington) | [jamesadjinwa](https://github.com/jamesadjinwa) | [jrwrigh](https://github.com/jrwrigh) | [jaredcrowe](https://github.com/jaredcrowe) | [volatilevar](https://github.com/volatilevar) |
| [innkuika](https://github.com/innkuika) | [JoelRSimpson](https://github.com/JoelRSimpson) | [joeltaylor](https://github.com/joeltaylor) | [exic](https://github.com/exic) | [JonathanPlasse](https://github.com/JonathanPlasse) |
| [joesfer](https://github.com/joesfer) | [joybinchen](https://github.com/joybinchen) | [kaustubhsh](https://github.com/kaustubhsh) | [y-usuzumi](https://github.com/y-usuzumi) | [xuhcc](https://github.com/xuhcc) |
| [kirtanprht](https://github.com/kirtanprht) | [k0ur0x](https://github.com/k0ur0x) | [kklas](https://github.com/kklas) | [xmlangel](https://github.com/xmlangel) | [troilus](https://github.com/troilus) |
| [lboullo0](https://github.com/lboullo0) | [dbinary](https://github.com/dbinary) | [marc-bouvier](https://github.com/marc-bouvier) | [mvonmaltitz](https://github.com/mvonmaltitz) | [mlkood](https://github.com/mlkood) |
| [plextoriano](https://github.com/plextoriano) | [Marmo](https://github.com/Marmo) | [mcejp](https://github.com/mcejp) | [freaktechnik](https://github.com/freaktechnik) | [martinkorelic](https://github.com/martinkorelic) |
| [Petemir](https://github.com/Petemir) | [matsair](https://github.com/matsair) | [mgroth0](https://github.com/mgroth0) | [silentmatt](https://github.com/silentmatt) | [maxs-test](https://github.com/maxs-test) |
| [MichBoi](https://github.com/MichBoi) | [MichipX](https://github.com/MichipX) | [MrTraduttore](https://github.com/MrTraduttore) | [sanjarcode](https://github.com/sanjarcode) | [Mustafa-ALD](https://github.com/Mustafa-ALD) |
| [NJannasch](https://github.com/NJannasch) | [zomglings](https://github.com/zomglings) | [Frichetten](https://github.com/Frichetten) | [nicolas-suzuki](https://github.com/nicolas-suzuki) | [Ouvill](https://github.com/Ouvill) |
| [shorty2380](https://github.com/shorty2380) | [dist3r](https://github.com/dist3r) | [rakleed](https://github.com/rakleed) | [idle-code](https://github.com/idle-code) | [bobchao](https://github.com/bobchao) |
| [Diadlo](https://github.com/Diadlo) | [pranavmodx](https://github.com/pranavmodx) | [R3dError](https://github.com/R3dError) | [rajprakash00](https://github.com/rajprakash00) | [rahil1304](https://github.com/rahil1304) |
| [rasulkireev](https://github.com/rasulkireev) | [reinhart1010](https://github.com/reinhart1010) | [Retew](https://github.com/Retew) | [ambrt](https://github.com/ambrt) | [Derkades](https://github.com/Derkades) |
| [fourstepper](https://github.com/fourstepper) | [rodgco](https://github.com/rodgco) | [Ronnie76er](https://github.com/Ronnie76er) | [roryokane](https://github.com/roryokane) | [ruzaq](https://github.com/ruzaq) |
| [szokesandor](https://github.com/szokesandor) | [SamuelBlickle](https://github.com/SamuelBlickle) | [livingc0l0ur](https://github.com/livingc0l0ur) | [bronson](https://github.com/bronson) | [semperor](https://github.com/semperor) |
| [shawnaxsom](https://github.com/shawnaxsom) | [SFoskitt](https://github.com/SFoskitt) | [kcrt](https://github.com/kcrt) | [xissy](https://github.com/xissy) | [tams](https://github.com/tams) |
| [Tekki](https://github.com/Tekki) | [ThatcherC](https://github.com/ThatcherC) | [TheoDutch](https://github.com/TheoDutch) | [tbroadley](https://github.com/tbroadley) | [Kriechi](https://github.com/Kriechi) |
| [tkilaker](https://github.com/tkilaker) | [Tim-Erwin](https://github.com/Tim-Erwin) | [tcyrus](https://github.com/tcyrus) | [tobias-grasse](https://github.com/tobias-grasse) | [strobeltobias](https://github.com/strobeltobias) |
| [kostegit](https://github.com/kostegit) | [tbergeron](https://github.com/tbergeron) | [Ullas-Aithal](https://github.com/Ullas-Aithal) | [MyTheValentinus](https://github.com/MyTheValentinus) | [vassudanagunta](https://github.com/vassudanagunta) |
| [vijayjoshi16](https://github.com/vijayjoshi16) | [max-keviv](https://github.com/max-keviv) | [vandreykiv](https://github.com/vandreykiv) | [WisdomCode](https://github.com/WisdomCode) | [xsak](https://github.com/xsak) |
| [ymitsos](https://github.com/ymitsos) | [abolishallprivateproperty](https://github.com/abolishallprivateproperty) | [aerotog](https://github.com/aerotog) | [albertopasqualetto](https://github.com/albertopasqualetto) | [asrient](https://github.com/asrient) |
| [bestlibre](https://github.com/bestlibre) | [boring10](https://github.com/boring10) | [cadolphs](https://github.com/cadolphs) | [colorchestra](https://github.com/colorchestra) | [cybertramp](https://github.com/cybertramp) |
| [dartero](https://github.com/dartero) | [delta-emil](https://github.com/delta-emil) | [doc75](https://github.com/doc75) | [dsp77](https://github.com/dsp77) | [ebayer](https://github.com/ebayer) |
| [elsiehupp](https://github.com/elsiehupp) | [espinosa](https://github.com/espinosa) | [exponentactivity](https://github.com/exponentactivity) | [exprez135](https://github.com/exprez135) | [fab4x](https://github.com/fab4x) |
| [fabianski7](https://github.com/fabianski7) | [rasperepodvipodvert](https://github.com/rasperepodvipodvert) | [gasolin](https://github.com/gasolin) | [githubaccount073](https://github.com/githubaccount073) | [hms5232](https://github.com/hms5232) |
| [hydrandt](https://github.com/hydrandt) | [iamtalwinder](https://github.com/iamtalwinder) | [jabdoa2](https://github.com/jabdoa2) | [jduar](https://github.com/jduar) | [jibedoubleve](https://github.com/jibedoubleve) |
| [johanvanheusden](https://github.com/johanvanheusden) | [jtagcat](https://github.com/jtagcat) | [konhi](https://github.com/konhi) | [krzysiekwie](https://github.com/krzysiekwie) | [lighthousebulb](https://github.com/lighthousebulb) |
| [luzpaz](https://github.com/luzpaz) | [majsterkovic](https://github.com/majsterkovic) | [mak2002](https://github.com/mak2002) | [nmiquan](https://github.com/nmiquan) | [nullpointer666](https://github.com/nullpointer666) |
| [oscaretu](https://github.com/oscaretu) | [oskarsh](https://github.com/oskarsh) | [osso73](https://github.com/osso73) | [over-soul](https://github.com/over-soul) | [pensierocrea](https://github.com/pensierocrea) |
| [pomeloy](https://github.com/pomeloy) | [rhtenhove](https://github.com/rhtenhove) | [rikanotank1](https://github.com/rikanotank1) | [rxliuli](https://github.com/rxliuli) | [simonsan](https://github.com/simonsan) |
| [stellarpower](https://github.com/stellarpower) | [suixinio](https://github.com/suixinio) | [sumomo-99](https://github.com/sumomo-99) | [xtatsux](https://github.com/xtatsux) | [taw00](https://github.com/taw00) |
| [tcassaert](https://github.com/tcassaert) | [victante](https://github.com/victante) | [Voltinus](https://github.com/Voltinus) | [xcffl](https://github.com/xcffl) | [yourcontact](https://github.com/yourcontact) |
| [zaoyifan](https://github.com/zaoyifan) | [zawnk](https://github.com/zawnk) | [zen-quo](https://github.com/zen-quo) | [zozolina123](https://github.com/zozolina123) | [xcession](https://github.com/xcession) |
| [paventyang](https://github.com/paventyang) | [jackytsu](https://github.com/jackytsu) | [zhangmx](https://github.com/zhangmx) | | |