1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-12-23 23:33:01 +02:00

Compare commits

..

31 Commits

Author SHA1 Message Date
Laurent Cozic
c6ff42f374 Update shim-init-node.js 2023-08-08 15:48:31 +01:00
Laurent Cozic
a25117c41a Update Note.tsx 2023-08-08 15:47:51 +01:00
Laurent Cozic
6131d1ffd2 Update shim-init-node.js 2023-08-08 15:47:01 +01:00
Laurent Cozic
6dea4b8261 Update Note.tsx 2023-08-08 15:46:04 +01:00
Hubert
94b3de1370 Split message in two lines. 2023-08-04 17:40:54 -03:00
Hubert
cca501d819 Merge remote-tracking branch 'origin/dev' into issue-8566 2023-08-04 17:30:11 -03:00
renovate[bot]
2329e321ec Update dependency @rmp135/sql-ts to v1.18.0 (#8615)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-04 12:28:58 +01:00
Hubert
6c2e0d9262 Desktop: Fixes #8591: Error while quitting the app (#8612) 2023-08-04 11:00:39 +01:00
Laurent Cozic
887c271853 Chore: Trying to fix logger (#8610) 2023-08-04 10:57:54 +01:00
Milo Ivir
ea7c7f6447 Update Croatian translation file (#8608) 2023-08-03 15:51:06 +01:00
renovate[bot]
29931c05ad Update dependency sharp to v0.32.3 (#8606)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-03 13:06:41 +00:00
renovate[bot]
17c227024e Update dependency react-select to v5.7.4 (#8604)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-02 19:11:39 +00:00
Hubert
6fe33f3435 Label updated. 2023-08-02 16:09:37 -03:00
Hubert
4d05cc7595 Merge remote-tracking branch 'origin/dev' into issue-8566 2023-08-02 16:08:13 -03:00
renovate[bot]
406a1496db Update buildTools (major) (#8597)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Laurent Cozic <laurent22@users.noreply.github.com>
2023-08-02 11:24:54 +01:00
Laurent Cozic
c8180b91e0 fix CI 2023-08-02 11:22:23 +01:00
renovate[bot]
1978929114 Update dependency glob to v10.3.3 (#8599)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-01 22:26:37 +00:00
Joplin Bot
3e7debbcc5 Doc: Auto-update documentation
Auto-updated using release-website.sh
2023-08-01 18:15:52 +00:00
Henry Heino
a138b92b1b Desktop: Fixes #8541: Fix toggle external editing button always disabled in rich text editor (#8595) 2023-08-01 17:54:39 +01:00
renovate[bot]
28619f1786 Update dependency @react-native-community/datetimepicker to v7.2.0 (#8593)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-01 15:40:05 +01:00
renovate[bot]
e8f30b708b Update dependency glob to v10.3.0 (#8594)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-01 15:39:51 +01:00
renovate[bot]
39bc7ed397 Update buildTools (#8596)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Laurent Cozic <laurent22@users.noreply.github.com>
2023-08-01 15:38:59 +01:00
Joplin Bot
59852e252b Doc: Auto-update documentation
Auto-updated using release-website.sh
2023-08-01 00:46:55 +00:00
renovate[bot]
51764cc933 Update dependency sharp to v0.32.2 (#8590)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-31 18:06:24 +00:00
Hubert
30471d591a Modifications in the mobile app to support the choice of the user from menu. 2023-07-31 14:37:43 -03:00
Hubert
c997a7e480 Merge remote-tracking branch 'origin/dev' into issue-8566 2023-07-31 13:02:22 -03:00
renovate[bot]
cb754604f1 Update dependency react-native-safe-area-context to v4.6.4 (#8589)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-31 15:44:33 +00:00
Hubert
7ed133d960 Changes from review. 2023-07-31 12:03:10 -03:00
Hubert
c252937852 Update packages/lib/models/Setting.ts
Co-authored-by: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com>
2023-07-30 10:30:58 -03:00
Hubert
a9c919fe59 Removed the changes in the indentation. The code isn't related to my changes. 2023-07-28 16:51:13 -03:00
Hubert
772baf1e84 Added the option under note's menu that allowed the users to decide what to do when attaching some large image file to some note. 2023-07-28 16:34:14 -03:00
77 changed files with 858 additions and 17025 deletions

View File

@@ -76,7 +76,6 @@ plugin_types/
readme/
packages/react-native-vosk/lib/
packages/lib/countable/Countable.js
packages/app-mobile/plugins
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
packages/app-cli/app/LinkSelector.js
@@ -444,7 +443,6 @@ packages/app-mobile/root.js
packages/app-mobile/services/AlarmServiceDriver.android.js
packages/app-mobile/services/AlarmServiceDriver.ios.js
packages/app-mobile/services/e2ee/RSA.react-native.js
packages/app-mobile/services/plugins/PluginRunner.js
packages/app-mobile/services/profiles/index.js
packages/app-mobile/services/voiceTyping/vosk.android.js
packages/app-mobile/services/voiceTyping/vosk.ios.js
@@ -458,7 +456,6 @@ packages/app-mobile/utils/checkPermissions.js
packages/app-mobile/utils/createRootStyle.js
packages/app-mobile/utils/debounce.js
packages/app-mobile/utils/fs-driver-rn.js
packages/app-mobile/utils/markupLanguageUtils.js
packages/app-mobile/utils/setupNotifications.js
packages/app-mobile/utils/shareHandler.js
packages/app-mobile/utils/types.js
@@ -544,6 +541,7 @@ packages/lib/htmlUtils2.test.js
packages/lib/import-enex-md-gen.test.js
packages/lib/import-enex-md-gen.js
packages/lib/import-enex.js
packages/lib/initLib.js
packages/lib/locale.test.js
packages/lib/locale.js
packages/lib/markdownUtils.test.js

3
.gitignore vendored
View File

@@ -428,7 +428,6 @@ packages/app-mobile/root.js
packages/app-mobile/services/AlarmServiceDriver.android.js
packages/app-mobile/services/AlarmServiceDriver.ios.js
packages/app-mobile/services/e2ee/RSA.react-native.js
packages/app-mobile/services/plugins/PluginRunner.js
packages/app-mobile/services/profiles/index.js
packages/app-mobile/services/voiceTyping/vosk.android.js
packages/app-mobile/services/voiceTyping/vosk.ios.js
@@ -442,7 +441,6 @@ packages/app-mobile/utils/checkPermissions.js
packages/app-mobile/utils/createRootStyle.js
packages/app-mobile/utils/debounce.js
packages/app-mobile/utils/fs-driver-rn.js
packages/app-mobile/utils/markupLanguageUtils.js
packages/app-mobile/utils/setupNotifications.js
packages/app-mobile/utils/shareHandler.js
packages/app-mobile/utils/types.js
@@ -528,6 +526,7 @@ packages/lib/htmlUtils2.test.js
packages/lib/import-enex-md-gen.test.js
packages/lib/import-enex-md-gen.js
packages/lib/import-enex.js
packages/lib/initLib.js
packages/lib/locale.test.js
packages/lib/locale.js
packages/lib/markdownUtils.test.js

View File

@@ -64,27 +64,27 @@
}
},
"devDependencies": {
"@joplin/utils": "~2.11",
"@joplin/utils": "~2.12",
"@seiyab/eslint-plugin-react-hooks": "4.5.1-beta.0",
"@typescript-eslint/eslint-plugin": "5.59.0",
"@typescript-eslint/parser": "5.59.0",
"@typescript-eslint/eslint-plugin": "5.60.0",
"@typescript-eslint/parser": "5.60.0",
"cspell": "5.21.2",
"eslint": "8.39.0",
"eslint-interactive": "10.7.0",
"eslint": "8.43.0",
"eslint-interactive": "10.8.0",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-jest": "27.2.1",
"eslint-plugin-jest": "27.2.2",
"eslint-plugin-promise": "6.1.1",
"eslint-plugin-react": "7.32.2",
"execa": "5.1.1",
"fs-extra": "11.1.1",
"glob": "10.2.7",
"glob": "10.3.3",
"gulp": "4.0.2",
"husky": "3.1.0",
"lerna": "3.22.1",
"lint-staged": "13.2.3",
"madge": "6.1.0",
"npm-package-json-lint": "6.4.0",
"typescript": "5.0.2"
"typescript": "5.1.3"
},
"dependencies": {
"@types/fs-extra": "11.0.1",
@@ -93,11 +93,12 @@
"node-gyp": "9.4.0",
"nodemon": "2.0.22"
},
"packageManager": "yarn@3.5.0",
"packageManager": "yarn@3.6.0",
"resolutions": {
"react-native-camera@4.2.1": "patch:react-native-camera@npm%3A4.2.1#./.yarn/patches/react-native-camera-npm-4.2.1-24b2600a7e.patch",
"react-native-vosk@0.1.12": "patch:react-native-vosk@npm%3A0.1.12#./.yarn/patches/react-native-vosk-npm-0.1.12-76b1caaae8.patch",
"eslint@8.39.0": "patch:eslint@npm%3A8.39.0#./.yarn/patches/eslint-npm-8.39.0-d92bace04d.patch",
"eslint@8.43.0": "patch:eslint@npm%3A8.39.0#./.yarn/patches/eslint-npm-8.39.0-d92bace04d.patch",
"eslint@^8.13.0": "patch:eslint@npm%3A8.39.0#./.yarn/patches/eslint-npm-8.39.0-d92bace04d.patch",
"app-builder-lib@24.4.0": "patch:app-builder-lib@npm%3A24.4.0#./.yarn/patches/app-builder-lib-npm-24.4.0-05322ff057.patch",
"react-native@0.71.10": "patch:react-native@npm%3A0.71.10#./.yarn/patches/react-native-animation-fix/react-native-npm-0.71.10-f9c32562d8.patch",

View File

@@ -57,7 +57,7 @@
"proper-lockfile": "4.1.2",
"read-chunk": "2.1.0",
"server-destroy": "1.0.1",
"sharp": "0.32.1",
"sharp": "0.32.3",
"sprintf-js": "1.1.2",
"sqlite3": "5.1.6",
"string-padding": "1.0.2",
@@ -72,12 +72,12 @@
"devDependencies": {
"@joplin/tools": "~2.12",
"@types/fs-extra": "11.0.1",
"@types/jest": "29.5.1",
"@types/node": "18.15.13",
"@types/jest": "29.5.3",
"@types/node": "18.16.18",
"@types/proper-lockfile": "^4.1.2",
"gulp": "4.0.2",
"jest": "29.5.0",
"temp": "0.9.4",
"typescript": "5.0.2"
"typescript": "5.1.3"
}
}

View File

@@ -174,7 +174,7 @@ export default class ElectronAppWrapper {
// so that it can tell us if we can really close the app or not.
// Search for "appClose" event for closing logic on renderer side.
event.preventDefault();
this.win_.webContents.send('appClose');
if (this.win_) this.win_.webContents.send('appClose');
} else {
// If the renderer process has responded, check if we can close or not
if (this.rendererProcessQuitReply_.canClose) {

View File

@@ -262,8 +262,6 @@ class Application extends BaseApplication {
if (this.initPluginServiceDone_) return;
this.initPluginServiceDone_ = true;
PlatformImplementation.instance().initialize((action: any) => this.dispatch(action));
const service = PluginService.instance();
const pluginRunner = new PluginRunner();

View File

@@ -2,7 +2,6 @@ import CommandService, { CommandRuntime, CommandDeclaration } from '@joplin/lib/
import { _ } from '@joplin/lib/locale';
import { stateUtils } from '@joplin/lib/reducer';
import { DesktopCommandContext } from '../services/commands/types';
import { enabledCondition } from '../gui/NoteEditor/editorCommandDeclarations';
export const declaration: CommandDeclaration = {
name: 'toggleExternalEditing',
@@ -23,7 +22,7 @@ export const runtime = (): CommandRuntime => {
void CommandService.instance().execute('startExternalEditing', noteId);
}
},
enabledCondition: enabledCondition(declaration.name),
enabledCondition: 'oneNoteSelected && !noteIsReadOnly && (!modalDialogVisible || gotoAnythingVisible)',
mapStateToTitle: (state: any) => {
const noteId = stateUtils.selectedNoteId(state);
return state.watchedNoteFiles.includes(noteId) ? _('Stop') : '';

View File

@@ -26,6 +26,7 @@ interface State {
interface Props {
message?: string;
children: any;
}
export default class ErrorBoundary extends React.Component<Props, State> {

View File

@@ -38,6 +38,7 @@ export const runtime = (): CommandRuntime => {
menuItem.click();
});
}
return null;
},
};
};

View File

@@ -99,7 +99,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
}
}, []);
const addListItem = useCallback((string1, defaultText = '') => {
const addListItem = useCallback((string1: string, defaultText = '') => {
if (editorRef.current) {
if (editorRef.current.somethingSelected()) {
editorRef.current.wrapSelectionsByLine(string1);

View File

@@ -141,7 +141,7 @@ export default function useScrollHandler(editorRef: any, webviewRef: any, onScro
// eslint-disable-next-line @seiyab/react-hooks/exhaustive-deps -- Old code before rule was applied
}, []);
const editor_resize = useCallback((cm) => {
const editor_resize = useCallback((cm: any) => {
if (isCodeMirrorReady(cm)) {
// This handler is called when resized and refreshed.
// Only when resized, the scroll position is restored.

View File

@@ -324,7 +324,7 @@ function NoteEditor(props: NoteEditorProps) {
const onMessage = useMessageHandler(scrollWhenReady, setScrollWhenReady, editorRef, setLocalSearchResultCount, props.dispatch, formNote);
const externalEditWatcher_noteChange = useCallback((event) => {
const externalEditWatcher_noteChange = useCallback((event: any) => {
if (event.id === formNote.id) {
const newFormNote = {
...formNote,
@@ -337,7 +337,7 @@ function NoteEditor(props: NoteEditorProps) {
// eslint-disable-next-line @seiyab/react-hooks/exhaustive-deps -- Old code before rule was applied
}, [formNote]);
const onNotePropertyChange = useCallback((event) => {
const onNotePropertyChange = useCallback((event: any) => {
setFormNote(formNote => {
if (formNote.id !== event.note.id) return formNote;

View File

@@ -78,7 +78,7 @@ export async function commandAttachFileToBody(body: string, filePaths: string[]
logger.info(`Attaching ${filePath}`);
const newBody = await shim.attachFileToNoteBody(body, filePath, options.position, {
createFileURL: options.createFileURL,
resizeLargeImages: 'ask',
resizeLargeImages: Setting.value('imageResizing'),
});
if (!newBody) {

View File

@@ -84,11 +84,11 @@ function NoteListItem(props: NoteListItemProps, ref: any) {
dragItemPosition = 'bottom';
}
const onTitleClick = useCallback((event) => {
const onTitleClick = useCallback((event: any) => {
props.onTitleClick(event, props.item);
}, [props.onTitleClick, props.item]);
const onCheckboxClick = useCallback((event) => {
const onCheckboxClick = useCallback((event: any) => {
props.onCheckboxClick(event, props.item);
}, [props.onCheckboxClick, props.item]);

View File

@@ -210,7 +210,7 @@ class NotePropertiesDialog extends React.Component<Props, State> {
}
public async saveProperty() {
if (!this.state.editedKey) return;
if (!this.state.editedKey) return null;
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
return new Promise((resolve: Function) => {

View File

@@ -1,5 +1,6 @@
const { default: Logger, TargetType } = require('@joplin/utils/Logger');
const initLib = require('@joplin/lib/initLib').default;
// TODO: Some libraries required by test-utils.js seem to fail to import with the
// jsdom environment.
@@ -11,9 +12,16 @@ const logger = new Logger();
logger.addTarget(TargetType.Console);
logger.setLevel(Logger.LEVEL_WARN);
Logger.initializeGlobalLogger(logger);
initLib(logger);
// @electron/remote requires electron to be running. Mock it.
jest.mock('@electron/remote', () => {
return { require };
return {
require: () => {
return {
default: {},
};
},
};
});

View File

@@ -29,6 +29,7 @@ const EncryptionService = require('@joplin/lib/services/e2ee/EncryptionService')
const { FileApiDriverLocal } = require('@joplin/lib/file-api-driver-local');
const React = require('react');
const nodeSqlite = require('sqlite3');
const initLib = require('@joplin/lib/initLib').default;
// Security: If we attempt to navigate away from the root HTML page, it's likely because
// of an improperly sanitized link. Prevent this by closing the window before we can
@@ -132,6 +133,10 @@ document.addEventListener('click', (event) => {
event.preventDefault();
});
const logger = new Logger();
Logger.initializeGlobalLogger(logger);
initLib(logger);
app().start(bridge().processArgv()).then((result) => {
if (!result || !result.action) {
require('./gui/Root');

View File

@@ -110,21 +110,21 @@
"@electron/rebuild": "3.2.13",
"@joplin/tools": "~2.12",
"@testing-library/react-hooks": "8.0.1",
"@types/jest": "29.5.1",
"@types/node": "18.15.13",
"@types/react": "16.14.41",
"@types/jest": "29.5.3",
"@types/node": "18.16.18",
"@types/react": "18.0.24",
"@types/react-redux": "7.1.25",
"@types/styled-components": "5.1.26",
"electron": "25.3.1",
"electron-builder": "24.4.0",
"glob": "10.2.7",
"glob": "10.3.3",
"gulp": "4.0.2",
"jest": "29.5.0",
"jest-environment-jsdom": "29.5.0",
"js-sha512": "0.8.0",
"nan": "2.17.0",
"react-test-renderer": "18.2.0",
"typescript": "5.0.2"
"typescript": "5.1.3"
},
"optionalDependencies": {
"7zip-bin-linux": "^1.0.1",
@@ -163,7 +163,7 @@
"react-datetime": "3.2.0",
"react-dom": "18.2.0",
"react-redux": "8.1.1",
"react-select": "5.7.3",
"react-select": "5.7.4",
"react-toggle-button": "2.2.0",
"react-tooltip": "4.5.1",
"redux": "4.2.1",

View File

@@ -5,8 +5,6 @@ import { VersionInfo } from '@joplin/lib/services/plugins/api/types';
import Setting from '@joplin/lib/models/Setting';
import { reg } from '@joplin/lib/registry';
import BasePlatformImplementation, { Joplin } from '@joplin/lib/services/plugins/BasePlatformImplementation';
import { Dispatch } from 'redux';
import { readFile } from 'fs-extra';
const { clipboard, nativeImage } = require('electron');
const packageInfo = require('../../packageInfo');
@@ -22,17 +20,12 @@ export default class PlatformImplementation extends BasePlatformImplementation {
private static instance_: PlatformImplementation;
private joplin_: Joplin;
private components_: Components;
private dispatch_: Dispatch|null = null;
public static instance(): PlatformImplementation {
if (!this.instance_) this.instance_ = new PlatformImplementation();
return this.instance_;
}
public initialize(dispatch: Dispatch) {
this.dispatch_ = dispatch;
}
public get versionInfo(): VersionInfo {
return {
version: packageInfo.version,
@@ -52,14 +45,6 @@ export default class PlatformImplementation extends BasePlatformImplementation {
public get window(): WindowImplementation {
return {
injectCustomStyles: injectCustomStyles,
loadNoteCssFile: async (filePath) => {
const cssString = await readFile(filePath, 'utf8');
this.dispatch_({
type: 'CUSTOM_CSS_APPEND',
css: cssString,
});
},
};
}

View File

@@ -73,7 +73,7 @@ export default async (params: Params) => {
teamId: process.env.APPLE_ASC_PROVIDER,
tool: 'notarytool',
});
} as any);
} catch (error) {
console.error(error);
process.exit(1);

View File

@@ -47,7 +47,7 @@ react {
// hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
//
// The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
hermesFlags = ["-O", "-output-source-map"]
// hermesFlags = ["-O", "-output-source-map"]
}
/**

View File

@@ -2,7 +2,7 @@ import { useEffect, useState, useMemo, useRef } from 'react';
import shim from '@joplin/lib/shim';
import Setting from '@joplin/lib/models/Setting';
const { themeStyle } = require('../../global-style.js');
import markupLanguageUtils from '../../../utils/markupLanguageUtils';
import markupLanguageUtils from '@joplin/lib/markupLanguageUtils';
import Logger from '@joplin/utils/Logger';
const { assetsToHeaders } = require('@joplin/renderer');

View File

@@ -572,29 +572,16 @@ class NoteScreenComponent extends BaseScreenComponent {
public async resizeImage(localFilePath: string, targetPath: string, mimeType: string) {
const maxSize = Resource.IMAGE_MAX_DIMENSION;
const dimensions: any = await this.imageDimensions(localFilePath);
reg.logger().info('Original dimensions ', dimensions);
let mustResize = dimensions.width > maxSize || dimensions.height > maxSize;
if (mustResize) {
const buttonId = await dialogs.pop(this, _('You are about to attach a large image (%dx%d pixels). Would you like to resize it down to %d pixels before attaching it?', dimensions.width, dimensions.height, maxSize), [
{ text: _('Yes'), id: 'yes' },
{ text: _('No'), id: 'no' },
{ text: _('Cancel'), id: 'cancel' },
]);
if (buttonId === 'cancel') return false;
mustResize = buttonId === 'yes';
}
if (mustResize) {
const saveOriginalImage = async () => {
await shim.fsDriver().copy(localFilePath, targetPath);
return true;
};
const saveResizedImage = async () => {
dimensions.width = maxSize;
dimensions.height = maxSize;
reg.logger().info('New dimensions ', dimensions);
const format = mimeType === 'image/png' ? 'PNG' : 'JPEG';
@@ -612,11 +599,27 @@ class NoteScreenComponent extends BaseScreenComponent {
} catch (error) {
reg.logger().warn('Error when unlinking cached file: ', error);
}
} else {
await shim.fsDriver().copy(localFilePath, targetPath);
return true;
};
const canResize = dimensions.width > maxSize || dimensions.height > maxSize;
if (canResize) {
const resizeLargeImages = Setting.value('imageResizing');
if (resizeLargeImages === 'alwaysAsk') {
const userAnswer = await dialogs.pop(this, `${_('You are about to attach a large image (%dx%d pixels). Would you like to resize it down to %d pixels before attaching it?', dimensions.width, dimensions.height, maxSize)}\n\n${_('(You may disable this prompt in the options)')}`, [
{ text: _('Yes'), id: 'yes' },
{ text: _('No'), id: 'no' },
{ text: _('Cancel'), id: 'cancel' },
]);
if (userAnswer === 'yes') return await saveResizedImage();
if (userAnswer === 'no') return await saveOriginalImage();
if (userAnswer === 'cancel') return false;
} else if (resizeLargeImages === 'alwaysResize') {
return await saveResizedImage();
}
}
return true;
return await saveOriginalImage();
}
public async attachFile(pickerResponse: any, fileType: string) {

View File

@@ -328,7 +328,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export NODE_BINARY=/usr/local/bin/node\nexport SOURCEMAP_FILE=\"$(pwd)/../main.jsbundle.map\";\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
shellScript = "export NODE_BINARY=/usr/local/bin/node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
};
027E2AA6B101F8CFCA582EC1 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;

View File

@@ -351,7 +351,7 @@ PODS:
- React-Core
- react-native-get-random-values (1.9.0):
- React-Core
- react-native-image-picker (5.4.2):
- react-native-image-picker (5.6.0):
- React-Core
- react-native-image-resizer (1.4.5):
- React-Core
@@ -361,7 +361,7 @@ PODS:
- React
- react-native-saf-x (2.12.0):
- React-Core
- react-native-safe-area-context (4.5.5):
- react-native-safe-area-context (4.6.4):
- RCT-Folly
- RCTRequired
- RCTTypeSafety
@@ -465,7 +465,7 @@ PODS:
- React-Core
- RNCPushNotificationIOS (1.11.0):
- React-Core
- RNDateTimePicker (7.1.0):
- RNDateTimePicker (7.2.0):
- React-Core
- RNDeviceInfo (10.6.1):
- React-Core
@@ -823,12 +823,12 @@ SPEC CHECKSUMS:
react-native-fingerprint-scanner: ac6656f18c8e45a7459302b84da41a44ad96dbbe
react-native-geolocation: 0f7fe8a4c2de477e278b0365cce27d089a8c5903
react-native-get-random-values: dee677497c6a740b71e5612e8dbd83e7539ed5bb
react-native-image-picker: 77f552291e993f3fdcdf48cc3c280ef7f11789c8
react-native-image-picker: db60857e03d63721f19b6f4027de20429ddd9cba
react-native-image-resizer: d9fb629a867335bdc13230ac2a58702bb8c8828f
react-native-netinfo: 3a48f51c18dbd9253440621955e11de71bc51b32
react-native-rsa-native: 12132eb627797529fdb1f0d22fd0f8f9678df64a
react-native-saf-x: 129cd2ddf120a1f6164c724b2846d172666b33de
react-native-safe-area-context: 33e71d7408dffe148b08968d97a524009634ccc8
react-native-safe-area-context: 68b07eabfb0d14547d36f6929c0e98d818064f02
react-native-slider: 33b8d190b59d4f67a541061bb91775d53d617d9d
react-native-sqlite-storage: f6d515e1c446d1e6d026aa5352908a25d4de3261
react-native-version-info: a106f23009ac0db4ee00de39574eb546682579b9
@@ -849,7 +849,7 @@ SPEC CHECKSUMS:
rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
RNCPushNotificationIOS: 64218f3c776c03d7408284a819b2abfda1834bc8
RNDateTimePicker: 7ecd54a97fc3749f38c3c89a171f6cbd52f3c142
RNDateTimePicker: 3942382593f104af226ad9c56e16166960c7ae30
RNDeviceInfo: ab292735ad4fccc5f2aec0c773f7a7f03c7073ae
RNExitApp: c4e052df2568b43bec8a37c7cd61194d4cfee2c3
RNFileViewer: ce7ca3ac370e18554d35d6355cffd7c30437c592

View File

@@ -13,17 +13,15 @@
const path = require('path');
const localPackages = {
'@joplin/fork-htmlparser2': path.resolve(__dirname, '../fork-htmlparser2/'),
'@joplin/fork-sax': path.resolve(__dirname, '../fork-sax/'),
'@joplin/fork-uslug': path.resolve(__dirname, '../fork-uslug/'),
'@joplin/lib': path.resolve(__dirname, '../lib/'),
'@joplin/react-native-alarm-notification': path.resolve(__dirname, '../react-native-alarm-notification/'),
'@joplin/react-native-saf-x': path.resolve(__dirname, '../react-native-saf-x/'),
'@joplin/renderer': path.resolve(__dirname, '../renderer/'),
'@joplin/tools': path.resolve(__dirname, '../tools/'),
'@joplin/turndown-plugin-gfm': path.resolve(__dirname, '../turndown-plugin-gfm/'),
'@joplin/turndown': path.resolve(__dirname, '../turndown/'),
'@joplin/utils': path.resolve(__dirname, '../utils/'),
'@joplin/fork-htmlparser2': path.resolve(__dirname, '../fork-htmlparser2/'),
'@joplin/fork-uslug': path.resolve(__dirname, '../fork-uslug/'),
'@joplin/react-native-saf-x': path.resolve(__dirname, '../react-native-saf-x/'),
'@joplin/react-native-alarm-notification': path.resolve(__dirname, '../react-native-alarm-notification/'),
'@joplin/fork-sax': path.resolve(__dirname, '../fork-sax/'),
};
const remappedPackages = {
@@ -34,12 +32,7 @@ const remappedPackages = {
// versions. For example, this allows us to `import {resolve} from 'path'` rather than
// `const { resolve } = require('path-browserify')` ('path-browerify' doesn't have its own type
// definitions).
const browserifiedPackages = [
'http',
'https',
'os',
'path',
];
const browserifiedPackages = ['path'];
for (const package of browserifiedPackages) {
remappedPackages[package] = path.resolve(__dirname, `./node_modules/${package}-browserify/`);
}
@@ -81,30 +74,6 @@ module.exports = {
},
}
),
// Documentation at https://facebook.github.io/metro/docs/configuration/
resolveRequest: (context, moduleName, platform) => {
// console.info('Module: ' + moduleName + ' / ' + context.originModulePath);
// This can be used to allow importing a module that requires `fs`
// somewhere. For example, the `css` package which is used to parse
// CSS strings has a `loadFile()` function that we don't need, but
// that makes it import the `fs` package.
//
// So by having this here, we can use those packages as long as we
// don't use the specific methods that require `fs`. It's something
// to keep in mind if we get weird-related fs errors - it may be
// because the package is trying to access the mocked `fs` package.
if (moduleName === 'fs') {
return {
filePath: path.resolve(__dirname, 'mock-fs.js'),
type: 'sourceFile',
};
}
// Default resolver
return context.resolveRequest(context, moduleName, platform);
},
},
projectRoot: path.resolve(__dirname),
watchFolders: watchedFolders,

View File

@@ -1,13 +0,0 @@
function traceMethodCalls(obj) {
const handler = {
get(_target, propKey, _receiver) {
if (propKey === '$$typeof') return 'object';
throw new Error(`Trying to access member of mocked fs package: \`fs.${propKey}\``);
},
};
return new Proxy(obj, handler);
}
const mockFs = {};
module.exports = traceMethodCalls(mockFs);

View File

@@ -24,7 +24,7 @@
"@joplin/renderer": "~2.12",
"@joplin/utils": "~2.12",
"@react-native-community/clipboard": "1.5.1",
"@react-native-community/datetimepicker": "7.1.0",
"@react-native-community/datetimepicker": "7.2.0",
"@react-native-community/geolocation": "3.0.6",
"@react-native-community/netinfo": "9.3.11",
"@react-native-community/push-notification-ios": "1.11.0",
@@ -35,12 +35,9 @@
"crypto-browserify": "3.12.0",
"deprecated-react-native-prop-types": "4.0.0",
"events": "3.3.0",
"http-browserify": "1.7.0",
"https-browserify": "1.0.0",
"jsc-android": "241213.1.0",
"lodash": "4.17.21",
"md5": "2.3.0",
"os-browserify": "0.3.0",
"path-browserify": "1.0.1",
"prop-types": "15.8.1",
"punycode": "2.3.0",
@@ -68,7 +65,7 @@
"react-native-quick-actions": "0.3.13",
"react-native-reanimated": "3.3.0",
"react-native-rsa-native": "2.0.5",
"react-native-safe-area-context": "4.6.0",
"react-native-safe-area-context": "4.6.4",
"react-native-securerandom": "1.0.1",
"react-native-share": "8.2.2",
"react-native-sqlite-storage": "6.0.1",
@@ -111,12 +108,12 @@
"@testing-library/react-native": "12.1.2",
"@tsconfig/react-native": "2.0.2",
"@types/fs-extra": "11.0.1",
"@types/jest": "29.5.1",
"@types/jest": "29.5.3",
"@types/react": "18.0.24",
"@types/react-native": "0.70.6",
"@types/react-redux": "7.1.25",
"@types/tar-stream": "2.2.2",
"babel-jest": "29.2.1",
"babel-jest": "29.5.0",
"babel-plugin-module-resolver": "4.1.0",
"execa": "4.1.0",
"fs-extra": "11.1.1",
@@ -130,10 +127,10 @@
"nodemon": "2.0.22",
"react-test-renderer": "18.2.0",
"sqlite3": "5.1.6",
"ts-jest": "29.1.0",
"ts-jest": "29.1.1",
"ts-loader": "9.4.4",
"ts-node": "10.9.1",
"typescript": "5.0.2",
"typescript": "5.1.3",
"uglify-js": "3.17.4",
"webpack": "5.74.0"
}

View File

@@ -1,7 +0,0 @@
const initPlugin = joplin => {
!function(t){var e={};function o(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,o),r.l=!0,r.exports}o.m=t,o.c=e,o.d=function(t,e,n){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)o.d(n,r,function(e){return t[e]}.bind(null,r));return n},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=0)}([function(t,e,o){"use strict";var n=this&&this.__awaiter||function(t,e,o,n){return new(o||(o=Promise))((function(r,i){function u(t){try{c(n.next(t))}catch(t){i(t)}}function l(t){try{c(n.throw(t))}catch(t){i(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof o?e:new o((function(t){t(e)}))).then(u,l)}c((n=n.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0});const r=o(1),i=o(2);r.default.plugins.register({onStart:function(){return n(this,void 0,void 0,(function*(){yield r.default.contentScripts.register(i.ContentScriptType.MarkdownItPlugin,"todoTxtMd","./todoTxtMdRule.js"),yield r.default.contentScripts.register(i.ContentScriptType.CodeMirrorPlugin,"todoTxtMdCtrl","./todoTxtMdCtrl.js"),yield r.default.contentScripts.onMessage("todoTxtMd",t=>{r.default.commands.execute("editor.execCommand",{name:"todoTxtAction",args:[t]}),r.default.commands.execute("editor.focus")})}))}})},function(t,e,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=joplin},function(t,e,o){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.ContentScriptType=e.SettingStorage=e.AppType=e.SettingItemType=e.ToolbarButtonLocation=e.isContextMenuItemLocation=e.MenuItemLocation=e.ImportModuleOutputFormat=e.FileSystemItem=void 0,function(t){t.File="file",t.Directory="directory"}(e.FileSystemItem||(e.FileSystemItem={})),function(t){t.Markdown="md",t.Html="html"}(e.ImportModuleOutputFormat||(e.ImportModuleOutputFormat={})),function(t){t.File="file",t.Edit="edit",t.View="view",t.Note="note",t.Tools="tools",t.Help="help",t.Context="context",t.NoteListContextMenu="noteListContextMenu",t.EditorContextMenu="editorContextMenu",t.FolderContextMenu="folderContextMenu",t.TagContextMenu="tagContextMenu"}(n=e.MenuItemLocation||(e.MenuItemLocation={})),e.isContextMenuItemLocation=function(t){return[n.Context,n.NoteListContextMenu,n.EditorContextMenu,n.FolderContextMenu,n.TagContextMenu].includes(t)},function(t){t.NoteToolbar="noteToolbar",t.EditorToolbar="editorToolbar"}(e.ToolbarButtonLocation||(e.ToolbarButtonLocation={})),function(t){t[t.Int=1]="Int",t[t.String=2]="String",t[t.Bool=3]="Bool",t[t.Array=4]="Array",t[t.Object=5]="Object",t[t.Button=6]="Button"}(e.SettingItemType||(e.SettingItemType={})),function(t){t.Desktop="desktop",t.Mobile="mobile",t.Cli="cli"}(e.AppType||(e.AppType={})),function(t){t[t.Database=1]="Database",t[t.File=2]="File"}(e.SettingStorage||(e.SettingStorage={})),function(t){t.MarkdownItPlugin="markdownItPlugin",t.CodeMirrorPlugin="codeMirrorPlugin"}(e.ContentScriptType||(e.ContentScriptType={}))}]);
}
module.exports = { initPlugin };

View File

@@ -1,12 +0,0 @@
{
"manifest_version": 1,
"id": "com.hieuthi.joplin.metis",
"app_min_version": "2.2",
"version": "0.1.5",
"name": "Metis",
"description": "A Simple Task Manager Plugin for Joplin based on Todo.txt Specification",
"author": "Hieu-Thi Luong",
"homepage_url": "https://github.com/hieuthi/joplin-plugin-metis",
"repository_url": "https://github.com/hieuthi/joplin-plugin-metis",
"keywords": ["joplin-plugin","todo","todotxt","task management"]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,163 +0,0 @@
ul.todotxt {
--color-default: #999;
--color-faded: #999;
--color-A: rgb(247, 210, 110); /* yellow* */
--color-B: rgb(152, 104, 1); /* red */
--color-C: rgb(80, 161, 79); /* green */
--color-D: rgb(21, 91, 218); /* blue */
--project-background-color: rgb(247, 210, 110);
--project-color: black;
--context-color: rgb(152, 104, 1);
--transition-duration: 0.15s;
}
ul.todotxt { list-style:none; }
ul.todotxt li {
list-style-type:none;
border-bottom: dashed 1px;
margin-bottom: 4px;
line-height: 1.2em;
}
ul.todotxt li.todotxt-header {
font-size: 10px;
}
.todo-priority {
display: inline-block;
width: 1.2em;
overflow: hidden;
color: var(--color-default);
vertical-align: text-bottom;
}
.todo-priority select {
appearance: none;
background-color: transparent;
border-color: transparent;
color: inherit;
font-size: inherit;
font-weight: 700;
cursor: pointer;
}
.todo-priority select:focus-visible {
outline: none;
}
.todo-priority select:hover {
text-decoration: underline;
}
.todo-panel {
display: block;
font-size: 12px;
line-height: 1em;
text-align: right;
margin: 2px 0 4px 0;
color: var(--color-faded);
}
.todo-completion, .todo-creation {
display: inline-block;
min-width: 6em;
}
.todo-project {
background-color: var(--project-background-color);
color: var(--project-color);
border-radius: 2px;
}
.todo-context {
color: var(--context-color);
}
.todo-count {
color: var(--color-faded);
}
.todo-count::before{
content: '/';
}
.todo-meta {
color: var(--color-faded);
}
.todo-select {
display: inline-block;
min-width: 3em;
text-decoration: none;
}
.todo-checkbox {
margin-left: -1.9em;
margin-right: 0.5em;
display: inline-block;
vertical-align: text-top;
position: relative;
cursor: pointer;
user-select: none;
}
.todo-checkbox input {
position: absolute;
display: none;
}
.todo-checkbox .todo-checkmark {
width : 1.2em;
height: 1.2em;
position: relative;
display : inline-block;
overflow: hidden;
text-align: center;
color: white;
border: solid 1px var(--color-default);
border-radius: 100%;
transition: background-color var(--transition-duration) ease-in;
}
.todo-checkbox input:checked ~ .todo-checkmark {
background-color: var(--color-default);
}
.todo-checkbox .todo-checkmark:after {
content: '×';
position: relative;
display: inline-block;
transition: opacity var(--transition-duration);
opacity: 0;
}
.todo-checkbox input:checked ~ .todo-checkmark:after {
opacity: 1.0;
}
/* Color scheme */
.prior-A .todo-priority {
color: var(--color-A);
}
.prior-A .todo-checkbox .todo-checkmark {
border-color: var(--color-A);
color: black;
}
.prior-A .todo-checkbox input:checked ~ .todo-checkmark {
background-color: var(--color-A);
}
.prior-B .todo-priority {
color: var(--color-B);
}
.prior-B .todo-checkbox .todo-checkmark {
border-color: var(--color-B);
}
.prior-B .todo-checkbox input:checked ~ .todo-checkmark {
background-color: var(--color-B);
}
.prior-C .todo-priority {
color: var(--color-C);
}
.prior-C .todo-checkbox .todo-checkmark {
border-color: var(--color-C);
}
.prior-C .todo-checkbox input:checked ~ .todo-checkmark {
background-color: var(--color-C);
}
.prior-D .todo-priority {
color: var(--color-D);
}
.prior-D .todo-checkbox .todo-checkmark {
border-color: var(--color-D);
}
.prior-D .todo-checkbox input:checked ~ .todo-checkmark {
background-color: var(--color-D);
}

View File

@@ -1,38 +0,0 @@
document.addEventListener('joplin-noteDidUpdate', makeTodoViewActionable );
if (/WebKit/i.test(navigator.userAgent)) { // sniff
var _timer_todotxt = setInterval(function() {
if (/loaded|complete/.test(document.readyState)) {
makeTodoViewActionable()
}
}, 10);
}
function makeTodoViewActionable() {
if (_timer_todotxt) clearInterval(_timer_todotxt);
const todoTxts = document.getElementsByClassName('todotxt');
for (var i=0; i<todoTxts.length; i++){
const todoTxt = todoTxts[i];
const todos = todoTxt.getElementsByClassName('todo');
for (var j=0; j<todos.length; j++){
const todo = todos[j];
const lineIdx = todo.getAttribute("data-lineIdx");
const checkbox = todo.getElementsByClassName('todo-checkbox')[0].getElementsByTagName('input')[0];
const priority = todo.getElementsByClassName('todo-priority')[0].getElementsByTagName('select')[0];
const selectButton = todo.getElementsByClassName('todo-select')[0];
checkbox.onclick = function (){
setTimeout(()=> {webviewApi.postMessage('todoTxtMd', `toggleStatus:${lineIdx}`)}, 170);
}
priority.onchange = function(option) {
var value = option.target.value;
webviewApi.postMessage('todoTxtMd', `changePriority:${lineIdx}:${value}`);
}
selectButton.onclick = function () {
webviewApi.postMessage('todoTxtMd', `selectLine:${lineIdx}`);
}
}
}
}

View File

@@ -1,17 +0,0 @@
const initPlugin = joplin => {
joplin.plugins.register({
onStart: async function() {
await joplin.contentScripts.register(
'markdownItPlugin',
'abc_music_sheet',
'./markdownItPlugin.js'
);
},
});
//!function(t){var e={};function n(o){if(e[o])return e[o].exports;var r=e[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)n.d(o,r,function(e){return t[e]}.bind(null,r));return o},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";var o=this&&this.__awaiter||function(t,e,n,o){return new(n||(n=Promise))((function(r,i){function u(t){try{c(o.next(t))}catch(t){i(t)}}function l(t){try{c(o.throw(t))}catch(t){i(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(u,l)}c((o=o.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0});const r=n(1),i=n(2);r.default.plugins.register({onStart:function(){return o(this,void 0,void 0,(function*(){yield r.default.contentScripts.register(i.ContentScriptType.MarkdownItPlugin,"abc_music_sheet","./markdownItPlugin.js"),setInterval(()=>{console.log("AAAAAAAAAAAAAAA")},1e3)}))}})},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=joplin},function(t,e,n){"use strict";var o;Object.defineProperty(e,"__esModule",{value:!0}),e.ContentScriptType=e.SettingStorage=e.AppType=e.SettingItemType=e.ToolbarButtonLocation=e.isContextMenuItemLocation=e.MenuItemLocation=e.ImportModuleOutputFormat=e.FileSystemItem=void 0,function(t){t.File="file",t.Directory="directory"}(e.FileSystemItem||(e.FileSystemItem={})),function(t){t.Markdown="md",t.Html="html"}(e.ImportModuleOutputFormat||(e.ImportModuleOutputFormat={})),function(t){t.File="file",t.Edit="edit",t.View="view",t.Note="note",t.Tools="tools",t.Help="help",t.Context="context",t.NoteListContextMenu="noteListContextMenu",t.EditorContextMenu="editorContextMenu",t.FolderContextMenu="folderContextMenu",t.TagContextMenu="tagContextMenu"}(o=e.MenuItemLocation||(e.MenuItemLocation={})),e.isContextMenuItemLocation=function(t){return[o.Context,o.NoteListContextMenu,o.EditorContextMenu,o.FolderContextMenu,o.TagContextMenu].includes(t)},function(t){t.NoteToolbar="noteToolbar",t.EditorToolbar="editorToolbar"}(e.ToolbarButtonLocation||(e.ToolbarButtonLocation={})),function(t){t[t.Int=1]="Int",t[t.String=2]="String",t[t.Bool=3]="Bool",t[t.Array=4]="Array",t[t.Object=5]="Object",t[t.Button=6]="Button"}(e.SettingItemType||(e.SettingItemType={})),function(t){t.Desktop="desktop",t.Mobile="mobile",t.Cli="cli"}(e.AppType||(e.AppType={})),function(t){t[t.Database=1]="Database",t[t.File=2]="File"}(e.SettingStorage||(e.SettingStorage={})),function(t){t.MarkdownItPlugin="markdownItPlugin",t.CodeMirrorPlugin="codeMirrorPlugin"}(e.ContentScriptType||(e.ContentScriptType={}))}]);
}
module.exports = { initPlugin };

View File

@@ -1,16 +0,0 @@
{
"manifest_version": 1,
"id": "org.joplinapp.plugins.AbcSheetMusic",
"app_min_version": "2.2",
"version": "1.0.2",
"name": "ABC Sheet Music Plugin",
"description": "Turns ABC text notation into sheet music",
"author": "Laurent Cozic",
"homepage_url": "https://github.com/joplin/plugin-abc-sheet-music",
"repository_url": "https://github.com/joplin/plugin-abc-sheet-music",
"keywords": [
"sheet music",
"abc",
"notation"
]
}

View File

@@ -1,14 +0,0 @@
const initPlugin = joplin => {
joplin.plugins.register({
onStart: async function() {
// eslint-disable-next-line no-console
console.info('RUNNING AS PLUGIN 1: ', await joplin.plugins.id()); // await joplin.plugins.id());
// const folder = await joplin.data.post(['folders'], null, { title: "my plugin folder" });
// await joplin.data.post(['notes'], null, { parent_id: folder.id, title: "testing plugin!" });
},
});
}
module.exports = { initPlugin };

View File

@@ -1,12 +0,0 @@
{
"id": "org.joplinapp.plugins.Simple",
"manifest_version": 1,
"app_min_version": "1.4",
"name": "Joplin Simple Plugin",
"version": "1.0.0",
"description": "To test loading and running a plugin",
"homepage_url": "https://joplinapp.org",
"permissions": [
"model"
]
}

View File

@@ -1,14 +0,0 @@
const initPlugin = joplin => {
joplin.plugins.register({
onStart: async function() {
// eslint-disable-next-line no-console
console.info('RUNNING AS PLUGIN 2: ', await joplin.plugins.id());
// const folder = await joplin.data.post(['folders'], null, { title: "my plugin folder" });
// await joplin.data.post(['notes'], null, { parent_id: folder.id, title: "testing plugin!" });
},
});
}
module.exports = { initPlugin };

View File

@@ -1,12 +0,0 @@
{
"id": "org.joplinapp.plugins.Simple2",
"manifest_version": 1,
"app_min_version": "1.4",
"name": "Joplin Simple Plugin",
"version": "1.0.0",
"description": "To test loading and running a plugin",
"homepage_url": "https://joplinapp.org",
"permissions": [
"model"
]
}

View File

@@ -85,7 +85,7 @@ const SyncTargetWebDAV = require('@joplin/lib/SyncTargetWebDAV.js');
const SyncTargetDropbox = require('@joplin/lib/SyncTargetDropbox.js');
const SyncTargetAmazonS3 = require('@joplin/lib/SyncTargetAmazonS3.js');
import BiometricPopup from './components/biometrics/BiometricPopup';
import PluginService from '@joplin/lib/services/plugins/PluginService';
import initLib from '@joplin/lib/initLib';
SyncTargetRegistry.addClass(SyncTargetNone);
SyncTargetRegistry.addClass(SyncTargetOneDrive);
@@ -121,7 +121,6 @@ import { ReactNode } from 'react';
import userFetcher, { initializeUserFetcher } from '@joplin/lib/utils/userFetcher';
import { parseShareCache } from '@joplin/lib/services/share/reducer';
import autodetectTheme, { onSystemColorSchemeChange } from './utils/autodetectTheme';
import PluginRunner from './services/plugins/PluginRunner';
type SideMenuPosition = 'left' | 'right';
@@ -440,97 +439,6 @@ const initializeTempDir = async () => {
return tempDir;
};
const simplePlugin1 = require('./plugins/org.joplinapp.plugins.Simple/index.js');
const simplePluginManifest1 = `{
"id": "org.joplinapp.plugins.Simple",
"manifest_version": 1,
"app_min_version": "1.4",
"name": "Joplin Simple Plugin",
"version": "1.0.0",
"description": "To test loading and running a plugin",
"homepage_url": "https://joplinapp.org",
"permissions": [
"model"
]
}`;
const simplePlugin2 = require('./plugins/org.joplinapp.plugins.Simple2/index.js');
const simplePluginManifest2 = `{
"id": "org.joplinapp.plugins.Simple2",
"manifest_version": 1,
"app_min_version": "1.4",
"name": "Joplin Simple Plugin",
"version": "1.0.0",
"description": "To test loading and running a plugin",
"homepage_url": "https://joplinapp.org",
"permissions": [
"model"
]
}`;
// const abcPlugin = require('./plugins/org.joplinapp.plugins.AbcSheetMusic/index.js');
// const abcPluginManifest = `{
// "manifest_version": 1,
// "id": "org.joplinapp.plugins.AbcSheetMusic",
// "app_min_version": "2.2",
// "version": "1.0.2",
// "name": "ABC Sheet Music Plugin",
// "description": "Turns ABC text notation into sheet music",
// "author": "Laurent Cozic",
// "homepage_url": "https://github.com/joplin/plugin-abc-sheet-music",
// "repository_url": "https://github.com/joplin/plugin-abc-sheet-music",
// "keywords": [
// "sheet music",
// "abc",
// "notation"
// ]
// }`;
// const abcPluginContentScript = require('./plugins/org.joplinapp.plugins.AbcSheetMusic/markdownItPlugin.js');
const metisPlugin = require('./plugins/com.hieuthi.joplin.metis/index.js');
const metisManifest = `{
"manifest_version": 1,
"id": "com.hieuthi.joplin.metis",
"app_min_version": "2.2",
"version": "0.1.5",
"name": "Metis",
"description": "A Simple Task Manager Plugin for Joplin based on Todo.txt Specification",
"author": "Hieu-Thi Luong",
"homepage_url": "https://github.com/hieuthi/joplin-plugin-metis",
"repository_url": "https://github.com/hieuthi/joplin-plugin-metis",
"keywords": ["joplin-plugin","todo","todotxt","task management"]
}`;
const metisContentScript = require('./plugins/com.hieuthi.joplin.metis/todoTxtMdRule.js');
const initPluginService = async () => {
const service = PluginService.instance();
const runner = new PluginRunner();
service.initialize(
'2.12.1',
{
joplin: {},
},
runner,
{
dispatch: () => {},
getState: () => {},
}
);
const plugin1 = await PluginService.instance().loadPluginFromModule({ main: simplePlugin1 }, simplePluginManifest1);
await PluginService.instance().runPlugin(plugin1);
const plugin2 = await PluginService.instance().loadPluginFromModule({ main: simplePlugin2 }, simplePluginManifest2);
await PluginService.instance().runPlugin(plugin2);
// const plugin3 = await PluginService.instance().loadPluginFromModule({ main: abcPlugin, contentScripts: { ['markdownItPlugin.js']: abcPluginContentScript } }, abcPluginManifest);
// await PluginService.instance().runPlugin(plugin3);
const plugin4 = await PluginService.instance().loadPluginFromModule({ main: metisPlugin, contentScripts: { ['todoTxtMdView.js']: metisContentScript } }, metisManifest);
await PluginService.instance().runPlugin(plugin4);
};
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
async function initialize(dispatch: Function) {
shimInit();
@@ -567,6 +475,7 @@ async function initialize(dispatch: Function) {
}
Logger.initializeGlobalLogger(mainLogger);
initLib(mainLogger);
reg.setLogger(mainLogger);
reg.setShowErrorMessageBoxHandler((message: string) => { alert(message); });
@@ -798,8 +707,6 @@ async function initialize(dispatch: Function) {
// and it cannot collect anything when the app is not active.
RevisionService.instance().runInBackground(1000 * 30);
await initPluginService();
// ----------------------------------------------------------------------------
// Keep this below to test react-native-rsa-native
// ----------------------------------------------------------------------------

View File

@@ -1,15 +0,0 @@
import Global from '@joplin/lib/services/plugins/api/Global';
import BasePluginRunner from '@joplin/lib/services/plugins/BasePluginRunner';
import Plugin from '@joplin/lib/services/plugins/Plugin';
import Logger from '@joplin/utils/Logger';
const logger = Logger.create('PluginRunner');
export default class PluginRunner extends BasePluginRunner {
public async run(plugin: Plugin, sandbox: Global): Promise<void> {
logger.info(`Run plugin: ${plugin.id}`);
plugin.module.main.initPlugin(sandbox.joplin);
}
}

View File

@@ -256,8 +256,12 @@ export default class FsDriverRN extends FsDriverBase {
return output ? output : null;
}
public resolve(...pathSegments: string[]) {
return resolve(...pathSegments);
public resolve(path: string) {
throw new Error(`Not implemented: resolve(): ${path}`);
}
public resolveRelativePathWithinDir(_baseDir: string, relativePath: string) {
throw new Error(`Not implemented: resolveRelativePathWithinDir(): ${relativePath}`);
}
public async md5File(path: string): Promise<string> {

View File

@@ -1,21 +0,0 @@
import { MarkupLanguageUtils as BaseMarkupLanguageUtils } from '@joplin/lib/markupLanguageUtils';
import { PluginStates } from '@joplin/lib/services/plugins/reducer';
import { contentScriptsToRendererRules } from '@joplin/lib/services/plugins/utils/loadContentScripts';
import { Options } from '@joplin/renderer/MarkupToHtml';
class MarkupLanguageUtils extends BaseMarkupLanguageUtils {
public newMarkupToHtml(plugins: PluginStates = null, options: Options = null) {
plugins = plugins || {};
return super.newMarkupToHtml(null, {
extraRendererRules: contentScriptsToRendererRules(plugins),
...options,
});
}
}
const markupLanguageUtils = new MarkupLanguageUtils();
export default markupLanguageUtils;

View File

@@ -45,16 +45,16 @@
"entities": "2.2.0"
},
"devDependencies": {
"@types/jest": "29.5.1",
"@types/node": "18.15.13",
"@typescript-eslint/eslint-plugin": "5.59.0",
"@typescript-eslint/parser": "5.59.0",
"@types/jest": "29.5.3",
"@types/node": "18.16.18",
"@typescript-eslint/eslint-plugin": "5.60.0",
"@typescript-eslint/parser": "5.60.0",
"coveralls": "3.1.1",
"eslint": "8.39.0",
"eslint": "8.43.0",
"jest": "29.5.0",
"prettier": "2.8.8",
"ts-jest": "29.1.0",
"typescript": "5.0.2"
"ts-jest": "29.1.1",
"typescript": "5.1.3"
},
"jest": {
"preset": "ts-jest",

View File

@@ -1,11 +1,11 @@
{
"name": "generate-plugin-doc",
"packageManager": "yarn@3.3.1",
"packageManager": "yarn@3.6.0",
"scripts": {
"buildPluginDoc_": "typedoc --name 'Joplin Plugin API Documentation' --mode file -theme '../../Assets/PluginDocTheme/' --readme '../../Assets/PluginDocTheme/index.md' --excludeNotExported --excludeExternals --excludePrivate --excludeProtected --out ../../../joplin-website/docs/api/references/plugin_api ../lib/services/plugins/api/"
},
"dependencies": {
"typedoc": "0.17.8",
"typescript": "4.7.4"
"typescript": "5.0.4"
}
}

View File

@@ -59,7 +59,6 @@ import Resource from './models/Resource';
import { ProfileConfig } from './services/profileConfig/types';
import initProfile from './services/profileConfig/initProfile';
import { parseShareCache } from './services/share/reducer';
import RotatingLogs from './RotatingLogs';
const appLogger: LoggerWrapper = Logger.create('App');
@@ -69,6 +68,7 @@ const appLogger: LoggerWrapper = Logger.create('App');
interface StartOptions {
keychainEnabled?: boolean;
setupGlobalLogger?: boolean;
}
export default class BaseApplication {
@@ -738,6 +738,7 @@ export default class BaseApplication {
public async start(argv: string[], options: StartOptions = null): Promise<any> {
options = {
keychainEnabled: true,
setupGlobalLogger: true,
...options,
};
@@ -800,18 +801,15 @@ export default class BaseApplication {
const extraFlags = await this.readFlagsFromFile(`${profileDir}/flags.txt`);
initArgs = { ...initArgs, ...extraFlags };
const globalLogger = Logger.globalLogger;
const globalLogger = new Logger();
globalLogger.addTarget(TargetType.File, { path: `${profileDir}/log.txt` });
if (Setting.value('appType') === 'desktop') {
globalLogger.addTarget(TargetType.Console);
if (options.setupGlobalLogger) {
globalLogger.addTarget(TargetType.File, { path: `${profileDir}/log.txt` });
if (Setting.value('appType') === 'desktop') {
globalLogger.addTarget(TargetType.Console);
}
globalLogger.setLevel(initArgs.logLevel);
}
globalLogger.setLevel(initArgs.logLevel);
Logger.initializeGlobalLogger(globalLogger);
reg.setLogger(Logger.create('') as Logger);
// reg.dispatch = () => {};

View File

@@ -114,7 +114,7 @@ export default class ClipperServer {
} catch (error) {
this.setStartState(StartState.Idle);
this.logger().error(error);
return;
return null;
}
this.server_ = require('http').createServer();

View File

@@ -272,7 +272,7 @@ export default class Synchronizer {
}
public async cancel() {
if (this.cancelling_ || this.state() === 'idle') return;
if (this.cancelling_ || this.state() === 'idle') return null;
// Stop queue but don't set it to null as it may be used to
// retrieve the last few downloads.

View File

@@ -158,20 +158,6 @@ export default class FsDriverBase {
};
}
public resolve(..._pathSegments: string[]): string {
throw new Error('Not implemented');
}
// Resolves the provided relative path to an absolute path within baseDir. The function
// also checks that the absolute path is within baseDir, to avoid security issues.
// It is expected that baseDir is a safe path (not user-provided).
public resolveRelativePathWithinDir(baseDir: string, relativePath: string) {
const resolvedBaseDir = this.resolve(baseDir);
const resolvedPath = this.resolve(baseDir, relativePath);
if (resolvedPath.indexOf(resolvedBaseDir) !== 0) throw new Error(`Resolved path for relative path "${relativePath}" is not within base directory "${baseDir}" (Was resolved to ${resolvedPath})`);
return resolvedPath;
}
public async tarExtract(_options: any) {
throw new Error('Not implemented');
}

View File

@@ -186,8 +186,18 @@ export default class FsDriverNode extends FsDriverBase {
throw new Error(`Unsupported encoding: ${encoding}`);
}
public resolve(...pathSegments: string[]) {
return nodeResolve(...pathSegments);
public resolve(path: string) {
return require('path').resolve(path);
}
// Resolves the provided relative path to an absolute path within baseDir. The function
// also checks that the absolute path is within baseDir, to avoid security issues.
// It is expected that baseDir is a safe path (not user-provided).
public resolveRelativePathWithinDir(baseDir: string, relativePath: string) {
const resolvedBaseDir = nodeResolve(baseDir);
const resolvedPath = nodeResolve(baseDir, relativePath);
if (resolvedPath.indexOf(resolvedBaseDir) !== 0) throw new Error(`Resolved path for relative path "${relativePath}" is not within base directory "${baseDir}" (Was resolved to ${resolvedPath})`);
return resolvedPath;
}
public async md5File(path: string): Promise<string> {

9
packages/lib/initLib.ts Normal file
View File

@@ -0,0 +1,9 @@
import Logger from '@joplin/utils/Logger';
// @joplin/lib has its own copy of the Logger class, however we want it to be
// initialised with the same logger instance as the calling application, so that
// the lib and app share the same log. This initLib() function is used for this
// and must be called by any "app" package that makes use of the lib package.
export default (globalLogger: Logger) => {
Logger.initializeGlobalLogger(globalLogger);
};

View File

@@ -1121,7 +1121,25 @@ class Setting extends BaseModel {
storage: SettingStorage.File,
isGlobal: true,
},
imageResizing: {
value: 'alwaysAsk',
type: SettingItemType.String,
section: 'note',
isEnum: true,
public: true,
appTypes: [AppType.Mobile, AppType.Desktop],
label: () => _('Resize large images:'),
description: () => _('Shrink large images before adding them to notes to save storage space.'),
options: () => {
return {
alwaysAsk: _('Always ask'),
alwaysResize: _('Always resize'),
neverResize: _('Never resize'),
};
},
storage: SettingStorage.File,
isGlobal: true,
},
'plugins.states': {
value: '',
type: SettingItemType.Object,

View File

@@ -17,16 +17,16 @@
},
"devDependencies": {
"@types/fs-extra": "11.0.1",
"@types/jest": "29.5.1",
"@types/jest": "29.5.3",
"@types/js-yaml": "4.0.5",
"@types/node": "18.15.13",
"@types/node": "18.16.18",
"@types/node-rsa": "1.1.1",
"@types/react": "17.0.59",
"@types/uuid": "^9.0.0",
"@types/react": "18.0.24",
"@types/uuid": "9.0.2",
"clean-html": "1.5.0",
"jest": "29.5.0",
"sharp": "0.32.1",
"typescript": "5.0.2"
"sharp": "0.32.3",
"typescript": "5.1.3"
},
"dependencies": {
"@aws-sdk/client-s3": "3.296.0",

View File

@@ -4,7 +4,6 @@ import shim from '../../shim';
import { ViewHandle } from './utils/createViewHandle';
import { ContentScriptType } from './api/types';
import Logger from '@joplin/utils/Logger';
import Joplin from './api/Joplin';
const EventEmitter = require('events');
const logger = Logger.create('Plugin');
@@ -16,20 +15,12 @@ interface ViewControllers {
export interface ContentScript {
id: string;
path: string;
module?: any;
}
interface ContentScripts {
[type: string]: ContentScript[];
}
export interface Module {
main: {
initPlugin: (joplin: Joplin)=> void;
};
contentScripts?: Record<string, any>;
}
export default class Plugin {
private baseDir_: string;
@@ -47,16 +38,14 @@ export default class Plugin {
private contentScriptMessageListeners_: Record<string, Function> = {};
private dataDir_: string;
private dataDirCreated_ = false;
private module_: Module|null = null;
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
public constructor(baseDir: string, manifest: PluginManifest, scriptText: string, dispatch: Function, dataDir: string, module: Module|null = null) {
this.baseDir_ = baseDir ? shim.fsDriver().resolve(baseDir) : '';
public constructor(baseDir: string, manifest: PluginManifest, scriptText: string, dispatch: Function, dataDir: string) {
this.baseDir_ = shim.fsDriver().resolve(baseDir);
this.manifest_ = manifest;
this.scriptText_ = scriptText;
this.dispatch_ = dispatch;
this.dataDir_ = dataDir;
this.module_ = module;
this.eventEmitter_ = new EventEmitter();
}
@@ -84,10 +73,6 @@ export default class Plugin {
return this.baseDir_;
}
public get module(): Module|null {
return this.module_;
}
public async dataDir(): Promise<string> {
if (this.dataDirCreated_) return this.dataDir_;
@@ -120,25 +105,13 @@ export default class Plugin {
public async registerContentScript(type: ContentScriptType, id: string, path: string) {
if (!this.contentScripts_[type]) this.contentScripts_[type] = [];
let absolutePath = '';
let scriptModule: any = null;
const absolutePath = shim.fsDriver().resolveRelativePathWithinDir(this.baseDir, path);
if (this.module) {
const normalizePath = (p: string) => {
if (p.startsWith('./')) return p.substring(2);
return p;
};
if (!(await shim.fsDriver().exists(absolutePath))) throw new Error(`Could not find content script at path ${absolutePath}`);
const moduleKey = normalizePath(path);
scriptModule = this.module.contentScripts[moduleKey];
logger.debug(`"${this.id}": Registered content script: ${type}: ${id}: ${moduleKey}`);
} else {
absolutePath = shim.fsDriver().resolveRelativePathWithinDir(this.baseDir, path);
if (!(await shim.fsDriver().exists(absolutePath))) throw new Error(`Could not find content script at path ${absolutePath}`);
logger.debug(`"${this.id}": Registered content script: ${type}: ${id}: ${absolutePath}`);
}
this.contentScripts_[type].push({ id, path: absolutePath });
this.contentScripts_[type].push({ id, path: absolutePath, module: scriptModule });
logger.debug(`"${this.id}": Registered content script: ${type}: ${id}: ${absolutePath}`);
this.dispatch_({
type: 'PLUGIN_CONTENT_SCRIPTS_ADD',
@@ -147,7 +120,6 @@ export default class Plugin {
type: type,
id: id,
path: absolutePath,
module: scriptModule,
},
});
}

View File

@@ -1,4 +1,4 @@
import Plugin, { Module } from './Plugin';
import Plugin from './Plugin';
import manifestFromObject from './utils/manifestFromObject';
import Global from './api/Global';
import BasePluginRunner from './BasePluginRunner';
@@ -28,10 +28,6 @@ export interface Plugins {
[key: string]: Plugin;
}
export interface PluginModule {
}
export interface SettingAndValue {
[settingName: string]: string;
}
@@ -287,17 +283,7 @@ export default class PluginService extends BaseService {
}
}
public async loadPluginFromModule(module: Module, manifestText: string): Promise<Plugin> {
return this.loadPlugin(
'',
manifestText,
'',
'',
module
);
}
private async loadPlugin(baseDir: string, manifestText: string, scriptText: string, pluginIdIfNotSpecified: string, module: Module|null = null): Promise<Plugin> {
private async loadPlugin(baseDir: string, manifestText: string, scriptText: string, pluginIdIfNotSpecified: string): Promise<Plugin> {
baseDir = rtrimSlashes(baseDir);
const manifestObj = JSON.parse(manifestText);
@@ -332,7 +318,7 @@ export default class PluginService extends BaseService {
const dataDir = `${Setting.value('pluginDataDir')}/${manifest.id}`;
const plugin = new Plugin(baseDir, manifest, scriptText, (action: any) => this.store_.dispatch(action), dataDir, module);
const plugin = new Plugin(baseDir, manifest, scriptText, (action: any) => this.store_.dispatch(action), dataDir);
for (const notice of deprecationNotices) {
plugin.deprecationNotice(notice.goneInVersion, notice.message, notice.isError);

View File

@@ -71,10 +71,6 @@ export default class JoplinPlugins {
return this.plugin.dataDir();
}
public async id(): Promise<string> {
return this.plugin.id;
}
/**
* Gets the plugin installation directory. This can be used to access any
* asset that was packaged with the plugin. This directory should be

View File

@@ -1,20 +1,22 @@
/* eslint-disable multiline-comment-style */
import Plugin from '../Plugin';
import * as fs from 'fs-extra';
export interface Implementation {
injectCustomStyles(elementId: string, cssFilePath: string): Promise<void>;
loadNoteCssFile(filePath: string): Promise<void>;
}
export default class JoplinWindow {
private plugin_: Plugin;
private store_: any;
private implementation_: Implementation;
public constructor(implementation: Implementation, plugin: Plugin, _store: any) {
public constructor(implementation: Implementation, plugin: Plugin, store: any) {
this.implementation_ = implementation;
this.plugin_ = plugin;
this.store_ = store;
}
/**
@@ -34,7 +36,12 @@ export default class JoplinWindow {
* for an example.
*/
public async loadNoteCssFile(filePath: string) {
await this.implementation_.loadNoteCssFile(filePath);
const cssString = await fs.readFile(filePath, 'utf8');
this.store_.dispatch({
type: 'CUSTOM_CSS_APPEND',
css: cssString,
});
}
}

View File

@@ -17,7 +17,6 @@ interface PluginViewStates {
interface PluginContentScriptState {
id: string;
path: string;
module?: any;
}
interface PluginContentScriptStates {
@@ -171,7 +170,6 @@ const reducer = (draftRoot: Draft<any>, action: any) => {
draft.plugins[action.pluginId].contentScripts[type].push({
id: action.contentScript.id,
path: action.contentScript.path,
module: action.contentScript.module,
});
break;
}

View File

@@ -27,7 +27,6 @@ const { fileExtension, safeFileExtension, safeFilename, filename } = require('..
const { fileUriToPath } = require('../../../urlUtils');
const { MarkupToHtml } = require('@joplin/renderer');
const { ErrorNotFound } = require('../utils/errors');
const minify = require('html-minifier').minify;
const logger = Logger.create('routes/notes');
@@ -52,6 +51,7 @@ async function requestNoteToNote(requestNote: any) {
if (requestNote.body_html) {
if (requestNote.convert_to === 'html') {
const style = await buildNoteStyleSheet(requestNote.stylesheets);
const minify = require('html-minifier').minify;
const minifyOptions = {
// Remove all spaces and, especially, newlines from tag attributes, as that would

View File

@@ -184,38 +184,42 @@ function shimInit(options = null) {
if (shim.isElectron()) {
// For Electron
const nativeImage = require('electron').nativeImage;
let image = nativeImage.createFromPath(filePath);
const image = nativeImage.createFromPath(filePath);
if (image.isEmpty()) throw new Error(`Image is invalid or does not exist: ${filePath}`);
const size = image.getSize();
let mustResize = size.width > maxDim || size.height > maxDim;
if (mustResize && resizeLargeImages === 'ask') {
const answer = shim.showMessageBox(_('You are about to attach a large image (%dx%d pixels). Would you like to resize it down to %d pixels before attaching it?', size.width, size.height, maxDim), {
buttons: [_('Yes'), _('No'), _('Cancel')],
});
if (answer === 2) return false;
mustResize = answer === 0;
}
if (!mustResize) {
const saveOriginalImage = async () => {
await shim.fsDriver().copy(filePath, targetPath);
return true;
};
const saveResizedImage = async () => {
const options = {};
if (size.width > size.height) {
options.width = maxDim;
} else {
options.height = maxDim;
}
const resizedImage = image.resize(options);
await shim.writeImageToFile(resizedImage, mime, targetPath);
return true;
};
const canResize = size.width > maxDim || size.height > maxDim;
if (canResize) {
if (resizeLargeImages === 'alwaysAsk') {
const Yes = 0, No = 1, Cancel = 2;
const userAnswer = shim.showMessageBox(`${_('You are about to attach a large image (%dx%d pixels). Would you like to resize it down to %d pixels before attaching it?', size.width, size.height, maxDim)}\n\n${_('(You may disable this prompt in the options)')}`, {
buttons: [_('Yes'), _('No'), _('Cancel')],
});
if (userAnswer === Yes) return await saveResizedImage();
if (userAnswer === No) return await saveOriginalImage();
if (userAnswer === Cancel) return false;
} else if (resizeLargeImages === 'alwaysResize') {
return await saveResizedImage();
}
}
const options = {};
if (size.width > size.height) {
options.width = maxDim;
} else {
options.height = maxDim;
}
image = image.resize(options);
await shim.writeImageToFile(image, mime, targetPath);
return await saveOriginalImage();
} else {
// For the CLI tool
const image = sharp(filePath);
@@ -241,8 +245,6 @@ function shimInit(options = null) {
});
});
}
return true;
};
// This is a bit of an ugly method that's used to both create a new resource

View File

@@ -63,6 +63,7 @@ const { S3Client } = require('@aws-sdk/client-s3');
const { Dirnames } = require('../services/synchronizer/utils/types');
import RSA from '../services/e2ee/RSA.node';
import { State as ShareState } from '../services/share/reducer';
import initLib from '../initLib';
// Each suite has its own separate data and temp directory so that multiple
// suites can be run at the same time. suiteName is what is used to
@@ -173,6 +174,7 @@ logger.addTarget(TargetType.Console);
logger.setLevel(LogLevel.Warn); // Set to DEBUG to display sync process in console
Logger.initializeGlobalLogger(logger);
initLib(logger);
BaseItem.loadClass('Note', Note);
BaseItem.loadClass('Folder', Folder);
@@ -916,7 +918,7 @@ class TestApp extends BaseApplication {
if (!argv.includes('--profile')) {
argv = argv.concat(['--profile', `tests-build/profile/${uuid.create()}`]);
}
argv = await super.start(['', ''].concat(argv));
argv = await super.start(['', ''].concat(argv), { setupGlobalLogger: false });
// For now, disable sync and encryption to avoid spurious intermittent failures
// caused by them interupting processing and causing delays.

View File

@@ -156,7 +156,7 @@ class Time {
}
public async waitTillCondition(condition: ConditionHandler) {
if (condition()) return;
if (condition()) return null;
return new Promise(resolve => {
const iid = setInterval(() => {

View File

@@ -19,19 +19,19 @@
"author": "Joplin",
"license": "AGPL-3.0-or-later",
"devDependencies": {
"@types/jest": "29.5.1",
"@types/jest": "29.5.3",
"@types/pdfjs-dist": "2.10.378",
"@types/react": "16.14.41",
"@types/react-dom": "18.0.11",
"@types/react": "18.2.6",
"@types/react-dom": "18.2.6",
"@types/styled-components": "5.1.26",
"babel-jest": "29.5.0",
"css-loader": "6.8.1",
"jest": "29.5.0",
"jest-environment-jsdom": "29.5.0",
"style-loader": "3.3.3",
"ts-jest": "29.1.0",
"ts-jest": "29.1.1",
"ts-loader": "9.4.4",
"typescript": "5.0.2",
"typescript": "5.1.3",
"webpack": "5.74.0",
"webpack-cli": "4.10.0"
},

View File

@@ -29,11 +29,11 @@
},
"devDependencies": {
"@types/fs-extra": "11.0.1",
"@types/jest": "29.5.1",
"@types/node": "18.15.13",
"@types/jest": "29.5.3",
"@types/node": "18.16.18",
"jest": "29.5.0",
"source-map-loader": "4.0.1",
"typescript": "5.0.2",
"typescript": "5.1.3",
"webpack": "5.65.0",
"webpack-cli": "4.10.0"
},

View File

@@ -47,7 +47,7 @@
"@types/react-native": "0.64.19",
"react": "18.2.0",
"react-native": "0.70.6",
"typescript": "5.0.2"
"typescript": "5.1.3"
},
"peerDependencies": {
"react": "*",

View File

@@ -18,12 +18,12 @@
"author": "",
"license": "AGPL-3.0-or-later",
"devDependencies": {
"@types/jest": "29.5.1",
"@types/node": "18.15.13",
"@types/jest": "29.5.3",
"@types/node": "18.16.18",
"jest": "29.5.0",
"jest-environment-jsdom": "29.5.0",
"ts-jest": "29.1.0",
"typescript": "5.0.2"
"ts-jest": "29.1.1",
"typescript": "5.1.3"
},
"dependencies": {
"@joplin/fork-htmlparser2": "^4.1.44",

View File

@@ -27,7 +27,7 @@
"@joplin/renderer": "~2.12",
"@joplin/utils": "~2.12",
"@koa/cors": "3.4.3",
"@types/uuid": "9.0.1",
"@types/uuid": "9.0.2",
"bcryptjs": "2.4.3",
"bulma": "0.9.4",
"bulma-prefers-dark": "0.1.0-beta.1",
@@ -60,16 +60,16 @@
},
"devDependencies": {
"@joplin/tools": "~2.12",
"@rmp135/sql-ts": "1.17.0",
"@rmp135/sql-ts": "1.18.0",
"@types/formidable": "2.0.6",
"@types/fs-extra": "11.0.1",
"@types/jest": "29.5.1",
"@types/jest": "29.5.3",
"@types/jest-expect-message": "1.0.4",
"@types/jsdom": "21.1.0",
"@types/jsdom": "21.1.1",
"@types/koa": "2.13.6",
"@types/markdown-it": "12.2.3",
"@types/mustache": "4.2.2",
"@types/nodemailer": "6.4.7",
"@types/nodemailer": "6.4.8",
"@types/yargs": "17.0.24",
"@types/zxcvbn": "4.4.1",
"gulp": "4.0.2",
@@ -78,6 +78,6 @@
"jsdom": "22.1.0",
"node-mocks-http": "1.12.2",
"source-map-support": "0.5.21",
"typescript": "5.0.2"
"typescript": "5.1.3"
}
}

View File

@@ -24,6 +24,7 @@ import { RouteResponseFormat, routeResponseFormat } from './utils/routeUtils';
import { parseEnv } from './env';
import storageConnectionCheck from './utils/storageConnectionCheck';
import { setLocale } from '@joplin/lib/locale';
import initLib from '@joplin/lib/initLib';
import checkAdminHandler from './middleware/checkAdminHandler';
interface Argv {
@@ -215,6 +216,7 @@ async function main() {
formatInfo: `%(date_time)s: ${instancePrefix}%(prefix)s: %(message)s`,
});
Logger.initializeGlobalLogger(globalLogger);
initLib(globalLogger);
if (envFilePath) appLogger().info(`Env variables were loaded from: ${envFilePath}`);

View File

@@ -25,6 +25,7 @@ import { createCsrfToken } from '../csrf';
import { cookieSet } from '../cookies';
import { parseEnv } from '../../env';
import { URL } from 'url';
import initLib from '@joplin/lib/initLib';
// Takes into account the fact that this file will be inside the /dist directory
// when it runs.
@@ -64,6 +65,7 @@ export async function makeTempFileWithContent(content: string | Buffer): Promise
function initGlobalLogger() {
const globalLogger = new Logger();
Logger.initializeGlobalLogger(globalLogger);
initLib(globalLogger);
}
let createdDbPath_: string = null;

View File

@@ -2,7 +2,7 @@
# Copyright (C) 2001 Laurent Cozic
# This file is distributed under the same license as the Joplin-CLI package.
# Hrvoje Mandić <trbuhom@net.hr>
# Milo Ivir <mail@milotype.de>, 2021., 2022.
# Milo Ivir <mail@milotype.de>, 2021., 2022., 2023.
#
msgid ""
msgstr ""
@@ -15,8 +15,10 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.0\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
#: packages/app-mobile/components/screens/ConfigScreen.tsx:687
msgid "- Camera: to allow taking a picture and attaching it to a note."
@@ -359,8 +361,8 @@ msgstr ""
#: packages/app-cli/app/command-mkbook.ts:33
#: packages/app-cli/app/command-mv.js:29
msgid ""
"Ambiguous notebook \"%s\". Please use short notebook id instead - press "
"\"ti\" to see the short notebook id"
"Ambiguous notebook \"%s\". Please use short notebook id instead - press \"ti"
"\" to see the short notebook id"
msgstr ""
"Nejednoznačna bilježnica „%s”. Umjesto toga koristi kratki ID bilježnice – "
"pritisni „ti” za prikaz kratkog ID-a bilježnice"
@@ -1424,9 +1426,8 @@ msgid "Downloading"
msgstr "Preuzimanje"
#: packages/app-mobile/components/voiceTyping/VoiceTypingDialog.tsx:89
#, fuzzy
msgid "Downloading %s language files..."
msgstr "Preuzimanje resursa …"
msgstr "Preuzimanje jezičnih datoteka za %s …"
#: packages/app-cli/app/command-sync.ts:218
msgid "Downloading resources..."
@@ -2021,9 +2022,8 @@ msgid "Help"
msgstr "Pomoć"
#: packages/app-mobile/components/screens/ConfigScreen.tsx:759
#, fuzzy
msgid "Hermes enabled: %d"
msgstr "Pretraživanje cijelog teksta je aktivirano: %d"
msgstr "Hermes aktiviran: %d"
#: packages/app-desktop/gui/MenuBar.tsx:567
msgid "Hide %s"
@@ -2445,6 +2445,7 @@ msgstr "Slijed gumbova rasporeda"
#: packages/lib/models/Setting.ts:1704
msgid "Leave it blank to download the language files from the default website"
msgstr ""
"Ostavi prazno za preuzimanje jezičnih datoteka sa standardne web stranice"
#: packages/app-desktop/gui/MainScreen/commands/leaveSharedFolder.ts:10
msgid "Leave notebook..."
@@ -3460,7 +3461,7 @@ msgstr "Zamijeni sa …"
#: packages/app-mobile/components/NoteEditor/SearchPanel.tsx:257
msgid "Replace: "
msgstr "Zamijeni:"
msgstr "Zamijeni: "
#: packages/app-desktop/gui/MainScreen/commands/resetLayout.ts:7
msgid "Reset application layout"
@@ -3649,9 +3650,8 @@ msgid "Select file..."
msgstr "Odaberi datoteku …"
#: packages/app-mobile/components/screens/folder.js:109
#, fuzzy
msgid "Select parent notebook"
msgstr "Obriši bilježnicu"
msgstr "Obriši nadređenu bilježnicu"
#: packages/app-cli/app/command-server.js:38
msgid "Server is already running on port %d"
@@ -4940,12 +4940,12 @@ msgstr "Vim"
#: packages/lib/models/Setting.ts:1705
msgid "Voice typing language files (URL)"
msgstr ""
msgstr "Jezične datoteke za tipkanje glasom (URL)"
#: packages/app-mobile/components/screens/Note.tsx:994
#: packages/app-mobile/components/voiceTyping/VoiceTypingDialog.tsx:119
msgid "Voice typing..."
msgstr "Tipkanje glasa …"
msgstr "Tipkanje glasom …"
#: packages/app-mobile/components/screens/ConfigScreen.tsx:83
msgid "Warning"
@@ -4999,9 +4999,8 @@ msgstr ""
"pritisni `mn`."
#: packages/lib/WelcomeUtils.ts:63
#, fuzzy
msgid "Welcome!"
msgstr "Dobro došli"
msgstr "Dobro došao, dobro došla!"
#: packages/lib/models/Setting.ts:1105
msgid "When creating a new note:"

View File

@@ -28,7 +28,7 @@
"execa": "4.1.0",
"fs-extra": "11.1.1",
"gettext-parser": "7.0.1",
"glob": "10.2.7",
"glob": "10.3.3",
"markdown-it": "13.0.1",
"md5-file": "5.0.0",
"moment": "2.29.4",
@@ -36,19 +36,19 @@
"node-fetch": "2.6.7",
"relative": "3.0.2",
"request": "2.88.2",
"sharp": "0.32.1",
"sharp": "0.32.3",
"source-map-support": "0.5.21",
"uri-template": "2.0.0",
"yargs": "17.7.2"
},
"devDependencies": {
"@joplin/fork-htmlparser2": "^4.1.44",
"@rmp135/sql-ts": "1.17.0",
"@rmp135/sql-ts": "1.18.0",
"@types/fs-extra": "11.0.1",
"@types/jest": "29.5.1",
"@types/jest": "29.5.3",
"@types/mustache": "4.2.2",
"@types/node": "18.15.13",
"@types/node-fetch": "2.6.3",
"@types/node": "18.16.18",
"@types/node-fetch": "2.6.4",
"@types/yargs": "17.0.24",
"gettext-extractor": "3.7.2",
"gulp": "4.0.2",
@@ -57,7 +57,7 @@
"rss": "1.2.2",
"sass": "1.63.6",
"sqlite3": "5.1.6",
"typescript": "5.0.2"
"typescript": "5.1.3"
},
"gitHead": "eb4b0e64eab40a51b0895d3a40a9d8c3cb7b1b14"
}

View File

@@ -24,16 +24,16 @@
"async-mutex": "0.4.0",
"execa": "5.1.1",
"fs-extra": "11.1.1",
"glob": "10.2.7",
"glob": "10.3.3",
"moment": "2.29.4",
"node-fetch": "2.6.7",
"sprintf-js": "1.1.2"
},
"devDependencies": {
"@types/fs-extra": "11.0.1",
"@types/jest": "29.5.1",
"@types/node-fetch": "2.6.3",
"@types/jest": "29.5.3",
"@types/node-fetch": "2.6.4",
"jest": "29.5.0",
"ts-jest": "29.1.0"
"ts-jest": "29.1.1"
}
}

View File

@@ -14,19 +14,22 @@
## [v2.12.9](https://github.com/laurent22/joplin/releases/tag/v2.12.9) (Pre-release) - 2023-07-25T16:06:08Z
- New: Add support for Joplin Cloud email to note functionality ([#8460](https://github.com/laurent22/joplin/issues/8460) by [@pedr](https://github.com/pedr))
- New: Add support for Joplin Cloud email to note functionality ([[#8460](https://github.com/laurent22/joplin/issues/8460)](https://github.com/laurent22/joplin/issues/8460) by [@pedr](https://github.com/pedr))
- New: Enable share permission handling for Joplin Cloud ([c88b6b6](https://github.com/laurent22/joplin/commit/c88b6b6))
- Improved: Rich text editor: Disable spellcheck in inline code blocks ([#8532](https://github.com/laurent22/joplin/issues/8532) by Henry Heino)
- Improved: Rotating log files ([#8376](https://github.com/laurent22/joplin/issues/8376)) ([#5521](https://github.com/laurent22/joplin/issues/5521) by [@hubert](https://github.com/hubert))
- Improved: Rich text editor: Disable spellcheck in inline code blocks ([[#8532](https://github.com/laurent22/joplin/issues/8532)](https://github.com/laurent22/joplin/issues/8532) by Henry Heino)
- Improved: Updated packages dayjs (v1.11.9), jsdom (v22.1.0), react-redux (v8.1.0), sass (v1.63.6), ts-loader (v9.4.4)
- Improved: WebDAV: Show a more descriptive error message when the password is empty ([#8477](https://github.com/laurent22/joplin/issues/8477)) ([#8466](https://github.com/laurent22/joplin/issues/8466) by Henry Heino)
- Fixed: Add "insert*before" buttons for tables in the rich text editor ([#8393](https://github.com/laurent22/joplin/issues/8393)) ([#8382](https://github.com/laurent22/joplin/issues/8382) by [@Marph](https://github.com/Marph))
- Fixed: Fix Rich Text theme not matching the system theme after several global theme changes ([#8521](https://github.com/laurent22/joplin/issues/8521)) ([#8520](https://github.com/laurent22/joplin/issues/8520) by Henry Heino)
- Fixed: Make HTML &lt;br/&gt; tags convert to markdown compatible with the softbreaks setting ([#8469](https://github.com/laurent22/joplin/issues/8469)) ([#8430](https://github.com/laurent22/joplin/issues/8430) by Henry Heino)
- Fixed: Merge changes from upstream turndown project ([#8468](https://github.com/laurent22/joplin/issues/8468)) ([#8448](https://github.com/laurent22/joplin/issues/8448) by Henry Heino)
- Fixed: Rich text editor: Use fewer `&nbsp;`s in markdown while still preserving initial paragraph indentation ([#8529](https://github.com/laurent22/joplin/issues/8529)) ([#8530](https://github.com/laurent22/joplin/issues/8530) by Henry Heino)
- Fixed: Support plugin toolbar icons in the Rich Text editor toolbar ([#8519](https://github.com/laurent22/joplin/issues/8519)) ([#8504](https://github.com/laurent22/joplin/issues/8504) by Henry Heino)
- Security: Fix XSS: Sanitize rendered output in safe mode ([#8507](https://github.com/laurent22/joplin/issues/8507) by Henry Heino)
- Security: Close root electron window before unload: Prevent top-level redirection ([#8478](https://github.com/laurent22/joplin/issues/8478) by Henry Heino)
- Improved: WebDAV: Show a more descriptive error message when the password is empty ([[#8477](https://github.com/laurent22/joplin/issues/8477)](https://github.com/laurent22/joplin/issues/8477)) ([[#8466](https://github.com/laurent22/joplin/issues/8466)](https://github.com/laurent22/joplin/issues/8466) by Henry Heino)
- Fixed: Add "insert*before" buttons for tables in the rich text editor ([[#8393](https://github.com/laurent22/joplin/issues/8393)](https://github.com/laurent22/joplin/issues/8393)) ([[#8382](https://github.com/laurent22/joplin/issues/8382)](https://github.com/laurent22/joplin/issues/8382) by [@Marph](https://github.com/Marph))
- Fixed: Fix Rich Text theme not matching the system theme after several global theme changes ([[#8521](https://github.com/laurent22/joplin/issues/8521)](https://github.com/laurent22/joplin/issues/8521)) ([[#8520](https://github.com/laurent22/joplin/issues/8520)](https://github.com/laurent22/joplin/issues/8520) by Henry Heino)
- Fixed: Make HTML &lt;br/&gt; tags convert to markdown compatible with the softbreaks setting ([[#8469](https://github.com/laurent22/joplin/issues/8469)](https://github.com/laurent22/joplin/issues/8469)) ([[#8430](https://github.com/laurent22/joplin/issues/8430)](https://github.com/laurent22/joplin/issues/8430) by Henry Heino)
- Fixed: Merge changes from upstream turndown project ([[#8468](https://github.com/laurent22/joplin/issues/8468)](https://github.com/laurent22/joplin/issues/8468)) ([[#8448](https://github.com/laurent22/joplin/issues/8448)](https://github.com/laurent22/joplin/issues/8448) by Henry Heino)
- Fixed: Rich text editor: Use fewer `&nbsp;`s in markdown while still preserving initial paragraph indentation ([[#8529](https://github.com/laurent22/joplin/issues/8529)](https://github.com/laurent22/joplin/issues/8529)) ([[#8530](https://github.com/laurent22/joplin/issues/8530)](https://github.com/laurent22/joplin/issues/8530) by Henry Heino)
- Fixed: Support plugin toolbar icons in the Rich Text editor toolbar ([[#8519](https://github.com/laurent22/joplin/issues/8519)](https://github.com/laurent22/joplin/issues/8519)) ([[#8504](https://github.com/laurent22/joplin/issues/8504)](https://github.com/laurent22/joplin/issues/8504) by Henry Heino)
- Security: Fix XSS: Sanitize rendered output in safe mode ([[#8507](https://github.com/laurent22/joplin/issues/8507)](https://github.com/laurent22/joplin/issues/8507) by Henry Heino)
- Security: Close root electron window before unload: Prevent top-level redirection ([[#8478](https://github.com/laurent22/joplin/issues/8478)](https://github.com/laurent22/joplin/issues/8478) by Henry Heino)
- Security: Disallow map and area tags ([#8479](https://github.com/laurent22/joplin/issues/8479) by Henry Heino)
## [v2.12.7](https://github.com/laurent22/joplin/releases/tag/v2.12.7) (Pre-release) - 2023-07-13T12:55:31Z

View File

@@ -1,14 +1,14 @@
---
updated: 2023-07-01T00:51:15Z
updated: 2023-08-01T00:46:35Z
---
# Joplin statistics
| Name | Value |
| ----- | ----- |
| Total Windows downloads | 3,484,565 |
| Total macOs downloads | 1,284,117 |
| Total Linux downloads | 1,006,876 |
| Total Windows downloads | 3,586,372 |
| Total macOs downloads | 1,321,007 |
| Total Linux downloads | 1,029,101 |
| Windows % | 60% |
| macOS % | 22% |
| Linux % | 17% |
@@ -17,289 +17,295 @@ updated: 2023-07-01T00:51:15Z
| Version | Date | Windows | macOS | Linux | Total |
| ----- | ----- | ----- | ----- | ----- | ----- |
| [v2.11.11](https://github.com/laurent22/joplin/releases/tag/v2.11.11) | 2023-06-23T15:16:37Z | 35,189 | 19,296 | 3,689 | 58,174 |
| [v2.11.9](https://github.com/laurent22/joplin/releases/tag/v2.11.9) (p) | 2023-06-06T16:23:27Z | 2,215 | 553 | 716 | 3,484 |
| [v2.11.6](https://github.com/laurent22/joplin/releases/tag/v2.11.6) (p) | 2023-05-31T20:13:08Z | 1,097 | 417 | 322 | 1,836 |
| [v2.11.5](https://github.com/laurent22/joplin/releases/tag/v2.11.5) (p) | 2023-05-28T00:41:40Z | 955 | 287 | 260 | 1,502 |
| [v2.10.19](https://github.com/laurent22/joplin/releases/tag/v2.10.19) | 2023-05-17T12:25:41Z | 119,113 | 47,864 | 22,296 | 189,273 |
| [v2.11.4](https://github.com/laurent22/joplin/releases/tag/v2.11.4) (p) | 2023-05-16T10:02:21Z | 1,043 | 452 | 393 | 1,888 |
| [v2.11.3](https://github.com/laurent22/joplin/releases/tag/v2.11.3) (p) | 2023-05-16T09:09:57Z | 62 | 25 | 23 | 110 |
| [v2.10.18](https://github.com/laurent22/joplin/releases/tag/v2.10.18) | 2023-05-09T13:27:43Z | 53,794 | 24,181 | 6,705 | 84,680 |
| [v2.10.17](https://github.com/laurent22/joplin/releases/tag/v2.10.17) | 2023-05-08T17:27:28Z | 16,895 | 11,466 | 862 | 29,223 |
| [v2.10.16](https://github.com/laurent22/joplin/releases/tag/v2.10.16) | 2023-04-27T09:27:45Z | 7,665 | 4,214 | 759 | 12,638 |
| [v2.10.15](https://github.com/laurent22/joplin/releases/tag/v2.10.15) (p) | 2023-04-26T22:02:16Z | 337 | 123 | 44 | 504 |
| [v2.10.13](https://github.com/laurent22/joplin/releases/tag/v2.10.13) (p) | 2023-04-03T16:53:46Z | 3,379 | 812 | 1,063 | 5,254 |
| [v2.10.12](https://github.com/laurent22/joplin/releases/tag/v2.10.12) (p) | 2023-03-23T12:17:13Z | 2,375 | 505 | 592 | 3,472 |
| [v2.10.11](https://github.com/laurent22/joplin/releases/tag/v2.10.11) (p) | 2023-03-17T10:54:02Z | 1,757 | 370 | 370 | 2,497 |
| [v2.10.10](https://github.com/laurent22/joplin/releases/tag/v2.10.10) (p) | 2023-03-13T23:16:37Z | 1,244 | 264 | 240 | 1,748 |
| [v2.10.9](https://github.com/laurent22/joplin/releases/tag/v2.10.9) (p) | 2023-03-12T16:16:45Z | 783 | 202 | 276 | 1,261 |
| [v2.10.8](https://github.com/laurent22/joplin/releases/tag/v2.10.8) (p) | 2023-02-26T12:53:55Z | 3,258 | 562 | 858 | 4,678 |
| [v2.10.7](https://github.com/laurent22/joplin/releases/tag/v2.10.7) (p) | 2023-02-24T10:56:20Z | 931 | 178 | 263 | 1,372 |
| [v2.10.6](https://github.com/laurent22/joplin/releases/tag/v2.10.6) (p) | 2023-02-20T14:00:05Z | 1,740 | 327 | 274 | 2,341 |
| [v2.10.5](https://github.com/laurent22/joplin/releases/tag/v2.10.5) | 2023-01-16T15:00:53Z | 223 | 56 | 258 | 537 |
| [v2.10.4](https://github.com/laurent22/joplin/releases/tag/v2.10.4) (p) | 2023-01-05T13:09:20Z | 6,923 | 1,277 | 1,767 | 9,967 |
| [v2.10.3](https://github.com/laurent22/joplin/releases/tag/v2.10.3) (p) | 2022-12-31T15:53:23Z | 1,519 | 300 | 371 | 2,190 |
| [v2.10.2](https://github.com/laurent22/joplin/releases/tag/v2.10.2) (p) | 2022-12-18T18:05:08Z | 2,930 | 553 | 609 | 4,092 |
| [v2.9.17](https://github.com/laurent22/joplin/releases/tag/v2.9.17) | 2022-11-15T10:28:37Z | 332,242 | 108,666 | 83,109 | 524,017 |
| [v2.9.12](https://github.com/laurent22/joplin/releases/tag/v2.9.12) (p) | 2022-11-01T17:06:05Z | 10,131 | 595 | 523 | 11,249 |
| [v2.9.11](https://github.com/laurent22/joplin/releases/tag/v2.9.11) (p) | 2022-10-23T16:09:58Z | 2,278 | 514 | 699 | 3,491 |
| [v2.9.4](https://github.com/laurent22/joplin/releases/tag/v2.9.4) (p) | 2022-08-18T16:52:26Z | 7,322 | 1,847 | 2,174 | 11,343 |
| [v2.9.3](https://github.com/laurent22/joplin/releases/tag/v2.9.3) (p) | 2022-08-18T13:11:09Z | 300 | 77 | 252 | 629 |
| [v2.9.2](https://github.com/laurent22/joplin/releases/tag/v2.9.2) (p) | 2022-08-12T18:12:12Z | 1,479 | 433 | 0 | 1,912 |
| [v2.9.1](https://github.com/laurent22/joplin/releases/tag/v2.9.1) (p) | 2022-07-11T09:59:32Z | 6,740 | 1,326 | 1,382 | 9,448 |
| [v2.8.8](https://github.com/laurent22/joplin/releases/tag/v2.8.8) | 2022-05-17T14:48:06Z | 347,273 | 113,660 | 113,394 | 574,327 |
| [v2.8.7](https://github.com/laurent22/joplin/releases/tag/v2.8.7) (p) | 2022-05-06T11:34:27Z | 3,003 | 350 | 379 | 3,732 |
| [v2.8.6](https://github.com/laurent22/joplin/releases/tag/v2.8.6) (p) | 2022-05-03T10:08:25Z | 2,634 | 387 | 311 | 3,332 |
| [v2.8.5](https://github.com/laurent22/joplin/releases/tag/v2.8.5) (p) | 2022-04-27T13:51:50Z | 2,671 | 345 | 326 | 3,342 |
| [v2.8.4](https://github.com/laurent22/joplin/releases/tag/v2.8.4) (p) | 2022-04-19T18:00:09Z | 3,183 | 573 | 311 | 4,067 |
| [v2.8.2](https://github.com/laurent22/joplin/releases/tag/v2.8.2) (p) | 2022-04-14T11:35:45Z | 2,591 | 263 | 246 | 3,100 |
| [v2.7.15](https://github.com/laurent22/joplin/releases/tag/v2.7.15) | 2022-03-17T13:03:23Z | 154,202 | 56,688 | 51,203 | 262,093 |
| [v2.7.14](https://github.com/laurent22/joplin/releases/tag/v2.7.14) | 2022-02-27T11:30:53Z | 32,961 | 16,759 | 4,780 | 54,500 |
| [v2.7.13](https://github.com/laurent22/joplin/releases/tag/v2.7.13) | 2022-02-24T17:42:12Z | 53,368 | 25,708 | 11,691 | 90,767 |
| [v2.7.12](https://github.com/laurent22/joplin/releases/tag/v2.7.12) (p) | 2022-02-14T15:06:14Z | 3,355 | 449 | 444 | 4,248 |
| [v2.7.11](https://github.com/laurent22/joplin/releases/tag/v2.7.11) (p) | 2022-02-12T13:00:02Z | 2,483 | 181 | 144 | 2,808 |
| [v2.7.10](https://github.com/laurent22/joplin/releases/tag/v2.7.10) (p) | 2022-02-11T18:19:09Z | 2,027 | 112 | 68 | 2,207 |
| [v2.7.8](https://github.com/laurent22/joplin/releases/tag/v2.7.8) (p) | 2022-01-19T09:35:27Z | 4,264 | 756 | 808 | 5,828 |
| [v2.7.7](https://github.com/laurent22/joplin/releases/tag/v2.7.7) (p) | 2022-01-18T14:05:07Z | 2,318 | 143 | 120 | 2,581 |
| [v2.7.6](https://github.com/laurent22/joplin/releases/tag/v2.7.6) (p) | 2022-01-17T17:08:28Z | 2,294 | 169 | 100 | 2,563 |
| [v2.6.10](https://github.com/laurent22/joplin/releases/tag/v2.6.10) | 2021-12-19T11:31:16Z | 133,515 | 51,168 | 49,227 | 233,910 |
| [v2.6.9](https://github.com/laurent22/joplin/releases/tag/v2.6.9) | 2021-12-17T11:57:32Z | 17,418 | 9,479 | 3,169 | 30,066 |
| [v2.6.7](https://github.com/laurent22/joplin/releases/tag/v2.6.7) (p) | 2021-12-16T10:47:23Z | 2,468 | 151 | 86 | 2,705 |
| [v2.6.6](https://github.com/laurent22/joplin/releases/tag/v2.6.6) (p) | 2021-12-13T12:31:43Z | 2,491 | 244 | 151 | 2,886 |
| [v2.6.5](https://github.com/laurent22/joplin/releases/tag/v2.6.5) (p) | 2021-12-13T10:07:04Z | 1,814 | 39 | 17 | 1,870 |
| [v2.6.4](https://github.com/laurent22/joplin/releases/tag/v2.6.4) (p) | 2021-12-09T19:53:43Z | 2,536 | 275 | 187 | 2,998 |
| [v2.6.2](https://github.com/laurent22/joplin/releases/tag/v2.6.2) (p) | 2021-11-18T12:19:12Z | 4,330 | 779 | 688 | 5,797 |
| [v2.5.12](https://github.com/laurent22/joplin/releases/tag/v2.5.12) | 2021-11-08T11:07:11Z | 80,762 | 32,486 | 25,200 | 138,448 |
| [v2.5.10](https://github.com/laurent22/joplin/releases/tag/v2.5.10) | 2021-11-01T08:22:42Z | 45,558 | 19,017 | 10,059 | 74,634 |
| [v2.5.8](https://github.com/laurent22/joplin/releases/tag/v2.5.8) | 2021-10-31T11:38:03Z | 14,310 | 6,551 | 2,299 | 23,160 |
| [v2.5.7](https://github.com/laurent22/joplin/releases/tag/v2.5.7) (p) | 2021-10-29T14:47:33Z | 2,106 | 192 | 152 | 2,450 |
| [v2.5.6](https://github.com/laurent22/joplin/releases/tag/v2.5.6) (p) | 2021-10-28T22:03:09Z | 2,138 | 165 | 94 | 2,397 |
| [v2.5.4](https://github.com/laurent22/joplin/releases/tag/v2.5.4) (p) | 2021-10-19T10:10:54Z | 3,631 | 556 | 559 | 4,746 |
| [v2.4.12](https://github.com/laurent22/joplin/releases/tag/v2.4.12) | 2021-10-13T17:24:34Z | 45,329 | 19,960 | 9,768 | 75,057 |
| [v2.5.1](https://github.com/laurent22/joplin/releases/tag/v2.5.1) (p) | 2021-10-02T09:51:58Z | 4,609 | 891 | 932 | 6,432 |
| [v2.4.9](https://github.com/laurent22/joplin/releases/tag/v2.4.9) | 2021-09-29T19:08:58Z | 57,537 | 23,234 | 15,871 | 96,642 |
| [v2.4.8](https://github.com/laurent22/joplin/releases/tag/v2.4.8) (p) | 2021-09-22T19:01:46Z | 8,483 | 1,760 | 521 | 10,764 |
| [v2.4.7](https://github.com/laurent22/joplin/releases/tag/v2.4.7) (p) | 2021-09-19T12:53:22Z | 2,584 | 240 | 194 | 3,018 |
| [v2.4.6](https://github.com/laurent22/joplin/releases/tag/v2.4.6) (p) | 2021-09-09T18:57:17Z | 3,350 | 447 | 505 | 4,302 |
| [v2.4.5](https://github.com/laurent22/joplin/releases/tag/v2.4.5) (p) | 2021-09-06T18:03:28Z | 2,602 | 257 | 211 | 3,070 |
| [v2.4.4](https://github.com/laurent22/joplin/releases/tag/v2.4.4) (p) | 2021-08-30T16:02:51Z | 2,815 | 365 | 346 | 3,526 |
| [v2.4.3](https://github.com/laurent22/joplin/releases/tag/v2.4.3) (p) | 2021-08-28T15:27:32Z | 2,340 | 193 | 165 | 2,698 |
| [v2.4.2](https://github.com/laurent22/joplin/releases/tag/v2.4.2) (p) | 2021-08-27T17:13:21Z | 2,067 | 137 | 78 | 2,282 |
| [v2.4.1](https://github.com/laurent22/joplin/releases/tag/v2.4.1) (p) | 2021-08-21T11:52:30Z | 2,953 | 358 | 323 | 3,634 |
| [v2.3.5](https://github.com/laurent22/joplin/releases/tag/v2.3.5) | 2021-08-17T06:43:30Z | 83,003 | 31,398 | 33,108 | 147,509 |
| [v2.3.3](https://github.com/laurent22/joplin/releases/tag/v2.3.3) | 2021-08-14T09:19:40Z | 16,464 | 6,871 | 4,046 | 27,381 |
| [v2.2.7](https://github.com/laurent22/joplin/releases/tag/v2.2.7) | 2021-08-11T11:03:26Z | 16,573 | 7,508 | 2,583 | 26,664 |
| [v2.2.6](https://github.com/laurent22/joplin/releases/tag/v2.2.6) (p) | 2021-08-09T19:29:20Z | 9,299 | 4,607 | 944 | 14,850 |
| [v2.2.5](https://github.com/laurent22/joplin/releases/tag/v2.2.5) (p) | 2021-08-07T10:35:24Z | 2,685 | 265 | 194 | 3,144 |
| [v2.2.4](https://github.com/laurent22/joplin/releases/tag/v2.2.4) (p) | 2021-08-05T16:42:48Z | 2,356 | 194 | 119 | 2,669 |
| [v2.2.2](https://github.com/laurent22/joplin/releases/tag/v2.2.2) (p) | 2021-07-19T10:28:35Z | 4,250 | 724 | 634 | 5,608 |
| [v2.1.9](https://github.com/laurent22/joplin/releases/tag/v2.1.9) | 2021-07-19T10:28:43Z | 47,893 | 18,794 | 16,761 | 83,448 |
| [v2.2.1](https://github.com/laurent22/joplin/releases/tag/v2.2.1) (p) | 2021-07-09T17:38:25Z | 3,895 | 402 | 380 | 4,677 |
| [v2.1.8](https://github.com/laurent22/joplin/releases/tag/v2.1.8) | 2021-07-03T08:25:16Z | 31,692 | 12,186 | 12,717 | 56,595 |
| [v2.1.7](https://github.com/laurent22/joplin/releases/tag/v2.1.7) | 2021-06-26T19:48:55Z | 15,288 | 6,394 | 3,617 | 25,299 |
| [v2.1.5](https://github.com/laurent22/joplin/releases/tag/v2.1.5) (p) | 2021-06-23T15:08:52Z | 2,722 | 236 | 188 | 3,146 |
| [v2.1.3](https://github.com/laurent22/joplin/releases/tag/v2.1.3) (p) | 2021-06-19T16:32:51Z | 2,820 | 297 | 202 | 3,319 |
| [v2.0.11](https://github.com/laurent22/joplin/releases/tag/v2.0.11) | 2021-06-16T17:55:49Z | 25,037 | 9,260 | 9,843 | 44,140 |
| [v2.0.10](https://github.com/laurent22/joplin/releases/tag/v2.0.10) | 2021-06-16T07:58:29Z | 4,002 | 930 | 380 | 5,312 |
| [v2.0.9](https://github.com/laurent22/joplin/releases/tag/v2.0.9) (p) | 2021-06-12T09:30:30Z | 2,797 | 291 | 878 | 3,966 |
| [v2.0.8](https://github.com/laurent22/joplin/releases/tag/v2.0.8) (p) | 2021-06-10T16:15:08Z | 2,324 | 228 | 576 | 3,128 |
| [v2.0.4](https://github.com/laurent22/joplin/releases/tag/v2.0.4) (p) | 2021-06-02T12:54:17Z | 1,614 | 391 | 378 | 2,383 |
| [v2.0.2](https://github.com/laurent22/joplin/releases/tag/v2.0.2) (p) | 2021-05-21T18:07:48Z | 4,122 | 489 | 1,667 | 6,278 |
| [v2.0.1](https://github.com/laurent22/joplin/releases/tag/v2.0.1) (p) | 2021-05-15T13:22:58Z | 881 | 271 | 1,021 | 2,173 |
| [v1.8.5](https://github.com/laurent22/joplin/releases/tag/v1.8.5) | 2021-05-10T11:58:14Z | 39,618 | 16,278 | 19,410 | 75,306 |
| [v1.8.4](https://github.com/laurent22/joplin/releases/tag/v1.8.4) (p) | 2021-05-09T18:05:05Z | 2,286 | 138 | 457 | 2,881 |
| [v1.8.3](https://github.com/laurent22/joplin/releases/tag/v1.8.3) (p) | 2021-05-04T10:38:16Z | 3,291 | 308 | 938 | 4,537 |
| [v1.8.2](https://github.com/laurent22/joplin/releases/tag/v1.8.2) (p) | 2021-04-25T10:50:51Z | 3,576 | 437 | 1,285 | 5,298 |
| [v1.8.1](https://github.com/laurent22/joplin/releases/tag/v1.8.1) (p) | 2021-03-29T10:46:41Z | 4,608 | 826 | 2,452 | 7,886 |
| [v1.7.11](https://github.com/laurent22/joplin/releases/tag/v1.7.11) | 2021-02-03T12:50:01Z | 118,649 | 42,883 | 64,367 | 225,899 |
| [v1.7.10](https://github.com/laurent22/joplin/releases/tag/v1.7.10) | 2021-01-30T13:25:29Z | 14,294 | 4,863 | 4,497 | 23,654 |
| [v1.7.9](https://github.com/laurent22/joplin/releases/tag/v1.7.9) (p) | 2021-01-28T09:50:21Z | 506 | 135 | 500 | 1,141 |
| [v1.7.6](https://github.com/laurent22/joplin/releases/tag/v1.7.6) (p) | 2021-01-27T10:36:05Z | 320 | 95 | 290 | 705 |
| [v1.7.5](https://github.com/laurent22/joplin/releases/tag/v1.7.5) (p) | 2021-01-26T09:53:05Z | 413 | 207 | 456 | 1,076 |
| [v1.7.4](https://github.com/laurent22/joplin/releases/tag/v1.7.4) (p) | 2021-01-22T17:58:38Z | 699 | 206 | 627 | 1,532 |
| [v1.6.8](https://github.com/laurent22/joplin/releases/tag/v1.6.8) | 2021-01-20T18:11:34Z | 21,244 | 7,711 | 7,609 | 36,564 |
| [v1.7.3](https://github.com/laurent22/joplin/releases/tag/v1.7.3) (p) | 2021-01-20T11:23:50Z | 353 | 79 | 445 | 877 |
| [v1.6.7](https://github.com/laurent22/joplin/releases/tag/v1.6.7) | 2021-01-11T23:20:33Z | 13,012 | 4,646 | 4,552 | 22,210 |
| [v1.6.6](https://github.com/laurent22/joplin/releases/tag/v1.6.6) | 2021-01-09T16:15:31Z | 12,726 | 3,426 | 4,799 | 20,951 |
| [v1.6.5](https://github.com/laurent22/joplin/releases/tag/v1.6.5) (p) | 2021-01-09T01:24:32Z | 2,560 | 79 | 310 | 2,949 |
| [v1.6.4](https://github.com/laurent22/joplin/releases/tag/v1.6.4) (p) | 2021-01-07T19:11:32Z | 396 | 80 | 206 | 682 |
| [v1.6.2](https://github.com/laurent22/joplin/releases/tag/v1.6.2) (p) | 2021-01-04T22:34:55Z | 677 | 230 | 592 | 1,499 |
| [v1.5.14](https://github.com/laurent22/joplin/releases/tag/v1.5.14) | 2020-12-30T01:48:46Z | 13,496 | 5,217 | 5,533 | 24,246 |
| [v1.6.1](https://github.com/laurent22/joplin/releases/tag/v1.6.1) (p) | 2020-12-29T19:37:45Z | 175 | 40 | 170 | 385 |
| [v1.5.13](https://github.com/laurent22/joplin/releases/tag/v1.5.13) | 2020-12-29T18:29:15Z | 666 | 228 | 210 | 1,104 |
| [v1.5.12](https://github.com/laurent22/joplin/releases/tag/v1.5.12) | 2020-12-28T15:14:08Z | 2,438 | 1,781 | 927 | 5,146 |
| [v1.5.11](https://github.com/laurent22/joplin/releases/tag/v1.5.11) | 2020-12-27T19:54:07Z | 14,199 | 4,642 | 4,285 | 23,126 |
| [v1.5.10](https://github.com/laurent22/joplin/releases/tag/v1.5.10) (p) | 2020-12-26T12:35:36Z | 298 | 109 | 272 | 679 |
| [v1.5.9](https://github.com/laurent22/joplin/releases/tag/v1.5.9) (p) | 2020-12-23T18:01:08Z | 332 | 374 | 413 | 1,119 |
| [v1.5.8](https://github.com/laurent22/joplin/releases/tag/v1.5.8) (p) | 2020-12-20T09:45:19Z | 570 | 167 | 646 | 1,383 |
| [v1.5.7](https://github.com/laurent22/joplin/releases/tag/v1.5.7) (p) | 2020-12-10T12:58:33Z | 893 | 256 | 996 | 2,145 |
| [v1.5.4](https://github.com/laurent22/joplin/releases/tag/v1.5.4) (p) | 2020-12-05T12:07:49Z | 697 | 169 | 637 | 1,503 |
| [v1.4.19](https://github.com/laurent22/joplin/releases/tag/v1.4.19) | 2020-12-01T11:11:16Z | 28,209 | 13,552 | 11,687 | 53,448 |
| [v1.4.18](https://github.com/laurent22/joplin/releases/tag/v1.4.18) | 2020-11-28T12:21:41Z | 11,616 | 3,895 | 3,146 | 18,657 |
| [v1.4.16](https://github.com/laurent22/joplin/releases/tag/v1.4.16) | 2020-11-27T19:40:16Z | 1,517 | 844 | 605 | 2,966 |
| [v1.4.15](https://github.com/laurent22/joplin/releases/tag/v1.4.15) | 2020-11-27T13:25:43Z | 937 | 497 | 280 | 1,714 |
| [v1.4.12](https://github.com/laurent22/joplin/releases/tag/v1.4.12) | 2020-11-23T18:58:07Z | 3,081 | 1,346 | 1,312 | 5,739 |
| [v1.4.11](https://github.com/laurent22/joplin/releases/tag/v1.4.11) (p) | 2020-11-19T23:06:51Z | 3,334 | 165 | 597 | 4,096 |
| [v1.4.10](https://github.com/laurent22/joplin/releases/tag/v1.4.10) (p) | 2020-11-14T09:53:15Z | 655 | 204 | 688 | 1,547 |
| [v1.4.9](https://github.com/laurent22/joplin/releases/tag/v1.4.9) (p) | 2020-11-11T14:23:17Z | 845 | 149 | 406 | 1,400 |
| [v1.4.7](https://github.com/laurent22/joplin/releases/tag/v1.4.7) (p) | 2020-11-07T18:23:29Z | 531 | 180 | 519 | 1,230 |
| [v1.3.18](https://github.com/laurent22/joplin/releases/tag/v1.3.18) | 2020-11-06T12:07:02Z | 33,512 | 11,355 | 10,524 | 55,391 |
| [v1.3.17](https://github.com/laurent22/joplin/releases/tag/v1.3.17) (p) | 2020-11-06T11:35:15Z | 57 | 34 | 28 | 119 |
| [v1.4.6](https://github.com/laurent22/joplin/releases/tag/v1.4.6) (p) | 2020-11-05T22:44:12Z | 677 | 102 | 57 | 836 |
| [v1.3.15](https://github.com/laurent22/joplin/releases/tag/v1.3.15) | 2020-11-04T12:22:50Z | 2,614 | 1,317 | 855 | 4,786 |
| [v1.3.11](https://github.com/laurent22/joplin/releases/tag/v1.3.11) (p) | 2020-10-31T13:22:20Z | 709 | 195 | 486 | 1,390 |
| [v1.3.10](https://github.com/laurent22/joplin/releases/tag/v1.3.10) (p) | 2020-10-29T13:27:14Z | 385 | 124 | 321 | 830 |
| [v1.3.9](https://github.com/laurent22/joplin/releases/tag/v1.3.9) (p) | 2020-10-23T16:04:26Z | 850 | 252 | 638 | 1,740 |
| [v1.3.8](https://github.com/laurent22/joplin/releases/tag/v1.3.8) (p) | 2020-10-21T18:46:29Z | 531 | 125 | 335 | 991 |
| [v1.3.7](https://github.com/laurent22/joplin/releases/tag/v1.3.7) (p) | 2020-10-20T11:35:55Z | 305 | 94 | 347 | 746 |
| [v1.3.5](https://github.com/laurent22/joplin/releases/tag/v1.3.5) (p) | 2020-10-17T14:26:35Z | 481 | 143 | 411 | 1,035 |
| [v1.3.3](https://github.com/laurent22/joplin/releases/tag/v1.3.3) (p) | 2020-10-17T10:56:57Z | 129 | 55 | 38 | 222 |
| [v1.3.2](https://github.com/laurent22/joplin/releases/tag/v1.3.2) (p) | 2020-10-11T20:39:49Z | 677 | 192 | 573 | 1,442 |
| [v1.3.1](https://github.com/laurent22/joplin/releases/tag/v1.3.1) (p) | 2020-10-11T15:10:18Z | 93 | 61 | 49 | 203 |
| [v1.2.6](https://github.com/laurent22/joplin/releases/tag/v1.2.6) | 2020-10-09T13:56:59Z | 47,390 | 17,756 | 14,058 | 79,204 |
| [v1.2.4](https://github.com/laurent22/joplin/releases/tag/v1.2.4) (p) | 2020-09-30T07:34:29Z | 831 | 258 | 804 | 1,893 |
| [v1.2.3](https://github.com/laurent22/joplin/releases/tag/v1.2.3) (p) | 2020-09-29T15:13:02Z | 229 | 74 | 87 | 390 |
| [v1.2.2](https://github.com/laurent22/joplin/releases/tag/v1.2.2) (p) | 2020-09-22T20:31:55Z | 1,121 | 217 | 644 | 1,982 |
| [v1.1.4](https://github.com/laurent22/joplin/releases/tag/v1.1.4) | 2020-09-21T11:20:09Z | 28,026 | 13,520 | 7,763 | 49,309 |
| [v1.1.3](https://github.com/laurent22/joplin/releases/tag/v1.1.3) (p) | 2020-09-17T10:30:37Z | 583 | 162 | 470 | 1,215 |
| [v1.1.2](https://github.com/laurent22/joplin/releases/tag/v1.1.2) (p) | 2020-09-15T12:58:38Z | 392 | 128 | 258 | 778 |
| [v1.1.1](https://github.com/laurent22/joplin/releases/tag/v1.1.1) (p) | 2020-09-11T23:32:47Z | 546 | 209 | 357 | 1,112 |
| [v1.0.245](https://github.com/laurent22/joplin/releases/tag/v1.0.245) | 2020-09-09T12:56:10Z | 22,510 | 10,026 | 5,654 | 38,190 |
| [v1.0.242](https://github.com/laurent22/joplin/releases/tag/v1.0.242) | 2020-09-04T22:00:34Z | 12,853 | 6,435 | 3,029 | 22,317 |
| [v1.0.241](https://github.com/laurent22/joplin/releases/tag/v1.0.241) | 2020-09-04T18:06:00Z | 26,364 | 5,953 | 5,123 | 37,440 |
| [v1.0.239](https://github.com/laurent22/joplin/releases/tag/v1.0.239) (p) | 2020-09-01T21:56:36Z | 937 | 240 | 409 | 1,586 |
| [v1.0.237](https://github.com/laurent22/joplin/releases/tag/v1.0.237) (p) | 2020-08-29T15:38:04Z | 603 | 938 | 347 | 1,888 |
| [v1.0.236](https://github.com/laurent22/joplin/releases/tag/v1.0.236) (p) | 2020-08-28T09:16:54Z | 328 | 125 | 112 | 565 |
| [v1.0.235](https://github.com/laurent22/joplin/releases/tag/v1.0.235) (p) | 2020-08-18T22:08:01Z | 2,011 | 504 | 930 | 3,445 |
| [v1.0.234](https://github.com/laurent22/joplin/releases/tag/v1.0.234) (p) | 2020-08-17T23:13:02Z | 635 | 139 | 109 | 883 |
| [v1.0.233](https://github.com/laurent22/joplin/releases/tag/v1.0.233) | 2020-08-01T14:51:15Z | 46,050 | 18,214 | 12,369 | 76,633 |
| [v1.0.232](https://github.com/laurent22/joplin/releases/tag/v1.0.232) (p) | 2020-07-28T22:34:40Z | 668 | 237 | 188 | 1,093 |
| [v1.0.227](https://github.com/laurent22/joplin/releases/tag/v1.0.227) | 2020-07-07T20:44:54Z | 41,390 | 15,296 | 9,649 | 66,335 |
| [v1.0.226](https://github.com/laurent22/joplin/releases/tag/v1.0.226) (p) | 2020-07-04T10:21:26Z | 4,936 | 2,267 | 696 | 7,899 |
| [v1.0.224](https://github.com/laurent22/joplin/releases/tag/v1.0.224) | 2020-06-20T22:26:08Z | 25,029 | 11,021 | 6,016 | 42,066 |
| [v1.0.223](https://github.com/laurent22/joplin/releases/tag/v1.0.223) (p) | 2020-06-20T11:51:27Z | 201 | 128 | 87 | 416 |
| [v1.0.221](https://github.com/laurent22/joplin/releases/tag/v1.0.221) (p) | 2020-06-20T01:44:20Z | 870 | 221 | 221 | 1,312 |
| [v1.0.220](https://github.com/laurent22/joplin/releases/tag/v1.0.220) | 2020-06-13T18:26:22Z | 32,727 | 9,939 | 6,426 | 49,092 |
| [v1.0.218](https://github.com/laurent22/joplin/releases/tag/v1.0.218) | 2020-06-07T10:43:34Z | 14,580 | 6,988 | 3,135 | 24,703 |
| [v1.0.217](https://github.com/laurent22/joplin/releases/tag/v1.0.217) (p) | 2020-06-06T15:17:27Z | 240 | 109 | 66 | 415 |
| [v1.0.216](https://github.com/laurent22/joplin/releases/tag/v1.0.216) | 2020-05-24T14:21:01Z | 39,818 | 14,318 | 10,194 | 64,330 |
| [v1.0.214](https://github.com/laurent22/joplin/releases/tag/v1.0.214) (p) | 2020-05-21T17:15:15Z | 6,794 | 3,483 | 774 | 11,051 |
| [v1.0.212](https://github.com/laurent22/joplin/releases/tag/v1.0.212) (p) | 2020-05-21T07:48:39Z | 226 | 83 | 58 | 367 |
| [v1.0.211](https://github.com/laurent22/joplin/releases/tag/v1.0.211) (p) | 2020-05-20T08:59:16Z | 315 | 147 | 98 | 560 |
| [v1.0.209](https://github.com/laurent22/joplin/releases/tag/v1.0.209) (p) | 2020-05-17T18:32:51Z | 1,407 | 867 | 157 | 2,431 |
| [v1.0.207](https://github.com/laurent22/joplin/releases/tag/v1.0.207) (p) | 2020-05-10T16:37:35Z | 1,211 | 278 | 1,027 | 2,516 |
| [v1.0.201](https://github.com/laurent22/joplin/releases/tag/v1.0.201) | 2020-04-15T22:55:13Z | 54,275 | 20,065 | 18,192 | 92,532 |
| [v1.0.200](https://github.com/laurent22/joplin/releases/tag/v1.0.200) | 2020-04-12T12:17:46Z | 9,584 | 4,904 | 1,912 | 16,400 |
| [v1.0.199](https://github.com/laurent22/joplin/releases/tag/v1.0.199) | 2020-04-10T18:41:58Z | 19,653 | 5,901 | 3,804 | 29,358 |
| [v1.0.197](https://github.com/laurent22/joplin/releases/tag/v1.0.197) | 2020-03-30T17:21:22Z | 23,229 | 9,775 | 6,302 | 39,306 |
| [v1.0.195](https://github.com/laurent22/joplin/releases/tag/v1.0.195) | 2020-03-22T19:56:12Z | 19,122 | 7,964 | 4,515 | 31,601 |
| [v1.0.194](https://github.com/laurent22/joplin/releases/tag/v1.0.194) (p) | 2020-03-14T00:00:32Z | 1,297 | 1,399 | 527 | 3,223 |
| [v1.0.193](https://github.com/laurent22/joplin/releases/tag/v1.0.193) | 2020-03-08T08:58:53Z | 28,756 | 10,932 | 7,426 | 47,114 |
| [v1.0.192](https://github.com/laurent22/joplin/releases/tag/v1.0.192) (p) | 2020-03-06T23:27:52Z | 493 | 136 | 99 | 728 |
| [v1.0.190](https://github.com/laurent22/joplin/releases/tag/v1.0.190) (p) | 2020-03-06T01:22:22Z | 398 | 104 | 94 | 596 |
| [v1.0.189](https://github.com/laurent22/joplin/releases/tag/v1.0.189) (p) | 2020-03-04T17:27:15Z | 366 | 110 | 106 | 582 |
| [v1.0.187](https://github.com/laurent22/joplin/releases/tag/v1.0.187) (p) | 2020-03-01T12:31:06Z | 937 | 247 | 283 | 1,467 |
| [v1.0.179](https://github.com/laurent22/joplin/releases/tag/v1.0.179) | 2020-01-24T22:42:41Z | 71,485 | 28,859 | 22,570 | 122,914 |
| [v1.0.178](https://github.com/laurent22/joplin/releases/tag/v1.0.178) | 2020-01-20T19:06:45Z | 17,616 | 5,977 | 2,601 | 26,194 |
| [v1.0.177](https://github.com/laurent22/joplin/releases/tag/v1.0.177) (p) | 2019-12-30T14:40:40Z | 1,967 | 452 | 720 | 3,139 |
| [v1.0.176](https://github.com/laurent22/joplin/releases/tag/v1.0.176) (p) | 2019-12-14T10:36:44Z | 3,136 | 2,549 | 479 | 6,164 |
| [v1.0.175](https://github.com/laurent22/joplin/releases/tag/v1.0.175) | 2019-12-08T11:48:47Z | 73,545 | 16,978 | 16,592 | 107,115 |
| [v1.0.174](https://github.com/laurent22/joplin/releases/tag/v1.0.174) | 2019-11-12T18:20:58Z | 30,616 | 11,761 | 8,236 | 50,613 |
| [v1.0.173](https://github.com/laurent22/joplin/releases/tag/v1.0.173) | 2019-11-11T08:33:35Z | 5,115 | 2,093 | 756 | 7,964 |
| [v1.0.170](https://github.com/laurent22/joplin/releases/tag/v1.0.170) | 2019-10-13T22:13:04Z | 27,709 | 8,789 | 7,696 | 44,194 |
| [v1.0.169](https://github.com/laurent22/joplin/releases/tag/v1.0.169) | 2019-09-27T18:35:13Z | 17,193 | 5,934 | 3,762 | 26,889 |
| [v1.0.168](https://github.com/laurent22/joplin/releases/tag/v1.0.168) | 2019-09-25T21:21:38Z | 5,349 | 2,287 | 727 | 8,363 |
| [v1.0.167](https://github.com/laurent22/joplin/releases/tag/v1.0.167) | 2019-09-10T08:48:37Z | 16,866 | 5,719 | 3,713 | 26,298 |
| [v1.0.166](https://github.com/laurent22/joplin/releases/tag/v1.0.166) | 2019-09-09T17:35:54Z | 1,974 | 574 | 244 | 2,792 |
| [v1.0.165](https://github.com/laurent22/joplin/releases/tag/v1.0.165) | 2019-08-14T21:46:29Z | 19,061 | 6,995 | 5,475 | 31,531 |
| [v1.0.161](https://github.com/laurent22/joplin/releases/tag/v1.0.161) | 2019-07-13T18:30:00Z | 19,335 | 6,364 | 4,145 | 29,844 |
| [v1.0.160](https://github.com/laurent22/joplin/releases/tag/v1.0.160) | 2019-06-15T00:21:40Z | 30,707 | 7,769 | 8,116 | 46,592 |
| [v1.0.159](https://github.com/laurent22/joplin/releases/tag/v1.0.159) | 2019-06-08T00:00:19Z | 5,216 | 2,192 | 1,180 | 8,588 |
| [v1.0.158](https://github.com/laurent22/joplin/releases/tag/v1.0.158) | 2019-05-27T19:01:18Z | 9,841 | 3,561 | 1,945 | 15,347 |
| [v1.0.157](https://github.com/laurent22/joplin/releases/tag/v1.0.157) | 2019-05-26T17:55:53Z | 2,196 | 857 | 300 | 3,353 |
| [v1.0.153](https://github.com/laurent22/joplin/releases/tag/v1.0.153) (p) | 2019-05-15T06:27:29Z | 865 | 117 | 115 | 1,097 |
| [v1.0.152](https://github.com/laurent22/joplin/releases/tag/v1.0.152) | 2019-05-13T09:08:07Z | 13,895 | 4,447 | 4,069 | 22,411 |
| [v1.0.151](https://github.com/laurent22/joplin/releases/tag/v1.0.151) | 2019-05-12T15:14:32Z | 1,971 | 549 | 967 | 3,487 |
| [v1.0.150](https://github.com/laurent22/joplin/releases/tag/v1.0.150) | 2019-05-12T11:27:48Z | 441 | 149 | 80 | 670 |
| [v1.0.148](https://github.com/laurent22/joplin/releases/tag/v1.0.148) (p) | 2019-05-08T19:12:24Z | 142 | 70 | 103 | 315 |
| [v1.0.145](https://github.com/laurent22/joplin/releases/tag/v1.0.145) | 2019-05-03T09:16:53Z | 7,025 | 2,874 | 1,447 | 11,346 |
| [v1.0.143](https://github.com/laurent22/joplin/releases/tag/v1.0.143) | 2019-04-22T10:51:38Z | 11,935 | 3,565 | 2,791 | 18,291 |
| [v1.0.142](https://github.com/laurent22/joplin/releases/tag/v1.0.142) | 2019-04-02T16:44:51Z | 14,781 | 4,582 | 4,740 | 24,103 |
| [v1.0.140](https://github.com/laurent22/joplin/releases/tag/v1.0.140) | 2019-03-10T20:59:58Z | 13,656 | 4,185 | 3,387 | 21,228 |
| [v1.0.139](https://github.com/laurent22/joplin/releases/tag/v1.0.139) (p) | 2019-03-09T10:06:48Z | 136 | 79 | 56 | 271 |
| [v1.0.138](https://github.com/laurent22/joplin/releases/tag/v1.0.138) (p) | 2019-03-03T17:23:00Z | 166 | 103 | 92 | 361 |
| [v1.0.137](https://github.com/laurent22/joplin/releases/tag/v1.0.137) (p) | 2019-03-03T01:12:51Z | 603 | 71 | 93 | 767 |
| [v1.0.135](https://github.com/laurent22/joplin/releases/tag/v1.0.135) | 2019-02-27T23:36:57Z | 12,646 | 3,972 | 4,089 | 20,707 |
| [v1.0.134](https://github.com/laurent22/joplin/releases/tag/v1.0.134) | 2019-02-27T10:21:44Z | 1,484 | 582 | 227 | 2,293 |
| [v1.0.132](https://github.com/laurent22/joplin/releases/tag/v1.0.132) | 2019-02-26T23:02:05Z | 1,104 | 467 | 104 | 1,675 |
| [v1.0.127](https://github.com/laurent22/joplin/releases/tag/v1.0.127) | 2019-02-14T23:12:48Z | 9,907 | 3,186 | 2,940 | 16,033 |
| [v1.0.126](https://github.com/laurent22/joplin/releases/tag/v1.0.126) (p) | 2019-02-09T19:46:16Z | 947 | 86 | 124 | 1,157 |
| [v1.0.125](https://github.com/laurent22/joplin/releases/tag/v1.0.125) | 2019-01-26T18:14:33Z | 10,310 | 3,571 | 1,712 | 15,593 |
| [v1.0.120](https://github.com/laurent22/joplin/releases/tag/v1.0.120) | 2019-01-10T21:42:53Z | 15,635 | 5,221 | 6,528 | 27,384 |
| [v1.0.119](https://github.com/laurent22/joplin/releases/tag/v1.0.119) | 2018-12-18T12:40:22Z | 8,933 | 3,276 | 2,024 | 14,233 |
| [v1.0.118](https://github.com/laurent22/joplin/releases/tag/v1.0.118) | 2019-01-11T08:34:13Z | 732 | 261 | 98 | 1,091 |
| [v1.0.117](https://github.com/laurent22/joplin/releases/tag/v1.0.117) | 2018-11-24T12:05:24Z | 16,279 | 4,911 | 6,391 | 27,581 |
| [v1.0.116](https://github.com/laurent22/joplin/releases/tag/v1.0.116) | 2018-11-20T19:09:24Z | 3,972 | 1,137 | 723 | 5,832 |
| [v1.0.115](https://github.com/laurent22/joplin/releases/tag/v1.0.115) | 2018-11-16T16:52:02Z | 3,671 | 1,317 | 810 | 5,798 |
| [v1.0.114](https://github.com/laurent22/joplin/releases/tag/v1.0.114) | 2018-10-24T20:14:10Z | 11,411 | 3,515 | 3,839 | 18,765 |
| [v1.0.111](https://github.com/laurent22/joplin/releases/tag/v1.0.111) | 2018-09-30T20:15:09Z | 12,215 | 3,383 | 3,691 | 19,289 |
| [v1.0.110](https://github.com/laurent22/joplin/releases/tag/v1.0.110) | 2018-09-29T12:29:21Z | 976 | 424 | 128 | 1,528 |
| [v1.0.109](https://github.com/laurent22/joplin/releases/tag/v1.0.109) | 2018-09-27T18:01:41Z | 2,118 | 719 | 340 | 3,177 |
| [v1.0.108](https://github.com/laurent22/joplin/releases/tag/v1.0.108) (p) | 2018-09-29T18:49:29Z | 42 | 36 | 25 | 103 |
| [v1.0.107](https://github.com/laurent22/joplin/releases/tag/v1.0.107) | 2018-09-16T19:51:07Z | 7,167 | 2,150 | 1,719 | 11,036 |
| [v1.0.106](https://github.com/laurent22/joplin/releases/tag/v1.0.106) | 2018-09-08T15:23:40Z | 4,573 | 1,471 | 327 | 6,371 |
| [v1.0.105](https://github.com/laurent22/joplin/releases/tag/v1.0.105) | 2018-09-05T11:29:36Z | 4,672 | 1,607 | 1,468 | 7,747 |
| [v1.0.104](https://github.com/laurent22/joplin/releases/tag/v1.0.104) | 2018-06-28T20:25:36Z | 15,089 | 4,717 | 7,375 | 27,181 |
| [v1.0.103](https://github.com/laurent22/joplin/releases/tag/v1.0.103) | 2018-06-21T19:38:13Z | 2,069 | 902 | 688 | 3,659 |
| [v1.0.101](https://github.com/laurent22/joplin/releases/tag/v1.0.101) | 2018-06-17T18:35:11Z | 1,325 | 622 | 419 | 2,366 |
| [v1.0.100](https://github.com/laurent22/joplin/releases/tag/v1.0.100) | 2018-06-14T17:41:43Z | 901 | 447 | 254 | 1,602 |
| [v1.0.99](https://github.com/laurent22/joplin/releases/tag/v1.0.99) | 2018-06-10T13:18:23Z | 1,270 | 612 | 390 | 2,272 |
| [v1.0.97](https://github.com/laurent22/joplin/releases/tag/v1.0.97) | 2018-06-09T19:23:34Z | 328 | 170 | 69 | 567 |
| [v1.0.96](https://github.com/laurent22/joplin/releases/tag/v1.0.96) | 2018-05-26T16:36:39Z | 2,739 | 1,239 | 1,713 | 5,691 |
| [v1.0.95](https://github.com/laurent22/joplin/releases/tag/v1.0.95) | 2018-05-25T13:04:30Z | 434 | 233 | 135 | 802 |
| [v1.0.94](https://github.com/laurent22/joplin/releases/tag/v1.0.94) | 2018-05-21T20:52:59Z | 1,147 | 601 | 412 | 2,160 |
| [v1.0.93](https://github.com/laurent22/joplin/releases/tag/v1.0.93) | 2018-05-14T11:36:01Z | 1,806 | 1,278 | 773 | 3,857 |
| [v1.0.91](https://github.com/laurent22/joplin/releases/tag/v1.0.91) | 2018-05-10T14:48:04Z | 836 | 567 | 324 | 1,727 |
| [v1.0.89](https://github.com/laurent22/joplin/releases/tag/v1.0.89) | 2018-05-09T13:05:05Z | 510 | 249 | 128 | 887 |
| [v1.0.85](https://github.com/laurent22/joplin/releases/tag/v1.0.85) | 2018-05-01T21:08:24Z | 1,663 | 967 | 649 | 3,279 |
| [v1.0.83](https://github.com/laurent22/joplin/releases/tag/v1.0.83) | 2018-04-04T19:43:58Z | 5,483 | 2,548 | 2,672 | 10,703 |
| [v1.0.82](https://github.com/laurent22/joplin/releases/tag/v1.0.82) | 2018-03-31T19:16:31Z | 712 | 421 | 136 | 1,269 |
| [v1.0.81](https://github.com/laurent22/joplin/releases/tag/v1.0.81) | 2018-03-28T08:13:58Z | 1,009 | 612 | 797 | 2,418 |
| [v1.0.79](https://github.com/laurent22/joplin/releases/tag/v1.0.79) | 2018-03-23T18:00:11Z | 938 | 554 | 398 | 1,890 |
| [v1.0.78](https://github.com/laurent22/joplin/releases/tag/v1.0.78) | 2018-03-17T15:27:18Z | 1,319 | 911 | 885 | 3,115 |
| [v1.0.77](https://github.com/laurent22/joplin/releases/tag/v1.0.77) | 2018-03-16T15:12:35Z | 186 | 119 | 59 | 364 |
| [v1.0.72](https://github.com/laurent22/joplin/releases/tag/v1.0.72) | 2018-03-14T09:44:35Z | 418 | 272 | 69 | 759 |
| [v1.0.70](https://github.com/laurent22/joplin/releases/tag/v1.0.70) | 2018-02-28T20:04:30Z | 1,868 | 1,067 | 1,267 | 4,202 |
| [v1.0.67](https://github.com/laurent22/joplin/releases/tag/v1.0.67) | 2018-02-19T22:51:08Z | 1,829 | 619 | 0 | 2,448 |
| [v1.0.66](https://github.com/laurent22/joplin/releases/tag/v1.0.66) | 2018-02-18T23:09:09Z | 342 | 149 | 94 | 585 |
| [v1.0.65](https://github.com/laurent22/joplin/releases/tag/v1.0.65) | 2018-02-17T20:02:25Z | 205 | 143 | 141 | 489 |
| [v1.0.64](https://github.com/laurent22/joplin/releases/tag/v1.0.64) | 2018-02-16T00:58:20Z | 1,096 | 557 | 1,132 | 2,785 |
| [v1.0.63](https://github.com/laurent22/joplin/releases/tag/v1.0.63) | 2018-02-14T19:40:36Z | 315 | 173 | 100 | 588 |
| [v1.0.62](https://github.com/laurent22/joplin/releases/tag/v1.0.62) | 2018-02-12T20:19:58Z | 579 | 316 | 380 | 1,275 |
| [v0.10.61](https://github.com/laurent22/joplin/releases/tag/v0.10.61) | 2018-02-08T18:27:39Z | 987 | 649 | 971 | 2,607 |
| [v0.10.60](https://github.com/laurent22/joplin/releases/tag/v0.10.60) | 2018-02-06T13:09:56Z | 732 | 535 | 560 | 1,827 |
| [v0.10.54](https://github.com/laurent22/joplin/releases/tag/v0.10.54) | 2018-01-31T20:21:30Z | 1,834 | 1,474 | 332 | 3,640 |
| [v0.10.52](https://github.com/laurent22/joplin/releases/tag/v0.10.52) | 2018-01-31T19:25:18Z | 59 | 649 | 25 | 733 |
| [v0.10.51](https://github.com/laurent22/joplin/releases/tag/v0.10.51) | 2018-01-28T18:47:02Z | 1,340 | 1,615 | 336 | 3,291 |
| [v0.10.48](https://github.com/laurent22/joplin/releases/tag/v0.10.48) | 2018-01-23T11:19:51Z | 1,976 | 1,767 | 41 | 3,784 |
| [v0.10.47](https://github.com/laurent22/joplin/releases/tag/v0.10.47) | 2018-01-16T17:27:17Z | 1,242 | 1,287 | 75 | 2,604 |
| [v0.10.43](https://github.com/laurent22/joplin/releases/tag/v0.10.43) | 2018-01-08T10:12:10Z | 3,450 | 2,371 | 1,218 | 7,039 |
| [v0.10.41](https://github.com/laurent22/joplin/releases/tag/v0.10.41) | 2018-01-05T20:38:12Z | 1,054 | 1,570 | 251 | 2,875 |
| [v0.10.40](https://github.com/laurent22/joplin/releases/tag/v0.10.40) | 2018-01-02T23:16:57Z | 1,603 | 1,801 | 346 | 3,750 |
| [v0.10.39](https://github.com/laurent22/joplin/releases/tag/v0.10.39) | 2017-12-11T21:19:44Z | 5,939 | 4,406 | 3,298 | 13,643 |
| [v0.10.38](https://github.com/laurent22/joplin/releases/tag/v0.10.38) | 2017-12-08T10:12:06Z | 1,057 | 1,247 | 316 | 2,620 |
| [v0.10.37](https://github.com/laurent22/joplin/releases/tag/v0.10.37) | 2017-12-07T19:38:05Z | 275 | 865 | 93 | 1,233 |
| [v0.10.36](https://github.com/laurent22/joplin/releases/tag/v0.10.36) | 2017-12-05T09:34:40Z | 1,026 | 1,374 | 448 | 2,848 |
| [v0.10.35](https://github.com/laurent22/joplin/releases/tag/v0.10.35) | 2017-12-02T15:56:08Z | 1,587 | 1,565 | 754 | 3,906 |
| [v0.10.34](https://github.com/laurent22/joplin/releases/tag/v0.10.34) | 2017-12-02T14:50:28Z | 101 | 689 | 70 | 860 |
| [v0.10.33](https://github.com/laurent22/joplin/releases/tag/v0.10.33) | 2017-12-02T13:20:39Z | 71 | 680 | 36 | 787 |
| [v0.10.31](https://github.com/laurent22/joplin/releases/tag/v0.10.31) | 2017-12-01T09:56:44Z | 902 | 1,472 | 418 | 2,792 |
| [v0.10.30](https://github.com/laurent22/joplin/releases/tag/v0.10.30) | 2017-11-30T20:28:16Z | 737 | 1,395 | 436 | 2,568 |
| [v0.10.28](https://github.com/laurent22/joplin/releases/tag/v0.10.28) | 2017-11-30T01:07:46Z | 1,371 | 1,732 | 890 | 3,993 |
| [v0.10.26](https://github.com/laurent22/joplin/releases/tag/v0.10.26) | 2017-11-29T16:02:17Z | 206 | 729 | 275 | 1,210 |
| [v0.10.25](https://github.com/laurent22/joplin/releases/tag/v0.10.25) | 2017-11-24T14:27:49Z | 162 | 724 | 6,665 | 7,551 |
| [v0.10.23](https://github.com/laurent22/joplin/releases/tag/v0.10.23) | 2017-11-21T19:38:41Z | 151 | 689 | 49 | 889 |
| [v0.10.22](https://github.com/laurent22/joplin/releases/tag/v0.10.22) | 2017-11-20T21:45:57Z | 101 | 676 | 35 | 812 |
| [v0.10.21](https://github.com/laurent22/joplin/releases/tag/v0.10.21) | 2017-11-18T00:53:15Z | 67 | 668 | 30 | 765 |
| [v0.10.20](https://github.com/laurent22/joplin/releases/tag/v0.10.20) | 2017-11-17T17:18:25Z | 56 | 679 | 39 | 774 |
| [v0.10.19](https://github.com/laurent22/joplin/releases/tag/v0.10.19) | 2017-11-20T18:59:48Z | 49 | 678 | 36 | 763 |
| [v2.12.10](https://github.com/laurent22/joplin/releases/tag/v2.12.10) (p) | 2023-07-30T18:25:58Z | 3,358 | 2,778 | 237 | 6,373 |
| [v2.12.9](https://github.com/laurent22/joplin/releases/tag/v2.12.9) (p) | 2023-07-25T16:06:08Z | 971 | 324 | 298 | 1,593 |
| [v2.12.7](https://github.com/laurent22/joplin/releases/tag/v2.12.7) (p) | 2023-07-13T12:55:31Z | 1,806 | 594 | 550 | 2,950 |
| [v2.12.5](https://github.com/laurent22/joplin/releases/tag/v2.12.5) (p) | 2023-07-12T15:03:46Z | 481 | 116 | 97 | 694 |
| [v2.12.4](https://github.com/laurent22/joplin/releases/tag/v2.12.4) (p) | 2023-07-07T22:36:53Z | 1,000 | 398 | 198 | 1,596 |
| [v2.12.3](https://github.com/laurent22/joplin/releases/tag/v2.12.3) (p) | 2023-07-07T10:16:55Z | 314 | 153 | 68 | 535 |
| [v2.11.11](https://github.com/laurent22/joplin/releases/tag/v2.11.11) | 2023-06-23T15:16:37Z | 119,234 | 48,292 | 22,400 | 189,926 |
| [v2.11.9](https://github.com/laurent22/joplin/releases/tag/v2.11.9) (p) | 2023-06-06T16:23:27Z | 2,259 | 563 | 732 | 3,554 |
| [v2.11.6](https://github.com/laurent22/joplin/releases/tag/v2.11.6) (p) | 2023-05-31T20:13:08Z | 1,123 | 423 | 329 | 1,875 |
| [v2.11.5](https://github.com/laurent22/joplin/releases/tag/v2.11.5) (p) | 2023-05-28T00:41:40Z | 984 | 293 | 269 | 1,546 |
| [v2.10.19](https://github.com/laurent22/joplin/releases/tag/v2.10.19) | 2023-05-17T12:25:41Z | 119,616 | 48,216 | 22,350 | 190,182 |
| [v2.11.4](https://github.com/laurent22/joplin/releases/tag/v2.11.4) (p) | 2023-05-16T10:02:21Z | 1,055 | 458 | 399 | 1,912 |
| [v2.11.3](https://github.com/laurent22/joplin/releases/tag/v2.11.3) (p) | 2023-05-16T09:09:57Z | 74 | 31 | 29 | 134 |
| [v2.10.18](https://github.com/laurent22/joplin/releases/tag/v2.10.18) | 2023-05-09T13:27:43Z | 53,918 | 24,205 | 6,712 | 84,835 |
| [v2.10.17](https://github.com/laurent22/joplin/releases/tag/v2.10.17) | 2023-05-08T17:27:28Z | 16,997 | 11,487 | 869 | 29,353 |
| [v2.10.16](https://github.com/laurent22/joplin/releases/tag/v2.10.16) | 2023-04-27T09:27:45Z | 7,719 | 4,225 | 766 | 12,710 |
| [v2.10.15](https://github.com/laurent22/joplin/releases/tag/v2.10.15) (p) | 2023-04-26T22:02:16Z | 349 | 129 | 50 | 528 |
| [v2.10.13](https://github.com/laurent22/joplin/releases/tag/v2.10.13) (p) | 2023-04-03T16:53:46Z | 3,430 | 819 | 1,071 | 5,320 |
| [v2.10.12](https://github.com/laurent22/joplin/releases/tag/v2.10.12) (p) | 2023-03-23T12:17:13Z | 2,402 | 511 | 598 | 3,511 |
| [v2.10.11](https://github.com/laurent22/joplin/releases/tag/v2.10.11) (p) | 2023-03-17T10:54:02Z | 1,779 | 376 | 376 | 2,531 |
| [v2.10.10](https://github.com/laurent22/joplin/releases/tag/v2.10.10) (p) | 2023-03-13T23:16:37Z | 1,273 | 270 | 247 | 1,790 |
| [v2.10.9](https://github.com/laurent22/joplin/releases/tag/v2.10.9) (p) | 2023-03-12T16:16:45Z | 814 | 208 | 284 | 1,306 |
| [v2.10.8](https://github.com/laurent22/joplin/releases/tag/v2.10.8) (p) | 2023-02-26T12:53:55Z | 3,282 | 568 | 864 | 4,714 |
| [v2.10.7](https://github.com/laurent22/joplin/releases/tag/v2.10.7) (p) | 2023-02-24T10:56:20Z | 947 | 184 | 271 | 1,402 |
| [v2.10.6](https://github.com/laurent22/joplin/releases/tag/v2.10.6) (p) | 2023-02-20T14:00:05Z | 1,761 | 333 | 280 | 2,374 |
| [v2.10.5](https://github.com/laurent22/joplin/releases/tag/v2.10.5) | 2023-01-16T15:00:53Z | 253 | 66 | 271 | 590 |
| [v2.10.4](https://github.com/laurent22/joplin/releases/tag/v2.10.4) (p) | 2023-01-05T13:09:20Z | 6,956 | 1,283 | 1,782 | 10,021 |
| [v2.10.3](https://github.com/laurent22/joplin/releases/tag/v2.10.3) (p) | 2022-12-31T15:53:23Z | 1,545 | 306 | 383 | 2,234 |
| [v2.10.2](https://github.com/laurent22/joplin/releases/tag/v2.10.2) (p) | 2022-12-18T18:05:08Z | 2,958 | 560 | 615 | 4,133 |
| [v2.9.17](https://github.com/laurent22/joplin/releases/tag/v2.9.17) | 2022-11-15T10:28:37Z | 332,422 | 108,686 | 83,145 | 524,253 |
| [v2.9.12](https://github.com/laurent22/joplin/releases/tag/v2.9.12) (p) | 2022-11-01T17:06:05Z | 10,156 | 602 | 530 | 11,288 |
| [v2.9.11](https://github.com/laurent22/joplin/releases/tag/v2.9.11) (p) | 2022-10-23T16:09:58Z | 2,309 | 521 | 705 | 3,535 |
| [v2.9.4](https://github.com/laurent22/joplin/releases/tag/v2.9.4) (p) | 2022-08-18T16:52:26Z | 7,351 | 1,854 | 2,181 | 11,386 |
| [v2.9.3](https://github.com/laurent22/joplin/releases/tag/v2.9.3) (p) | 2022-08-18T13:11:09Z | 321 | 83 | 260 | 664 |
| [v2.9.2](https://github.com/laurent22/joplin/releases/tag/v2.9.2) (p) | 2022-08-12T18:12:12Z | 1,503 | 440 | 0 | 1,943 |
| [v2.9.1](https://github.com/laurent22/joplin/releases/tag/v2.9.1) (p) | 2022-07-11T09:59:32Z | 6,769 | 1,332 | 1,388 | 9,489 |
| [v2.8.8](https://github.com/laurent22/joplin/releases/tag/v2.8.8) | 2022-05-17T14:48:06Z | 347,510 | 113,887 | 113,421 | 574,818 |
| [v2.8.7](https://github.com/laurent22/joplin/releases/tag/v2.8.7) (p) | 2022-05-06T11:34:27Z | 3,067 | 356 | 385 | 3,808 |
| [v2.8.6](https://github.com/laurent22/joplin/releases/tag/v2.8.6) (p) | 2022-05-03T10:08:25Z | 2,697 | 394 | 318 | 3,409 |
| [v2.8.5](https://github.com/laurent22/joplin/releases/tag/v2.8.5) (p) | 2022-04-27T13:51:50Z | 2,750 | 353 | 334 | 3,437 |
| [v2.8.4](https://github.com/laurent22/joplin/releases/tag/v2.8.4) (p) | 2022-04-19T18:00:09Z | 3,255 | 581 | 317 | 4,153 |
| [v2.8.2](https://github.com/laurent22/joplin/releases/tag/v2.8.2) (p) | 2022-04-14T11:35:45Z | 2,667 | 270 | 252 | 3,189 |
| [v2.7.15](https://github.com/laurent22/joplin/releases/tag/v2.7.15) | 2022-03-17T13:03:23Z | 154,330 | 56,708 | 51,211 | 262,249 |
| [v2.7.14](https://github.com/laurent22/joplin/releases/tag/v2.7.14) | 2022-02-27T11:30:53Z | 33,045 | 16,767 | 4,786 | 54,598 |
| [v2.7.13](https://github.com/laurent22/joplin/releases/tag/v2.7.13) | 2022-02-24T17:42:12Z | 53,454 | 25,714 | 11,697 | 90,865 |
| [v2.7.12](https://github.com/laurent22/joplin/releases/tag/v2.7.12) (p) | 2022-02-14T15:06:14Z | 3,431 | 456 | 450 | 4,337 |
| [v2.7.11](https://github.com/laurent22/joplin/releases/tag/v2.7.11) (p) | 2022-02-12T13:00:02Z | 2,560 | 189 | 153 | 2,902 |
| [v2.7.10](https://github.com/laurent22/joplin/releases/tag/v2.7.10) (p) | 2022-02-11T18:19:09Z | 2,093 | 118 | 75 | 2,286 |
| [v2.7.8](https://github.com/laurent22/joplin/releases/tag/v2.7.8) (p) | 2022-01-19T09:35:27Z | 4,331 | 762 | 814 | 5,907 |
| [v2.7.7](https://github.com/laurent22/joplin/releases/tag/v2.7.7) (p) | 2022-01-18T14:05:07Z | 2,395 | 149 | 126 | 2,670 |
| [v2.7.6](https://github.com/laurent22/joplin/releases/tag/v2.7.6) (p) | 2022-01-17T17:08:28Z | 2,359 | 175 | 106 | 2,640 |
| [v2.6.10](https://github.com/laurent22/joplin/releases/tag/v2.6.10) | 2021-12-19T11:31:16Z | 133,684 | 51,179 | 49,244 | 234,107 |
| [v2.6.9](https://github.com/laurent22/joplin/releases/tag/v2.6.9) | 2021-12-17T11:57:32Z | 17,495 | 9,485 | 3,176 | 30,156 |
| [v2.6.7](https://github.com/laurent22/joplin/releases/tag/v2.6.7) (p) | 2021-12-16T10:47:23Z | 2,540 | 157 | 94 | 2,791 |
| [v2.6.6](https://github.com/laurent22/joplin/releases/tag/v2.6.6) (p) | 2021-12-13T12:31:43Z | 2,560 | 250 | 158 | 2,968 |
| [v2.6.5](https://github.com/laurent22/joplin/releases/tag/v2.6.5) (p) | 2021-12-13T10:07:04Z | 1,885 | 45 | 24 | 1,954 |
| [v2.6.4](https://github.com/laurent22/joplin/releases/tag/v2.6.4) (p) | 2021-12-09T19:53:43Z | 2,607 | 282 | 193 | 3,082 |
| [v2.6.2](https://github.com/laurent22/joplin/releases/tag/v2.6.2) (p) | 2021-11-18T12:19:12Z | 4,401 | 785 | 694 | 5,880 |
| [v2.5.12](https://github.com/laurent22/joplin/releases/tag/v2.5.12) | 2021-11-08T11:07:11Z | 80,885 | 32,493 | 25,206 | 138,584 |
| [v2.5.10](https://github.com/laurent22/joplin/releases/tag/v2.5.10) | 2021-11-01T08:22:42Z | 45,633 | 19,023 | 10,066 | 74,722 |
| [v2.5.8](https://github.com/laurent22/joplin/releases/tag/v2.5.8) | 2021-10-31T11:38:03Z | 14,384 | 6,558 | 2,305 | 23,247 |
| [v2.5.7](https://github.com/laurent22/joplin/releases/tag/v2.5.7) (p) | 2021-10-29T14:47:33Z | 2,170 | 198 | 158 | 2,526 |
| [v2.5.6](https://github.com/laurent22/joplin/releases/tag/v2.5.6) (p) | 2021-10-28T22:03:09Z | 2,199 | 171 | 101 | 2,471 |
| [v2.5.4](https://github.com/laurent22/joplin/releases/tag/v2.5.4) (p) | 2021-10-19T10:10:54Z | 3,697 | 562 | 566 | 4,825 |
| [v2.4.12](https://github.com/laurent22/joplin/releases/tag/v2.4.12) | 2021-10-13T17:24:34Z | 45,430 | 19,967 | 9,774 | 75,171 |
| [v2.5.1](https://github.com/laurent22/joplin/releases/tag/v2.5.1) (p) | 2021-10-02T09:51:58Z | 4,685 | 897 | 938 | 6,520 |
| [v2.4.9](https://github.com/laurent22/joplin/releases/tag/v2.4.9) | 2021-09-29T19:08:58Z | 57,612 | 23,242 | 15,881 | 96,735 |
| [v2.4.8](https://github.com/laurent22/joplin/releases/tag/v2.4.8) (p) | 2021-09-22T19:01:46Z | 8,550 | 1,767 | 527 | 10,844 |
| [v2.4.7](https://github.com/laurent22/joplin/releases/tag/v2.4.7) (p) | 2021-09-19T12:53:22Z | 2,648 | 246 | 200 | 3,094 |
| [v2.4.6](https://github.com/laurent22/joplin/releases/tag/v2.4.6) (p) | 2021-09-09T18:57:17Z | 3,410 | 453 | 511 | 4,374 |
| [v2.4.5](https://github.com/laurent22/joplin/releases/tag/v2.4.5) (p) | 2021-09-06T18:03:28Z | 2,667 | 263 | 217 | 3,147 |
| [v2.4.4](https://github.com/laurent22/joplin/releases/tag/v2.4.4) (p) | 2021-08-30T16:02:51Z | 2,879 | 371 | 352 | 3,602 |
| [v2.4.3](https://github.com/laurent22/joplin/releases/tag/v2.4.3) (p) | 2021-08-28T15:27:32Z | 2,403 | 199 | 171 | 2,773 |
| [v2.4.2](https://github.com/laurent22/joplin/releases/tag/v2.4.2) (p) | 2021-08-27T17:13:21Z | 2,130 | 143 | 84 | 2,357 |
| [v2.4.1](https://github.com/laurent22/joplin/releases/tag/v2.4.1) (p) | 2021-08-21T11:52:30Z | 3,016 | 365 | 329 | 3,710 |
| [v2.3.5](https://github.com/laurent22/joplin/releases/tag/v2.3.5) | 2021-08-17T06:43:30Z | 83,116 | 31,404 | 33,114 | 147,634 |
| [v2.3.3](https://github.com/laurent22/joplin/releases/tag/v2.3.3) | 2021-08-14T09:19:40Z | 16,579 | 6,877 | 4,052 | 27,508 |
| [v2.2.7](https://github.com/laurent22/joplin/releases/tag/v2.2.7) | 2021-08-11T11:03:26Z | 16,653 | 7,514 | 2,589 | 26,756 |
| [v2.2.6](https://github.com/laurent22/joplin/releases/tag/v2.2.6) (p) | 2021-08-09T19:29:20Z | 9,384 | 4,613 | 951 | 14,948 |
| [v2.2.5](https://github.com/laurent22/joplin/releases/tag/v2.2.5) (p) | 2021-08-07T10:35:24Z | 2,752 | 271 | 200 | 3,223 |
| [v2.2.4](https://github.com/laurent22/joplin/releases/tag/v2.2.4) (p) | 2021-08-05T16:42:48Z | 2,417 | 201 | 126 | 2,744 |
| [v2.2.2](https://github.com/laurent22/joplin/releases/tag/v2.2.2) (p) | 2021-07-19T10:28:35Z | 4,307 | 730 | 640 | 5,677 |
| [v2.1.9](https://github.com/laurent22/joplin/releases/tag/v2.1.9) | 2021-07-19T10:28:43Z | 48,002 | 18,802 | 16,770 | 83,574 |
| [v2.2.1](https://github.com/laurent22/joplin/releases/tag/v2.2.1) (p) | 2021-07-09T17:38:25Z | 3,961 | 409 | 386 | 4,756 |
| [v2.1.8](https://github.com/laurent22/joplin/releases/tag/v2.1.8) | 2021-07-03T08:25:16Z | 31,781 | 12,192 | 12,723 | 56,696 |
| [v2.1.7](https://github.com/laurent22/joplin/releases/tag/v2.1.7) | 2021-06-26T19:48:55Z | 15,367 | 6,401 | 3,623 | 25,391 |
| [v2.1.5](https://github.com/laurent22/joplin/releases/tag/v2.1.5) (p) | 2021-06-23T15:08:52Z | 2,794 | 243 | 194 | 3,231 |
| [v2.1.3](https://github.com/laurent22/joplin/releases/tag/v2.1.3) (p) | 2021-06-19T16:32:51Z | 2,896 | 303 | 208 | 3,407 |
| [v2.0.11](https://github.com/laurent22/joplin/releases/tag/v2.0.11) | 2021-06-16T17:55:49Z | 25,096 | 9,266 | 9,853 | 44,215 |
| [v2.0.10](https://github.com/laurent22/joplin/releases/tag/v2.0.10) | 2021-06-16T07:58:29Z | 4,074 | 936 | 387 | 5,397 |
| [v2.0.9](https://github.com/laurent22/joplin/releases/tag/v2.0.9) (p) | 2021-06-12T09:30:30Z | 2,845 | 298 | 885 | 4,028 |
| [v2.0.8](https://github.com/laurent22/joplin/releases/tag/v2.0.8) (p) | 2021-06-10T16:15:08Z | 2,372 | 234 | 583 | 3,189 |
| [v2.0.4](https://github.com/laurent22/joplin/releases/tag/v2.0.4) (p) | 2021-06-02T12:54:17Z | 1,627 | 397 | 384 | 2,408 |
| [v2.0.2](https://github.com/laurent22/joplin/releases/tag/v2.0.2) (p) | 2021-05-21T18:07:48Z | 4,194 | 495 | 1,673 | 6,362 |
| [v2.0.1](https://github.com/laurent22/joplin/releases/tag/v2.0.1) (p) | 2021-05-15T13:22:58Z | 896 | 278 | 1,027 | 2,201 |
| [v1.8.5](https://github.com/laurent22/joplin/releases/tag/v1.8.5) | 2021-05-10T11:58:14Z | 39,741 | 16,284 | 19,416 | 75,441 |
| [v1.8.4](https://github.com/laurent22/joplin/releases/tag/v1.8.4) (p) | 2021-05-09T18:05:05Z | 2,335 | 144 | 464 | 2,943 |
| [v1.8.3](https://github.com/laurent22/joplin/releases/tag/v1.8.3) (p) | 2021-05-04T10:38:16Z | 3,337 | 314 | 944 | 4,595 |
| [v1.8.2](https://github.com/laurent22/joplin/releases/tag/v1.8.2) (p) | 2021-04-25T10:50:51Z | 3,623 | 443 | 1,292 | 5,358 |
| [v1.8.1](https://github.com/laurent22/joplin/releases/tag/v1.8.1) (p) | 2021-03-29T10:46:41Z | 4,655 | 833 | 2,458 | 7,946 |
| [v1.7.11](https://github.com/laurent22/joplin/releases/tag/v1.7.11) | 2021-02-03T12:50:01Z | 118,768 | 42,896 | 64,378 | 226,042 |
| [v1.7.10](https://github.com/laurent22/joplin/releases/tag/v1.7.10) | 2021-01-30T13:25:29Z | 14,318 | 4,870 | 4,505 | 23,693 |
| [v1.7.9](https://github.com/laurent22/joplin/releases/tag/v1.7.9) (p) | 2021-01-28T09:50:21Z | 518 | 141 | 506 | 1,165 |
| [v1.7.6](https://github.com/laurent22/joplin/releases/tag/v1.7.6) (p) | 2021-01-27T10:36:05Z | 332 | 101 | 296 | 729 |
| [v1.7.5](https://github.com/laurent22/joplin/releases/tag/v1.7.5) (p) | 2021-01-26T09:53:05Z | 425 | 213 | 462 | 1,100 |
| [v1.7.4](https://github.com/laurent22/joplin/releases/tag/v1.7.4) (p) | 2021-01-22T17:58:38Z | 711 | 212 | 633 | 1,556 |
| [v1.6.8](https://github.com/laurent22/joplin/releases/tag/v1.6.8) | 2021-01-20T18:11:34Z | 21,349 | 7,719 | 7,617 | 36,685 |
| [v1.7.3](https://github.com/laurent22/joplin/releases/tag/v1.7.3) (p) | 2021-01-20T11:23:50Z | 365 | 85 | 451 | 901 |
| [v1.6.7](https://github.com/laurent22/joplin/releases/tag/v1.6.7) | 2021-01-11T23:20:33Z | 13,086 | 4,655 | 4,561 | 22,302 |
| [v1.6.6](https://github.com/laurent22/joplin/releases/tag/v1.6.6) | 2021-01-09T16:15:31Z | 12,740 | 3,432 | 4,805 | 20,977 |
| [v1.6.5](https://github.com/laurent22/joplin/releases/tag/v1.6.5) (p) | 2021-01-09T01:24:32Z | 2,606 | 85 | 316 | 3,007 |
| [v1.6.4](https://github.com/laurent22/joplin/releases/tag/v1.6.4) (p) | 2021-01-07T19:11:32Z | 408 | 86 | 212 | 706 |
| [v1.6.2](https://github.com/laurent22/joplin/releases/tag/v1.6.2) (p) | 2021-01-04T22:34:55Z | 689 | 236 | 598 | 1,523 |
| [v1.5.14](https://github.com/laurent22/joplin/releases/tag/v1.5.14) | 2020-12-30T01:48:46Z | 13,569 | 5,223 | 5,539 | 24,331 |
| [v1.6.1](https://github.com/laurent22/joplin/releases/tag/v1.6.1) (p) | 2020-12-29T19:37:45Z | 187 | 46 | 176 | 409 |
| [v1.5.13](https://github.com/laurent22/joplin/releases/tag/v1.5.13) | 2020-12-29T18:29:15Z | 681 | 234 | 216 | 1,131 |
| [v1.5.12](https://github.com/laurent22/joplin/releases/tag/v1.5.12) | 2020-12-28T15:14:08Z | 2,453 | 1,787 | 933 | 5,173 |
| [v1.5.11](https://github.com/laurent22/joplin/releases/tag/v1.5.11) | 2020-12-27T19:54:07Z | 14,213 | 4,648 | 4,291 | 23,152 |
| [v1.5.10](https://github.com/laurent22/joplin/releases/tag/v1.5.10) (p) | 2020-12-26T12:35:36Z | 310 | 115 | 278 | 703 |
| [v1.5.9](https://github.com/laurent22/joplin/releases/tag/v1.5.9) (p) | 2020-12-23T18:01:08Z | 344 | 380 | 419 | 1,143 |
| [v1.5.8](https://github.com/laurent22/joplin/releases/tag/v1.5.8) (p) | 2020-12-20T09:45:19Z | 582 | 173 | 652 | 1,407 |
| [v1.5.7](https://github.com/laurent22/joplin/releases/tag/v1.5.7) (p) | 2020-12-10T12:58:33Z | 905 | 262 | 1,002 | 2,169 |
| [v1.5.4](https://github.com/laurent22/joplin/releases/tag/v1.5.4) (p) | 2020-12-05T12:07:49Z | 709 | 175 | 643 | 1,527 |
| [v1.4.19](https://github.com/laurent22/joplin/releases/tag/v1.4.19) | 2020-12-01T11:11:16Z | 28,261 | 13,561 | 11,693 | 53,515 |
| [v1.4.18](https://github.com/laurent22/joplin/releases/tag/v1.4.18) | 2020-11-28T12:21:41Z | 11,631 | 3,902 | 3,152 | 18,685 |
| [v1.4.16](https://github.com/laurent22/joplin/releases/tag/v1.4.16) | 2020-11-27T19:40:16Z | 1,531 | 853 | 611 | 2,995 |
| [v1.4.15](https://github.com/laurent22/joplin/releases/tag/v1.4.15) | 2020-11-27T13:25:43Z | 954 | 504 | 286 | 1,744 |
| [v1.4.12](https://github.com/laurent22/joplin/releases/tag/v1.4.12) | 2020-11-23T18:58:07Z | 3,096 | 1,359 | 1,318 | 5,773 |
| [v1.4.11](https://github.com/laurent22/joplin/releases/tag/v1.4.11) (p) | 2020-11-19T23:06:51Z | 3,382 | 178 | 603 | 4,163 |
| [v1.4.10](https://github.com/laurent22/joplin/releases/tag/v1.4.10) (p) | 2020-11-14T09:53:15Z | 667 | 216 | 694 | 1,577 |
| [v1.4.9](https://github.com/laurent22/joplin/releases/tag/v1.4.9) (p) | 2020-11-11T14:23:17Z | 858 | 162 | 412 | 1,432 |
| [v1.4.7](https://github.com/laurent22/joplin/releases/tag/v1.4.7) (p) | 2020-11-07T18:23:29Z | 544 | 193 | 525 | 1,262 |
| [v1.3.18](https://github.com/laurent22/joplin/releases/tag/v1.3.18) | 2020-11-06T12:07:02Z | 33,586 | 11,367 | 10,530 | 55,483 |
| [v1.3.17](https://github.com/laurent22/joplin/releases/tag/v1.3.17) (p) | 2020-11-06T11:35:15Z | 70 | 47 | 34 | 151 |
| [v1.4.6](https://github.com/laurent22/joplin/releases/tag/v1.4.6) (p) | 2020-11-05T22:44:12Z | 689 | 114 | 63 | 866 |
| [v1.3.15](https://github.com/laurent22/joplin/releases/tag/v1.3.15) | 2020-11-04T12:22:50Z | 2,631 | 1,329 | 861 | 4,821 |
| [v1.3.11](https://github.com/laurent22/joplin/releases/tag/v1.3.11) (p) | 2020-10-31T13:22:20Z | 724 | 207 | 492 | 1,423 |
| [v1.3.10](https://github.com/laurent22/joplin/releases/tag/v1.3.10) (p) | 2020-10-29T13:27:14Z | 398 | 136 | 327 | 861 |
| [v1.3.9](https://github.com/laurent22/joplin/releases/tag/v1.3.9) (p) | 2020-10-23T16:04:26Z | 862 | 265 | 644 | 1,771 |
| [v1.3.8](https://github.com/laurent22/joplin/releases/tag/v1.3.8) (p) | 2020-10-21T18:46:29Z | 543 | 138 | 341 | 1,022 |
| [v1.3.7](https://github.com/laurent22/joplin/releases/tag/v1.3.7) (p) | 2020-10-20T11:35:55Z | 317 | 106 | 353 | 776 |
| [v1.3.5](https://github.com/laurent22/joplin/releases/tag/v1.3.5) (p) | 2020-10-17T14:26:35Z | 494 | 155 | 417 | 1,066 |
| [v1.3.3](https://github.com/laurent22/joplin/releases/tag/v1.3.3) (p) | 2020-10-17T10:56:57Z | 142 | 67 | 44 | 253 |
| [v1.3.2](https://github.com/laurent22/joplin/releases/tag/v1.3.2) (p) | 2020-10-11T20:39:49Z | 691 | 204 | 579 | 1,474 |
| [v1.3.1](https://github.com/laurent22/joplin/releases/tag/v1.3.1) (p) | 2020-10-11T15:10:18Z | 106 | 73 | 55 | 234 |
| [v1.2.6](https://github.com/laurent22/joplin/releases/tag/v1.2.6) | 2020-10-09T13:56:59Z | 47,477 | 17,770 | 14,067 | 79,314 |
| [v1.2.4](https://github.com/laurent22/joplin/releases/tag/v1.2.4) (p) | 2020-09-30T07:34:29Z | 843 | 270 | 810 | 1,923 |
| [v1.2.3](https://github.com/laurent22/joplin/releases/tag/v1.2.3) (p) | 2020-09-29T15:13:02Z | 242 | 86 | 93 | 421 |
| [v1.2.2](https://github.com/laurent22/joplin/releases/tag/v1.2.2) (p) | 2020-09-22T20:31:55Z | 1,133 | 229 | 650 | 2,012 |
| [v1.1.4](https://github.com/laurent22/joplin/releases/tag/v1.1.4) | 2020-09-21T11:20:09Z | 28,059 | 13,533 | 7,769 | 49,361 |
| [v1.1.3](https://github.com/laurent22/joplin/releases/tag/v1.1.3) (p) | 2020-09-17T10:30:37Z | 596 | 174 | 476 | 1,246 |
| [v1.1.2](https://github.com/laurent22/joplin/releases/tag/v1.1.2) (p) | 2020-09-15T12:58:38Z | 405 | 140 | 264 | 809 |
| [v1.1.1](https://github.com/laurent22/joplin/releases/tag/v1.1.1) (p) | 2020-09-11T23:32:47Z | 576 | 220 | 362 | 1,158 |
| [v1.0.245](https://github.com/laurent22/joplin/releases/tag/v1.0.245) | 2020-09-09T12:56:10Z | 22,582 | 10,039 | 5,660 | 38,281 |
| [v1.0.242](https://github.com/laurent22/joplin/releases/tag/v1.0.242) | 2020-09-04T22:00:34Z | 12,868 | 6,447 | 3,035 | 22,350 |
| [v1.0.241](https://github.com/laurent22/joplin/releases/tag/v1.0.241) | 2020-09-04T18:06:00Z | 26,416 | 5,966 | 5,129 | 37,511 |
| [v1.0.239](https://github.com/laurent22/joplin/releases/tag/v1.0.239) (p) | 2020-09-01T21:56:36Z | 951 | 252 | 415 | 1,618 |
| [v1.0.237](https://github.com/laurent22/joplin/releases/tag/v1.0.237) (p) | 2020-08-29T15:38:04Z | 616 | 950 | 353 | 1,919 |
| [v1.0.236](https://github.com/laurent22/joplin/releases/tag/v1.0.236) (p) | 2020-08-28T09:16:54Z | 341 | 137 | 118 | 596 |
| [v1.0.235](https://github.com/laurent22/joplin/releases/tag/v1.0.235) (p) | 2020-08-18T22:08:01Z | 2,024 | 516 | 936 | 3,476 |
| [v1.0.234](https://github.com/laurent22/joplin/releases/tag/v1.0.234) (p) | 2020-08-17T23:13:02Z | 649 | 151 | 115 | 915 |
| [v1.0.233](https://github.com/laurent22/joplin/releases/tag/v1.0.233) | 2020-08-01T14:51:15Z | 46,124 | 18,226 | 12,375 | 76,725 |
| [v1.0.232](https://github.com/laurent22/joplin/releases/tag/v1.0.232) (p) | 2020-07-28T22:34:40Z | 680 | 249 | 194 | 1,123 |
| [v1.0.227](https://github.com/laurent22/joplin/releases/tag/v1.0.227) | 2020-07-07T20:44:54Z | 41,425 | 15,308 | 9,655 | 66,388 |
| [v1.0.226](https://github.com/laurent22/joplin/releases/tag/v1.0.226) (p) | 2020-07-04T10:21:26Z | 4,948 | 2,279 | 702 | 7,929 |
| [v1.0.224](https://github.com/laurent22/joplin/releases/tag/v1.0.224) | 2020-06-20T22:26:08Z | 25,059 | 11,033 | 6,022 | 42,114 |
| [v1.0.223](https://github.com/laurent22/joplin/releases/tag/v1.0.223) (p) | 2020-06-20T11:51:27Z | 214 | 140 | 93 | 447 |
| [v1.0.221](https://github.com/laurent22/joplin/releases/tag/v1.0.221) (p) | 2020-06-20T01:44:20Z | 882 | 233 | 227 | 1,342 |
| [v1.0.220](https://github.com/laurent22/joplin/releases/tag/v1.0.220) | 2020-06-13T18:26:22Z | 32,749 | 9,952 | 6,432 | 49,133 |
| [v1.0.218](https://github.com/laurent22/joplin/releases/tag/v1.0.218) | 2020-06-07T10:43:34Z | 14,594 | 7,001 | 3,142 | 24,737 |
| [v1.0.217](https://github.com/laurent22/joplin/releases/tag/v1.0.217) (p) | 2020-06-06T15:17:27Z | 252 | 122 | 72 | 446 |
| [v1.0.216](https://github.com/laurent22/joplin/releases/tag/v1.0.216) | 2020-05-24T14:21:01Z | 39,891 | 14,330 | 10,200 | 64,421 |
| [v1.0.214](https://github.com/laurent22/joplin/releases/tag/v1.0.214) (p) | 2020-05-21T17:15:15Z | 6,824 | 3,496 | 780 | 11,100 |
| [v1.0.212](https://github.com/laurent22/joplin/releases/tag/v1.0.212) (p) | 2020-05-21T07:48:39Z | 238 | 96 | 64 | 398 |
| [v1.0.211](https://github.com/laurent22/joplin/releases/tag/v1.0.211) (p) | 2020-05-20T08:59:16Z | 327 | 159 | 104 | 590 |
| [v1.0.209](https://github.com/laurent22/joplin/releases/tag/v1.0.209) (p) | 2020-05-17T18:32:51Z | 1,419 | 879 | 164 | 2,462 |
| [v1.0.207](https://github.com/laurent22/joplin/releases/tag/v1.0.207) (p) | 2020-05-10T16:37:35Z | 1,224 | 290 | 1,034 | 2,548 |
| [v1.0.201](https://github.com/laurent22/joplin/releases/tag/v1.0.201) | 2020-04-15T22:55:13Z | 54,291 | 20,077 | 18,198 | 92,566 |
| [v1.0.200](https://github.com/laurent22/joplin/releases/tag/v1.0.200) | 2020-04-12T12:17:46Z | 9,598 | 4,916 | 1,919 | 16,433 |
| [v1.0.199](https://github.com/laurent22/joplin/releases/tag/v1.0.199) | 2020-04-10T18:41:58Z | 19,675 | 5,913 | 3,810 | 29,398 |
| [v1.0.197](https://github.com/laurent22/joplin/releases/tag/v1.0.197) | 2020-03-30T17:21:22Z | 23,269 | 9,800 | 6,332 | 39,401 |
| [v1.0.195](https://github.com/laurent22/joplin/releases/tag/v1.0.195) | 2020-03-22T19:56:12Z | 19,137 | 7,976 | 4,522 | 31,635 |
| [v1.0.194](https://github.com/laurent22/joplin/releases/tag/v1.0.194) (p) | 2020-03-14T00:00:32Z | 1,310 | 1,411 | 533 | 3,254 |
| [v1.0.193](https://github.com/laurent22/joplin/releases/tag/v1.0.193) | 2020-03-08T08:58:53Z | 28,773 | 10,944 | 7,432 | 47,149 |
| [v1.0.192](https://github.com/laurent22/joplin/releases/tag/v1.0.192) (p) | 2020-03-06T23:27:52Z | 506 | 148 | 105 | 759 |
| [v1.0.190](https://github.com/laurent22/joplin/releases/tag/v1.0.190) (p) | 2020-03-06T01:22:22Z | 410 | 117 | 101 | 628 |
| [v1.0.189](https://github.com/laurent22/joplin/releases/tag/v1.0.189) (p) | 2020-03-04T17:27:15Z | 379 | 122 | 112 | 613 |
| [v1.0.187](https://github.com/laurent22/joplin/releases/tag/v1.0.187) (p) | 2020-03-01T12:31:06Z | 950 | 261 | 289 | 1,500 |
| [v1.0.179](https://github.com/laurent22/joplin/releases/tag/v1.0.179) | 2020-01-24T22:42:41Z | 71,511 | 28,885 | 22,577 | 122,973 |
| [v1.0.178](https://github.com/laurent22/joplin/releases/tag/v1.0.178) | 2020-01-20T19:06:45Z | 17,630 | 5,990 | 2,607 | 26,227 |
| [v1.0.177](https://github.com/laurent22/joplin/releases/tag/v1.0.177) (p) | 2019-12-30T14:40:40Z | 1,980 | 464 | 726 | 3,170 |
| [v1.0.176](https://github.com/laurent22/joplin/releases/tag/v1.0.176) (p) | 2019-12-14T10:36:44Z | 3,148 | 2,561 | 485 | 6,194 |
| [v1.0.175](https://github.com/laurent22/joplin/releases/tag/v1.0.175) | 2019-12-08T11:48:47Z | 73,565 | 16,990 | 16,600 | 107,155 |
| [v1.0.174](https://github.com/laurent22/joplin/releases/tag/v1.0.174) | 2019-11-12T18:20:58Z | 30,639 | 11,774 | 8,243 | 50,656 |
| [v1.0.173](https://github.com/laurent22/joplin/releases/tag/v1.0.173) | 2019-11-11T08:33:35Z | 5,128 | 2,106 | 762 | 7,996 |
| [v1.0.170](https://github.com/laurent22/joplin/releases/tag/v1.0.170) | 2019-10-13T22:13:04Z | 27,734 | 8,802 | 7,702 | 44,238 |
| [v1.0.169](https://github.com/laurent22/joplin/releases/tag/v1.0.169) | 2019-09-27T18:35:13Z | 17,207 | 5,947 | 3,768 | 26,922 |
| [v1.0.168](https://github.com/laurent22/joplin/releases/tag/v1.0.168) | 2019-09-25T21:21:38Z | 5,363 | 2,300 | 733 | 8,396 |
| [v1.0.167](https://github.com/laurent22/joplin/releases/tag/v1.0.167) | 2019-09-10T08:48:37Z | 16,885 | 5,731 | 3,720 | 26,336 |
| [v1.0.166](https://github.com/laurent22/joplin/releases/tag/v1.0.166) | 2019-09-09T17:35:54Z | 1,988 | 586 | 250 | 2,824 |
| [v1.0.165](https://github.com/laurent22/joplin/releases/tag/v1.0.165) | 2019-08-14T21:46:29Z | 19,075 | 7,007 | 5,481 | 31,563 |
| [v1.0.161](https://github.com/laurent22/joplin/releases/tag/v1.0.161) | 2019-07-13T18:30:00Z | 19,350 | 6,377 | 4,151 | 29,878 |
| [v1.0.160](https://github.com/laurent22/joplin/releases/tag/v1.0.160) | 2019-06-15T00:21:40Z | 30,727 | 7,782 | 8,122 | 46,631 |
| [v1.0.159](https://github.com/laurent22/joplin/releases/tag/v1.0.159) | 2019-06-08T00:00:19Z | 5,231 | 2,204 | 1,193 | 8,628 |
| [v1.0.158](https://github.com/laurent22/joplin/releases/tag/v1.0.158) | 2019-05-27T19:01:18Z | 9,855 | 3,574 | 1,952 | 15,381 |
| [v1.0.157](https://github.com/laurent22/joplin/releases/tag/v1.0.157) | 2019-05-26T17:55:53Z | 2,210 | 869 | 306 | 3,385 |
| [v1.0.153](https://github.com/laurent22/joplin/releases/tag/v1.0.153) (p) | 2019-05-15T06:27:29Z | 877 | 129 | 122 | 1,128 |
| [v1.0.152](https://github.com/laurent22/joplin/releases/tag/v1.0.152) | 2019-05-13T09:08:07Z | 13,911 | 4,460 | 4,076 | 22,447 |
| [v1.0.151](https://github.com/laurent22/joplin/releases/tag/v1.0.151) | 2019-05-12T15:14:32Z | 1,985 | 561 | 974 | 3,520 |
| [v1.0.150](https://github.com/laurent22/joplin/releases/tag/v1.0.150) | 2019-05-12T11:27:48Z | 456 | 162 | 86 | 704 |
| [v1.0.148](https://github.com/laurent22/joplin/releases/tag/v1.0.148) (p) | 2019-05-08T19:12:24Z | 155 | 83 | 110 | 348 |
| [v1.0.145](https://github.com/laurent22/joplin/releases/tag/v1.0.145) | 2019-05-03T09:16:53Z | 7,039 | 2,887 | 1,453 | 11,379 |
| [v1.0.143](https://github.com/laurent22/joplin/releases/tag/v1.0.143) | 2019-04-22T10:51:38Z | 11,951 | 3,578 | 2,797 | 18,326 |
| [v1.0.142](https://github.com/laurent22/joplin/releases/tag/v1.0.142) | 2019-04-02T16:44:51Z | 14,796 | 4,595 | 4,748 | 24,139 |
| [v1.0.140](https://github.com/laurent22/joplin/releases/tag/v1.0.140) | 2019-03-10T20:59:58Z | 13,670 | 4,199 | 3,393 | 21,262 |
| [v1.0.139](https://github.com/laurent22/joplin/releases/tag/v1.0.139) (p) | 2019-03-09T10:06:48Z | 148 | 91 | 62 | 301 |
| [v1.0.138](https://github.com/laurent22/joplin/releases/tag/v1.0.138) (p) | 2019-03-03T17:23:00Z | 178 | 115 | 99 | 392 |
| [v1.0.137](https://github.com/laurent22/joplin/releases/tag/v1.0.137) (p) | 2019-03-03T01:12:51Z | 616 | 83 | 99 | 798 |
| [v1.0.135](https://github.com/laurent22/joplin/releases/tag/v1.0.135) | 2019-02-27T23:36:57Z | 12,661 | 3,984 | 4,095 | 20,740 |
| [v1.0.134](https://github.com/laurent22/joplin/releases/tag/v1.0.134) | 2019-02-27T10:21:44Z | 1,498 | 594 | 234 | 2,326 |
| [v1.0.132](https://github.com/laurent22/joplin/releases/tag/v1.0.132) | 2019-02-26T23:02:05Z | 1,118 | 479 | 110 | 1,707 |
| [v1.0.127](https://github.com/laurent22/joplin/releases/tag/v1.0.127) | 2019-02-14T23:12:48Z | 9,928 | 3,199 | 2,946 | 16,073 |
| [v1.0.126](https://github.com/laurent22/joplin/releases/tag/v1.0.126) (p) | 2019-02-09T19:46:16Z | 959 | 99 | 131 | 1,189 |
| [v1.0.125](https://github.com/laurent22/joplin/releases/tag/v1.0.125) | 2019-01-26T18:14:33Z | 10,327 | 3,584 | 1,718 | 15,629 |
| [v1.0.120](https://github.com/laurent22/joplin/releases/tag/v1.0.120) | 2019-01-10T21:42:53Z | 15,651 | 5,234 | 6,534 | 27,419 |
| [v1.0.119](https://github.com/laurent22/joplin/releases/tag/v1.0.119) | 2018-12-18T12:40:22Z | 8,948 | 3,288 | 2,030 | 14,266 |
| [v1.0.118](https://github.com/laurent22/joplin/releases/tag/v1.0.118) | 2019-01-11T08:34:13Z | 747 | 274 | 104 | 1,125 |
| [v1.0.117](https://github.com/laurent22/joplin/releases/tag/v1.0.117) | 2018-11-24T12:05:24Z | 16,293 | 4,924 | 6,397 | 27,614 |
| [v1.0.116](https://github.com/laurent22/joplin/releases/tag/v1.0.116) | 2018-11-20T19:09:24Z | 4,017 | 1,150 | 729 | 5,896 |
| [v1.0.115](https://github.com/laurent22/joplin/releases/tag/v1.0.115) | 2018-11-16T16:52:02Z | 3,686 | 1,329 | 817 | 5,832 |
| [v1.0.114](https://github.com/laurent22/joplin/releases/tag/v1.0.114) | 2018-10-24T20:14:10Z | 11,426 | 3,528 | 3,845 | 18,799 |
| [v1.0.111](https://github.com/laurent22/joplin/releases/tag/v1.0.111) | 2018-09-30T20:15:09Z | 12,239 | 3,402 | 3,698 | 19,339 |
| [v1.0.110](https://github.com/laurent22/joplin/releases/tag/v1.0.110) | 2018-09-29T12:29:21Z | 990 | 437 | 134 | 1,561 |
| [v1.0.109](https://github.com/laurent22/joplin/releases/tag/v1.0.109) | 2018-09-27T18:01:41Z | 2,132 | 732 | 346 | 3,210 |
| [v1.0.108](https://github.com/laurent22/joplin/releases/tag/v1.0.108) (p) | 2018-09-29T18:49:29Z | 55 | 48 | 31 | 134 |
| [v1.0.107](https://github.com/laurent22/joplin/releases/tag/v1.0.107) | 2018-09-16T19:51:07Z | 7,183 | 2,163 | 1,726 | 11,072 |
| [v1.0.106](https://github.com/laurent22/joplin/releases/tag/v1.0.106) | 2018-09-08T15:23:40Z | 4,587 | 1,483 | 333 | 6,403 |
| [v1.0.105](https://github.com/laurent22/joplin/releases/tag/v1.0.105) | 2018-09-05T11:29:36Z | 4,686 | 1,619 | 1,474 | 7,779 |
| [v1.0.104](https://github.com/laurent22/joplin/releases/tag/v1.0.104) | 2018-06-28T20:25:36Z | 15,109 | 4,729 | 7,383 | 27,221 |
| [v1.0.103](https://github.com/laurent22/joplin/releases/tag/v1.0.103) | 2018-06-21T19:38:13Z | 2,083 | 914 | 694 | 3,691 |
| [v1.0.101](https://github.com/laurent22/joplin/releases/tag/v1.0.101) | 2018-06-17T18:35:11Z | 1,339 | 634 | 425 | 2,398 |
| [v1.0.100](https://github.com/laurent22/joplin/releases/tag/v1.0.100) | 2018-06-14T17:41:43Z | 915 | 460 | 261 | 1,636 |
| [v1.0.99](https://github.com/laurent22/joplin/releases/tag/v1.0.99) | 2018-06-10T13:18:23Z | 1,284 | 624 | 397 | 2,305 |
| [v1.0.97](https://github.com/laurent22/joplin/releases/tag/v1.0.97) | 2018-06-09T19:23:34Z | 343 | 182 | 75 | 600 |
| [v1.0.96](https://github.com/laurent22/joplin/releases/tag/v1.0.96) | 2018-05-26T16:36:39Z | 2,756 | 1,251 | 1,725 | 5,732 |
| [v1.0.95](https://github.com/laurent22/joplin/releases/tag/v1.0.95) | 2018-05-25T13:04:30Z | 450 | 246 | 147 | 843 |
| [v1.0.94](https://github.com/laurent22/joplin/releases/tag/v1.0.94) | 2018-05-21T20:52:59Z | 1,163 | 614 | 425 | 2,202 |
| [v1.0.93](https://github.com/laurent22/joplin/releases/tag/v1.0.93) | 2018-05-14T11:36:01Z | 1,820 | 1,296 | 786 | 3,902 |
| [v1.0.91](https://github.com/laurent22/joplin/releases/tag/v1.0.91) | 2018-05-10T14:48:04Z | 844 | 581 | 337 | 1,762 |
| [v1.0.89](https://github.com/laurent22/joplin/releases/tag/v1.0.89) | 2018-05-09T13:05:05Z | 524 | 262 | 140 | 926 |
| [v1.0.85](https://github.com/laurent22/joplin/releases/tag/v1.0.85) | 2018-05-01T21:08:24Z | 1,670 | 979 | 661 | 3,310 |
| [v1.0.83](https://github.com/laurent22/joplin/releases/tag/v1.0.83) | 2018-04-04T19:43:58Z | 5,503 | 2,560 | 2,684 | 10,747 |
| [v1.0.82](https://github.com/laurent22/joplin/releases/tag/v1.0.82) | 2018-03-31T19:16:31Z | 720 | 434 | 148 | 1,302 |
| [v1.0.81](https://github.com/laurent22/joplin/releases/tag/v1.0.81) | 2018-03-28T08:13:58Z | 1,017 | 626 | 810 | 2,453 |
| [v1.0.79](https://github.com/laurent22/joplin/releases/tag/v1.0.79) | 2018-03-23T18:00:11Z | 945 | 566 | 410 | 1,921 |
| [v1.0.78](https://github.com/laurent22/joplin/releases/tag/v1.0.78) | 2018-03-17T15:27:18Z | 1,326 | 924 | 897 | 3,147 |
| [v1.0.77](https://github.com/laurent22/joplin/releases/tag/v1.0.77) | 2018-03-16T15:12:35Z | 193 | 131 | 71 | 395 |
| [v1.0.72](https://github.com/laurent22/joplin/releases/tag/v1.0.72) | 2018-03-14T09:44:35Z | 425 | 284 | 81 | 790 |
| [v1.0.70](https://github.com/laurent22/joplin/releases/tag/v1.0.70) | 2018-02-28T20:04:30Z | 1,877 | 1,079 | 1,279 | 4,235 |
| [v1.0.67](https://github.com/laurent22/joplin/releases/tag/v1.0.67) | 2018-02-19T22:51:08Z | 1,838 | 633 | 0 | 2,471 |
| [v1.0.66](https://github.com/laurent22/joplin/releases/tag/v1.0.66) | 2018-02-18T23:09:09Z | 349 | 162 | 100 | 611 |
| [v1.0.65](https://github.com/laurent22/joplin/releases/tag/v1.0.65) | 2018-02-17T20:02:25Z | 214 | 155 | 147 | 516 |
| [v1.0.64](https://github.com/laurent22/joplin/releases/tag/v1.0.64) | 2018-02-16T00:58:20Z | 1,103 | 570 | 1,138 | 2,811 |
| [v1.0.63](https://github.com/laurent22/joplin/releases/tag/v1.0.63) | 2018-02-14T19:40:36Z | 325 | 187 | 106 | 618 |
| [v1.0.62](https://github.com/laurent22/joplin/releases/tag/v1.0.62) | 2018-02-12T20:19:58Z | 586 | 329 | 386 | 1,301 |
| [v0.10.61](https://github.com/laurent22/joplin/releases/tag/v0.10.61) | 2018-02-08T18:27:39Z | 994 | 662 | 977 | 2,633 |
| [v0.10.60](https://github.com/laurent22/joplin/releases/tag/v0.10.60) | 2018-02-06T13:09:56Z | 739 | 548 | 566 | 1,853 |
| [v0.10.54](https://github.com/laurent22/joplin/releases/tag/v0.10.54) | 2018-01-31T20:21:30Z | 1,841 | 1,487 | 338 | 3,666 |
| [v0.10.52](https://github.com/laurent22/joplin/releases/tag/v0.10.52) | 2018-01-31T19:25:18Z | 66 | 661 | 31 | 758 |
| [v0.10.51](https://github.com/laurent22/joplin/releases/tag/v0.10.51) | 2018-01-28T18:47:02Z | 1,348 | 1,627 | 342 | 3,317 |
| [v0.10.48](https://github.com/laurent22/joplin/releases/tag/v0.10.48) | 2018-01-23T11:19:51Z | 1,983 | 1,779 | 47 | 3,809 |
| [v0.10.47](https://github.com/laurent22/joplin/releases/tag/v0.10.47) | 2018-01-16T17:27:17Z | 1,249 | 1,300 | 81 | 2,630 |
| [v0.10.43](https://github.com/laurent22/joplin/releases/tag/v0.10.43) | 2018-01-08T10:12:10Z | 3,457 | 2,383 | 1,224 | 7,064 |
| [v0.10.41](https://github.com/laurent22/joplin/releases/tag/v0.10.41) | 2018-01-05T20:38:12Z | 1,062 | 1,582 | 257 | 2,901 |
| [v0.10.40](https://github.com/laurent22/joplin/releases/tag/v0.10.40) | 2018-01-02T23:16:57Z | 1,610 | 1,815 | 352 | 3,777 |
| [v0.10.39](https://github.com/laurent22/joplin/releases/tag/v0.10.39) | 2017-12-11T21:19:44Z | 5,947 | 4,420 | 3,305 | 13,672 |
| [v0.10.38](https://github.com/laurent22/joplin/releases/tag/v0.10.38) | 2017-12-08T10:12:06Z | 1,065 | 1,260 | 322 | 2,647 |
| [v0.10.37](https://github.com/laurent22/joplin/releases/tag/v0.10.37) | 2017-12-07T19:38:05Z | 282 | 877 | 99 | 1,258 |
| [v0.10.36](https://github.com/laurent22/joplin/releases/tag/v0.10.36) | 2017-12-05T09:34:40Z | 1,033 | 1,388 | 454 | 2,875 |
| [v0.10.35](https://github.com/laurent22/joplin/releases/tag/v0.10.35) | 2017-12-02T15:56:08Z | 1,594 | 1,578 | 760 | 3,932 |
| [v0.10.34](https://github.com/laurent22/joplin/releases/tag/v0.10.34) | 2017-12-02T14:50:28Z | 108 | 702 | 76 | 886 |
| [v0.10.33](https://github.com/laurent22/joplin/releases/tag/v0.10.33) | 2017-12-02T13:20:39Z | 78 | 694 | 42 | 814 |
| [v0.10.31](https://github.com/laurent22/joplin/releases/tag/v0.10.31) | 2017-12-01T09:56:44Z | 909 | 1,484 | 424 | 2,817 |
| [v0.10.30](https://github.com/laurent22/joplin/releases/tag/v0.10.30) | 2017-11-30T20:28:16Z | 744 | 1,414 | 442 | 2,600 |
| [v0.10.28](https://github.com/laurent22/joplin/releases/tag/v0.10.28) | 2017-11-30T01:07:46Z | 1,379 | 1,744 | 896 | 4,019 |
| [v0.10.26](https://github.com/laurent22/joplin/releases/tag/v0.10.26) | 2017-11-29T16:02:17Z | 213 | 741 | 281 | 1,235 |
| [v0.10.25](https://github.com/laurent22/joplin/releases/tag/v0.10.25) | 2017-11-24T14:27:49Z | 170 | 736 | 6,676 | 7,582 |
| [v0.10.23](https://github.com/laurent22/joplin/releases/tag/v0.10.23) | 2017-11-21T19:38:41Z | 158 | 701 | 55 | 914 |
| [v0.10.22](https://github.com/laurent22/joplin/releases/tag/v0.10.22) | 2017-11-20T21:45:57Z | 108 | 688 | 41 | 837 |
| [v0.10.21](https://github.com/laurent22/joplin/releases/tag/v0.10.21) | 2017-11-18T00:53:15Z | 75 | 680 | 36 | 791 |
| [v0.10.20](https://github.com/laurent22/joplin/releases/tag/v0.10.20) | 2017-11-17T17:18:25Z | 64 | 692 | 45 | 801 |
| [v0.10.19](https://github.com/laurent22/joplin/releases/tag/v0.10.19) | 2017-11-20T18:59:48Z | 58 | 693 | 42 | 793 |

617
yarn.lock

File diff suppressed because it is too large Load Diff