Overview
Joplin is a free, open-source note-taking and to-do application that supports Markdown formatting, end-to-end encryption, and synchronization across multiple platforms. It can handle large numbers of notes organized into notebooks, and supports tagging, searching, and attaching files to notes. Notes are stored locally and can be synced via cloud services.
Joplin is available on Windows, macOS, Linux, Android, and iOS. It supports importing from Evernote (ENEX files), and can synchronize via Nextcloud, Dropbox, OneDrive, WebDAV, or Joplin Cloud. The application also features a web clipper browser extension for saving web pages directly into your notes.
Installation
Desktop
# macOS via Homebrew
brew install --cask joplin
# Linux via AppImage
wget -O Joplin.AppImage https://github.com/laurent22/joplin/releases/latest/download/Joplin-x86_64.AppImage
chmod +x Joplin.AppImage
./Joplin.AppImage
# Linux via Snap
sudo snap install joplin-desktop
# Windows via Chocolatey
choco install joplin
# Windows via winget
winget install --id=Joplin.Joplin
Terminal App (CLI)
# Install via npm
npm install -g joplin
# Start the terminal app
joplin
# Import notes from Evernote
joplin import /path/to/exported.enex
# Sync with configured target
joplin sync
CLI Commands
| Command | Description |
|---|
joplin | Start the terminal UI |
joplin ls | List notebooks |
joplin ls notebook_name | List notes in a notebook |
joplin mknote "Title" | Create a new note |
joplin mkbook "Notebook" | Create a new notebook |
joplin edit "Title" | Edit a note in your default editor |
joplin cat "Title" | Display note contents |
joplin rm "Title" | Delete a note |
joplin cp "Title" "Notebook" | Copy note to notebook |
joplin mv "Title" "Notebook" | Move note to notebook |
joplin tag add tagname "Title" | Add a tag to a note |
joplin tag list | List all tags |
joplin search "query" | Search notes |
joplin sync | Synchronize notes |
joplin import file.enex | Import Evernote export |
joplin export --format md /path | Export notes as Markdown |
joplin config | Show configuration |
joplin server start | Start Joplin Server |
Keyboard Shortcuts (Desktop)
| Shortcut | Action |
|---|
Ctrl+N | New note |
Ctrl+Shift+N | New to-do |
Ctrl+B | New notebook |
Ctrl+P | Go to anything (search) |
Ctrl+Shift+P | Command palette |
Ctrl+F | Search in note |
Ctrl+G | Search in all notes |
Ctrl+E | Toggle editor/viewer |
Ctrl+L | Toggle sidebar |
Ctrl+Shift+L | Toggle note list |
Ctrl+S | Sync manually |
F10 | Toggle external editing |
Alt+E | Toggle rich text / Markdown |
Ctrl+, | Open settings |
Synchronization
Sync Targets
| Target | Config Value | Description |
|---|
| File system | 2 | Sync to a local directory |
| OneDrive | 3 | Microsoft OneDrive |
| Nextcloud | 5 | Self-hosted Nextcloud |
| WebDAV | 6 | Any WebDAV server |
| Dropbox | 7 | Dropbox cloud storage |
| S3 (Compatible) | 8 | AWS S3 or compatible |
| Joplin Server | 9 | Official Joplin Server |
| Joplin Cloud | 10 | Hosted Joplin Cloud service |
Configuring Sync via CLI
# Set sync target to Nextcloud
joplin config sync.target 5
joplin config sync.5.path https://nextcloud.example.com/remote.php/webdav/Joplin
joplin config sync.5.username your_username
joplin config sync.5.password your_password
# Set sync target to filesystem
joplin config sync.target 2
joplin config sync.2.path /path/to/sync/directory
# Run sync
joplin sync
Configuration
Key Configuration Options
# Enable end-to-end encryption
joplin config encryption.enabled 1
# Set editor
joplin config editor "vim"
# Set date format
joplin config dateFormat "YYYY-MM-DD"
# Set time format
joplin config timeFormat "HH:mm"
# Set locale
joplin config locale en_US
# Show completed to-dos
joplin config showCompletedTodos 1
# Set sort order
joplin config notes.sortOrder.field user_updated_time
joplin config notes.sortOrder.reverse 1
Encryption
# Enable E2EE via CLI
joplin e2ee enable
# Check encryption status
joplin e2ee status
# Decrypt all notes
joplin e2ee decrypt
# Disable E2EE
joplin e2ee disable
Advanced Usage
Joplin Server (Self-Hosted)
# docker-compose.yml
version: '3'
services:
joplin:
image: joplin/server:latest
ports:
- "22300:22300"
environment:
- APP_PORT=22300
- APP_BASE_URL=https://joplin.example.com
- DB_CLIENT=pg
- POSTGRES_PASSWORD=changeme
- POSTGRES_DATABASE=joplin
- POSTGRES_USER=joplin
- POSTGRES_PORT=5432
- POSTGRES_HOST=db
depends_on:
- db
restart: unless-stopped
db:
image: postgres:15
volumes:
- ./data/postgres:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=changeme
- POSTGRES_USER=joplin
- POSTGRES_DB=joplin
restart: unless-stopped
Web Clipper API
# Enable web clipper service in Joplin settings
# Default port: 41184
# Create a note via API
curl -X POST http://localhost:41184/notes \
-H "Content-Type: application/json" \
-d '{"title":"API Note","body":"Content here"}' \
--data-urlencode "token=YOUR_TOKEN"
# Search notes
curl "http://localhost:41184/search?query=keyword&token=YOUR_TOKEN"
# List notebooks
curl "http://localhost:41184/folders?token=YOUR_TOKEN"
Plugins
| Plugin | Description |
|---|
Note Tabs | Tabbed note navigation |
Kanban | Kanban board for tasks |
Templates | Note templates support |
Backup | Automated backups |
Quick Links | Fast note linking |
Favorites | Pin favorite notes |
Troubleshooting
| Issue | Solution |
|---|
| Sync conflict | Open conflicting notes; manually merge changes |
| Notes not appearing after sync | Wait for full sync; check sync target configuration |
| Encryption errors | Verify master password; re-enable E2EE if needed |
| Slow search with many notes | Rebuild search index: Tools → Note list → Rebuild |
| Web clipper not connecting | Check port 41184 is open; enable clipper in settings |
| Import failing from Evernote | Ensure ENEX file is valid; try smaller batches |
| Large attachments not syncing | Check sync target storage limits |
| CLI not finding notes | Run joplin sync first to populate local database |