We Have a New Pick for the Best App for Taking Handwritten Notes on the iPad



Our timing of our review for the best app for taking handwritten notes on the iPad was impeccable: just a day or two after we originally launched the review, GoodNotes 5 launched an upgrade to GoodNotes 4 and introduced a bevy of new features. We were initially hesitant to quickly rewrite our review all due to the launch of GoodNotes 5, but the additional time has provided clarity.
Since that original review launch, GoodNotes 5 has continued becoming better at what it does. The new design fits the latest iOS aesthetics, while its seemingly unlimited options of pens, highlighters, and shape tools make using the app easier than ever.

Our Must-Have, Must Used Productivity Apps
We spend an inordinate amount of time sorting through hundreds of apps to find the very best. We put together a short list of our must-have, most-used apps for increasing productivity.
Send me the roundup »



window.rmpanda = window.rmpanda || {};
window.rmpanda.wpvars = window.rmpanda.wpvars || {};

var debug = (window.rmpanda || {}).debug || /rmdebug=1/.test(window.location.search);
var logger = {};
Object.keys(console).forEach(f => {
if (typeof console[f] === 'function') {
logger[f] = function() {
debug && console[f].apply(console, Array.prototype.slice.call(arguments));
};
}
});

function pipelistToArray(pipelist) {
return (pipelist || '').replace(/^|||$/g, '').split('|');
}

function arrayToPipelist(array) {
return '|' + (array || []).join('|') + '|';
}

function createLeaderboard(cachedPosts, dataKey) {
var leaderboard = {};
var totalRead = cachedPosts.length;

cachedPosts.forEach(function(pageview, idx) {
var pID = pageview[0]; var slugs = pageview[1][dataKey];
var score = 0.5 + ((1.0 - (idx / totalRead)) * 0.5);
slugs.forEach(function(slug) {
leaderboard[slug] = leaderboard[slug] || 0;
leaderboard[slug] += score;
});
});

return leaderboard;
}

function findLeaderboardWinners(leaderboard) {
var winningScore = 0;
var winners = [];
Object.keys(leaderboard).forEach(function(candidate) {
var candidateScore = leaderboard[candidate];
if (candidateScore >= winningScore) {
winningScore = candidateScore;
if (candidateScore > winningScore) {
winners = [];
}
winners.push(candidate);
}
});
return winners;
}

window.rmpanda.wpvars = {};

var cachedPosts = JSON.parse(localStorage.getItem('rmCachedPosts')) || [];


var categoriesLeaderboard = createLeaderboard(cachedPosts, 'categories');
logger.log("CATEGORIES LEADERBOARD:", categoriesLeaderboard);

var tagsLeaderboard = createLeaderboard(cachedPosts, 'tags');
logger.log("TAGS LEADERBOARD:", tagsLeaderboard);

window.rmpanda.wpvars.favoriteCategorySlugs = arrayToPipelist(findLeaderboardWinners(categoriesLeaderboard));
window.rmpanda.wpvars.favoriteTagSlugs = arrayToPipelist(findLeaderboardWinners(tagsLeaderboard));

localStorage.setItem('rmCachedPosts', JSON.stringify(cachedPosts));



But perhaps more important than all those features are the ability to create PDF paper templates inside GoodNotes . If you have a certain type of paper you want to use over and over again, Goodnotes can create a paper template from any PDF, making your notebook truly and uniquely your own (you can create paper templates quite easily inside an app like OmniOutliner ).
It’s these features, alongside great backup, sync, and security, and an impending Mac app that make Goodnotes 5 our new pick for the best handwriting note-taking app for the iPad.

Our review has been updated with some new photography and, best of all, now comes with a handy guide to quickly get you started with GoodNotes 5 . Our new guide teaches you how to create and save custom page templates and how to use those page templates to transform GoodNotes into your own productivity notebook. The guide is completely free — just check out our review for the full details.

Wait. There’s a Bonus….
Custom Productivity Templates for GoodNotes
If you want to use custom productivity templates in GoodNotes, we’ve put together a free guide that can help you.
We’ll show you…

How to create and save custom page templates.
How to use those page templates to transform GoodNotes into your own productivity notebook (or any other type of notebook replacement).

Plus, we also have included a couple of our custom productivity templates for you to get started with. These templates are right out of our popular productivity course.


This guide is available for FREE to our email subscriber community. And you can get it right now. By joining the Sweet Setup community you’ll also get access to our other guides, early previews to big new reviews and workflow articles we are working on, weekly roundups of our best content, and more.

GET THE TEMPLATES



window.rmpanda = window.rmpanda || {};
window.rmpanda.wpvars = window.rmpanda.wpvars || {};

