Doc: Added blog posts for archival purpose and to allow listing them in notifications
1
Tools/.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
*-kct.*
|
||||
github_username_cache.json
|
||||
patreon_oauth_token.txt
|
131
Tools/fetchPatreonPosts.js
Normal file
@ -0,0 +1,131 @@
|
||||
// Fetch Patreon posts to Markdown so that we have them in a more versatile format
|
||||
// and to add them to the "News" notifications later on.
|
||||
|
||||
require('app-module-path').addPath(`${__dirname}/../ReactNativeClient`);
|
||||
|
||||
const fetch = require('node-fetch');
|
||||
const fs = require('fs-extra');
|
||||
const { patreonOauthToken } = require('./tool-utils');
|
||||
const HtmlToMd = require('lib/HtmlToMd');
|
||||
const { dirname, filename, basename } = require('lib/path-utils');
|
||||
const markdownUtils = require('lib/markdownUtils');
|
||||
const mimeUtils = require('lib/mime-utils.js').mime;
|
||||
const { netUtils } = require('lib/net-utils');
|
||||
const { shim } = require('lib/shim');
|
||||
const moment = require('moment');
|
||||
const { pregQuote } = require('lib/string-utils');
|
||||
const { shimInit } = require('lib/shim-init-node.js');
|
||||
|
||||
shimInit();
|
||||
|
||||
const blogDir = `${dirname(__dirname)}/readme/blog`;
|
||||
const tempDir = `${__dirname}/temp`;
|
||||
const imageDir = `${dirname(__dirname)}/readme/blog/images`;
|
||||
|
||||
const htmlToMd = new HtmlToMd();
|
||||
|
||||
async function fetchPosts(url) {
|
||||
const token = await patreonOauthToken();
|
||||
|
||||
const response = await fetch(url, {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
},
|
||||
});
|
||||
|
||||
const responseJson = await response.json();
|
||||
|
||||
const posts = responseJson.data.map(p => {
|
||||
return {
|
||||
id: p.id,
|
||||
title: p.attributes.title,
|
||||
content: p.attributes.content,
|
||||
published_at: p.attributes.published_at,
|
||||
url: p.attributes.url,
|
||||
};
|
||||
});
|
||||
|
||||
return {
|
||||
data: posts,
|
||||
nextUrl: responseJson.links && responseJson.links.next ? responseJson.links.next : null,
|
||||
};
|
||||
}
|
||||
|
||||
async function createPostFile(post, filePath) {
|
||||
let contentMd = htmlToMd.parse(post.content, { preserveImageTagsWithSize: true });
|
||||
|
||||
const imageUrls = markdownUtils.extractImageUrls(contentMd);
|
||||
|
||||
const imageUrlsToFiles = {};
|
||||
|
||||
for (let i = 0; i < imageUrls.length; i++) {
|
||||
const imageUrl = imageUrls[i];
|
||||
const imageFilename = `${filename(filePath)}_${i}`;
|
||||
const imagePath = `${tempDir}/${imageFilename}`;
|
||||
const response = await shim.fetchBlob(imageUrl, { path: imagePath, maxRetry: 1 });
|
||||
|
||||
const mimeType = netUtils.mimeTypeFromHeaders(response.headers);
|
||||
let ext = 'jpg';
|
||||
if (mimeType) {
|
||||
const newExt = mimeUtils.toFileExtension(mimeType);
|
||||
if (newExt) ext = newExt;
|
||||
}
|
||||
|
||||
const destFile = `${imageDir}/${imageFilename}.${ext}`;
|
||||
await fs.move(imagePath, destFile, { overwrite: true });
|
||||
|
||||
imageUrlsToFiles[imageUrl] = destFile;
|
||||
}
|
||||
|
||||
for (const imageUrl in imageUrlsToFiles) {
|
||||
const r = `images/${basename(imageUrlsToFiles[imageUrl])}`;
|
||||
contentMd = contentMd.replace(new RegExp(pregQuote(imageUrl), 'g'), r);
|
||||
}
|
||||
|
||||
const fileMd = [`# ${post.title}`];
|
||||
fileMd.push('');
|
||||
fileMd.push(contentMd);
|
||||
fileMd.push('');
|
||||
fileMd.push('* * *');
|
||||
fileMd.push('');
|
||||
fileMd.push(`url: https://www.patreon.com${post.url}`);
|
||||
fileMd.push(`published_at: ${post.published_at}`);
|
||||
await fs.writeFile(filePath, fileMd.join('\n'));
|
||||
}
|
||||
|
||||
async function createPostFiles(posts) {
|
||||
for (const post of posts) {
|
||||
const filename = `${moment(post.published_at).format('YYYYMMDD-HHmmss')}.md`;
|
||||
await createPostFile(post, `${blogDir}/${filename}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
await fs.mkdirp(blogDir);
|
||||
await fs.mkdirp(imageDir);
|
||||
await fs.mkdirp(tempDir);
|
||||
|
||||
const fields = [
|
||||
'title',
|
||||
'content',
|
||||
'published_at',
|
||||
'url',
|
||||
];
|
||||
|
||||
let url = `https://www.patreon.com/api/oauth2/v2/campaigns/1818121/posts?fields%5Bpost%5D=${fields.join(',')}`;
|
||||
|
||||
while (url) {
|
||||
console.info('Fetching ', url);
|
||||
const result = await fetchPosts(url);
|
||||
console.info(`Found ${result.data.length} posts`);
|
||||
await createPostFiles(result.data);
|
||||
url = result.nextUrl;
|
||||
}
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error(error);
|
||||
process.exit(1);
|
||||
}).then(() => {
|
||||
return fs.remove(tempDir);
|
||||
});
|
5
Tools/package-lock.json
generated
@ -756,6 +756,11 @@
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
|
||||
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
|
||||
},
|
||||
"momentjs": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/momentjs/-/momentjs-2.0.0.tgz",
|
||||
"integrity": "sha1-c9+QS0+kGPbjxgXoMc727VUY69Q="
|
||||
},
|
||||
"mustache": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz",
|
||||
|
@ -17,6 +17,7 @@
|
||||
"markdown-it": "^8.4.1",
|
||||
"md5-file": "^4.0.0",
|
||||
"moment": "^2.24.0",
|
||||
"momentjs": "^2.0.0",
|
||||
"mustache": "^2.3.0",
|
||||
"node-fetch": "^1.7.3",
|
||||
"request": "^2.88.0",
|
||||
|
@ -162,6 +162,12 @@ toolUtils.githubUsername = async function(email, name) {
|
||||
return output;
|
||||
};
|
||||
|
||||
toolUtils.patreonOauthToken = async function() {
|
||||
const fs = require('fs-extra');
|
||||
const r = await fs.readFile(`${__dirname}/patreon_oauth_token.txt`);
|
||||
return r.toString();
|
||||
};
|
||||
|
||||
toolUtils.githubOauthToken = async function() {
|
||||
const fs = require('fs-extra');
|
||||
const r = await fs.readFile(`${__dirname}/github_oauth_token.txt`);
|
||||
|
757
package-lock.json
generated
@ -40,5 +40,11 @@
|
||||
"husky": "^3.0.2",
|
||||
"lint-staged": "^9.2.1",
|
||||
"typescript": "^3.7.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.11.0",
|
||||
"joplin-turndown": "^4.0.27",
|
||||
"joplin-turndown-plugin-gfm": "^1.0.12",
|
||||
"relative": "^3.0.2"
|
||||
}
|
||||
}
|
||||
|
12
readme/blog/20180621-182112.md
Normal file
@ -0,0 +1,12 @@
|
||||
# Web Clipper now available on Firefox and Chrome
|
||||
|
||||
[One of the most requested feature](https://github.com/laurent22/joplin/issues/135), the Web Clipper, is now available on the Firefox and Chrome store. It is possible to save a whole web page, or a simplified version of it, or a screenshot directly from the browser to Joplin. Like the rest of Joplin, the HTML page will be converted to Markdown, which means it can be easily edited and read even without a special viewer, and, since it's plain text, it also makes it easier to search and share the content.
|
||||
|
||||
Have a look at the [Web Clipper documentation](https://joplin.cozic.net/clipper/) for more information.
|
||||
|
||||
![](images/20180621-182112_0.png)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/web-clipper-now-19589638
|
||||
published_at: 2018-06-21T17:21:12.000+00:00
|
14
readme/blog/20180906-111039.md
Normal file
@ -0,0 +1,14 @@
|
||||
# New iOS release with improved attachment support
|
||||
|
||||
![](images/20180906-111039_0.png)
|
||||
|
||||
The iOS version for iPhone, iPad and iPod sometimes lags behind the Android one due to the App Store release process being more complex. However it eventually catches up, as is the case with the latest release, which includes all the features and bug fixes from the past few months.
|
||||
|
||||
In particular a feature that's been needed for a while - the ability to open resources (eg. PDF files or other attachments) in external viewers. That means all that's available in desktop - notes and attachments - is now also fully available on mobile, making the app much more useful. In this release there are also quite a few optimisations to the sync process so in some cases it should be faster, as well as better support for WebDAV. Finally there are various small fixes and improvements, such as support for SVG vector graphics, improved math formula support, etc.
|
||||
|
||||
All these improvements are also found in the recently released macOS, Windows, Linux and Android versions.
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/new-ios-release-21242395
|
||||
published_at: 2018-09-06T10:10:39.000+00:00
|
12
readme/blog/20180916-210431.md
Normal file
@ -0,0 +1,12 @@
|
||||
# Note properties in desktop application
|
||||
|
||||
![](images/20180916-210431_0.png)
|
||||
|
||||
The new desktop version of Joplin for Windows, macOS and Linux features a new dialog box to view and edit the note properties, such as the updated date, created date, source URL or even location. It's a small change but it can be useful. This dialog can be accessed by clicking on the Information icon in the toolbar.
|
||||
|
||||
As usual this release also includes various bug fixes and improvements. More information on the changelog: [https://joplin.cozic.net/changelog/](https://joplin.cozic.net/changelog/)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/note-properties-21454692
|
||||
published_at: 2018-09-16T20:04:31.000+00:00
|
12
readme/blog/20180929-121053.md
Normal file
@ -0,0 +1,12 @@
|
||||
# New release and many bug fixes
|
||||
|
||||
Reliability and stability is an important feature of Joplin as the application can potentially manage thousands of notes spanning many years (My oldest note, imported from another software, is from October 1999!). A stable interface without too many glitches also makes for a more pleasant user experience. For these reasons, bug fixes are always given high priority in this project, and are usually worked on before any new feature is added. The latest release for instance pretty much only contains bug fixes - eight of them, including one security fix.
|
||||
|
||||
Joplin is not bug free yet, there are still a few issues here and there, that sometimes depend on the user's hardware or configuration, and others that are hard to replicate or fix, but the app is getting there - more stable with each new release.
|
||||
|
||||
More information about this release and download link in the changelog - [https://joplin.cozic.net/changelog/](https://joplin.cozic.net/changelog/)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/new-release-and-21717193
|
||||
published_at: 2018-09-29T11:10:53.000+00:00
|
16
readme/blog/20181004-091123.md
Normal file
@ -0,0 +1,16 @@
|
||||
# Joplin and Hacktobertfest 2018 🎃
|
||||
|
||||
The [Hacktobertfest event](https://hacktoberfest.digitalocean.com/) has started - it allows you to contribute to Joplin and, at the end of the month, after having done 5 PR, you'll earn a limited edition T-shirt.
|
||||
|
||||
To participate, go on [https://hacktoberfest.digitalocean.com/](https://hacktoberfest.digitalocean.com/) log in (with you github account) and you are ready to get in.
|
||||
|
||||
Next, go dive into the Joplin issues list labelled ["Hacktoberfest"](https://github.com/laurent22/joplin/labels/Hacktoberfest%20%3Ajack_o_lantern%3A)
|
||||
|
||||
We hope you will enjoy that event by contributing to the project which is a nice moment of sharing good vibe 🎃 🎉
|
||||
|
||||
*PS: the 5 Pull Request don't have to be done* ***only*** *on Joplin project, those can be done on any FOSS projects.*
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/joplin-and-2018-21841975
|
||||
published_at: 2018-10-04T08:11:23.000+00:00
|
22
readme/blog/20181101-174335.md
Normal file
@ -0,0 +1,22 @@
|
||||
# Hacktoberfest has now ended
|
||||
|
||||
Hacktoberfest has now ended - many thanks to all those who have contributed. Some of the pull requests are not merged yet but they will be soon. For information, this is the number of pull requests per month on the project, so there was approximately a 30% increase in October:
|
||||
|
||||
Oct - 26
|
||||
|
||||
Sep - 20
|
||||
|
||||
Aug - 8
|
||||
|
||||
Jul - 3
|
||||
|
||||
Jun - 4
|
||||
|
||||
May - 18
|
||||
|
||||
Again many thanks to all those who have submitted a pull request, your efforts to improve the project are much appreciated!
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/hacktoberfest-22447274
|
||||
published_at: 2018-11-01T17:43:35.000+00:00
|
18
readme/blog/20181213-173459.md
Normal file
@ -0,0 +1,18 @@
|
||||
# Joplin is now featured on PrivacyTools.io
|
||||
|
||||
Joplin is now [featured on PrivacyTools.io](https://www.privacytools.io/#notebook), a site dedicated to providing knowledge and tools to protect people's privacy against global mass surveillance. The app was kindly submitted by [Mats Estensen on GitHub](https://github.com/privacytoolsIO/privacytools.io/pull/659) and accepted soon after.
|
||||
|
||||
Since day one the Joplin project has indeed been concerned with privacy - offering End To End Encryption and supporting open standards, including WebDAV for synchronisation. Setting up Joplin synchronisation can be more complicated than other existing note applications, but the advantage is that once it is done you 100% own the data and even the infrastructure if you use Nextcloud on your own server.
|
||||
|
||||
The applications do not track users, and of course there is not and will never be ads. It also makes very few web requests (outside of synchronisation). In fact only two requests are made, and both can be disabled in the options:
|
||||
|
||||
\- One for geolocation tagging, to associate a latitude and longitude with a note.
|
||||
|
||||
\- One for the auto-update checks. It makes a request to GitHub to check if a new version has been released.
|
||||
|
||||
This endorsement by PrivacyTools is great news for the project. It means more users, and that our efforts to create a privacy-respecting tool are going in the right direction.
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/joplin-is-now-on-23311940
|
||||
published_at: 2018-12-13T17:34:59.000+00:00
|
18
readme/blog/20190130-230218.md
Normal file
@ -0,0 +1,18 @@
|
||||
# New search engine in Joplin
|
||||
|
||||
The original search engine in Joplin was pretty limited - it would search for your exact query and that is it. For example if you search for "recipe cake" it would return results that contain exactly this word in this order and nothing else - it would not return "apple cake recipe" or "recipe for birthday cake", thus forcing you to try various queries.
|
||||
|
||||
The last versions of Joplin include a new search engine that provides much better results, and also allow better specifying search queries.
|
||||
|
||||
The search engine indexes in real time the content of the notes, thus it can give back results very fast. It is also built on top of SQLite FTS and thus support [all its queries](https://joplin.cozic.net/#searching). Unlike the previous search engine, the new one also sorts the results by relevance.
|
||||
|
||||
The first iteration of this new search engine was a bit limited when it comes to non-English text. For example, for searching text that contains accents or non-alphabetical characters. So in the last update, better support for this was also added - accentuated and non-accentuated characters are treated in the same way, and languages like Russian, Chinese, Japanese or Korean can be searched easily.
|
||||
|
||||
This search engine is still new so it is likely to change over time. For example, ordering the results by relevance is a bit experimental, and some edge cases might not work for non-English language queries. If you notice any issue, feel free to report it on the forum or GitHub. The new search engine is in use in both the mobile and desktop application.
|
||||
|
||||
![](images/20190130-230218_0.png)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/new-search-in-24342206
|
||||
published_at: 2019-01-30T23:02:18.000+00:00
|
16
readme/blog/20190404-074157.md
Normal file
@ -0,0 +1,16 @@
|
||||
# Markdown plugins and Goto Anything
|
||||
|
||||
The latest release includes two relatively important new features:
|
||||
|
||||
The first one, is the addition of several Markdown plugins that enable new features: for example it's now possible to add a table of contents to your notes, to enable footnotes, or to render various text decorations, such as superscript, subscript, highlighting, etc. This was all made possible thanks to the efforts of Caleb John.
|
||||
|
||||
![](images/20190404-074157_0.png)
|
||||
|
||||
The second major new feature is the addition of the Goto Anything dialog. Press Ctrl+P or Cmd+P and type the title of a note to jump directly to it. You can also type # followed by a tag or @ followed by a notebook title. The feature was largely inspired by the cool Sublime Text Goto Anything feature.
|
||||
|
||||
![](images/20190404-074157_1.png)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/markdown-plugins-25864443
|
||||
published_at: 2019-04-04T06:41:57.000+00:00
|
16
readme/blog/20190424-112410.md
Normal file
@ -0,0 +1,16 @@
|
||||
# The Joplin forum is one year old
|
||||
|
||||
Exactly one year ago, on 24 April 2018, the [Joplin forum](https://discourse.joplinapp.org/) was created as a result of [this post on GitHub](https://github.com/laurent22/joplin/issues/418). Before this, the only way to discuss the project was indeed on the GitHub bug tracker, which is not ideal for general discussion about features, development and so on.
|
||||
|
||||
After looking at various options, eventually we settled on Discourse, which provides a nice clean UI, works well on mobile, and is easy to manage. Even better, the Discourse team was kind enough to host the project for us for free, as part of their [Free hosting program for open source projects](https://blog.discourse.org/2016/03/free-discourse-forum-hosting-for-community-friendly-github-projects/). Not having to manage or pay for the server is great, and it means more time can be spent developing the application.
|
||||
|
||||
On the opening day, there was only three users - me, foxmask and zblesk, joined a few days later by tessus, merlinuwe, jhf2442, sciurius and many others. Today there are 811 users, 6700 posts, about 15 new posts created each day, and about 2000 pageviews each day.
|
||||
|
||||
The forum has been very useful to discuss features and development, to provide support and news, and to organise [events such as Hacktoberfest](https://discourse.joplinapp.org/t/joplin-and-hacktobertfest-2018/752). It also serves as a knowledge base (via the [search function](https://discourse.joplinapp.org/search)) to provide solutions regarding various Joplin issues.
|
||||
|
||||
Of course the forum has also been great to develop the community around the Joplin project, and hopefully will keep serving us well for the years to come!
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/joplin-forum-is-26325959
|
||||
published_at: 2019-04-24T10:24:10.000+00:00
|
36
readme/blog/20190523-231026.md
Normal file
@ -0,0 +1,36 @@
|
||||
# Note history now in Joplin
|
||||
|
||||
The latest versions of Joplin adds support for note history. The applications (desktop, mobile and CLI) now preserve previous versions of the notes, so you can inspect or restore them later on as needed.
|
||||
|
||||
A common complain with many sync-based note taking apps is that they work in an opaque way - sometimes notes are changed or they disappear and it's not clear why - it could be a user error, or some bug, but regardless it makes it hard to trust the app with thousands of notes. So this feature give transparency over what's happening - if some note seems to be gone or changed when it shouldn't, the redundant data allows investigating the issue and restoring content.
|
||||
|
||||
Another medium term goal is to allow the implementation of a recycle bin. Behind the scene, this is essentially already done since whenever a note is deleted, a final revision of that note is preserved. What's missing is a user interface (i.e. the recycle bin) to view these deleted notes.
|
||||
|
||||
### How does it work?
|
||||
|
||||
All the apps save a version of the modified notes every 10 minutes. These revisions are then synced across all the devices so if you're looking for a particular version of a note that was made on mobile, you can later find that version on the desktop app too.
|
||||
|
||||
### How to view the history of a note?
|
||||
|
||||
While all the apps save revisions, currently only the desktop one allow viewing these revisions.
|
||||
|
||||
To do so, click on the Information icon in the toolbar, then select "Previous version of this note".
|
||||
|
||||
![](images/20190523-231026_0.png)
|
||||
|
||||
The next screen will show the latest version of the note. You can then choose to view a different version, if any, or to restore one of them.
|
||||
|
||||
To restore a note, simply click on the "Restore" button. The old version of the note will be copied in a folder called "Restored Notes". The current version of the note will not be replaced or modified.
|
||||
|
||||
![](images/20190523-231026_1.png)
|
||||
|
||||
### How to configure the note history feature?
|
||||
|
||||
Additional options are available in the "Note History" section of the configuration screen. It is possible to enable/disable the note history feature. It is also possible to specify for how long the history of a note should be kept (by default, for 90 days).
|
||||
|
||||
IMPORTANT: Please note that since all the revisions are synced across all devices, it means these settings are kind of global. So for example, if on one device you set it to keep revisions for 30 days, and on another to 100 days, the revisions older than 30 days will be deleted, and then this deletion will be synced. So in practice it means revisions are kept for whatever is the minimum number of days as set on any of the devices. In that particular case, the 100 days setting will be essentially ignored, and only the 30 days one will apply.
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/note-history-now-27083082
|
||||
published_at: 2019-05-23T22:10:26.000+00:00
|
16
readme/blog/20190611-000711.md
Normal file
@ -0,0 +1,16 @@
|
||||
# Changing attachment download behaviour to save disk space
|
||||
|
||||
One issue that came up frequently in the forum is that Joplin's data can be very large, especially when the note collection includes many attachments (images, PDFs, etc.). This happens in particular when using the web clipper a lot, as each web page usually has many images included.
|
||||
|
||||
The recent versions of Joplin (Desktop, mobile and CLI) attempt to mitigate this issue by providing an option to change how attachments are downloaded during synchronisation.
|
||||
|
||||
![](images/20190611-000711_0.png)
|
||||
|
||||
The default option is to download all the attachments, all the time, so that the data is available even when the device is offline. However, more importantly, there's now the option to download the attachments **manually,** by clicking on it, or **automatically**, in which case the attachments are downloaded only when a note is opened.
|
||||
|
||||
These changes should help saving disk space and network bandwidth, especially on mobile.
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/changing-to-save-27539487
|
||||
published_at: 2019-06-10T23:07:11.000+00:00
|
16
readme/blog/20190613-202613.md
Normal file
@ -0,0 +1,16 @@
|
||||
# Customising your notes with the help of the development tools and CSS
|
||||
|
||||
In Joplin desktop, it has been possible [to customise the appearance of your notes](https://joplinapp.org/#custom-css) using CSS for quite some time.
|
||||
|
||||
An issue however is that it is difficult to know what CSS to write and how to select specific elements with CSS. The development tools that were just added allow figuring this out. They are available under the menu **Help > Toggle development tools.**
|
||||
|
||||
![](images/20190613-202613_0.png)
|
||||
|
||||
Then, from the "Elements" tab, it is possible to select an element and view the corresponding HTML as well as styles. It is also possible to modify the style in real time and view the changes before adding them to userstyle.css.
|
||||
|
||||
![](images/20190613-202613_1.png)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/customising-your-27609047
|
||||
published_at: 2019-06-13T19:26:13.000+00:00
|
28
readme/blog/20190814-225957.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Joplin now supports Fountain screenwriting markup language
|
||||
|
||||
[Fountain](https://fountain.io/) is markup language for screenwriting. Similar to Markdown, it is a lightweight markup format, which allows editing screenplays in plain text.
|
||||
|
||||
The desktop and mobile Joplin applications now support Fountain, allowing you to write and read your screenplays on your computer or on the go. To add a Fountain screenplay to a note simply wrap it into a fenced block, with the "fountain" identifier. For example:
|
||||
|
||||
```fountain
|
||||
|
||||
\*\*FADE IN:\*\*
|
||||
|
||||
A RIVER.
|
||||
|
||||
We're underwater, watching a fat catfish swim along.
|
||||
|
||||
```
|
||||
|
||||
For example, here is Big Fish on mobile:
|
||||
|
||||
![](images/20190814-225957_0.png)
|
||||
|
||||
and on desktop:
|
||||
|
||||
![](images/20190814-225957_1.png)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/joplin-now-29169691
|
||||
published_at: 2019-08-14T21:59:57.000+00:00
|
58
readme/blog/20190925-000254.md
Normal file
@ -0,0 +1,58 @@
|
||||
# New icon for Joplin!
|
||||
|
||||
The Joplin icon is going to change soon. The one we have now is something I put together quickly, not knowing if the project would interest someone, so I didn't want to spend too much time on it. Now that the project is more mature, it makes sense to start improving the visuals - first the icon, then the logo font, the website and finally the app UI (although these have already been improved little by little over the past year).
|
||||
|
||||
Before picking an icon, I'd be interested to hear about your feedback and whether you have a preference among those below. They all share the same idea - which is something that looks like a note, and that contains a "J" too.
|
||||
|
||||
Feedback is welcome! And if you have a preference **please answer this post and put your top 2 or 3 icons** in your post and we'll do a tally in a few days.
|
||||
|
||||
**Icon A**
|
||||
|
||||
![](images/20190925-000254_0.png)
|
||||
|
||||
|
||||
|
||||
**Icon B**
|
||||
|
||||
![](images/20190925-000254_1.png)
|
||||
|
||||
|
||||
|
||||
**Icon C**
|
||||
|
||||
![](images/20190925-000254_2.png)
|
||||
|
||||
|
||||
|
||||
**Icon D**
|
||||
|
||||
![](images/20190925-000254_3.png)
|
||||
|
||||
|
||||
|
||||
**Icon E**
|
||||
|
||||
![](images/20190925-000254_4.png)
|
||||
|
||||
|
||||
|
||||
**Icon F**
|
||||
|
||||
![](images/20190925-000254_5.png)
|
||||
|
||||
|
||||
|
||||
**Icon G**
|
||||
|
||||
![](images/20190925-000254_6.png)
|
||||
|
||||
|
||||
|
||||
**Icon H**
|
||||
|
||||
![](images/20190925-000254_7.png)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/new-icon-for-30218482
|
||||
published_at: 2019-09-24T23:02:54.000+00:00
|
28
readme/blog/20190929-152834.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Hacktoberfest 2019 is coming soon!
|
||||
|
||||
|
||||
|
||||
A word form @foxmask, our community manager!
|
||||
|
||||
\* \* \*
|
||||
|
||||
[Hacktoberfest](https://hacktoberfest.digitalocean.com/) is back this year again for our great pleasure ^^
|
||||
|
||||
here are the rules to participate:
|
||||
|
||||
> To qualify for the official limited edition Hacktoberfest shirt, you must register and make four pull requests (PRs) between October 1-31 (in any time zone). PRs can be made to any public repo on GitHub, not only the ones with issues labeled Hacktoberfest. This year, the first 50,000 participants who successfully complete the challenge will earn a T-shirt.
|
||||
|
||||
To participate go to [https://hacktoberfest.digitalocean.com/](https://hacktoberfest.digitalocean.com/), log in (with you GitHub account) and you are ready to get in.
|
||||
|
||||
Next, go dive into the Joplin issues list labelled "[Hacktoberfest](https://github.com/laurent22/joplin/labels/hacktoberfest)".
|
||||
|
||||
Start hacking, submit the PR from the 1st of October, not before.
|
||||
|
||||
We hope you will enjoy that event this year again like the previous one 🎃 🎉
|
||||
|
||||
*PS: the 4 Pull Request don’t have to be done* ***only*** *on Joplin project, those can be done on any FOSS projects. Even PR for issue not tagged as 'hacktoberfest'*
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/hacktoberfest-is-30334358
|
||||
published_at: 2019-09-29T14:28:34.000+00:00
|
18
readme/blog/20191012-233121.md
Normal file
@ -0,0 +1,18 @@
|
||||
# Support for chemical equations using mhchem for Katex
|
||||
|
||||
The next version of Joplin will feature support for chemical equations using mhchem for Katex.
|
||||
|
||||
For example this mhchem syntax will be rendered as below in Joplin:
|
||||
|
||||
> $\\ce{CO2 + C -> 2 CO}$
|
||||
|
||||
> $C_p\[\\ce{H2O(l)}\] = \\pu{75.3 J // mol K}$
|
||||
|
||||
> $\\ce{Hg^2+ ->\[I-\] HgI2 ->\[I-\] \[Hg^{II}I4\]^2-}$
|
||||
|
||||
![](images/20191012-233121_0.png)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/support-for-for-30712513
|
||||
published_at: 2019-10-12T22:31:21.000+00:00
|
16
readme/blog/20191014-165136.md
Normal file
@ -0,0 +1,16 @@
|
||||
# New Joplin icon, second round
|
||||
|
||||
The quest for a [new Joplin icon](https://www.patreon.com/posts/new-icon-for-30218482) continue - first many thanks for the votes and feedback! It definitely helped getting a better sense of what would make a great icon.
|
||||
|
||||
Taking all this into account, the remaining candidates are the 5 following icons. The first three were the top voted icons, and the following two are based on the feedback here and on the forum.
|
||||
|
||||
Again that would be great if you could vote for your top 2 icons. I expect the winner among these will be the next Joplin icon. Also of course general feedback is welcome too!
|
||||
|
||||
|
||||
|
||||
![](images/20191014-165136_0.png)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/new-joplin-icon-30751136
|
||||
published_at: 2019-10-14T15:51:36.000+00:00
|
17
readme/blog/20191101-131852.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Hacktoberfest 2019 has now ended 🎃
|
||||
|
||||
We got lots of great contributions for Hacktoberfest 2019, including:
|
||||
|
||||
- 48 pull requests opened
|
||||
- 39 pull requests merged
|
||||
|
||||
This year, one small issue is that we got 11 "spam" contributions, as in pull requests that are created only as a way to get a the Hacktoberfest T-shirt. It's not too many, thankfully, but it still makes us lose time as we need to review the code, and sometimes ask questions, to which we get no answer, etc.
|
||||
|
||||
On the other hand, the total number of valid pull requests is high, at 48 it's nearly twice as many as last year (we got 26 in 2018). Many of these are great improvements to Joplin and they will be part of the coming release.
|
||||
|
||||
Thanks a lot to all the contributors! Also many thanks to our admins, tessus, for his valuable help reviewing and commenting on many pull requests, and foxmask for organising the event.
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/hacktoberfest-31221846
|
||||
published_at: 2019-11-01T13:18:52.000+00:00
|
32
readme/blog/20191117-183855.md
Normal file
@ -0,0 +1,32 @@
|
||||
# And the winner is...
|
||||
|
||||
After much discussion and votes and new logo and icon for Joplin has finally been decided:
|
||||
|
||||
![](images/20191117-183855_0.png)
|
||||
|
||||
In the end, it is an icon relatively similar to the previous one but with a unique style for the "J", which gives it a distinctive look.
|
||||
|
||||
Perhaps that's the best way - evolving and cleaning up the icon rather than radically changing it. Another advantage of this icon is that it does not represent any specific object (it's not a note, or notebook), so it does not restrict the scope of the project, which as it grows, is becoming more than just a tool to take notes.
|
||||
|
||||
Finally, this icon scales well at different sizes, including down to 16x16 pixels which we need for tray icons. It also works well inside circles (for Android) and square shapes.
|
||||
|
||||
Over the next few weeks, the icon and logo will be updated in the various apps and websites. That will give an opportunity to refresh the icons used throughout the apps, as several of them have incorrect dimensions, in particular on desktop and Android.
|
||||
|
||||
For information, this was the final tally, with Patreon and forum votes combined, with more weight (2 points) given to the first choice:
|
||||
|
||||
A 30
|
||||
|
||||
B 45
|
||||
|
||||
C 115
|
||||
|
||||
D 135
|
||||
|
||||
E 61
|
||||
|
||||
Many thanks to everyone who's contributed to the votes and discussion!
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/and-winner-is-31636650
|
||||
published_at: 2019-11-17T18:38:55.000+00:00
|
23
readme/blog/20191118-072700.md
Normal file
@ -0,0 +1,23 @@
|
||||
# Joplin is looking into joining Google Summer of Code in 2020
|
||||
|
||||
![](images/20191118-072700_0.png)
|
||||
|
||||
Joplin is looking into joining **Google Summer of Code** next summer. The application period as organisation is expected to happen in the second half of January 2020. Until then Joplin hopes to have multiple active discussion and may even have some easy commits in regard to the application and potential projects.
|
||||
|
||||
For those who don’t know, GSoC is a summer internship sponsored by Google, where **open source organisations get full-time students as interns** (paid by Google) to help take care of tasks. It’s a huge boon to many open source projects, allowing potentially some impressive progress to take place, and therefore many organisations try to qualify.
|
||||
|
||||
In order to apply, we'd need:
|
||||
|
||||
- **A list of good task suggestions for students**. These tasks need to be things that can be realistically done by someone working full-time over a single summer. Students can suggest other tasks, but we are going to provide some suggestions.
|
||||
- **People volunteering to mentor a student.** Mentoring requires continuous communication and contact with the student, as well as responding to requests and questions. I’ve mentored in the past, and it’s a fun experience.
|
||||
|
||||
Fell free to make a suggestion or offer support by creating topics in the [Features category](https://discourse.joplinapp.org/c/features) of the forum and tagging them by **#GSoC** and **#2020**, if it is directly related to the upcoming coding season. More details on how to contribute will be published soon.
|
||||
|
||||
In general, Google wants to know that its money is put to good use, so we, as the Joplin community, need to show active involvement in this, leading to a solid schedule of desired deliverables during the coding phase.
|
||||
|
||||
The GSoC application is managed by **@PackElend**. He is an open source enthusiast with a big believe in a fair economy. He has recognised that Joplin has the potential to become one of the best note taking apps, and he sees the GSoC has a great opportunity to bring certain essential features to Joplin. PackElend mentored students in the past for another project and thus is aware of the pitfalls. He would appreciate if he could get support in giving the documentation the final touch.
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/joplin-is-into-31650911
|
||||
published_at: 2019-11-18T07:27:00.000+00:00
|
12
readme/blog/20200220-190804.md
Normal file
@ -0,0 +1,12 @@
|
||||
# GSoC 2020: Joplin has been accepted as a mentor organization!
|
||||
|
||||
Good news, our Google Summer of Code 2020 application [has been accepted](https://summerofcode.withgoogle.com/organizations/?sp-search=joplin#6258880889225216)!
|
||||
|
||||
Since we made the announcement back in November, we already had a few students submitted pull requests and getting themselves familiar with the codebase.
|
||||
|
||||
We hope some of them will work on [the project ideas](https://joplinapp.org/gsoc2020/ideas.html) we've suggested, and develop some great features this summer!
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/gsoc-2020-joplin-34196835
|
||||
published_at: 2020-02-20T19:08:04.000+00:00
|
44
readme/blog/20200301-125055.md
Normal file
@ -0,0 +1,44 @@
|
||||
# Large desktop update coming soon
|
||||
|
||||
I haven't kept up with releases lately and thus the new one is quite big, it includes 8 new features, 3 security fixes, 19 improvements, and 29 bug fixes. Here's a summary of what to expect:
|
||||
|
||||
**Mermaid diagram support**
|
||||
|
||||
Mermaid was one of the most requested features, and it is finally here. The diagrams can be inserted using a fenced block, and all the diagrams supported by the library should be available, including Flow, Sequence, Gantt, Class, State and Pie diagrams.
|
||||
|
||||
![](images/20200301-125055_0.png)
|
||||
|
||||
More info in the [Mermaid Markdown documentation](https://joplinapp.org/markdown/#diagrams)
|
||||
|
||||
**Word counter dialog**
|
||||
|
||||
A dialog is now available to provide statistics about the current note. It includes line, word and character count:
|
||||
|
||||
![](images/20200301-125055_1.png)
|
||||
|
||||
To open it, click on the post-it toolbar icon.
|
||||
|
||||
**Improved tag management**
|
||||
|
||||
Also included are several improvement to tags, such as the possibility to add or remove tags from multiple notes, improved sorting of tags in certain contexts, and various other fixes.
|
||||
|
||||
**Security fixes**
|
||||
|
||||
Joplin having to deal with potentially sensitive data, it is build with privacy and security in mind. We also try to fix any reported security issue as quickly as possible.
|
||||
|
||||
This release in particular includes a fix to an XSS vulnerability, which could have allowed an attacker, via a targetted attack and a specially crafted note, to exfiltrate user data. As far as we are aware, this flaw had not been exploited yet.
|
||||
|
||||
Finally, the geolocation service on the desktop application was previously using an http service to get the user location. We now use instead an https URL, which will increase privacy.
|
||||
|
||||
**Linux**
|
||||
|
||||
It is often more difficult to keep up with Linux due to the wide variety of distributions, desktop environments, and the differences between them from one version to the next.
|
||||
|
||||
We however try to keep it stable, and regularly get fixes and updates from Linux users. This release includes support for the --no-sandbox flag, required to get the app starting on certain systems, and an optimisation to Nextcloud and WebDAV sync, which could previously be very slow, using persistent connections.
|
||||
|
||||
The update is already available as a pre-release [on the GitHub release page](https://github.com/laurent22/joplin/releases/tag/v1.0.187), and should be available as a final release soon.
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/large-desktop-34477238
|
||||
published_at: 2020-03-01T12:50:55.000+00:00
|
32
readme/blog/20200314-001555.md
Normal file
@ -0,0 +1,32 @@
|
||||
# Experimental WYSIWYG editor in Joplin
|
||||
|
||||
The latest pre-release of Joplin ([v1.0.194](https://github.com/laurent22/joplin/releases/tag/v1.0.194)) includes a new WYSIWYG editor, a prototype for now, but a first step towards integrating this feature into Joplin.
|
||||
|
||||
![](images/20200314-001555_0.gif)
|
||||
|
||||
WYSIWYG is probably the most requested feature in Joplin - it's the second most up-voted on GitHub, and one of the most viewed and commented on post in the forum.
|
||||
|
||||
Please note however that this feature is experimental at this stage - don't use it for important notes as you may lose the content of the note, or it might get corrupted.
|
||||
|
||||
If you are interested in this editor though it might make sense to use it for less important notes, so as to evaluate it and report bugs and issues you might find.
|
||||
|
||||
This is a technically challenging component because it needs to convert between Markdown and HTML, and vice-versa. Joplin already includes robust HTML-to-MD and MD-to-HTML conversion modules (battle tested respectively in the web clipper and the desktop/mobile client), and this new editor is based on this technology. It is possible however that there are various edge cases that I have not thought of.
|
||||
|
||||
Thus your support to test and validate (or invalidate) this idea would be very much appreciated! If it turns out it does not make sense technically to support this editor, for example if some bugs are critical and can't be solved, it might be removed at a later date, but hopefully all bugs will be fixable. **Please report issues you might find on GitHub,** [**on this post**](https://github.com/laurent22/joplin/issues/176). In there, there's also a list of features that remains to be implemented.
|
||||
|
||||
At the moment, the feature is a bit hidden. **To enable it, go into the menu View => Layout button sequence, and choose "Split / WYSIWYG"**. Then click on the Layout button to toggle between modes.
|
||||
|
||||
**Missing features**
|
||||
|
||||
Some features are missing, most notably the ability to insert plugin blocks such as Katex or Mermaid, so you would have to create them first in the split view. Once created, they can however be edited.
|
||||
|
||||
One issue to be aware of, one that cannot be easily fixed, is that **some Markdown plugins are not supported by the editor**. This is because once the Markdown is converted to HTML, and displayed in the WYSIWYG editor, it cannot be converted back to the original Markdown. Some plugins are supported, such as Katex, Fountain or Mermaid. But others are not, like the multi-md table. So if you open a note that contains a multi-md table in the WYSIWYG editor and save, the original multi-md Markdown will be lost, and you'll get back a plain Markdown table.
|
||||
|
||||
Again if you find any issue, please report it on GitHub: [https://github.com/laurent22/joplin/issues/176](https://github.com/laurent22/joplin/issues/176)
|
||||
|
||||
![](images/20200314-001555_1.gif)
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/experimental-in-34246624
|
||||
published_at: 2020-03-14T00:15:55.000+00:00
|
43
readme/blog/20200406-224254.md
Normal file
@ -0,0 +1,43 @@
|
||||
# Joplin informal encryption and security audit results
|
||||
|
||||
Joplin encryption, and in particular the E2EE system used during synchronisation, was recently audited by Isaac Potoczny-Jones, CEO of [Tozny](https://tozny.com) and this is what he had to say:
|
||||
|
||||
> I was looking through your encryption implementation for Joplin and I have a few comments and concerns. I don't see anything that I \*know\* is a critical issue, but there are a number of choices and weaknesses that I'd like to lend you some advice about.
|
||||
|
||||
### OBC2
|
||||
|
||||
> OCB2, the chosen multi-block cipher mode has had some weaknesses identified in the last few years. I don't know this mode well since it's not a NIST-approved mode, but here's a paper on the topic. I get the impression it's not considered a good choice anymore. [Source](https://pdfs.semanticscholar.org/bb95/0d82fd390e732f71d8320530994bfb6d2529.pdf)
|
||||
|
||||
We indeed had been notified about this issue by another cryptographer and had been preparing migration to the more secure CCM mode. Migration for this is now complete in all the Joplin clients and a migration tool has been added to the Encryption config screen of the desktop application. In particular you can perform two operations:
|
||||
|
||||
- Upgrade the master key: This will convert the master key encryption to CCM
|
||||
- Re-encryption: With this tool, you can re-encrypt all your data using the new encryption method based on CCM. Please follow the instructions on this screen and note that this process can take quite a bit of time so it's better to plan for it and run it over night. It is not entirely clear how the OBC2 flaw can be exploited but it is best to upgrade your data as soon as possible.
|
||||
|
||||
### Unnecessary key expansions
|
||||
|
||||
> Running key expansion on a random key: Your encrypt function uses either 1k or 10k rounds of key derivation. The goal of this is to reduce brute-force attacks against user-chosen passwords. This function appears to me to be used for both password-based key derivation (at 10k rounds) \*and\* bulk encryption of data from a randomly-generated "master key" (at 1k rounds). The bulk encryption does not need the password expansion since the key is randomly generated (presumably with a cryptographically strong generator). I suspect this could be a major performance issue on the bulk encryption of raw data, so if you're finding encryption slow, this is maybe why.
|
||||
|
||||
This is more a performance than a security issue. Indeed, the previous encryption method was using 1,000 key expansion iterations every time a note was encrypted, which is unnecessary since the master key is already secured with 10,000 iterations. As a result the encryption algorithm has been changed to perform only 100 iterations when encrypting notes, which should result in faster encryption and decryption on the desktop, mobile and CLI applications.
|
||||
|
||||
### Unnecessary and potentially insecure master key checksum
|
||||
|
||||
> You make and store a checksum of the master password with SHA256 in addition to encrypting it. I expect this is because you need a way to tell if the user's password is correct. I've never seen this done before, and it has me concerned, but I don't know for sure that it's an issue. Thought I'd mention it anyway. [Source](https://crypto.stackexchange.com/questions/61915/can-i-hash-a-secret-key-and-used-the-hash-as-key-id). At least with CCM mode (and I think with OCB2) it shouldn't successfully decrypt if you have the wrong password.
|
||||
|
||||
A checksum was previously stored with the master key to verify that it is valid. This could potentially weaken the security of the mater key since, as mentioned in Cryptography StackExchange link, "in the standard model of hash functions there isn't a requirement that hash outputs not have properties that leak information about the input". It was also unnecessary since the decryption algorithm in use would fail if the key is invalid, so the additional checksum was not needed.
|
||||
|
||||
This has also been addressed by the new master key upgrading tool. If you have performed the upgrade, the checksum will be gone from your master key.
|
||||
|
||||
### Encrypting local secrets with a keychain service
|
||||
|
||||
> Now I did notice that you cache the plain text password in the database, which is a bit concerning, but I guess the security model of your encryption approach is that it happens during sync, not locally. The generally accepted approach \[to store secrets\] is to use a keychain service, which is available pretty much on all modern platforms.
|
||||
|
||||
Passwords are indeed cached locally, so that you don't have to input it again every time a note needs to be encrypted or decrypted for synchronisation. It is assumed that your local device is secure, which is why for now passwords were cached locally.
|
||||
|
||||
To improve security however, future versions of Joplin will use the system keychain whenever it is available. A [pull request](https://github.com/laurent22/joplin/pull/2861) is in progress to add this feature.
|
||||
|
||||
To conclude I'd like to thank Isaac Potoczny-Jones for conducting this audit and revealing these potential security issues. Joplin is now much safer as a result.
|
||||
|
||||
* * *
|
||||
|
||||
url: https://www.patreon.com/posts/joplin-informal-35719724
|
||||
published_at: 2020-04-06T21:42:54.000+00:00
|
BIN
readme/blog/images/20180621-182112_0.png
Normal file
After Width: | Height: | Size: 387 KiB |
BIN
readme/blog/images/20180906-111039_0.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
readme/blog/images/20180916-210431_0.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
readme/blog/images/20190130-230218_0.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
readme/blog/images/20190404-074157_0.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
readme/blog/images/20190404-074157_1.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
readme/blog/images/20190523-231026_0.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
readme/blog/images/20190523-231026_1.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
readme/blog/images/20190611-000711_0.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
readme/blog/images/20190613-202613_0.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
readme/blog/images/20190613-202613_1.png
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
readme/blog/images/20190814-225957_0.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
readme/blog/images/20190814-225957_1.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
readme/blog/images/20190925-000254_0.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
readme/blog/images/20190925-000254_1.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
readme/blog/images/20190925-000254_2.png
Normal file
After Width: | Height: | Size: 6.7 KiB |
BIN
readme/blog/images/20190925-000254_3.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
readme/blog/images/20190925-000254_4.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
readme/blog/images/20190925-000254_5.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
readme/blog/images/20190925-000254_6.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
readme/blog/images/20190925-000254_7.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
readme/blog/images/20191012-233121_0.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
readme/blog/images/20191014-165136_0.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
readme/blog/images/20191117-183855_0.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
readme/blog/images/20191118-072700_0.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
readme/blog/images/20200301-125055_0.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
readme/blog/images/20200301-125055_1.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
readme/blog/images/20200314-001555_0.gif
Normal file
After Width: | Height: | Size: 20 MiB |
BIN
readme/blog/images/20200314-001555_1.gif
Normal file
After Width: | Height: | Size: 5.1 MiB |