var debug = (window.rmpanda || {}).debug || /rmdebug=1/.test(window.location.search);
var logger = {};
Object.keys(console).forEach(f => {
if (typeof console[f] === 'function') {
logger[f] = function() {
debug && console[f].apply(console, Array.prototype.slice.call(arguments));
};
}
});

function pipelistToArray(pipelist) {
return (pipelist || '').replace(/^|||$/g, '').split('|');
}

function arrayToPipelist(array) {
return '|' + (array || []).join('|') + '|';
}

function createLeaderboard(cachedPosts, dataKey) {
var leaderboard = {};
var totalRead = cachedPosts.length;

cachedPosts.forEach(function(pageview, idx) {
var pID = pageview[0]; var slugs = pageview[1][dataKey];
var score = 0.5 + ((1.0 - (idx / totalRead)) * 0.5);
slugs.forEach(function(slug) {
leaderboard[slug] = leaderboard[slug] || 0;
leaderboard[slug] += score;
});
});

return leaderboard;
}

function findLeaderboardWinners(leaderboard) {
var winningScore = 0;
var winners = [];
Object.keys(leaderboard).forEach(function(candidate) {
var candidateScore = leaderboard[candidate];
if (candidateScore >= winningScore) {
winningScore = candidateScore;
if (candidateScore > winningScore) {
winners = [];
}
winners.push(candidate);
}
});
return winners;
}

window.rmpanda.wpvars = {};

var cachedPosts = JSON.parse(localStorage.getItem('rmCachedPosts')) || [];


var categoriesLeaderboard = createLeaderboard(cachedPosts, 'categories');
logger.log("CATEGORIES LEADERBOARD:", categoriesLeaderboard);

var tagsLeaderboard = createLeaderboard(cachedPosts, 'tags');
logger.log("TAGS LEADERBOARD:", tagsLeaderboard);

window.rmpanda.wpvars.favoriteCategorySlugs = arrayToPipelist(findLeaderboardWinners(categoriesLeaderboard));
window.rmpanda.wpvars.favoriteTagSlugs = arrayToPipelist(findLeaderboardWinners(tagsLeaderboard));

localStorage.setItem('rmCachedPosts', JSON.stringify(cachedPosts));




window.rmpanda = window.rmpanda || {};
window.rmpanda.wpvars = window.rmpanda.wpvars || {};

var debug = (window.rmpanda || {}).debug || /rmdebug=1/.test(window.location.search);
var logger = {};
Object.keys(console).forEach(f => {
if (typeof console[f] === 'function') {
logger[f] = function() {
debug && console[f].apply(console, Array.prototype.slice.call(arguments));
};
}
});

function pipelistToArray(pipelist) {
return (pipelist || '').replace(/^|||$/g, '').split('|');
}

function arrayToPipelist(array) {
return '|' + (array || []).join('|') + '|';
}

function createLeaderboard(cachedPosts, dataKey) {
var leaderboard = {};
var totalRead = cachedPosts.length;

cachedPosts.forEach(function(pageview, idx) {
var pID = pageview[0]; var slugs = pageview[1][dataKey];
var score = 0.5 + ((1.0 - (idx / totalRead)) * 0.5);
slugs.forEach(function(slug) {
leaderboard[slug] = leaderboard[slug] || 0;
leaderboard[slug] += score;
});
});

return leaderboard;
}

function findLeaderboardWinners(leaderboard) {
var winningScore = 0;
var winners = [];
Object.keys(leaderboard).forEach(function(candidate) {
var candidateScore = leaderboard[candidate];
if (candidateScore >= winningScore) {
winningScore = candidateScore;
if (candidateScore > winningScore) {
winners = [];
}
winners.push(candidate);
}
});
return winners;
}

window.rmpanda.wpvars = {};

var cachedPosts = JSON.parse(localStorage.getItem('rmCachedPosts')) || [];


var categoriesLeaderboard = createLeaderboard(cachedPosts, 'categories');
logger.log("CATEGORIES LEADERBOARD:", categoriesLeaderboard);

var tagsLeaderboard = createLeaderboard(cachedPosts, 'tags');
logger.log("TAGS LEADERBOARD:", tagsLeaderboard);

window.rmpanda.wpvars.favoriteCategorySlugs = arrayToPipelist(findLeaderboardWinners(categoriesLeaderboard));
window.rmpanda.wpvars.favoriteTagSlugs = arrayToPipelist(findLeaderboardWinners(tagsLeaderboard));

localStorage.setItem('rmCachedPosts', JSON.stringify(cachedPosts));


Top News