mirror of
https://github.com/streetwriters/notesnook.git
synced 2026-08-29 10:09:26 +02:00
docs(help): rebuild the help site with VitePress (#10169)
* docs: new help built with vitepress. * docs: improve docs home ui Added a Go to Docs button on homepage Added a searchbar for directly searching what you are looking for in the docs * docs(help): wire up with build system & setup proper ci * Clean up new documentation (#10174) * Docs: Cleanup pass 1 Signed-off-by: Chloe Oletto <NeedsChloesure@riseup.net> * docs: cleanup pass 2 Signed-off-by: Chloe Oletto <NeedsChloesure@riseup.net> * docs: Fix vscode's manglement that I missed. Signed-off-by: Chloe Oletto <NeedsChloesure@riseup.net> * Update docs/help/contents/plans-and-limits.md Co-authored-by: Abdullah Atta <thecodrr@protonmail.com> Signed-off-by: Chloe Oletto <NeedsChloesure@riseup.net> * Update docs/help/contents/rich-text-editor/outline-lists.md Co-authored-by: Abdullah Atta <thecodrr@protonmail.com> Signed-off-by: Chloe Oletto <NeedsChloesure@riseup.net> * docs: Remove self-hosting guide from sidebar, and comments for reviewer. Signed-off-by: Chloe Oletto <NeedsChloesure@riseup.net> --------- Signed-off-by: Chloe Oletto <NeedsChloesure@riseup.net> Co-authored-by: Abdullah Atta <thecodrr@protonmail.com> * docs: some fixes * ci: do not publish help on push * docs(help): improve regional pricing & free trials * docs: improve sidebar * docs: some more fixes after re-review * docs: improve search and nav * docs: a few more fixes * docs: fix tabs formatting compat with prettier * docs: fix tabs formatting in various places * docs: show correct plus button image for mobile * docs: disable notesnook self hosting docs * docs: update help docs with fixes --------- Signed-off-by: Chloe Oletto <NeedsChloesure@riseup.net> Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co> Co-authored-by: Chloe Oletto <NeedsChloesure@riseup.net> Co-authored-by: Abdullah Atta <thecodrr@protonmail.com>
This commit is contained in:
81
.github/workflows/help.preview.yml
vendored
Normal file
81
.github/workflows/help.preview.yml
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
name: Notesnook Help PR Preview
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, reopened, synchronize]
|
||||
branches: [master, beta]
|
||||
paths:
|
||||
- "docs/help/**"
|
||||
# re-run workflow if workflow file changes
|
||||
- ".github/workflows/help.preview.yml"
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node
|
||||
uses: ./.github/actions/setup-node-with-cache
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm ci --ignore-scripts --prefer-offline --no-audit
|
||||
npm run bootstrap -- --scope=help
|
||||
|
||||
- name: Build help
|
||||
run: npm run build:help
|
||||
|
||||
- name: Deploy to Cloudflare Pages
|
||||
id: deploy
|
||||
working-directory: ./docs/help
|
||||
run: |
|
||||
set -euo pipefail
|
||||
BRANCH=pr-${{ github.event.number }}-$(echo "${{ github.sha }}" | cut -c1-7)
|
||||
echo "Deploying branch: $BRANCH"
|
||||
DEPLOY_OUT=$(npx --yes wrangler pages deploy --project-name=notesnook-help --branch="$BRANCH" ./.vitepress/dist 2>&1) || { echo "$DEPLOY_OUT"; exit 1; }
|
||||
echo "$DEPLOY_OUT"
|
||||
PREVIEW_URL=$(printf "%s" "$DEPLOY_OUT" | grep -Eo 'https?://[^ ]+' | head -1 || true)
|
||||
if [ -z "$PREVIEW_URL" ]; then
|
||||
echo "WARNING: could not parse preview URL from wrangler output"
|
||||
fi
|
||||
echo "preview_url=$PREVIEW_URL" >> $GITHUB_ENV
|
||||
|
||||
- name: Post or update PR comment
|
||||
uses: actions/github-script@v6
|
||||
env:
|
||||
preview_url: ${{ env.preview_url }}
|
||||
with:
|
||||
script: |
|
||||
const marker = '<!-- docs-pages-preview-comment -->';
|
||||
const prNumber = context.issue.number;
|
||||
const previewUrl = process.env.preview_url || '';
|
||||
const body = `${marker}\n**Cloudflare Pages Docs Preview**\n\n${previewUrl || 'Preview URL unavailable — check workflow logs.'}\n\nCommit: ${process.env.GITHUB_SHA}\n`;
|
||||
const { data: comments } = await github.rest.issues.listComments({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: prNumber,
|
||||
});
|
||||
const existing = comments.find(c => c.body && c.body.includes(marker));
|
||||
if (existing) {
|
||||
await github.rest.issues.updateComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
comment_id: existing.id,
|
||||
body,
|
||||
});
|
||||
} else {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: prNumber,
|
||||
body,
|
||||
});
|
||||
}
|
||||
27
.github/workflows/help.publish.yml
vendored
27
.github/workflows/help.publish.yml
vendored
@@ -2,11 +2,6 @@ name: Publish Notesnook Help
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
paths:
|
||||
- "docs/help/**"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -14,17 +9,21 @@ jobs:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
- uses: actions-rs/toolchain@v1
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
toolchain: stable
|
||||
# VitePress reads git history to show the last updated date per page.
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install docgen
|
||||
run: cargo install --git https://github.com/thecodrr/docgen
|
||||
- name: Setup Node
|
||||
uses: ./.github/actions/setup-node-with-cache
|
||||
|
||||
- name: Build site
|
||||
run: docgen build --release
|
||||
working-directory: docs/help
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm ci --ignore-scripts --prefer-offline --no-audit
|
||||
npm run bootstrap -- --scope=help
|
||||
|
||||
- name: Build help
|
||||
run: npm run build:help
|
||||
|
||||
- name: Setup environment
|
||||
run: |
|
||||
@@ -32,4 +31,4 @@ jobs:
|
||||
echo "CLOUDFLARE_API_TOKEN=${{ secrets.CLOUDFLARE_API_TOKEN }}" >> $GITHUB_ENV
|
||||
|
||||
- name: Publish on Cloudflare Pages
|
||||
run: npx --yes wrangler pages deploy --project-name notesnook-help ./docs/help/site/ --branch main
|
||||
run: npx --yes wrangler pages deploy --project-name notesnook-help ./docs/help/.vitepress/dist/ --branch main
|
||||
|
||||
4
.github/workflows/web.preview.yml
vendored
4
.github/workflows/web.preview.yml
vendored
@@ -27,7 +27,9 @@ jobs:
|
||||
uses: ./.github/actions/setup-node-with-cache
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
run: |
|
||||
npm ci --ignore-scripts --prefer-offline --no-audit
|
||||
npm run bootstrap -- --scope=web
|
||||
|
||||
- name: Build web
|
||||
run: npm run build:web
|
||||
|
||||
4
docs/help/.gitignore
vendored
Normal file
4
docs/help/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
.vitepress/dist
|
||||
.vitepress/cache
|
||||
contents/v*/
|
||||
.vitepress/sidebars/generated.mjs
|
||||
219
docs/help/.vitepress/config.mts
Normal file
219
docs/help/.vitepress/config.mts
Normal file
@@ -0,0 +1,219 @@
|
||||
import { defineConfig } from "vitepress";
|
||||
import { tabsMarkdownPlugin } from "vitepress-plugin-tabs";
|
||||
import taskLists from "markdown-it-task-lists";
|
||||
import { sidebar } from "./sidebar.mjs";
|
||||
import {
|
||||
LATEST,
|
||||
isArchivedPath,
|
||||
versionOfPath,
|
||||
versionsNavItem
|
||||
} from "./versions.mjs";
|
||||
// Latest docs live at the root; the /v<version>/ trees and their sidebars are
|
||||
// composed from contents/_versions/ by scripts/build-versions.mjs, which runs
|
||||
// before dev and build.
|
||||
import { archivedSidebars } from "./sidebars/generated.mjs";
|
||||
import { seoHead, seoTitle } from "./seo.mjs";
|
||||
import { stringsMarkdownPlugin } from "./strings.mjs";
|
||||
|
||||
export default defineConfig({
|
||||
title: "Notesnook Help",
|
||||
description:
|
||||
"Your complete and free resource to using Notesnook as a daily note taking app to organize your work and life while safeguarding your privacy.",
|
||||
lang: "en-US",
|
||||
srcDir: "./contents",
|
||||
// Version overrides are source material for build-versions.mjs, not pages.
|
||||
// The Standard Notes importer is unpublished for now — the page is kept in
|
||||
// the repo but is not built, linked or listed in the sitemap. Delete the
|
||||
// second entry (and restore the sidebar link) to publish it again.
|
||||
srcExclude: [
|
||||
"_versions/**",
|
||||
"importing-notes/import-notes-from-standardnotes.md"
|
||||
],
|
||||
cleanUrls: true,
|
||||
lastUpdated: true,
|
||||
metaChunk: true,
|
||||
sitemap: {
|
||||
hostname: "https://help.notesnook.com",
|
||||
// Only the latest docs belong in the sitemap.
|
||||
transformItems: (items) =>
|
||||
items.filter(
|
||||
(i) => !isArchivedPath(`/${i.url}`) && !i.url.startsWith("404")
|
||||
)
|
||||
},
|
||||
|
||||
transformPageData(pageData, ctx) {
|
||||
const path = `/${pageData.relativePath}`;
|
||||
pageData.frontmatter.head ??= [];
|
||||
|
||||
// Archived pages are kept out of search engines so they don't compete with
|
||||
// the latest docs, and are tagged so the layout can show a version banner.
|
||||
if (isArchivedPath(path)) {
|
||||
pageData.frontmatter.archivedVersion = versionOfPath(path);
|
||||
pageData.frontmatter.latestVersion = LATEST;
|
||||
pageData.frontmatter.head.push([
|
||||
"meta",
|
||||
{ name: "robots", content: "noindex,follow" }
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Canonical, Open Graph, Twitter cards and JSON-LD for the live docs.
|
||||
seoTitle(pageData);
|
||||
pageData.frontmatter.head.push(...seoHead(pageData, ctx));
|
||||
},
|
||||
|
||||
head: [
|
||||
["link", { rel: "icon", href: "/favicon.ico" }],
|
||||
// The two weights that render above the fold on every page.
|
||||
[
|
||||
"link",
|
||||
{
|
||||
rel: "preload",
|
||||
href: "/fonts/Inter-Regular.woff2",
|
||||
as: "font",
|
||||
type: "font/woff2",
|
||||
crossorigin: ""
|
||||
}
|
||||
],
|
||||
[
|
||||
"link",
|
||||
{
|
||||
rel: "preload",
|
||||
href: "/fonts/Inter-SemiBold.woff2",
|
||||
as: "font",
|
||||
type: "font/woff2",
|
||||
crossorigin: ""
|
||||
}
|
||||
],
|
||||
["meta", { name: "theme-color", content: "#008837" }],
|
||||
["meta", { property: "og:type", content: "website" }],
|
||||
["meta", { property: "og:site_name", content: "Notesnook Help" }],
|
||||
["meta", { property: "og:image", content: "/logo.png" }],
|
||||
[
|
||||
"script",
|
||||
{
|
||||
async: "",
|
||||
defer: "",
|
||||
"data-website-id": "ad34576b-2721-436c-b36a-47a614009d2b",
|
||||
src: "https://aas.streetwriters.co/script.js",
|
||||
"data-domains": "help.notesnook.com"
|
||||
}
|
||||
]
|
||||
],
|
||||
|
||||
markdown: {
|
||||
config(md) {
|
||||
md.use(tabsMarkdownPlugin);
|
||||
// `- [x] item` renders as a real checkbox instead of literal "[x]".
|
||||
md.use(taskLists, { label: true, labelAfter: true });
|
||||
|
||||
// `{{archive}}` becomes the live label from packages/intl.
|
||||
md.use(stringsMarkdownPlugin);
|
||||
|
||||
// An image that shares a line with text is a UI glyph ("press the ⋯
|
||||
// button"), not a figure. Tag those so CSS can keep them in the line —
|
||||
// :only-child can't be used for this because it ignores text nodes.
|
||||
md.core.ruler.push("nn_inline_glyphs", (state) => {
|
||||
for (const token of state.tokens) {
|
||||
if (token.type !== "inline" || !token.children) continue;
|
||||
// Line breaks split the inline token into segments. A screenshot on
|
||||
// its own line inside a numbered step lives in the same inline token
|
||||
// as the step's text, so "does this token contain text?" would wrongly
|
||||
// shrink it — the question is whether text sits on *its* line.
|
||||
let segment: typeof token.children = [];
|
||||
const segments = [segment];
|
||||
for (const child of token.children) {
|
||||
if (child.type === "softbreak" || child.type === "hardbreak") {
|
||||
segment = [];
|
||||
segments.push(segment);
|
||||
} else segment.push(child);
|
||||
}
|
||||
for (const line of segments) {
|
||||
const sharesLineWithText = line.some(
|
||||
(child) =>
|
||||
(child.type === "text" && child.content.trim()) ||
|
||||
child.type === "code_inline"
|
||||
);
|
||||
if (!sharesLineWithText) continue;
|
||||
for (const child of line) {
|
||||
if (child.type === "image")
|
||||
child.attrJoin("class", "inline-glyph");
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
},
|
||||
image: { lazyLoading: true }
|
||||
},
|
||||
|
||||
themeConfig: {
|
||||
logo: "/logo.png",
|
||||
siteTitle: "Help",
|
||||
|
||||
nav: [
|
||||
versionsNavItem,
|
||||
{ text: "Downloads", link: "https://notesnook.com/downloads" },
|
||||
{ text: "Pricing", link: "https://notesnook.com/pricing" },
|
||||
{
|
||||
text: "More",
|
||||
items: [
|
||||
{ text: "Notesnook", link: "https://notesnook.com" },
|
||||
{ text: "Blog", link: "https://blog.notesnook.com" },
|
||||
{ text: "Roadmap", link: "https://notesnook.com/roadmap" },
|
||||
{ text: "Contact us", link: "https://notesnook.com/contact-us" },
|
||||
{
|
||||
text: "Report an issue",
|
||||
link: "https://github.com/streetwriters/notesnook/issues/new/choose"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
sidebar: { ...archivedSidebars, "/": sidebar },
|
||||
|
||||
search: {
|
||||
provider: "local",
|
||||
options: {
|
||||
detailedView: true,
|
||||
// Archived versions are excluded so a search for "archive a note" does
|
||||
// not return the same article once per version.
|
||||
_render(src, env, md) {
|
||||
if (isArchivedPath(`/${env.relativePath}`)) return "";
|
||||
return md.render(src, env);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
outline: { level: [2, 3], label: "On this page" },
|
||||
|
||||
editLink: {
|
||||
pattern:
|
||||
"https://github.com/streetwriters/notesnook/edit/master/docs/help/contents/:path",
|
||||
text: "Suggest an edit to this page"
|
||||
},
|
||||
|
||||
lastUpdated: {
|
||||
text: "Last updated",
|
||||
formatOptions: { dateStyle: "medium", forceLocale: false }
|
||||
},
|
||||
|
||||
socialLinks: [
|
||||
{ icon: "github", link: "https://github.com/streetwriters/notesnook" },
|
||||
{ icon: "mastodon", link: "https://mastodon.social/@notesnook" },
|
||||
{ icon: "discord", link: "https://discord.com/invite/zQBK97EE22" },
|
||||
{ icon: "x", link: "https://x.com/notesnook" }
|
||||
],
|
||||
|
||||
footer: {
|
||||
message:
|
||||
'Made with care by <a href="https://streetwriters.co">Streetwriters</a>. Notesnook is <a href="https://github.com/streetwriters/notesnook">open source</a>.',
|
||||
copyright: "Copyright © 2026 Streetwriters (Private) Limited"
|
||||
},
|
||||
|
||||
docFooter: { prev: "Previous", next: "Next" },
|
||||
externalLinkIcon: true,
|
||||
returnToTopLabel: "Back to top",
|
||||
darkModeSwitchLabel: "Appearance"
|
||||
}
|
||||
});
|
||||
207
docs/help/.vitepress/seo.mts
Normal file
207
docs/help/.vitepress/seo.mts
Normal file
@@ -0,0 +1,207 @@
|
||||
/**
|
||||
* Per-page SEO: canonical URL, Open Graph, Twitter cards and JSON-LD.
|
||||
*
|
||||
* The help site ranks #1 for high-intent queries like "import enex", so every
|
||||
* page needs to be individually addressable, individually described, and
|
||||
* eligible for rich results. Driven from each page's frontmatter:
|
||||
*
|
||||
* ---
|
||||
* title: Import from Evernote # sidebar label
|
||||
* description: One sentence… # meta description + search snippet
|
||||
* pageTitle: How to import Evernote… # optional: overrides the <title> only
|
||||
* keywords: [import enex, evernote…] # optional
|
||||
* schema: howto | faq | article # optional, default article
|
||||
* faqs: # required when schema: faq
|
||||
* - q: …
|
||||
* a: …
|
||||
* ---
|
||||
*/
|
||||
import { readFileSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
import type { HeadConfig, TransformPageContext, PageData } from "vitepress";
|
||||
import { resolveString } from "./strings.mjs";
|
||||
|
||||
const SITE = "https://help.notesnook.com";
|
||||
const OG_IMAGE = `${SITE}/logo.png`;
|
||||
|
||||
const url = (relativePath: string) =>
|
||||
`${SITE}/${relativePath.replace(/(index)?\.md$/, "").replace(/\/$/, "")}`.replace(
|
||||
/\/$/,
|
||||
""
|
||||
) || SITE;
|
||||
|
||||
/** "organizing-notes/archive-notes.md" -> ["Organizing notes", "Archive notes"] */
|
||||
function breadcrumbs(relativePath: string, title: string) {
|
||||
const parts = relativePath.split("/").slice(0, -1);
|
||||
const crumbs = [{ name: "Notesnook Help", item: SITE }];
|
||||
let path = "";
|
||||
for (const part of parts) {
|
||||
path += `/${part}`;
|
||||
crumbs.push({
|
||||
name: part.replace(/-/g, " ").replace(/^./, (c) => c.toUpperCase()),
|
||||
item: `${SITE}${path}`
|
||||
});
|
||||
}
|
||||
crumbs.push({ name: title, item: url(relativePath) });
|
||||
return crumbs;
|
||||
}
|
||||
|
||||
/**
|
||||
* The page's markdown. `transformPageData`'s context does not carry the source,
|
||||
* so it is read back off disk.
|
||||
*/
|
||||
function pageSource(relativePath: string) {
|
||||
try {
|
||||
return readFileSync(join(process.cwd(), "contents", relativePath), "utf8");
|
||||
} catch {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/** Numbered list items in the first tab of a page become HowTo steps. */
|
||||
const STRING_TOKEN = /\{\{\s*([A-Za-z][A-Za-z0-9_]*)(?::(\d+))?\s*\}\}/g;
|
||||
|
||||
function howToSteps(src: string) {
|
||||
const steps: { name: string; text: string }[] = [];
|
||||
for (const line of src.split("\n")) {
|
||||
const m = line.match(/^\s*\d+\.\s+(.*\S)\s*$/);
|
||||
if (!m) continue;
|
||||
const text = m[1]
|
||||
.replace(/!\[[^\]]*\]\([^)]*\)/g, "")
|
||||
.replace(/\[([^\]]+)\]\([^)]*\)/g, "$1")
|
||||
// These steps come from the raw markdown, before the markdown-it plugin
|
||||
// has swapped `{{key}}` for the app's label — resolve them here too, or
|
||||
// the structured data Google reads ships the raw tokens.
|
||||
.replace(STRING_TOKEN, (_m, key: string, count?: string) =>
|
||||
resolveString(key, count ? Number(count) : undefined)
|
||||
)
|
||||
.replace(/[`*_]/g, "")
|
||||
.trim();
|
||||
if (text.length > 3) steps.push({ name: text.slice(0, 110), text });
|
||||
if (steps.length >= 12) break;
|
||||
}
|
||||
return steps;
|
||||
}
|
||||
|
||||
function jsonLd(pageData: PageData, ctx: TransformPageContext) {
|
||||
const fm = pageData.frontmatter;
|
||||
const title = (fm.pageTitle || fm.title || pageData.title) as string;
|
||||
const description = (fm.description || "") as string;
|
||||
const pageUrl = url(pageData.relativePath);
|
||||
const graph: Record<string, unknown>[] = [];
|
||||
|
||||
graph.push({
|
||||
"@type": "BreadcrumbList",
|
||||
itemListElement: breadcrumbs(pageData.relativePath, title).map((c, i) => ({
|
||||
"@type": "ListItem",
|
||||
position: i + 1,
|
||||
name: c.name,
|
||||
item: c.item
|
||||
}))
|
||||
});
|
||||
|
||||
const publisher = {
|
||||
"@type": "Organization",
|
||||
name: "Notesnook",
|
||||
url: "https://notesnook.com",
|
||||
logo: OG_IMAGE
|
||||
};
|
||||
|
||||
if (fm.schema === "faq" && Array.isArray(fm.faqs) && fm.faqs.length) {
|
||||
graph.push({
|
||||
"@type": "FAQPage",
|
||||
mainEntity: fm.faqs.map((f: { q: string; a: string }) => ({
|
||||
"@type": "Question",
|
||||
name: f.q,
|
||||
acceptedAnswer: { "@type": "Answer", text: f.a }
|
||||
}))
|
||||
});
|
||||
} else if (fm.schema === "howto") {
|
||||
const steps = howToSteps(pageSource(pageData.relativePath));
|
||||
if (steps.length)
|
||||
graph.push({
|
||||
"@type": "HowTo",
|
||||
name: title,
|
||||
description,
|
||||
url: pageUrl,
|
||||
step: steps.map((s, i) => ({
|
||||
"@type": "HowToStep",
|
||||
position: i + 1,
|
||||
name: s.name,
|
||||
text: s.text,
|
||||
url: `${pageUrl}#${i + 1}`
|
||||
})),
|
||||
tool: [{ "@type": "HowToTool", name: "Notesnook" }],
|
||||
totalTime: fm.totalTime || undefined
|
||||
});
|
||||
}
|
||||
|
||||
graph.push({
|
||||
"@type": "TechArticle",
|
||||
headline: title,
|
||||
description,
|
||||
url: pageUrl,
|
||||
inLanguage: "en",
|
||||
isPartOf: {
|
||||
"@type": "WebSite",
|
||||
name: "Notesnook Help",
|
||||
url: SITE
|
||||
},
|
||||
about: {
|
||||
"@type": "SoftwareApplication",
|
||||
name: "Notesnook",
|
||||
applicationCategory: "ProductivityApplication",
|
||||
operatingSystem: "Windows, macOS, Linux, Android, iOS, Web"
|
||||
},
|
||||
author: publisher,
|
||||
publisher,
|
||||
dateModified: pageData.lastUpdated
|
||||
? new Date(pageData.lastUpdated).toISOString()
|
||||
: undefined
|
||||
});
|
||||
|
||||
return JSON.stringify({ "@context": "https://schema.org", "@graph": graph });
|
||||
}
|
||||
|
||||
/**
|
||||
* Head tags for one page. Returned as frontmatter `head` entries so VitePress
|
||||
* merges them into the rendered <head>.
|
||||
*/
|
||||
export function seoHead(
|
||||
pageData: PageData,
|
||||
ctx: TransformPageContext
|
||||
): HeadConfig[] {
|
||||
const fm = pageData.frontmatter;
|
||||
if (fm.layout === "home" && !fm.description) return [];
|
||||
|
||||
const title = (fm.pageTitle || fm.title || pageData.title) as string;
|
||||
const description = (fm.description || "") as string;
|
||||
const pageUrl = url(pageData.relativePath);
|
||||
const fullTitle = fm.pageTitle
|
||||
? `${fm.pageTitle} | Notesnook Help`
|
||||
: `${title} | Notesnook Help`;
|
||||
|
||||
const head: HeadConfig[] = [
|
||||
["link", { rel: "canonical", href: pageUrl }],
|
||||
["meta", { property: "og:title", content: fullTitle }],
|
||||
["meta", { property: "og:description", content: description }],
|
||||
["meta", { property: "og:url", content: pageUrl }],
|
||||
["meta", { property: "og:image", content: OG_IMAGE }],
|
||||
["meta", { name: "twitter:card", content: "summary" }],
|
||||
["meta", { name: "twitter:title", content: fullTitle }],
|
||||
["meta", { name: "twitter:description", content: description }]
|
||||
];
|
||||
|
||||
if (Array.isArray(fm.keywords) && fm.keywords.length)
|
||||
head.push(["meta", { name: "keywords", content: fm.keywords.join(", ") }]);
|
||||
|
||||
head.push(["script", { type: "application/ld+json" }, jsonLd(pageData, ctx)]);
|
||||
|
||||
return head;
|
||||
}
|
||||
|
||||
/** The <title> tag: prefer an SEO-shaped `pageTitle` when the page defines one. */
|
||||
export function seoTitle(pageData: PageData) {
|
||||
if (pageData.frontmatter.pageTitle)
|
||||
pageData.title = pageData.frontmatter.pageTitle as string;
|
||||
}
|
||||
320
docs/help/.vitepress/sidebar.mjs
Normal file
320
docs/help/.vitepress/sidebar.mjs
Normal file
@@ -0,0 +1,320 @@
|
||||
/**
|
||||
* Help site navigation.
|
||||
*
|
||||
* A page that is not listed here is unreachable from the sidebar, so every new
|
||||
* article needs an entry. `link` values are extensionless and root-absolute —
|
||||
* they mirror the file path under `contents/`, which is also the public URL.
|
||||
*/
|
||||
export const sidebar = [
|
||||
{
|
||||
text: "Getting started",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "All help topics", link: "/docs" },
|
||||
{ text: "Create your first note", link: "/create-a-note-in-notesnook" },
|
||||
{ text: "Search & navigation", link: "/search-and-navigation" },
|
||||
{ text: "Keyboard shortcuts", link: "/keyboard-shortcuts" },
|
||||
{ text: "Plans & limits", link: "/plans-and-limits" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Organizing notes",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "Notebooks",
|
||||
link: "/organizing-notes/organize-notes-using-notebooks"
|
||||
},
|
||||
{ text: "Tags", link: "/organizing-notes/organize-notes-using-tags" },
|
||||
{ text: "Colors", link: "/organizing-notes/organize-notes-using-colors" },
|
||||
{
|
||||
text: "Favorites",
|
||||
link: "/organizing-notes/organize-notes-using-favorites"
|
||||
},
|
||||
{ text: "Pins", link: "/organizing-notes/pin-notes" },
|
||||
{ text: "Archive", link: "/organizing-notes/archive-notes" },
|
||||
{
|
||||
text: "Side menu shortcuts",
|
||||
link: "/organizing-notes/side-menu-shortcuts"
|
||||
},
|
||||
{ text: "Reminders", link: "/reminders" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Working with notes",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "Note actions", link: "/notes/note-actions" },
|
||||
{ text: "Note links", link: "/note-links-and-backlinks" },
|
||||
{ text: "Expiring notes", link: "/notes/note-expiry" },
|
||||
{ text: "Version history", link: "/note-version-history" },
|
||||
{ text: "Trash", link: "/trash" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Editor",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "Editor toolbar",
|
||||
link: "/rich-text-editor/rich-text-editor-toolbar"
|
||||
},
|
||||
{ text: "Tabs & panes", link: "/rich-text-editor/editor-tabs-and-panes" },
|
||||
{
|
||||
text: "Personalizing the editor",
|
||||
link: "/rich-text-editor/personalizing-rich-text-editor"
|
||||
},
|
||||
{
|
||||
text: "Markdown shortcuts",
|
||||
link: "/rich-text-editor/markdown-notes-editing"
|
||||
},
|
||||
{
|
||||
text: "Headings",
|
||||
link: "/rich-text-editor/headings-and-collapsible-sections"
|
||||
},
|
||||
{ text: "Tables", link: "/rich-text-editor/tables" },
|
||||
{ text: "Task lists", link: "/rich-text-editor/task-and-todo-lists" },
|
||||
{ text: "Outline lists", link: "/rich-text-editor/outline-lists" },
|
||||
{ text: "Callouts", link: "/rich-text-editor/callouts" },
|
||||
{ text: "Code blocks", link: "/rich-text-editor/code-blocks" },
|
||||
{ text: "Math & formulas", link: "/rich-text-editor/math-and-formulas" },
|
||||
{
|
||||
text: "Images & embeds",
|
||||
link: "/rich-text-editor/images-attachments-and-embeds"
|
||||
},
|
||||
{ text: "Find & replace", link: "/rich-text-editor/search-and-replace" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Importing notes",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "Overview", link: "/importing-notes/" },
|
||||
{ text: "Evernote", link: "/importing-notes/import-notes-from-evernote" },
|
||||
{
|
||||
text: "Google Keep",
|
||||
link: "/importing-notes/import-notes-from-googlekeep"
|
||||
},
|
||||
{ text: "Joplin", link: "/importing-notes/import-notes-from-joplin" },
|
||||
{ text: "Obsidian", link: "/importing-notes/import-notes-from-obsidian" },
|
||||
{
|
||||
text: "Simplenote",
|
||||
link: "/importing-notes/import-notes-from-simplenote"
|
||||
},
|
||||
// Standard Notes is unpublished for now; the page is excluded from the
|
||||
// build in config.mts. Restore this entry when it goes live again.
|
||||
// {
|
||||
// text: "Standard Notes",
|
||||
// link: "/importing-notes/import-notes-from-standardnotes"
|
||||
// },
|
||||
{
|
||||
text: "ColorNote",
|
||||
link: "/importing-notes/import-notes-from-colornote"
|
||||
},
|
||||
{ text: "UpNote", link: "/importing-notes/import-notes-from-upnote" },
|
||||
{
|
||||
text: "Skiff Pages",
|
||||
link: "/importing-notes/import-notes-from-skiff-pages"
|
||||
},
|
||||
{
|
||||
text: "Zoho Notebook",
|
||||
link: "/importing-notes/import-notes-from-zoho-notebook"
|
||||
},
|
||||
{
|
||||
text: "Fusebase (Nimbus Note)",
|
||||
link: "/importing-notes/import-notes-from-fusebase"
|
||||
},
|
||||
{
|
||||
text: "Markdown files",
|
||||
link: "/importing-notes/import-notes-from-markdown-files"
|
||||
},
|
||||
{
|
||||
text: "HTML files",
|
||||
link: "/importing-notes/import-notes-from-html-files"
|
||||
},
|
||||
{
|
||||
text: "Plaintext files",
|
||||
link: "/importing-notes/import-notes-from-plaintext-files"
|
||||
},
|
||||
{
|
||||
text: "TextBundle files",
|
||||
link: "/importing-notes/import-notes-from-textbundle-files"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Backup & export",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "Backup and restore",
|
||||
link: "/backup-and-restore-notes-in-notesnook"
|
||||
},
|
||||
{ text: "Exporting notes", link: "/export-notes-from-notesnook" },
|
||||
{ text: "Attachments & files", link: "/attachments-and-files" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Sync",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "How sync works", link: "/sync/how-sync-works" },
|
||||
{ text: "Sync settings", link: "/sync/sync-settings" },
|
||||
{ text: "Troubleshooting sync", link: "/sync/troubleshooting-sync" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Privacy & security",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "How is my data encrypted?", link: "/how-is-my-data-encrypted" },
|
||||
{ text: "Private vault", link: "/lock-notes-with-private-vault" },
|
||||
{ text: "App lock", link: "/app-lock" },
|
||||
{ text: "Two-factor authentication", link: "/two-factor-authentication" },
|
||||
{ text: "Privacy mode", link: "/privacy-mode" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Publishing",
|
||||
collapsed: false,
|
||||
items: [{ text: "Monographs", link: "/publish-notes-with-monographs" }]
|
||||
},
|
||||
{
|
||||
text: "Web clipper",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "Installation", link: "/web-clipper/installation" },
|
||||
{
|
||||
text: "Clipping your first page",
|
||||
link: "/web-clipper/clipping-your-first-web-page-with-web-clipper"
|
||||
},
|
||||
{ text: "Troubleshooting", link: "/web-clipper/troubleshooting" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Mobile",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "Home screen widgets",
|
||||
link: "/mobile-integration/home-screen-widgets"
|
||||
},
|
||||
{
|
||||
text: "Android quick actions",
|
||||
link: "/mobile-integration/android-quick-actions"
|
||||
},
|
||||
{
|
||||
text: "Pin to notifications",
|
||||
link: "/mobile-integration/pin-notes-to-notifications"
|
||||
},
|
||||
{
|
||||
text: "Quick notes",
|
||||
link: "/mobile-integration/quick-note-from-notification"
|
||||
},
|
||||
{
|
||||
text: "Share from other apps",
|
||||
link: "/mobile-integration/share-things-from-other-apps"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Desktop",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "Auto start",
|
||||
link: "/desktop-integration/auto-start-on-system-startup"
|
||||
},
|
||||
{
|
||||
text: "System tray menu",
|
||||
link: "/desktop-integration/system-tray-menu"
|
||||
},
|
||||
{
|
||||
text: "Jumplist & dock menu",
|
||||
link: "/desktop-integration/jumplist-and-dock-menu"
|
||||
},
|
||||
{ text: "Spell checker", link: "/desktop-integration/spell-checker" },
|
||||
{
|
||||
text: "Updates & advanced",
|
||||
link: "/desktop-integration/updates-and-advanced-settings"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Appearance & themes",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "Customizing the app", link: "/customizing-notesnook" },
|
||||
{
|
||||
text: "Using themes",
|
||||
link: "/custom-themes/using-themes",
|
||||
items: [
|
||||
{ text: "How themes work", link: "/custom-themes/introduction" },
|
||||
{
|
||||
text: "Theme Builder",
|
||||
link: "/custom-themes/create-a-theme-with-theme-builder"
|
||||
},
|
||||
{
|
||||
text: "Install from file",
|
||||
link: "/custom-themes/install-a-theme-from-file"
|
||||
},
|
||||
{
|
||||
text: "Publish a new theme",
|
||||
link: "/custom-themes/publish-a-theme"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Your account",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{ text: "Account settings", link: "/account-settings" },
|
||||
{ text: "Notesnook Circle", link: "/notesnook-circle" },
|
||||
{ text: "Recovering your account", link: "/recovering-your-account" },
|
||||
{ text: "Deleting your account", link: "/deleting-your-account" },
|
||||
{ text: "Gift cards", link: "/gift-cards" },
|
||||
{ text: "Notesnook Wrapped", link: "/notesnook-wrapped" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "Advanced",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "Inbox API",
|
||||
items: [
|
||||
{
|
||||
text: "Getting started",
|
||||
link: "/inbox-api/getting-started"
|
||||
},
|
||||
{
|
||||
text: "Self-hosting the Inbox API",
|
||||
link: "/inbox-api/self-hosting-inbox-api"
|
||||
}
|
||||
]
|
||||
}
|
||||
// { text: "Self-hosting Notesnook", link: "/self-hosting" }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "FAQs",
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: "What are merge conflicts?",
|
||||
link: "/faqs/what-are-merge-conflicts"
|
||||
},
|
||||
{ text: "Is there an ETA for X feature?", link: "/faqs/is-there-an-eta" },
|
||||
{
|
||||
text: "Why login is needed to upload attachments",
|
||||
link: "/faqs/login-to-upload-attachments"
|
||||
},
|
||||
{
|
||||
text: "Why login is needed to restore attachments",
|
||||
link: "/faqs/login-to-restore-attachments-in-backup"
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
131
docs/help/.vitepress/strings.mts
Normal file
131
docs/help/.vitepress/strings.mts
Normal file
@@ -0,0 +1,131 @@
|
||||
/**
|
||||
* Live UI strings, straight from the app.
|
||||
*
|
||||
* The docs quote hundreds of button and menu labels. Typing them by hand means
|
||||
* they rot the moment someone renames a string, so pages write a key instead:
|
||||
*
|
||||
* Click on `{{archive}}` -> Click on `Archive`
|
||||
*
|
||||
* The key is resolved at build time from `@notesnook/intl` — the same catalogue
|
||||
* the apps render from — so renaming a string in the app updates every page that
|
||||
* quotes it on the next build. An unknown key fails the build rather than
|
||||
* shipping a placeholder.
|
||||
*
|
||||
* This only *reads* the catalogue. Never add strings to `packages/intl` for the
|
||||
* docs' sake: if a label has no string, write it as plain text and say why.
|
||||
*/
|
||||
import { readFileSync } from "node:fs";
|
||||
import { createRequire } from "node:module";
|
||||
import { i18n } from "@lingui/core";
|
||||
import { strings, setI18nGlobal } from "@notesnook/intl";
|
||||
|
||||
const require = createRequire(import.meta.url);
|
||||
|
||||
// The compiled English catalogue lives beside the package's dist output.
|
||||
const localePath = require.resolve("@notesnook/intl/locales/$en.json");
|
||||
const locale = JSON.parse(readFileSync(localePath, "utf8"));
|
||||
i18n.load({ en: locale.messages });
|
||||
i18n.activate("en");
|
||||
setI18nGlobal(i18n);
|
||||
|
||||
export type StringKey = keyof typeof strings;
|
||||
|
||||
const cache = new Map<string, string>();
|
||||
|
||||
/**
|
||||
* Resolve one key to the English text the app shows.
|
||||
*
|
||||
* A few catalogue entries are plural forms that take a count — quote those as
|
||||
* `{{notebooks:2}}` and the number is passed through.
|
||||
*/
|
||||
export function resolveString(key: string, count?: number): string {
|
||||
const cacheKey = count === undefined ? key : `${key}:${count}`;
|
||||
const cached = cache.get(cacheKey);
|
||||
if (cached !== undefined) return cached;
|
||||
|
||||
const entry = (strings as Record<string, unknown>)[key];
|
||||
if (typeof entry !== "function")
|
||||
throw new Error(
|
||||
`Unknown UI string "${key}". It must be an existing key in packages/intl ` +
|
||||
`(see strings.ts). Do not invent one — write the label as plain text instead.`
|
||||
);
|
||||
|
||||
let value: unknown;
|
||||
try {
|
||||
value =
|
||||
count === undefined
|
||||
? (entry as () => unknown)()
|
||||
: (entry as (n: number) => unknown)(count);
|
||||
} catch {
|
||||
throw new Error(
|
||||
`UI string "${key}" needs arguments. If it is a plural, quote it as ` +
|
||||
`{{${key}:2}}; otherwise write the label as plain text.`
|
||||
);
|
||||
}
|
||||
|
||||
if (typeof value !== "string" || !value.trim())
|
||||
throw new Error(`UI string "${key}" did not resolve to text.`);
|
||||
|
||||
cache.set(cacheKey, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse index: rendered text -> the key(s) that produce it. Used by
|
||||
* `scripts/check-strings.mjs` to find hardcoded labels that could be keys.
|
||||
*/
|
||||
export function buildReverseIndex(): Map<string, string[]> {
|
||||
const index = new Map<string, string[]>();
|
||||
for (const key of Object.keys(strings)) {
|
||||
let value: unknown;
|
||||
try {
|
||||
value = (strings as Record<string, () => unknown>)[key]();
|
||||
} catch {
|
||||
continue; // needs arguments
|
||||
}
|
||||
if (typeof value !== "string" || !value.trim()) continue;
|
||||
const existing = index.get(value);
|
||||
if (existing) existing.push(key);
|
||||
else index.set(value, [key]);
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
/** Every key used across the docs this build, for reporting. */
|
||||
export const usedKeys = new Set<string>();
|
||||
|
||||
const TOKEN = /\{\{\s*([A-Za-z][A-Za-z0-9_]*)(?::(\d+))?\s*\}\}/g;
|
||||
|
||||
/**
|
||||
* markdown-it rule: swap `{{key}}` for the live string while parsing, so the
|
||||
* rendered HTML contains real text and Vue never sees a moustache.
|
||||
*/
|
||||
export function stringsMarkdownPlugin(md: any) {
|
||||
md.core.ruler.push("nn_ui_strings", (state: any) => {
|
||||
const where = state.env?.relativePath ? ` in ${state.env.relativePath}` : "";
|
||||
const swap = (text: string) =>
|
||||
text.replace(TOKEN, (_match: string, key: string, count?: string) => {
|
||||
try {
|
||||
const value = resolveString(key, count ? Number(count) : undefined);
|
||||
usedKeys.add(key);
|
||||
return value;
|
||||
} catch (error) {
|
||||
throw new Error((error as Error).message + where);
|
||||
}
|
||||
});
|
||||
|
||||
for (const token of state.tokens) {
|
||||
if (token.type === "inline" && token.children) {
|
||||
for (const child of token.children) {
|
||||
if (child.type === "text" || child.type === "code_inline")
|
||||
child.content = swap(child.content);
|
||||
}
|
||||
} else if (token.type === "fence" || token.type === "html_block") {
|
||||
// Leave code fences alone; a doc may legitimately show `{{ }}` syntax.
|
||||
continue;
|
||||
}
|
||||
if (token.type === "inline") token.content = swap(token.content);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
89
docs/help/.vitepress/theme/components/DocsIndex.vue
Normal file
89
docs/help/.vitepress/theme/components/DocsIndex.vue
Normal file
@@ -0,0 +1,89 @@
|
||||
<script setup lang="ts">
|
||||
/**
|
||||
* Every page on the site, grouped exactly as the sidebar groups them.
|
||||
*
|
||||
* The home page has no sidebar, so without this there is no way to see what the
|
||||
* documentation actually covers. Reads the same sidebar module the site is
|
||||
* built from, so it can never drift from the navigation.
|
||||
*/
|
||||
import { sidebar } from "../../sidebar.mjs";
|
||||
|
||||
type Item = { text: string; link?: string; items?: Item[] };
|
||||
|
||||
// Drop this page's own entry — listing the index inside the index is noise.
|
||||
const groups = (sidebar as Item[]).map((group) => ({
|
||||
...group,
|
||||
items: group.items?.filter((item) => item.link !== "/docs")
|
||||
}));
|
||||
|
||||
const pageCount = groups.reduce(
|
||||
(total, group) => total + (group.items?.filter((i) => i.link).length ?? 0),
|
||||
0
|
||||
);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="nn-index">
|
||||
<p class="nn-index__count">{{ pageCount }} pages, grouped by what you're trying to do.</p>
|
||||
<div class="nn-index__grid">
|
||||
<section v-for="group in groups" :key="group.text" class="nn-index__group">
|
||||
<h2 class="nn-index__heading">{{ group.text }}</h2>
|
||||
<ul class="nn-index__list">
|
||||
<li v-for="item in group.items" :key="item.link || item.text">
|
||||
<a v-if="item.link" :href="item.link">{{ item.text }}</a>
|
||||
<span v-else>{{ item.text }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.nn-index__count {
|
||||
margin: 0 0 28px;
|
||||
color: var(--vp-c-text-2);
|
||||
}
|
||||
|
||||
.nn-index__grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
||||
gap: 28px 32px;
|
||||
}
|
||||
|
||||
.nn-index__group {
|
||||
break-inside: avoid;
|
||||
}
|
||||
|
||||
.nn-index__heading {
|
||||
margin: 0 0 10px;
|
||||
padding: 0 0 8px;
|
||||
border: none;
|
||||
border-bottom: 1px solid var(--vp-c-divider);
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.04em;
|
||||
text-transform: uppercase;
|
||||
color: var(--vp-c-text-3);
|
||||
}
|
||||
|
||||
.nn-index__list {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.nn-index__list li {
|
||||
margin: 0 0 6px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.nn-index__list a {
|
||||
font-weight: 400;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nn-index__list a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
</style>
|
||||
95
docs/help/.vitepress/theme/components/GetNotesnook.vue
Normal file
95
docs/help/.vitepress/theme/components/GetNotesnook.vue
Normal file
@@ -0,0 +1,95 @@
|
||||
<script setup lang="ts">
|
||||
/**
|
||||
* Conversion block for high-intent pages (importers, comparisons, "how do I…"
|
||||
* pages that people land on from search). Renders real anchors so crawlers and
|
||||
* no-JS clients follow them.
|
||||
*/
|
||||
withDefaults(
|
||||
defineProps<{
|
||||
title?: string;
|
||||
text?: string;
|
||||
/** Primary link target: "download" | "pricing" */
|
||||
action?: string;
|
||||
}>(),
|
||||
{
|
||||
title: "Ready to move your notes?",
|
||||
text: "Notesnook is free to use, end-to-end encrypted by default, and open source. Install it on every device you own and your notes stay in sync — readable only by you.",
|
||||
action: "download"
|
||||
}
|
||||
);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<aside class="nn-cta">
|
||||
<p class="nn-cta__title">{{ title }}</p>
|
||||
<p class="nn-cta__text">{{ text }}</p>
|
||||
<p class="nn-cta__actions">
|
||||
<a
|
||||
v-if="action === 'download'"
|
||||
class="nn-cta__button"
|
||||
href="https://notesnook.com/downloads"
|
||||
>Download Notesnook</a
|
||||
>
|
||||
<a
|
||||
v-else
|
||||
class="nn-cta__button"
|
||||
href="https://notesnook.com/pricing"
|
||||
>See plans and pricing</a
|
||||
>
|
||||
<a class="nn-cta__link" href="/plans-and-limits">What's included in each plan</a>
|
||||
</p>
|
||||
</aside>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.nn-cta {
|
||||
margin: 32px 0;
|
||||
padding: 20px 24px;
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-left: 3px solid var(--nn-accent);
|
||||
border-radius: var(--nn-radius-large);
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
}
|
||||
|
||||
.nn-cta__title {
|
||||
margin: 0 0 6px;
|
||||
font-weight: 600;
|
||||
color: var(--vp-c-text-1);
|
||||
}
|
||||
|
||||
.nn-cta__text {
|
||||
margin: 0 0 14px;
|
||||
font-size: 15px;
|
||||
line-height: 1.6;
|
||||
color: var(--vp-c-text-2);
|
||||
}
|
||||
|
||||
.nn-cta__actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 16px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.nn-cta__button {
|
||||
display: inline-block;
|
||||
padding: 8px 16px;
|
||||
border-radius: var(--nn-radius-button);
|
||||
background-color: var(--nn-accent);
|
||||
color: var(--nn-accent-foreground) !important;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
text-decoration: none !important;
|
||||
transition: background-color 100ms ease-out;
|
||||
}
|
||||
|
||||
.nn-cta__button:hover {
|
||||
background-color: #008837e6;
|
||||
}
|
||||
|
||||
.nn-cta__link {
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
}
|
||||
</style>
|
||||
118
docs/help/.vitepress/theme/components/HomeSearch.vue
Normal file
118
docs/help/.vitepress/theme/components/HomeSearch.vue
Normal file
@@ -0,0 +1,118 @@
|
||||
<script setup lang="ts">
|
||||
import { onMounted, ref } from "vue";
|
||||
|
||||
const isMac = ref(false);
|
||||
onMounted(() => {
|
||||
isMac.value = /mac/i.test(navigator.platform || navigator.userAgent);
|
||||
});
|
||||
|
||||
/**
|
||||
* Open the site's own search modal. VitePress listens for a Cmd/Ctrl+K keydown
|
||||
* on `window` and its nav button triggers search by dispatching exactly this
|
||||
* synthetic event, so we reuse that path rather than reimplementing search.
|
||||
*/
|
||||
function openSearch() {
|
||||
const event = new Event("keydown") as Event & { key: string; metaKey: boolean };
|
||||
event.key = "k";
|
||||
event.metaKey = true;
|
||||
window.dispatchEvent(event);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="nn-home-search">
|
||||
<button
|
||||
type="button"
|
||||
class="nn-home-search__button"
|
||||
aria-label="Search the documentation"
|
||||
@click="openSearch"
|
||||
>
|
||||
<span class="nn-home-search__icon" aria-hidden="true">
|
||||
<svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor">
|
||||
<path
|
||||
d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z"
|
||||
/>
|
||||
</svg>
|
||||
</span>
|
||||
<span class="nn-home-search__placeholder">Search the docs…</span>
|
||||
<kbd class="nn-home-search__key">{{ isMac ? "⌘" : "Ctrl" }} K</kbd>
|
||||
</button>
|
||||
<p class="nn-home-search__hint">
|
||||
Try “import from Evernote”, “app lock”, or “why is my note not syncing”.
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.nn-home-search {
|
||||
max-width: 640px;
|
||||
/* The hero's own bottom padding stops here, so the space below the search box
|
||||
has to come from this margin — without it the features grid rides up over
|
||||
the hint text. */
|
||||
margin: 16px auto 56px;
|
||||
padding: 0 24px;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.nn-home-search {
|
||||
margin: 8px auto 40px;
|
||||
}
|
||||
}
|
||||
|
||||
.nn-home-search__button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
width: 100%;
|
||||
padding: 14px 16px;
|
||||
border: 1.5px solid var(--vp-c-divider);
|
||||
border-radius: var(--nn-radius-button, 10px);
|
||||
background-color: var(--vp-c-bg);
|
||||
color: var(--vp-c-text-3);
|
||||
font-size: 16px;
|
||||
text-align: left;
|
||||
cursor: text;
|
||||
transition: border-color 120ms ease-out, box-shadow 120ms ease-out;
|
||||
}
|
||||
|
||||
.nn-home-search__button:hover,
|
||||
.nn-home-search__button:focus-visible {
|
||||
border-color: var(--nn-accent);
|
||||
box-shadow: 0 0 0 3px var(--vp-c-brand-soft);
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.nn-home-search__icon {
|
||||
display: flex;
|
||||
color: var(--vp-c-text-3);
|
||||
}
|
||||
|
||||
.nn-home-search__placeholder {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.nn-home-search__key {
|
||||
flex-shrink: 0;
|
||||
padding: 2px 6px;
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-bottom-width: 2px;
|
||||
border-radius: var(--nn-radius-default, 5px);
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
font-family: var(--vp-font-family-mono);
|
||||
font-size: 11px;
|
||||
line-height: 1.6;
|
||||
color: var(--vp-c-text-3);
|
||||
}
|
||||
|
||||
.nn-home-search__hint {
|
||||
margin: 10px 2px 0;
|
||||
font-size: 13px;
|
||||
color: var(--vp-c-text-3);
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.nn-home-search__key {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
89
docs/help/.vitepress/theme/components/PlanTag.vue
Normal file
89
docs/help/.vitepress/theme/components/PlanTag.vue
Normal file
@@ -0,0 +1,89 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from "vue";
|
||||
|
||||
const props = defineProps<{
|
||||
/** essential | pro | believer | free — the LOWEST plan that unlocks the feature. */
|
||||
plan: string;
|
||||
/** Set when the feature is limited to one platform, e.g. "Android only". */
|
||||
note?: string;
|
||||
}>();
|
||||
|
||||
const PLANS: Record<string, { label: string; title: string }> = {
|
||||
free: {
|
||||
label: "Free",
|
||||
title: "Available on every plan, including Free"
|
||||
},
|
||||
essential: {
|
||||
label: "Essential",
|
||||
title: "Requires the Essential plan or higher (Essential, Pro, Believer)"
|
||||
},
|
||||
pro: {
|
||||
label: "Pro",
|
||||
title: "Requires the Pro plan or higher (Pro, Believer)"
|
||||
},
|
||||
believer: {
|
||||
label: "Believer",
|
||||
title: "Requires the Believer plan"
|
||||
}
|
||||
};
|
||||
|
||||
const tier = computed(() => PLANS[props.plan.toLowerCase()] ?? PLANS.pro);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<span class="nn-plan-tag ignore-header" :class="`nn-plan-tag--${plan.toLowerCase()}`" :title="tier.title">
|
||||
{{ tier.label }}
|
||||
<span v-if="note" class="nn-plan-tag__note">· {{ note }}</span>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.nn-plan-tag {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-left: 6px;
|
||||
padding: 1px 8px;
|
||||
border-radius: 100px;
|
||||
border: 1px solid transparent;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.03em;
|
||||
line-height: 1.7;
|
||||
white-space: nowrap;
|
||||
text-transform: uppercase;
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
.nn-plan-tag__note {
|
||||
font-weight: 500;
|
||||
text-transform: none;
|
||||
opacity: 0.85;
|
||||
}
|
||||
|
||||
.nn-plan-tag--free {
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
border-color: var(--vp-c-divider);
|
||||
color: var(--vp-c-text-2);
|
||||
}
|
||||
|
||||
.nn-plan-tag--essential,
|
||||
.nn-plan-tag--pro,
|
||||
.nn-plan-tag--believer {
|
||||
background-color: var(--vp-c-brand-soft);
|
||||
border-color: var(--vp-c-brand-soft);
|
||||
color: var(--vp-c-brand-1);
|
||||
}
|
||||
|
||||
.nn-plan-tag--believer {
|
||||
background-color: transparent;
|
||||
border-color: var(--nn-accent);
|
||||
}
|
||||
|
||||
h1 .nn-plan-tag,
|
||||
h2 .nn-plan-tag,
|
||||
h3 .nn-plan-tag {
|
||||
position: relative;
|
||||
top: -2px;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
57
docs/help/.vitepress/theme/components/VersionBanner.vue
Normal file
57
docs/help/.vitepress/theme/components/VersionBanner.vue
Normal file
@@ -0,0 +1,57 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from "vue";
|
||||
import { useData } from "vitepress";
|
||||
|
||||
const { frontmatter, page } = useData();
|
||||
|
||||
const archived = computed(() => frontmatter.value.archivedVersion as string | undefined);
|
||||
const latest = computed(() => frontmatter.value.latestVersion as string | undefined);
|
||||
|
||||
// The same article in the latest docs, if it still exists there.
|
||||
const latestLink = computed(() => {
|
||||
const path = page.value.relativePath
|
||||
.replace(/^v[\d.]+\//, "/")
|
||||
.replace(/(index)?\.md$/, "");
|
||||
return path.startsWith("/") ? path : `/${path}`;
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="archived" class="nn-version-banner">
|
||||
<p>
|
||||
You are reading the documentation for <strong>Notesnook v{{ archived }}</strong>.
|
||||
The current version is v{{ latest }}.
|
||||
</p>
|
||||
<a :href="latestLink">Read the latest version of this page →</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.nn-version-banner {
|
||||
margin-bottom: 24px;
|
||||
padding: 15px 20px;
|
||||
border: 1px solid var(--vp-c-warning-soft);
|
||||
border-left: 3px solid var(--vp-c-warning-1);
|
||||
border-radius: var(--nn-radius-large);
|
||||
background-color: var(--vp-custom-block-warning-bg);
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.nn-version-banner p {
|
||||
margin: 0;
|
||||
color: var(--vp-c-text-1);
|
||||
}
|
||||
|
||||
.nn-version-banner a {
|
||||
display: inline-block;
|
||||
margin-top: 6px;
|
||||
color: var(--vp-c-brand-1);
|
||||
font-weight: 500;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nn-version-banner a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
</style>
|
||||
77
docs/help/.vitepress/theme/fonts.css
Normal file
77
docs/help/.vitepress/theme/fonts.css
Normal file
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* Self-hosted webfonts, matching the Notesnook app.
|
||||
* Inter is the app's UI font (apps/web/src/app.css), Fira Code its code font.
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/Inter-Regular.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/Inter-Medium.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/Inter-SemiBold.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/Inter-Bold.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/Inter-Italic.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/Inter-MediumItalic.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/Inter-SemiBoldItalic.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Inter";
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/Inter-BoldItalic.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Fira Code";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: local(""), url("/fonts/fira-code-v21-latin-regular.woff2")
|
||||
format("woff2");
|
||||
}
|
||||
31
docs/help/.vitepress/theme/index.ts
Normal file
31
docs/help/.vitepress/theme/index.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import type { Theme } from "vitepress";
|
||||
// theme-without-fonts skips the default theme's own bundled Inter — we ship the
|
||||
// exact Inter files the Notesnook app uses instead (see fonts.css).
|
||||
import DefaultTheme from "vitepress/theme-without-fonts";
|
||||
import { enhanceAppWithTabs } from "vitepress-plugin-tabs/client";
|
||||
import { h } from "vue";
|
||||
import VersionBanner from "./components/VersionBanner.vue";
|
||||
import PlanTag from "./components/PlanTag.vue";
|
||||
import GetNotesnook from "./components/GetNotesnook.vue";
|
||||
import HomeSearch from "./components/HomeSearch.vue";
|
||||
import DocsIndex from "./components/DocsIndex.vue";
|
||||
import "./fonts.css";
|
||||
import "./notesnook.css";
|
||||
|
||||
export default {
|
||||
extends: DefaultTheme,
|
||||
Layout: () =>
|
||||
h(DefaultTheme.Layout, null, {
|
||||
// Renders only on pages under an archived /v<version>/ tree.
|
||||
"doc-before": () => h(VersionBanner),
|
||||
// The home page has no sidebar, so search is the primary way in.
|
||||
"home-hero-after": () => h(HomeSearch)
|
||||
}),
|
||||
enhanceApp({ app }) {
|
||||
enhanceAppWithTabs(app);
|
||||
// Usable directly in markdown, no per-page import.
|
||||
app.component("PlanTag", PlanTag);
|
||||
app.component("GetNotesnook", GetNotesnook);
|
||||
app.component("DocsIndex", DocsIndex);
|
||||
}
|
||||
} satisfies Theme;
|
||||
628
docs/help/.vitepress/theme/notesnook.css
Normal file
628
docs/help/.vitepress/theme/notesnook.css
Normal file
@@ -0,0 +1,628 @@
|
||||
/**
|
||||
* Notesnook design tokens applied to VitePress.
|
||||
*
|
||||
* Values come from @notesnook/theme (default-light / default-dark v2.1) and
|
||||
* apps/web:
|
||||
* accent #008837 packages/theme default themes
|
||||
* radii 2.5 / 5 / 7 / 10 packages/theme/src/theme/index.ts
|
||||
* space scale 6 / 10 / 15 / 20 packages/theme/src/theme/index.ts
|
||||
* shadows menu / dialog packages/theme/src/theme/index.ts
|
||||
* fonts Inter, Fira Code apps/web/src/app.css
|
||||
*
|
||||
* Notesnook's UI is flat: 5px radii, hairline borders, hover fills instead of
|
||||
* cards, and a single accent used sparingly. This file keeps VitePress in that
|
||||
* register rather than layering a second design language on top of it.
|
||||
*/
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Tokens */
|
||||
/* ========================================================================== */
|
||||
|
||||
:root {
|
||||
/* Notesnook primitives */
|
||||
--nn-accent: #008837;
|
||||
--nn-accent-foreground: #ffffff;
|
||||
--nn-shade: #0088371a; /* alpha(accent, .1) */
|
||||
|
||||
--nn-radius-small: 2.5px;
|
||||
--nn-radius-default: 5px;
|
||||
--nn-radius-large: 7px;
|
||||
--nn-radius-dialog: 10px;
|
||||
--nn-radius-button: 10px;
|
||||
|
||||
--nn-space-1: 6px;
|
||||
--nn-space-2: 10px;
|
||||
--nn-space-3: 15px;
|
||||
--nn-space-4: 20px;
|
||||
--nn-space-5: 25px;
|
||||
|
||||
--nn-static-orange: #ff9800;
|
||||
|
||||
/* Typography */
|
||||
--vp-font-family-base: "Inter", "Noto Sans", Frutiger, Calibri, Myriad, Arial,
|
||||
Ubuntu, Helvetica, -apple-system, BlinkMacSystemFont, sans-serif;
|
||||
--vp-font-family-mono: "Fira Code", "Fira Mono", Hack, Menlo, Consolas,
|
||||
"Liberation Mono", "Courier New", monospace;
|
||||
|
||||
/* Layout — a help site reads better slightly narrower than VitePress' default */
|
||||
--vp-layout-max-width: 1440px;
|
||||
--vp-sidebar-width: 288px;
|
||||
--vp-nav-height: 60px;
|
||||
}
|
||||
|
||||
/* ------------------------------- light ---------------------------------- */
|
||||
:root {
|
||||
--vp-c-brand-1: #008837;
|
||||
--vp-c-brand-2: #008837e6; /* app button hover — alpha(accent, .9) */
|
||||
--vp-c-brand-3: #008837cc; /* app button active — alpha(accent, .8) */
|
||||
--vp-c-brand-soft: var(--nn-shade);
|
||||
|
||||
--vp-c-bg: #ffffff;
|
||||
--vp-c-bg-alt: #f7f7f7;
|
||||
--vp-c-bg-soft: #f7f7f7;
|
||||
--vp-c-bg-elv: #ffffff;
|
||||
|
||||
--vp-c-divider: #e8e8e8;
|
||||
--vp-c-border: #e8e8e8;
|
||||
--vp-c-gutter: #e8e8e8;
|
||||
|
||||
--vp-c-text-1: #202020; /* heading */
|
||||
--vp-c-text-2: #505050; /* paragraph */
|
||||
--vp-c-text-3: #777777; /* paragraph-secondary */
|
||||
|
||||
--nn-hover: #eeeeee;
|
||||
--nn-selected-bg: #eeeeee;
|
||||
--nn-selected-fg: #212121;
|
||||
--nn-code-bg: #f7f7f7;
|
||||
--nn-shadow-menu: 0px 0px 10px 0px #00000022;
|
||||
--nn-shadow-dialog: 0px 0px 25px 5px #0000004e;
|
||||
|
||||
--vp-c-tip-1: #4f8a10;
|
||||
--vp-c-tip-soft: #4f8a101a;
|
||||
--vp-c-danger-1: #f54b42;
|
||||
--vp-c-danger-soft: #f54b421a;
|
||||
--vp-c-warning-1: #b26a00; /* darkened static orange for AA on white */
|
||||
--vp-c-warning-soft: #ff98001f;
|
||||
}
|
||||
|
||||
/* -------------------------------- dark ---------------------------------- */
|
||||
.dark {
|
||||
/* #008837 is only 3.06:1 on the app's #181818, so text-bearing brand steps
|
||||
are lightened for readability. Solid accent fills stay exactly #008837. */
|
||||
--vp-c-brand-1: #00b34a;
|
||||
--vp-c-brand-2: #00c853;
|
||||
--vp-c-brand-3: #008837;
|
||||
--vp-c-brand-soft: #00883733;
|
||||
|
||||
--vp-c-bg: #181818;
|
||||
--vp-c-bg-alt: #202020;
|
||||
--vp-c-bg-soft: #202020;
|
||||
--vp-c-bg-elv: #202020;
|
||||
|
||||
--vp-c-divider: #383838;
|
||||
--vp-c-border: #2b2b2b;
|
||||
--vp-c-gutter: #2b2b2b;
|
||||
|
||||
--vp-c-text-1: #e3e3e3;
|
||||
--vp-c-text-2: #d3d3d3;
|
||||
--vp-c-text-3: #818589;
|
||||
|
||||
--nn-hover: #2b2b2b;
|
||||
--nn-selected-bg: #494949;
|
||||
--nn-selected-fg: #fbfbfb;
|
||||
--nn-code-bg: #202020;
|
||||
--nn-shadow-menu: 0px 0px 10px 0px #00000078;
|
||||
--nn-shadow-dialog: 0px 0px 25px 5px #000000aa;
|
||||
|
||||
--vp-c-tip-1: #7bb32e;
|
||||
--vp-c-tip-soft: #4f8a1033;
|
||||
--vp-c-danger-1: #f76b64;
|
||||
--vp-c-danger-soft: #f54b4226;
|
||||
--vp-c-warning-1: #ffa726;
|
||||
--vp-c-warning-soft: #ff980026;
|
||||
}
|
||||
|
||||
/* --------------------------- derived bindings ---------------------------- */
|
||||
:root,
|
||||
.dark {
|
||||
--vp-button-brand-bg: var(--nn-accent);
|
||||
--vp-button-brand-text: var(--nn-accent-foreground);
|
||||
--vp-button-brand-border: transparent;
|
||||
--vp-button-brand-hover-bg: #008837e6;
|
||||
--vp-button-brand-hover-text: var(--nn-accent-foreground);
|
||||
--vp-button-brand-hover-border: transparent;
|
||||
--vp-button-brand-active-bg: #008837cc;
|
||||
--vp-button-brand-active-text: var(--nn-accent-foreground);
|
||||
|
||||
--vp-code-bg: var(--nn-code-bg);
|
||||
--vp-code-block-bg: var(--nn-code-bg);
|
||||
--vp-code-copy-code-bg: var(--nn-code-bg);
|
||||
--vp-code-copy-code-hover-bg: var(--nn-hover);
|
||||
|
||||
--vp-shadow-1: var(--nn-shadow-menu);
|
||||
--vp-shadow-2: var(--nn-shadow-menu);
|
||||
--vp-shadow-3: var(--nn-shadow-menu);
|
||||
--vp-shadow-4: var(--nn-shadow-dialog);
|
||||
--vp-shadow-5: var(--nn-shadow-dialog);
|
||||
|
||||
--vp-custom-block-tip-bg: var(--vp-c-tip-soft);
|
||||
--vp-custom-block-warning-bg: var(--vp-c-warning-soft);
|
||||
--vp-custom-block-danger-bg: var(--vp-c-danger-soft);
|
||||
--vp-custom-block-info-bg: var(--vp-c-bg-alt);
|
||||
--vp-custom-block-details-bg: var(--vp-c-bg-alt);
|
||||
}
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Base */
|
||||
/* ========================================================================== */
|
||||
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
::selection {
|
||||
background-color: #00883766;
|
||||
color: var(--nn-selected-fg);
|
||||
}
|
||||
|
||||
.vp-doc h1,
|
||||
.vp-doc h2,
|
||||
.vp-doc h3,
|
||||
.vp-doc h4 {
|
||||
letter-spacing: -0.015em;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.vp-doc h1 {
|
||||
font-size: 32px;
|
||||
line-height: 1.25;
|
||||
margin-bottom: var(--nn-space-3);
|
||||
}
|
||||
|
||||
/* The app never underlines its own separators heavily — keep section rules
|
||||
hairline and give sections room to breathe. */
|
||||
.vp-doc h2 {
|
||||
margin-top: 44px;
|
||||
padding-top: var(--nn-space-4);
|
||||
border-top: 1px solid var(--vp-c-divider);
|
||||
font-size: 22px;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
.vp-doc h3 {
|
||||
margin-top: 28px;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
.vp-doc p,
|
||||
.vp-doc li {
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
.vp-doc a {
|
||||
font-weight: 500;
|
||||
text-decoration: none;
|
||||
text-underline-offset: 3px;
|
||||
}
|
||||
|
||||
.vp-doc a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Navigation & sidebar — modelled on the app's navigation menu */
|
||||
/* ========================================================================== */
|
||||
|
||||
.VPNav {
|
||||
backdrop-filter: saturate(160%) blur(12px);
|
||||
}
|
||||
|
||||
.VPNavBar:not(.home.top) {
|
||||
background-color: color-mix(in srgb, var(--vp-c-bg) 88%, transparent);
|
||||
}
|
||||
|
||||
.VPSidebar {
|
||||
background-color: var(--vp-c-bg-alt) !important;
|
||||
padding-top: var(--nn-space-3);
|
||||
}
|
||||
|
||||
.VPSidebarItem.level-0 > .item > .text {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.04em;
|
||||
text-transform: uppercase;
|
||||
color: var(--vp-c-text-3);
|
||||
}
|
||||
|
||||
/* Flat rows with a hover fill — same treatment as list items in the app. */
|
||||
.VPSidebarItem.is-link > .item .link,
|
||||
.VPSidebarItem .item > .link {
|
||||
border-radius: var(--nn-radius-default);
|
||||
}
|
||||
|
||||
/* The hover fill bleeds left of the label so item text keeps the same left edge
|
||||
as the group headers and the nav logo (32px), instead of sitting 10px in. */
|
||||
.VPSidebarItem.level-1 .item,
|
||||
.VPSidebarItem.level-2 .item,
|
||||
.VPSidebarItem.level-3 .item {
|
||||
border-radius: var(--nn-radius-default);
|
||||
margin-left: calc(var(--nn-space-2) * -1);
|
||||
padding-left: var(--nn-space-2);
|
||||
padding-right: var(--nn-space-1);
|
||||
transition: background-color 100ms ease-out;
|
||||
}
|
||||
|
||||
.VPSidebarItem.level-1:not(.is-active) .item:hover,
|
||||
.VPSidebarItem.level-2:not(.is-active) .item:hover,
|
||||
.VPSidebarItem.level-3:not(.is-active) .item:hover {
|
||||
background-color: var(--nn-hover);
|
||||
}
|
||||
|
||||
.VPSidebarItem.is-active > .item {
|
||||
background-color: var(--nn-selected-bg);
|
||||
}
|
||||
|
||||
.VPSidebarItem.is-active > .item > .indicator {
|
||||
background-color: var(--nn-accent);
|
||||
}
|
||||
|
||||
.VPSidebarItem.is-active > .item .link .text {
|
||||
color: var(--nn-selected-fg);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.VPSidebarItem .text {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Buttons */
|
||||
/* ========================================================================== */
|
||||
|
||||
/* One radius for every button on the site. `!important` is needed because the
|
||||
default theme's own button rules carry a scoped [data-v-*] attribute, which
|
||||
outranks a plain class selector. */
|
||||
.VPButton,
|
||||
.VPButton.small,
|
||||
.VPButton.medium,
|
||||
.VPButton.big,
|
||||
.VPNavBarSearchButton,
|
||||
.DocSearch-Button,
|
||||
.VPNavBarHamburger,
|
||||
.VPLocalNav button,
|
||||
.VPBackToTop,
|
||||
.VPSidebarItem .caret,
|
||||
.VPLocalSearchBox button,
|
||||
.VPDocFooter button,
|
||||
[class*="language-"] > button.copy,
|
||||
[class*="language-"] > span.lang + button,
|
||||
.vp-doc button {
|
||||
border-radius: var(--nn-radius-button) !important;
|
||||
}
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Home page */
|
||||
/* ========================================================================== */
|
||||
|
||||
.VPHero .image-bg {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* The default theme nudges the hero image up and left by 32px to optically
|
||||
centre it against the blurred `image-bg` circle behind it. We hide that
|
||||
circle, so the nudge has nothing left to compensate for — it just lifts the
|
||||
logo above the middle of the text column, leaving it centred on the heading
|
||||
and tagline with the action buttons hanging below. Dropping the transform
|
||||
centres it against the whole column: heading, tagline and actions. */
|
||||
@media (min-width: 960px) {
|
||||
.VPHero .image-container {
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
.VPHero .image-container img {
|
||||
max-width: 208px;
|
||||
max-height: 208px;
|
||||
border-radius: 44px;
|
||||
box-shadow: var(--nn-shadow-dialog);
|
||||
}
|
||||
|
||||
.VPHome .VPFeature {
|
||||
border-radius: var(--nn-radius-large);
|
||||
border-color: var(--vp-c-divider);
|
||||
transition: border-color 120ms ease-out, background-color 120ms ease-out;
|
||||
}
|
||||
|
||||
.VPHome .VPFeature:hover {
|
||||
border-color: var(--nn-accent);
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
}
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Custom blocks */
|
||||
/* ========================================================================== */
|
||||
|
||||
.vp-doc .custom-block {
|
||||
border-radius: var(--nn-radius-large);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-left-width: 3px;
|
||||
padding: var(--nn-space-3) var(--nn-space-4);
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.vp-doc .custom-block .custom-block-title {
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
.vp-doc .custom-block p {
|
||||
line-height: 1.65;
|
||||
}
|
||||
|
||||
.vp-doc .custom-block.info {
|
||||
border-color: var(--vp-c-divider);
|
||||
border-left-color: var(--vp-c-text-3);
|
||||
}
|
||||
|
||||
.vp-doc .custom-block.tip {
|
||||
border-color: var(--vp-c-tip-soft);
|
||||
border-left-color: var(--vp-c-tip-1);
|
||||
}
|
||||
|
||||
.vp-doc .custom-block.warning {
|
||||
border-color: var(--vp-c-warning-soft);
|
||||
border-left-color: var(--vp-c-warning-1);
|
||||
}
|
||||
|
||||
.vp-doc .custom-block.danger {
|
||||
border-color: var(--vp-c-danger-soft);
|
||||
border-left-color: var(--vp-c-danger-1);
|
||||
}
|
||||
|
||||
.vp-doc .custom-block.details {
|
||||
border-left-color: var(--vp-c-text-3);
|
||||
}
|
||||
|
||||
.vp-doc .custom-block img {
|
||||
margin-top: var(--nn-space-2);
|
||||
}
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Platform tabs (vitepress-plugin-tabs) */
|
||||
/* ========================================================================== */
|
||||
|
||||
.vp-doc .plugin-tabs {
|
||||
border-radius: var(--nn-radius-large);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
background-color: transparent;
|
||||
box-shadow: none;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--tab-list {
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
border-bottom: 1px solid var(--vp-c-divider);
|
||||
padding: var(--nn-space-1) var(--nn-space-1) 0;
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--tab {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: var(--vp-c-text-2);
|
||||
padding: var(--nn-space-1) var(--nn-space-2);
|
||||
border-radius: var(--nn-radius-default) var(--nn-radius-default) 0 0;
|
||||
transition: color 100ms ease-out, background-color 100ms ease-out;
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--tab:hover {
|
||||
background-color: var(--nn-hover);
|
||||
color: var(--vp-c-text-1);
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--tab[aria-selected="true"] {
|
||||
color: var(--vp-c-brand-1);
|
||||
font-weight: 600;
|
||||
background-color: var(--vp-c-bg);
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--tab::after {
|
||||
background-color: transparent;
|
||||
height: 2px;
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--tab[aria-selected="true"]::after {
|
||||
background-color: var(--nn-accent);
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--content {
|
||||
padding: var(--nn-space-4);
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--content > :first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.vp-doc .plugin-tabs--content > :last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Nested tabs inside a custom block should not double up on chrome. */
|
||||
.vp-doc .custom-block .plugin-tabs {
|
||||
background-color: var(--vp-c-bg);
|
||||
}
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Media, code, tables */
|
||||
/* ========================================================================== */
|
||||
|
||||
.vp-doc img {
|
||||
border-radius: var(--nn-radius-large);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/* The CSS reset makes every image `display: block`, which breaks the line when a
|
||||
UI glyph is referenced mid-sentence ("press the ⋯ button"). An image sharing
|
||||
its *line* with text is treated as a glyph — inline, sized to the text,
|
||||
unframed. An image on its own line stays a block, even when it sits inside a
|
||||
numbered step whose text is on the line above. */
|
||||
.vp-doc img.inline-glyph {
|
||||
display: inline-block;
|
||||
vertical-align: text-bottom;
|
||||
max-height: 1.5em;
|
||||
width: auto;
|
||||
margin: 0 2px;
|
||||
border: none;
|
||||
border-radius: var(--nn-radius-small);
|
||||
}
|
||||
|
||||
/* ---------------------------- task lists -------------------------------- */
|
||||
|
||||
.vp-doc .contains-task-list {
|
||||
padding-left: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.vp-doc .task-list-item {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.vp-doc .task-list-item-checkbox {
|
||||
appearance: none;
|
||||
flex-shrink: 0;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin: 6px 0 0;
|
||||
border: 1.5px solid var(--vp-c-divider);
|
||||
border-radius: var(--nn-radius-small);
|
||||
background-color: var(--vp-c-bg);
|
||||
}
|
||||
|
||||
.vp-doc .task-list-item-checkbox:checked {
|
||||
border-color: var(--nn-accent);
|
||||
background-color: var(--nn-accent);
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
|
||||
background-size: 12px;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.vp-doc .task-list-item label {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.vp-doc img[src$=".svg"] {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.vp-doc [class*="language-"] {
|
||||
border-radius: var(--nn-radius-large);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
}
|
||||
|
||||
.vp-doc code {
|
||||
font-size: 0.875em;
|
||||
border-radius: var(--nn-radius-small);
|
||||
padding: 3px 5px;
|
||||
}
|
||||
|
||||
.vp-doc :not(pre) > code {
|
||||
color: var(--vp-c-text-1);
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
}
|
||||
|
||||
.vp-doc kbd {
|
||||
display: inline-block;
|
||||
padding: 2px 6px;
|
||||
border-radius: var(--nn-radius-default);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-bottom-width: 2px;
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
font-family: var(--vp-font-family-mono);
|
||||
font-size: 12px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.vp-doc table {
|
||||
display: table;
|
||||
width: 100%;
|
||||
border-radius: var(--nn-radius-large);
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
.vp-doc th,
|
||||
.vp-doc td {
|
||||
border: none;
|
||||
border-bottom: 1px solid var(--vp-c-divider);
|
||||
}
|
||||
|
||||
.vp-doc tr:last-child td {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.vp-doc tr:nth-child(2n) {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.vp-doc tr:hover td {
|
||||
background-color: var(--nn-hover);
|
||||
}
|
||||
|
||||
.vp-doc th {
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
font-weight: 600;
|
||||
font-size: 13px;
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
|
||||
/* ========================================================================== */
|
||||
/* Search, footer nav */
|
||||
/* ========================================================================== */
|
||||
|
||||
.VPLocalSearchBox .search-bar {
|
||||
border-radius: var(--nn-radius-default);
|
||||
border: 1.5px solid var(--vp-c-divider);
|
||||
}
|
||||
|
||||
.VPLocalSearchBox .search-bar:focus-within {
|
||||
border-color: var(--nn-accent);
|
||||
border-width: 2px;
|
||||
}
|
||||
|
||||
.VPLocalSearchBox .result {
|
||||
border-radius: var(--nn-radius-default);
|
||||
}
|
||||
|
||||
.pager-link {
|
||||
border-radius: var(--nn-radius-large);
|
||||
border-color: var(--vp-c-divider);
|
||||
transition: background-color 100ms ease-out, border-color 100ms ease-out;
|
||||
}
|
||||
|
||||
.pager-link:hover {
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
border-color: var(--nn-accent);
|
||||
}
|
||||
|
||||
.VPDocFooter .edit-link-button {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.vp-doc h1 {
|
||||
font-size: 27px;
|
||||
}
|
||||
.vp-doc h2 {
|
||||
font-size: 20px;
|
||||
}
|
||||
.vp-doc .plugin-tabs--content,
|
||||
.vp-doc .custom-block {
|
||||
padding: var(--nn-space-3);
|
||||
}
|
||||
}
|
||||
36
docs/help/.vitepress/versions.mjs
Normal file
36
docs/help/.vitepress/versions.mjs
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Documentation versions.
|
||||
*
|
||||
* The **latest** version is served from the site root (`/create-a-note`,
|
||||
* `/organizing-notes/...`) so canonical URLs never move. Older versions are
|
||||
* served from `/v<version>/`.
|
||||
*
|
||||
* Older versions are stored as *differences*, not copies. `contents/_versions/`
|
||||
* holds only the pages whose content actually differs from the current docs;
|
||||
* every other page is shared, and the full `/v<version>/` tree is composed at
|
||||
* build time by `scripts/build-versions.mjs`.
|
||||
*
|
||||
* Cutting a new version: npm run version -- 3.5
|
||||
* Changing a page afterwards: npm run fork -- 3.4 <page> (before editing)
|
||||
*/
|
||||
|
||||
/** The version the docs at the site root describe. */
|
||||
export const LATEST = "3.4";
|
||||
|
||||
/** Older versions, newest first. */
|
||||
export const ARCHIVED = [];
|
||||
|
||||
export const isArchivedPath = (path) =>
|
||||
ARCHIVED.some((v) => path.startsWith(`/v${v}/`));
|
||||
|
||||
export const versionOfPath = (path) =>
|
||||
ARCHIVED.find((v) => path.startsWith(`/v${v}/`)) ?? LATEST;
|
||||
|
||||
/** The version picker shown in the nav bar. */
|
||||
export const versionsNavItem = {
|
||||
text: `v${LATEST}`,
|
||||
items: [
|
||||
{ text: `v${LATEST} (latest)`, link: "/" },
|
||||
...ARCHIVED.map((v) => ({ text: `v${v}`, link: `/v${v}/` }))
|
||||
]
|
||||
};
|
||||
85
docs/help/README.md
Normal file
85
docs/help/README.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# Notesnook Help
|
||||
|
||||
The source of [help.notesnook.com](https://help.notesnook.com), built with [VitePress](https://vitepress.dev).
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev # http://localhost:5173
|
||||
npm run build # production build; fails on dead internal links
|
||||
npm run preview # serve the built site
|
||||
```
|
||||
|
||||
## Where things are
|
||||
|
||||
| | |
|
||||
| ------------------------ | --------------------------------------------------- |
|
||||
| `contents/` | the articles — a file's path here is its public URL |
|
||||
| `contents/public/` | images and fonts, served from `/` |
|
||||
| `.vitepress/config.mts` | site config, nav, head |
|
||||
| `.vitepress/sidebar.mjs` | the sidebar — **add every new article here** |
|
||||
| `.vitepress/theme/` | Notesnook design tokens and self-hosted fonts |
|
||||
|
||||
## UI labels come from the app
|
||||
|
||||
Button and menu labels are written as string keys and resolved at build time from `@notesnook/intl`:
|
||||
|
||||
```md
|
||||
Click on `{{archive}}` to archive the note.
|
||||
```
|
||||
|
||||
Rename that string in the app and this page updates on the next build. An unknown key fails the build. Run `npm run strings` to see which hardcoded labels could become keys (`-- --fix` rewrites them). Don't add strings to `packages/intl` for the docs — if there's no key, write plain text.
|
||||
|
||||
## Writing an article
|
||||
|
||||
1. Create `contents/<section>/<slug>.md` with `title` (short, used in the sidebar) and `description` (one sentence, used as the search snippet) frontmatter.
|
||||
2. Add it to the right group in `.vitepress/sidebar.mjs`.
|
||||
3. Run `npm run build` before opening a PR.
|
||||
|
||||
Steps that differ per platform go in tabs, which stay in sync across the whole site via `key:platform`:
|
||||
|
||||
```md
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Right click on a note to open the `Note properties` menu.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Press the three dot button on a note.
|
||||
|
||||
:::
|
||||
```
|
||||
|
||||
Callouts use VitePress containers — `::: info`, `::: tip`, `::: warning`, `::: danger`, `::: details`.
|
||||
|
||||
Renaming or moving a file changes a live URL that the apps and support replies link to. Don't, unless a 301 goes into `contents/public/_redirects` with it. Some pages are linked from inside the app via `packages/intl/src/strings.ts`, and the importer package links to the `importing-notes/*` slugs — grep both before touching a slug.
|
||||
|
||||
## Versioning
|
||||
|
||||
The docs are versioned by Notesnook version. The **latest** version lives at the site root, so canonical URLs never move; older versions are served from `/v<version>/` and reachable from the version picker in the nav bar.
|
||||
|
||||
Older versions are stored as **differences, not copies**. A page is shared by every version until it actually changes; only then does the old text get its own file. `.vitepress/versions.mjs` holds `LATEST` and the list of older versions.
|
||||
|
||||
**When Notesnook ships a new version:**
|
||||
|
||||
```bash
|
||||
npm run version -- <next-version>
|
||||
```
|
||||
|
||||
Nothing is copied — the outgoing version becomes an older version whose pages are all still shared with the root.
|
||||
|
||||
**When you change a page in a way that doesn't apply to the old version**, preserve the old text first, then edit the root copy as usual:
|
||||
|
||||
```bash
|
||||
npm run fork -- <old-version> organizing-notes/archive-notes
|
||||
```
|
||||
|
||||
That writes `contents/_versions/<old-version>/organizing-notes/archive-notes.md` — the only file that version needs. For a page that didn't exist in an older version, add its path to `contents/_versions/<version>/_excluded.txt` instead.
|
||||
|
||||
`npm run versions` (run automatically before dev and build) composes the full `/v<version>/` trees from the shared pages plus those overrides. The composed trees live in `contents/v<version>/` and are gitignored — never edit them.
|
||||
|
||||
Archived pages carry a banner linking to the current version of the same page, are excluded from search and the sitemap, and are `noindex` so they don't compete with the latest docs. Images are shared across versions.
|
||||
|
||||
## Deployment
|
||||
|
||||
`.github/workflows/help.publish.yml` builds and deploys `.vitepress/dist/` to Cloudflare Pages on every push to `master` that touches `docs/help/**`.
|
||||
138
docs/help/STYLE.md
Normal file
138
docs/help/STYLE.md
Normal file
@@ -0,0 +1,138 @@
|
||||
# Help docs — writing conventions
|
||||
|
||||
Every page on help.notesnook.com follows these. They cover accuracy, plan tags, SEO and linking.
|
||||
|
||||
## 1. Accuracy is non-negotiable
|
||||
|
||||
Never describe UI from memory. Every menu label, settings path, limit, default and plan gate must be traced to source in this monorepo before it is written:
|
||||
|
||||
- user-facing strings — `packages/intl/src/strings.ts`
|
||||
- web/desktop UI — `apps/web/src/`, `apps/desktop/src/`
|
||||
- mobile UI — `apps/mobile/app/`
|
||||
- limits and plan gates — `packages/common/src/utils/is-feature-available.ts`
|
||||
- behaviour, sync, encryption, retention — `packages/core/src/`
|
||||
|
||||
### Quote labels by key, not by hand
|
||||
|
||||
Don't type a label and hope it stays true. Write the **string key** and the build resolves it from the app's own catalogue:
|
||||
|
||||
```md
|
||||
Click on `{{archive}}` renders: Click on `Archive`
|
||||
Open `{{privacyAndSecurity}}` renders: Open `Privacy & security`
|
||||
```
|
||||
|
||||
Keys come from `packages/intl/src/strings.ts` — the same catalogue the apps render from — so when someone renames a string in the app, every page quoting it updates on the next build. An unknown key **fails the build**; it never ships as a placeholder.
|
||||
|
||||
- Plural entries take a count: `{{notebooks:2}}`.
|
||||
- `npm run strings` lists labels that could be keys but aren't; `-- --fix` rewrites the unambiguous ones.
|
||||
- **Never add a string to `packages/intl` for the docs' sake.** If a label has no key — third-party UI, native OS text, a screen that isn't localized — write it as plain text.
|
||||
|
||||
If web and mobile differ, both go in the platform tabs. If you cannot verify something, leave it out and flag it — never guess.
|
||||
|
||||
## 2. Frontmatter
|
||||
|
||||
```yaml
|
||||
---
|
||||
title: Archive # short sidebar label, 2–3 words
|
||||
pageTitle: How to archive notes… # optional: SEO <title>, ~60 chars
|
||||
description: One sentence… # required, <160 chars, becomes the search snippet
|
||||
keywords: # optional, real search phrases
|
||||
- archive notes notesnook
|
||||
schema: howto # optional: howto | faq | article (default article)
|
||||
faqs: # required when schema: faq
|
||||
- q: …
|
||||
a: …
|
||||
---
|
||||
```
|
||||
|
||||
`schema: howto` turns the page's numbered steps into HowTo structured data automatically. `schema: faq` emits FAQPage structured data from the `faqs` list — the same Q&As must also appear in the page body.
|
||||
|
||||
## 3. Plan tags
|
||||
|
||||
Any feature that needs a paid plan is tagged inline, on the heading that introduces it:
|
||||
|
||||
```md
|
||||
## Set a note to expire <PlanTag plan="pro" />
|
||||
```
|
||||
|
||||
`plan` is the **lowest** plan that unlocks it: `essential`, `pro` or `believer`. Plans are cumulative — a `pro` tag means Pro and Believer. For platform-limited features add a note:
|
||||
|
||||
```md
|
||||
## Pin a note to your notifications <PlanTag plan="pro" note="Android only" />
|
||||
```
|
||||
|
||||
Verify the tier in `is-feature-available.ts` before tagging. Also state the consequence in prose where it matters ("free plans keep 100 versions per note"), and link to [Plans & limits](/plans-and-limits).
|
||||
|
||||
## 4. Article shape
|
||||
|
||||
```md
|
||||
# Full human title
|
||||
|
||||
One or two sentences: what this is and why someone would want it.
|
||||
|
||||
## Task in imperative form
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. …
|
||||
|
||||
== Mobile
|
||||
|
||||
1. …
|
||||
|
||||
:::
|
||||
```
|
||||
|
||||
- One `# H1`, first line of the body.
|
||||
- `##` per task, phrased as an action: "Archive a note", not "Archiving".
|
||||
- Numbered steps, one action each, ideally ≤ 6.
|
||||
- Close with the confirmation state — what the user should now see.
|
||||
- `key:platform` is mandatory on platform tabs so the choice syncs sitewide. Labels: `Desktop/Web`, `Desktop`, `Web`, `Mobile`, `Android`, `iOS`, `Windows`, `macOS`, `Linux`.
|
||||
- If a feature is missing on a platform, say so in that tab rather than omitting it.
|
||||
|
||||
## 5. Callouts
|
||||
|
||||
`::: info` context · `::: tip` shortcut · `::: warning` data loss or something irreversible · `::: danger` unrecoverable · `::: details` folded tangent.
|
||||
|
||||
Anything touching the vault, encryption, recovery or deletion must state plainly that **Notesnook cannot recover data or passwords for you**.
|
||||
|
||||
## 6. SEO
|
||||
|
||||
The help site already ranks #1 for high-intent queries like `import enex`, so each page is a landing page:
|
||||
|
||||
- **Write the H1 as the question a person types.** "How do I import notes from Evernote?" beats "Evernote importing".
|
||||
- **Use real phrasings in `##` headings** — "Can I use it offline?", "Why is my note not syncing?" — they win featured snippets.
|
||||
- **Answer in the first 40 words** after the H1. That paragraph is what Google quotes.
|
||||
- **Never leave alt text empty.** Describe what the reader should look for: ``.
|
||||
- **Every page ends with a `## Related pages` list** of 3–6 links with descriptive anchors (the home page, `/docs` and `/404` are exempt — they are already link lists) — "[backing up your notes](/backup-and-restore-notes-in-notesnook)", never "click here". This is what builds the internal link graph.
|
||||
- **Link the first mention** of any concept that has its own page, in body text, with the concept as the anchor.
|
||||
- **Add `<GetNotesnook />`** to pages people arrive at from search with buying intent — importers, comparisons, "how do I move from X" — placed after the instructions, never before them.
|
||||
- Prefer one page that fully answers a question over three thin pages.
|
||||
|
||||
## 7. Internal linking clusters
|
||||
|
||||
Pages are grouped into clusters, each with a hub that links to every member and members that link back to the hub and sideways to siblings:
|
||||
|
||||
| Cluster | Hub |
|
||||
| ------------------ | ------------------------------------------------------------- |
|
||||
| Importing | [Importing notes](/importing-notes/) |
|
||||
| Editor | [Editor toolbar](/rich-text-editor/rich-text-editor-toolbar) |
|
||||
| Organization | [Notebooks](/organizing-notes/organize-notes-using-notebooks) |
|
||||
| Privacy & security | [How is my data encrypted?](/how-is-my-data-encrypted) |
|
||||
| Sync | [How sync works](/sync/how-sync-works) |
|
||||
| Plans | [Plans & limits](/plans-and-limits) |
|
||||
|
||||
Any page that mentions a paid feature links to the plans hub. Any page that mentions encryption links to the encryption hub.
|
||||
|
||||
## 8. Things that are not allowed
|
||||
|
||||
- Undocumented guesses about UI, limits or plan gates.
|
||||
- Version numbers in body copy ("as of v3.2").
|
||||
- "Simply", "just", "easily", "seamlessly", "powerful".
|
||||
- Telling the reader to contact support before the documented steps.
|
||||
- Image paths that don't exist — leave `<!-- TODO: screenshot — … -->` instead.
|
||||
- Renaming or moving an existing page (its URL is live and linked from the apps). Some pages are linked from inside the app itself via `packages/intl/src/strings.ts` — grep it before touching a slug.
|
||||
- More than one `# H1` on a page, and `##`/`###` headings inside a `:::tabs` block. Headings in tabs are emitted once per tab, so they show up twice in the page outline with duplicate anchors.
|
||||
- Unquoted frontmatter values containing `: ` — the YAML parser fails the build. Quote them.
|
||||
- Alt text that describes nothing: `drawing`, a filename, or an unfilled template. Inline UI glyphs ("press the ⋯ button") are the one case where a short label is correct.
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Oops!
|
||||
description: The page you're looking for could not be found. Here are some helpful links to get you back on track.
|
||||
---
|
||||
|
||||
# Oops!
|
||||
@@ -8,6 +9,8 @@ Unfortunately, we cannot find what you are looking for.
|
||||
|
||||
Here are some other pages you might be interested in:
|
||||
|
||||
1. [Installing Notesnook](organizing-notes/organize-notes-using-notebooks)
|
||||
2. [Creating your first note](create-a-note-in-notesnook)
|
||||
3. [How is my data encrypted?](how-is-my-data-encrypted)
|
||||
1. [Creating your first note](/create-a-note-in-notesnook)
|
||||
2. [Organizing notes with notebooks](/organizing-notes/organize-notes-using-notebooks)
|
||||
3. [How is my data encrypted?](/how-is-my-data-encrypted)
|
||||
|
||||
Still stuck? [Contact us](https://notesnook.com/contact-us).
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
title: Notesnook Help
|
||||
description: Your complete and free resource to using Notesnook as a daily note taking app to organize your work and life while safeguarding your privacy.
|
||||
---
|
||||
|
||||
# Welcome to Notesnook Help
|
||||
|
||||
Notesnook is a free and open source note taking app focused on user privacy & ease of use. To ensure zero knowledge principles, Notesnook encrypts everything on your device using `XChaCha20-Poly1305` & `Argon2`.
|
||||
|
||||
Notesnook is our **proof** that privacy does _not_ (always) have to come at the cost of convenience. Our goal is to provide users peace of mind & 100% confidence that their notes are safe and secure. The decision to go fully open source is one of the most crucial steps towards that.
|
||||
|
||||
And with that convenience in mind, we believe that it is equally important to put together a simple & useful help website about everything Notesnook. Our help is a complete walkthrough of the Notesnook app and it's features.
|
||||
|
||||
Before we get started, let's [download & install Notesnook](https://notesnook.com/downloads) on all your devices.
|
||||
|
||||
Once that's done, let's learn how to [create your first note](/create-a-note-in-notesnook) in Notesnook.
|
||||
@@ -1,8 +0,0 @@
|
||||
<link rel="stylesheet" type="text/css" href="/custom.css" />
|
||||
<script
|
||||
async
|
||||
defer
|
||||
data-website-id="ad34576b-2721-436c-b36a-47a614009d2b"
|
||||
src="https://aas.streetwriters.co/script.js"
|
||||
data-domains="help.notesnook.com"
|
||||
></script>
|
||||
@@ -1,194 +0,0 @@
|
||||
/* open-sans-regular - vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic */
|
||||
@font-face {
|
||||
font-family: "Open Sans";
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 400;
|
||||
src: local(""),
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff2")
|
||||
format("woff2"),
|
||||
/* Super Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-regular.woff")
|
||||
format("woff"),
|
||||
/* Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-regular.ttf")
|
||||
format("truetype");
|
||||
}
|
||||
/* open-sans-600 - vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic */
|
||||
@font-face {
|
||||
font-family: "Open Sans";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: local(""),
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-600.woff2")
|
||||
format("woff2"),
|
||||
/* Super Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-600.woff")
|
||||
format("woff"),
|
||||
/* Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-600.ttf")
|
||||
format("truetype");
|
||||
}
|
||||
/* open-sans-700 - vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic */
|
||||
@font-face {
|
||||
font-family: "Open Sans";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: local(""),
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-700.woff2")
|
||||
format("woff2"),
|
||||
/* Super Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-700.woff")
|
||||
format("woff"),
|
||||
/* Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-700.ttf")
|
||||
format("truetype");
|
||||
}
|
||||
/* open-sans-italic - vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic */
|
||||
@font-face {
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: local(""),
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff2")
|
||||
format("woff2"),
|
||||
/* Super Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-italic.woff")
|
||||
format("woff"),
|
||||
/* Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-italic.ttf")
|
||||
format("truetype");
|
||||
}
|
||||
/* open-sans-600italic - vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic */
|
||||
@font-face {
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: local(""),
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-600italic.woff2")
|
||||
format("woff2"),
|
||||
/* Super Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-600italic.woff")
|
||||
format("woff"),
|
||||
/* Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-600italic.ttf")
|
||||
format("truetype");
|
||||
}
|
||||
/* open-sans-700italic - vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic */
|
||||
@font-face {
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: local(""),
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-700italic.woff2")
|
||||
format("woff2"),
|
||||
/* Super Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-700italic.woff")
|
||||
format("woff"),
|
||||
/* Modern Browsers */
|
||||
url("/fonts/open-sans-v34-vietnamese_latin-ext_latin_hebrew_greek-ext_greek_cyrillic-ext_cyrillic-700italic.ttf")
|
||||
format("truetype");
|
||||
}
|
||||
|
||||
/* fira-code-regular - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Fira Code";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("/fonts/fira-code-v21-latin-regular.woff2") format("woff2"),
|
||||
/* Super Modern Browsers */ url("/fonts/fira-code-v21-latin-regular.woff")
|
||||
format("woff"),
|
||||
/* Modern Browsers */ url("/fonts/fira-code-v21-latin-regular.ttf")
|
||||
format("truetype"); /* Safari, Android, iOS */
|
||||
}
|
||||
|
||||
html.light {
|
||||
--font-family: "Open Sans", sans-serif;
|
||||
--monospace-font-family: "Fira Code", monospace;
|
||||
--primary: #008837;
|
||||
--primary-fg: #fff;
|
||||
--header-fg: #008837;
|
||||
--link: #008837;
|
||||
--heading: #000;
|
||||
--page-bg: #ffffff;
|
||||
--document-bg: #f7f7f7;
|
||||
--selection-bg: #00883766;
|
||||
--selection-fg: #fff;
|
||||
--border: #e8e8e8;
|
||||
--input-border: #e8e8e8;
|
||||
|
||||
--hover-bg: #e8e8e8;
|
||||
--info-dim: #00883720;
|
||||
|
||||
--fg: #403f53;
|
||||
--fg-dim: #403f53cc;
|
||||
--fg-dimmer: #403f53bb;
|
||||
--code-bg: #e8e8e8;
|
||||
}
|
||||
|
||||
html.dark {
|
||||
--font-family: "Open Sans", sans-serif;
|
||||
--monospace-font-family: "Fira Code", monospace;
|
||||
--primary: #008837;
|
||||
--primary-fg: #fff;
|
||||
--header-fg: #008837;
|
||||
--link: #008837;
|
||||
--page-bg: #0d0d0d;
|
||||
--document-bg: #151515;
|
||||
--border: #383838;
|
||||
|
||||
--info-dim: #00883720;
|
||||
|
||||
--button-bg: #3b3b3b;
|
||||
--hover-bg: #202020;
|
||||
--button-fg: #fff;
|
||||
|
||||
--input-bg: #2b2b2b;
|
||||
--input-placeholder: #ababab;
|
||||
|
||||
--code-bg: #202020;
|
||||
--selection-bg: #00883766;
|
||||
--selection-fg: #fff;
|
||||
--border-dim: #383838;
|
||||
--input-border: #383838;
|
||||
--input-bg: #151515;
|
||||
}
|
||||
nav li {
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
li.nested {
|
||||
min-height: 38px !important;
|
||||
}
|
||||
|
||||
nav li li:not(li.nested):hover {
|
||||
background-color: var(--hover-bg);
|
||||
}
|
||||
|
||||
pre {
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.project-title a {
|
||||
color: var(--fg);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.project-subtitle {
|
||||
color: var(--fg);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.docgen-content {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
nav details[open] {
|
||||
max-height: max-content;
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +0,0 @@
|
||||
# https://www.robotstxt.org/robotstxt.html
|
||||
User-agent: *
|
||||
Allow: /
|
||||
166
docs/help/contents/account-settings.md
Normal file
166
docs/help/contents/account-settings.md
Normal file
@@ -0,0 +1,166 @@
|
||||
---
|
||||
title: Your account
|
||||
pageTitle: Manage your Notesnook account — email, password, profile
|
||||
description: Change your Notesnook email or password, set a profile name and picture, save your recovery key, and log out of your devices.
|
||||
keywords:
|
||||
- change notesnook email
|
||||
- change notesnook password
|
||||
- notesnook recovery key
|
||||
- notesnook log out all devices
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I manage my Notesnook account?
|
||||
|
||||
Everything about your account — email, password, profile name and picture, recovery key and sessions — lives in one place: `{{settings}}` → `{{profile}}` and `{{settings}}` → `{{authentication}}` on desktop and web, or `{{settings}}` → `{{account}}` → `{{manageAccount}}` on mobile.
|
||||
|
||||
## Change your email address
|
||||
|
||||
Changing your email is a two-step flow: you confirm your password, then enter a 6-digit code sent to the **new** address.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}` → `{{profile}}`.
|
||||
2. Press `{{changeEmail}}`.
|
||||
3. Fill in `{{newEmail}}` and `{{accountPassword}}`, then press `{{next}}`.
|
||||
4. Enter the `{{sixDigitCode}}` sent to your new address and press `{{next}}`.
|
||||
|
||||
`Resend code in …` on the code field is disabled for 60 seconds after each send.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}` → `{{account}}` → `{{manageAccount}}`.
|
||||
2. Tap `{{changeEmail}}`.
|
||||
3. Fill in the new email and your account password, then tap `{{verify}}`.
|
||||
4. Enter the 6-digit code sent to your new address and tap `{{changeEmail}}`.
|
||||
|
||||
:::
|
||||
|
||||
::: warning You will be logged out from all your devices
|
||||
The dialog says so explicitly. Your subscription and every other setting stay as they are — only the address changes.
|
||||
|
||||
:::
|
||||
|
||||
## Change your password
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}` → `{{authentication}}`.
|
||||
2. Press `{{changePassword}}`.
|
||||
3. Enter `Current password` and `{{newPassword}}`.
|
||||
|
||||
A backup is taken automatically before the change goes through. When it finishes you see `{{passwordChangedSuccessfully}}` and the `{{saveRecoveryKey}}` dialog opens — save the new key.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}` → `{{account}}` → `{{manageAccount}}` → `{{changePassword}}`.
|
||||
2. Enter `Current password` and `{{newPassword}}`.
|
||||
3. Tap `{{changePasswordConfirm}}`.
|
||||
|
||||
The screen warns that changing your password logs you out from all your devices, that you should not close the app while it runs, and that you must save the new account recovery key afterwards. A backup runs automatically first.
|
||||
|
||||
:::
|
||||
|
||||
### Are my notes re-encrypted when I change my password?
|
||||
|
||||
**No, and that is why it is fast.** Your notes are encrypted with data keys, and those keys are what your password protects. When you change your password, Notesnook derives a new master key from the new password and re-wraps the existing keys — your attachments key, monograph passwords key, inbox keys and data encryption keys — with it. The notes themselves are never re-encrypted, so the time it takes does not grow with the size of your notes.
|
||||
|
||||
::: danger Your password is the only way in
|
||||
Notesnook never sees your password and cannot reset it for you. If you forget it, your [account recovery key](/recovering-your-account) is the only way back to your data. Your email must be confirmed before you can change your password.
|
||||
|
||||
:::
|
||||
|
||||
## Set a profile name and picture
|
||||
|
||||
Your full name and profile picture are stored **end-to-end encrypted and are only visible to you** — they are personalization, not a public profile.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}` → `{{profile}}`.
|
||||
2. Click the pencil next to `{{yourFullName}}` to open `{{editFullName}}`, type a name and confirm. You get a `{{fullNameUpdated}}` toast.
|
||||
3. Hover the avatar and click `{{edit}}` to open `{{editProfilePicture}}`.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}` → `{{account}}` → `{{manageAccount}}`.
|
||||
2. `{{removeFullName}}` and `{{removeProfilePicture}}` appear here once you have set them, each asking for confirmation before clearing the value.
|
||||
|
||||
:::
|
||||
|
||||
## Save your account recovery key
|
||||
|
||||
The recovery key is what gets you back into your data if you forget your password. Save it before you need it.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}` → `{{profile}}`.
|
||||
2. Press `{{save}}` next to `{{saveDataRecoveryKey}}` and confirm the `{{verifyItsYou}}` prompt.
|
||||
3. In the `{{saveRecoveryKey}}` dialog use `{{saveQRCode}}` or `Download`.
|
||||
4. Press `{{keyBackedUp}}` to close the dialog.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}` → `{{account}}` → `{{manageAccount}}`.
|
||||
2. Tap `{{saveDataRecoveryKey}}` and confirm your identity.
|
||||
3. Save the key from the dialog that opens.
|
||||
|
||||
:::
|
||||
|
||||
The same dialog opens automatically right after you change your password, because the key changes with it.
|
||||
|
||||
## Log out from all other devices
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}` → `{{profile}}`.
|
||||
2. Under `{{sessions}}`, press `{{logoutAllOtherDevices}}` and confirm.
|
||||
|
||||
You get a `{{loggedOutAllOtherDevices}}` toast. The device you are using stays signed in.
|
||||
|
||||
== Mobile
|
||||
|
||||
This is not available in the mobile app — use the desktop or web app to force a logout on your other devices.
|
||||
|
||||
:::
|
||||
|
||||
::: info There is no list of active sessions
|
||||
Notesnook does not show a per-device session list. `{{logoutAllOtherDevices}}` clears every session except the one you are on; changing your email or password logs out every device including this one.
|
||||
|
||||
:::
|
||||
|
||||
## Log out of this device
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}` → `{{profile}}`.
|
||||
2. Under `{{sessions}}`, press `{{logout}}`.
|
||||
3. Leave `{{backupDataBeforeLogout}}` ticked — it is on by default — and confirm.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}` → `{{account}}` → `{{manageAccount}}` → `{{logout}}`.
|
||||
2. Leave `{{backupDataBeforeLogout}}` ticked — it is on by default — and confirm.
|
||||
|
||||
:::
|
||||
|
||||
If you have unsynced changes, the confirmation adds a warning about them before you continue. If the pre-logout backup fails, Notesnook asks whether you want to log out anyway — answering no cancels the logout so you can fix the problem first.
|
||||
|
||||
::: warning Logging out clears local data
|
||||
Logging out resets the local database on that device. Anything that has not synced is gone, which is exactly what the backup checkbox is there to prevent. See [backup and restore](/backup-and-restore-notes-in-notesnook).
|
||||
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Recovering your account](/recovering-your-account) — using your recovery key after a forgotten password
|
||||
- [Two-factor authentication](/two-factor-authentication) — adding a second step to every login
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — keeping your own copy before you log out
|
||||
- [Plans & limits](/plans-and-limits) — managing your subscription and billing
|
||||
- [Deleting your account](/deleting-your-account) — removing your account and data for good
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what your password actually protects
|
||||
@@ -1,51 +1,103 @@
|
||||
# App lock
|
||||
---
|
||||
title: App lock
|
||||
pageTitle: Lock the Notesnook app with a PIN, password or biometrics
|
||||
description: Turn on app lock in Notesnook to require a PIN, password, biometrics or a security key before your notes open, even when your device is already unlocked.
|
||||
keywords:
|
||||
- lock notes app
|
||||
- password protect notes app
|
||||
- fingerprint lock notes
|
||||
---
|
||||
|
||||
You can use app lock to restrict access to your app even when your system is unlocked.
|
||||
# App lock <PlanTag plan="pro" />
|
||||
|
||||
## [Desktop](#/tab/desktop)
|
||||
You can use app lock to restrict access to your app even when your system is unlocked. It works on desktop, web and mobile, and it is separate from the [private vault](/lock-notes-with-private-vault) — app lock covers the whole app, the vault covers individual notes.
|
||||
|
||||
### Turn on App Lock
|
||||
App lock is part of the [Pro plan and above](/plans-and-limits). If a paid plan expires, app lock is switched off automatically, so set up your device's own lock screen if you rely on it.
|
||||
|
||||
1. Go to Settings and Click on App lock. Then turn on the App lock switch. You will be prompted to enter your App Lock Password. When it is successful App Lock will be turned on.
|
||||
## Ways to unlock
|
||||
|
||||
<img src="/desktop-enable-app-lock.png" alt="drawing" height="500"/>
|
||||
| Method | Where |
|
||||
| --------------------------------- | ----------------------- |
|
||||
| PIN or password | Desktop, web and mobile |
|
||||
| Biometrics (fingerprint, Face ID) | Mobile |
|
||||
| Security key | Desktop and web |
|
||||
|
||||
### Setting App Lock Time Out
|
||||
## Turn on app lock
|
||||
|
||||
2. You can set the time out for your App Lock from one minute to an hour or you can turn it off by setting it to **Never**.
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
<img src="/desktop-lock-app-after.png" alt="drawing" height="500"/>
|
||||
1. Go to `{{settings}}` → `{{appLock}}`.
|
||||
2. Turn on `{{enableAppLock}}`.
|
||||
3. Enter a password or PIN when prompted, and confirm it.
|
||||
|
||||
### Change Password
|
||||

|
||||
|
||||
3. You can also change the pin or password or you can set a security key if you want a more secure app.
|
||||
== Mobile
|
||||
|
||||
<img src="/desktop-password-key.png" alt="drawing" height="500"/>
|
||||
1. Go to `{{settings}}` → `{{appLock}}`.
|
||||
|
||||
## [Mobile/IOS](#/tab/mobile)
|
||||

|
||||
|
||||
### Turn on App Lock
|
||||
2. Turn on `{{enableAppLock}}` and enter a PIN, or authenticate with your fingerprint or face.
|
||||
|
||||
1. Go to Settings and Tap on App lock.
|
||||

|
||||
|
||||
<img src="/app-lock-setting.png" alt="drawing" height="500"/>
|
||||
:::
|
||||
|
||||
2. Then turn on the App lock switch. You will be prompted to enter a pin or fingerprint. When it is successful App Lock will be turned on.
|
||||
Notesnook now asks for your credential every time it starts, and after the timeout you set below.
|
||||
|
||||
<img src="/app-lock-setting-on-off.png" alt="drawing" height="500"/>
|
||||
## Set how long before it locks
|
||||
|
||||
### Setting App Lock Time Out
|
||||
`Lock app after` decides how long the app can sit idle before it locks itself again. `{{never}}` means Notesnook only asks when it starts.
|
||||
|
||||
3. You can set the time out for your App Lock
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
<img src="/app-lock-setting-time-out.png" alt="drawing" height="500"/>
|
||||
1. Go to `{{settings}}` → `{{appLock}}`.
|
||||
2. Set `Lock app after` to `{{immediately}}`, `1`, `5`, `10`, `15`, `30` or `45` minutes, `1 hour`, or `{{never}}`.
|
||||
|
||||
### Set a pin
|
||||

|
||||
|
||||
4. You can set a pin instead of a fingerprint if you are more comfortable with it (or if your mobile is not fingerprint friendly).
|
||||
== Mobile
|
||||
|
||||
<img src="/setup-app-lock-pin.png" alt="drawing" height="500"/>
|
||||
1. Go to `{{settings}}` → `{{appLock}}`.
|
||||
2. Set `{{appLockTimeout}}` to `{{never}}`, `{{immediately}}`, `1`, `5`, `15` or `30` minutes.
|
||||
|
||||
5. You can also change or remove the pin.
|
||||

|
||||
|
||||
<img src="/change-remove-app-lock-pin.png" alt="drawing" height="500"/>
|
||||
:::
|
||||
|
||||
## Change or remove your PIN, password or security key
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
Under `{{credientials}}` on the same screen:
|
||||
|
||||
- `{{passwordPin}}` — press `{{change}}` to set a new one, or `{{disable}}` to remove it.
|
||||
- `{{securityKey}}` — press `{{register}}` to add a hardware security key, or `{{unregister}}` to remove it.
|
||||
|
||||

|
||||
|
||||
== Mobile
|
||||
|
||||
- `{{setupAppLockPin}}` or `{{setupAppLockPassword}}` add a credential; once one exists the entries read `{{changeAppLockPin}}` and `{{changeAppLockPassword}}`.
|
||||
- `{{removeAppLockPin}}` and `{{removeAppLockPassword}}` take one away. App lock is switched off entirely if you remove the last remaining method.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
:::
|
||||
|
||||
## Lock the app right now
|
||||
|
||||
Rather than waiting for the timeout, you can lock immediately. On desktop and web, click the lock icon in the status bar at the bottom of the window.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Private vault](/lock-notes-with-private-vault) — encrypt individual notes behind a separate password
|
||||
- [Privacy mode](/privacy-mode) — stop screenshots and hide the app from the task switcher
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what protects your notes on the server
|
||||
- [Plans & limits](/plans-and-limits) — what the Pro plan unlocks
|
||||
|
||||
205
docs/help/contents/attachments-and-files.md
Normal file
205
docs/help/contents/attachments-and-files.md
Normal file
@@ -0,0 +1,205 @@
|
||||
---
|
||||
title: Attachments & files
|
||||
pageTitle: How do I attach files and images to a note in Notesnook?
|
||||
description: Attach images and files to your notes, read PDFs without downloading them, see the per-plan size and storage limits, and manage every attachment.
|
||||
keywords:
|
||||
- notesnook attach file to note
|
||||
- notesnook attachment size limit
|
||||
- notesnook attachment manager
|
||||
- notesnook orphaned attachments
|
||||
- notesnook pdf preview
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I attach files and images to a note in Notesnook?
|
||||
|
||||
Open the insert menu in the editor and pick `{{image}}` or `{{attachment}}`. The file is encrypted on your device before it is uploaded, so nobody — including us — can read it. Attaching files requires a Notesnook account, and how large a file can be depends on your plan.
|
||||
|
||||
::: info You need an account to attach files
|
||||
Trying to insert an attachment while logged out shows `{{notLoggedIn}}` with the message `Login to upload attachments.` Attachments are stored on Notesnook's servers in encrypted form, which is why an account is required. See [why login is needed to upload attachments](/faqs/login-to-upload-attachments).
|
||||
|
||||
:::
|
||||
|
||||
## Attach a file or an image
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Put the cursor where the file should go.
|
||||
2. Open the insert menu (the `+` button on the toolbar).
|
||||
3. Choose `{{attachment}}` for any file, or `{{image}}` → `{{uploadFromDisk}}` for a picture.
|
||||
4. Pick one or more files.
|
||||
|
||||
Shortcuts: `Ctrl/Cmd + Shift + A` for an attachment, `Ctrl/Cmd + Shift + I` for an image. You can also drag files straight into the editor.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Put the cursor where the file should go.
|
||||
2. Open the insert menu (the `+` button on the toolbar).
|
||||
3. Choose `{{attachment}}` for any file, or `{{image}}` for a picture.
|
||||
4. Under `{{image}}` you also get `{{takePhotoUsingCamera}}`, which is mobile only.
|
||||
|
||||
:::
|
||||
|
||||
Notesnook hashes each file first, so attaching the same file twice reuses the copy that is already uploaded instead of consuming your storage again.
|
||||
|
||||
## File size and storage limits
|
||||
|
||||
| | Free | Essential | Pro | Believer |
|
||||
| ----------------- | ----- | --------- | ----- | -------- |
|
||||
| Maximum file size | 10 MB | 100 MB | 1 GB | 5 GB |
|
||||
| Storage per month | 50 MB | 1 GB | 10 GB | 25 GB |
|
||||
|
||||
Storage counts **attachments only** — images, files, audio and web clips. Your notes never count against it. If a file is over your plan's limit, the upload is refused with a message telling you the size you are allowed. Full details are on [Plans & limits](/plans-and-limits).
|
||||
|
||||
### Upload images at full quality <PlanTag plan="pro" />
|
||||
|
||||
By default Notesnook compresses images before uploading. The `{{imageCompression}}` setting offers `{{askEveryTime}}`, `{{enableRecommended}}` and `{{disable}}` — and `{{disable}}`, which uploads at full quality, needs **Pro** or **Believer**.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
Go to `{{settings}}` → `{{behaviour}}` → `{{imageCompression}}`.
|
||||
|
||||
== Mobile
|
||||
|
||||
Go to `{{settings}}` → `{{customization}}` → `{{behavior}}` → `{{imageCompression}}`.
|
||||
|
||||
:::
|
||||
|
||||
## Manage your attachments
|
||||
|
||||
The attachment manager lists every file in your account with its name, upload status, size and upload date.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
Go to `{{settings}}` → `{{profile}}` → `{{attachments}}` and press `{{open}}`.
|
||||
|
||||
== Mobile
|
||||
|
||||
Go to `{{settings}}` → `{{account}}` → `{{manageAccount}}` → `{{manageAttachments}}`.
|
||||
|
||||
:::
|
||||
|
||||
### Filter and search
|
||||
|
||||
Both apps group attachments by type. On desktop and web the sidebar has `All files`, `Images`, `Documents`, `Videos`, `Audios`, `{{uploads}}` and `{{orphaned}}`, each with a count. Mobile shows `All files`, `Images`, `Audios`, `Videos`, `Documents`, `{{orphaned}}` and `Errors`.
|
||||
|
||||
- **`{{uploads}}`** — files that are still waiting to be uploaded.
|
||||
- **`{{orphaned}}`** — files that are no longer referenced by any note, usually left behind by a note you deleted. These are safe to delete once you are sure you don't want the file itself.
|
||||
|
||||
The search box at the top filters the list by filename. On desktop and web you can also sort by clicking the `{{name}}`, `{{size}}` or `{{dateUploaded}}` column headers.
|
||||
|
||||
### Act on an attachment
|
||||
|
||||
Open an attachment's menu — right click desktop and web, tap the item on mobile — for:
|
||||
|
||||
| Action | What it does |
|
||||
| ------------------------------------------------ | ----------------------------------------------------------------------------- |
|
||||
| `{{previewAttachment}}` | Opens images and PDFs without downloading them (desktop and web) |
|
||||
| `{{linkedNotes}}` | Lists the notes that use this file; picking one opens it |
|
||||
| `{{fileCheck}}` | Verifies the uploaded file is intact and decryptable |
|
||||
| `{{rename}}` | Changes the filename |
|
||||
| `Download` | Saves the file to your device |
|
||||
| `Reupload` | Replaces a broken upload — you must pick the same file, the hash has to match |
|
||||
| `{{deletePermanently}}` (`{{delete}}` on mobile) | Removes the file from your account and from the notes that use it |
|
||||
|
||||
`Download`, `{{fileCheck}}` and `{{delete}}` also work on a multi-selection from the toolbar at the top of the desktop and web list.
|
||||
|
||||
::: tip Fix a failed attachment
|
||||
A file that shows an error usually needs `{{fileCheck}}` first. If the check reports a problem, `Reupload` with the original file repairs it.
|
||||
|
||||
:::
|
||||
|
||||
<!-- TODO: screenshot — the attachment manager with the type sidebar and the toolbar actions -->
|
||||
|
||||
### Download every attachment
|
||||
|
||||
The download button at the bottom of the desktop and web sidebar is `{{downloadAllAttachments}}`; on mobile it is the download icon in the header. A progress ring appears while it runs, and pressing the button again cancels it. This is the quickest way to get a local copy of everything you have uploaded.
|
||||
|
||||
### Clear the cache
|
||||
|
||||
`{{clearCache}}` removes the local copies of files without touching what is on the server. The confirmation spells out what happens: downloaded images and files are **cleared**, pending uploads are **cleared**, and uploaded images and files are **unaffected**.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
Use the `{{clearCache}}` button at the bottom of the attachment manager's sidebar.
|
||||
|
||||
== Mobile
|
||||
|
||||
Go to `{{settings}}` → `{{account}}` → `{{manageAccount}}` → `{{clearCache}}`. The setting shows the current cache size.
|
||||
|
||||
:::
|
||||
|
||||
::: warning Pending uploads are cleared too
|
||||
Anything that has not finished uploading is lost when you clear the cache. Let uploads finish first.
|
||||
|
||||
:::
|
||||
|
||||
## Read a PDF without downloading it
|
||||
|
||||
PDFs open in a viewer inside Notesnook, so you can read one without saving it to your device first. The file is downloaded to the local cache, decrypted in memory and shown — it is never handed to another app unless you ask for that.
|
||||
|
||||
To open one, click or tap the PDF attachment where it sits in the note. On desktop and web there is a second route: open the file's menu in the [attachment manager](#manage-your-attachments) and choose `{{previewAttachment}}`. That entry appears only on images and PDFs, and the attachment manager on mobile has no preview action — go through the note instead.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
The PDF opens in a **side pane to the right of the editor**, so you can read it and write at the same time. Drag the divider between the two to resize them.
|
||||
|
||||
The pane's toolbar has:
|
||||
|
||||
| Control | What it does |
|
||||
| ---------------------- | --------------------------------------------------------------- |
|
||||
| `{{search}}` | Searches the text of the PDF and highlights the matches |
|
||||
| `{{goToPreviousPage}}` | Back one page |
|
||||
| Page number | Shows the current page and the total; type a number to jump |
|
||||
| `{{goToNextPage}}` | Forward one page |
|
||||
| `{{zoomOut}}` / `{{zoomIn}}` | Steps the zoom down or up; the current percentage sits between them |
|
||||
| `Download` | Saves the PDF to your device |
|
||||
| `{{enterFullScreen}}` | Hands the whole screen to the PDF |
|
||||
| `{{close}}` | Closes the pane and returns the space to the editor |
|
||||
|
||||
The table of contents and the note properties share this space, so opening the PDF preview closes whichever of those was open.
|
||||
|
||||
== Mobile
|
||||
|
||||
The PDF opens **full screen** over the app. In its header you get:
|
||||
|
||||
- a back arrow to close the viewer and return to the note;
|
||||
- the current page number with the page total beside it — tap the number, type a page and confirm to jump straight to it;
|
||||
- a download button to save the file to your device;
|
||||
- an open-in-new button that hands the PDF to another app on your phone, so you can read it in your usual PDF reader or share it onward.
|
||||
|
||||
Scroll and pinch to zoom as you would in any other viewer.
|
||||
|
||||
:::
|
||||
|
||||
::: info Password-protected PDFs
|
||||
A PDF with a password on it opens on a `{{pdfLocked}}` screen instead of the document. Enter the PDF's own password to read it. This is the password whoever made the file set on it — it has nothing to do with your Notesnook account password or your [vault](/lock-notes-with-private-vault) password, and Notesnook cannot recover it for you.
|
||||
|
||||
:::
|
||||
|
||||
## Deleting an attachment
|
||||
|
||||
Deleting an attachment removes it from your account **and** from every note that references it — attachments are not moved to [Trash](/trash) the way notes are.
|
||||
|
||||
## What is an orphaned attachment?
|
||||
|
||||
Deleting a note does not delete the files it contained — they stay in your account as **orphaned** attachments, listed under `{{orphaned}}` in the attachment manager. Delete the ones you no longer want the file for.
|
||||
|
||||
## Why is my storage still full after I deleted attachments?
|
||||
|
||||
Your plan's storage figure is a **monthly allowance**, not a measure of how much you are currently storing — that is why every plan is written as `50 MB/mo`, `1 GB/mo` and so on. Uploading a file spends part of that month's allowance, and deleting the file afterwards does not hand the allowance back. The allowance starts again at the beginning of the next month.
|
||||
|
||||
So deleting attachments is worth doing to keep your account tidy, but it is not the way to get more room this month. If you are hitting the ceiling regularly, a plan with a larger monthly allowance is the fix — see [plans & limits](/plans-and-limits).
|
||||
|
||||
<GetNotesnook action="pricing" title="Need more room for files?" text="The free plan gives you 50 MB a month and a 10 MB file size cap. Paid plans go up to 25 GB a month with 5 GB files — and every file stays end-to-end encrypted on all of them." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Plans & limits](/plans-and-limits) — the storage and file size limits for every plan
|
||||
- [Trash](/trash) — why deleted notes leave their files behind
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — how attachments are encrypted before upload
|
||||
- [Private vault](/lock-notes-with-private-vault) — locking the notes your files live in
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — including attachments in a backup
|
||||
- [Why do I need to log in to upload attachments?](/faqs/login-to-upload-attachments)
|
||||
@@ -1,111 +1,148 @@
|
||||
---
|
||||
title: Backup and restore
|
||||
description: Notesnook allows you to backup all your notes data to a single backup file. Learn how you can backup your notes and restore them.
|
||||
pageTitle: How do I back up and restore my notes in Notesnook?
|
||||
description: Create an encrypted backup of everything in Notesnook, turn on automatic backups, and restore a backup without losing the work you have done since.
|
||||
keywords:
|
||||
- notesnook backup
|
||||
- backup notes app
|
||||
- restore notesnook backup
|
||||
- notesnook automatic backups
|
||||
- nnbackupz file
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Backup your notes
|
||||
# How do I back up and restore my notes?
|
||||
|
||||
It is always a good practice to take regular backups of your data so you can easily recover your data in case of data corruption or losing access to your account. All backups are stored locally encrypted (unless you turn off backup encryption) on your device.
|
||||
Taking regular backups means you can recover your notes if your data is corrupted or you lose access to your account. All backups are stored locally encrypted (unless you turn off backup encryption) on your device.
|
||||
|
||||
> error Store your password & recovery key safely
|
||||
>
|
||||
> Since all your data is end-to-end encrypted, we have no way to restore your account data if you forget your account password and lose your account recovery key. That's why we recommend that you store your password & recovery key in a password manager or some other safe place.
|
||||
::: danger Store your password & recovery key safely
|
||||
Since all your data is end-to-end encrypted, we have no way to restore your account data if you forget your account password and lose your account recovery key. That's why we recommend that you store your password & recovery key in a password manager or some other safe place.
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::
|
||||
|
||||
1. Go to Settings
|
||||
2. Scroll down in the Settings navigation menu and click on `Backup & export` section
|
||||
3. Click on `Create backup` under `Backup now` heading to create a new `.nnbackupz` file
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||

|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{backupExport}}` section
|
||||
3. Click `Create backup` under `{{backupNow}}` heading to create a new `.nnbackupz` file
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||

|
||||
|
||||
1. Go to Settings from Sidebar
|
||||
2. Scroll down to `Backup and Restore`
|
||||
3. Tap on `Backups`
|
||||
4. Press on `Backup now` to create a new `.nnbackupz` file
|
||||
== Mobile
|
||||
|
||||
> info
|
||||
>
|
||||
> On **Android** when you take a backup for the first time, you will be asked to select a folder where you want to store all your backup files. You can always change your backup files location from `Backups > Select backup directory`.
|
||||
>
|
||||
> Regardless of the folder you select, Notesnook will create a folder "Notesnook/backups" inside it and store all backup files there.
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{backupRestore}}`
|
||||
3. Tap `{{backups}}`
|
||||
4. Tap `{{backupNow}}` to create a new `.nnbackupz` file
|
||||
|
||||
---
|
||||
::: info
|
||||
On **Android** when you take a backup for the first time, you will be asked to select a folder where you want to store all your backup files. You can always change your backup files location from `Backups > Select backup directory`.
|
||||
|
||||
## Automatic Backups
|
||||
Regardless of the folder you select, Notesnook will create a folder "Notesnook/backups" inside it and store all backup files there.
|
||||
|
||||
:::
|
||||
|
||||
## Turn on automatic backups
|
||||
|
||||
For maximum safety against potential data loss, you can enable daily, weekly or monthly backups of your notes. Enabling automatic backups will ensure that all your data is safely backed up locally after a regular interval.
|
||||
|
||||
# [Desktop](#/tab/desktop)
|
||||
:::tabs key:platform
|
||||
== Desktop
|
||||
|
||||
1. Go to Settings
|
||||
2. Scroll down in the Settings navigation menu and click on `Backup & export` section
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{backupExport}}` section
|
||||
3. Select the Automatic backups interval from the dropdown
|
||||
|
||||

|
||||

|
||||
== Web
|
||||
::: info
|
||||
On the **web** app there is no way to automatically save backups to a folder, that is why Notesnook only reminds the users when it's time to create a new backup.
|
||||
|
||||
# [Web](#/tab/web)
|
||||
:::
|
||||
|
||||
> info
|
||||
>
|
||||
> On the **web** app there is no way to automatically save backups to a folder, that is why Notesnook only reminds the users when it's time to create a new backup.
|
||||
|
||||
1. Go to Settings
|
||||
2. Scroll down in the Settings navigation menu and click on `Backup & export` section
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{backupExport}}` section
|
||||
3. Select the Backup reminders interval from the dropdown
|
||||
|
||||

|
||||

|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Go to Settings > Backup & Restore
|
||||
2. Press Backups
|
||||
3. Select automatic backup frequency to enable automatic backups
|
||||
1. Go to `{{settings}}` → `{{backupRestore}}`.
|
||||
2. Tap `{{backups}}`.
|
||||
3. Choose an automatic backup frequency.
|
||||
:
|
||||
:::
|
||||
|
||||
---
|
||||
## Keep backups encrypted
|
||||
|
||||
## Encrypted Backups (Recommended)
|
||||
To keep your backups secure & private, it is recommended that you enable encryption on your backup files instead of storing them as plaintext data. **Encrypted backups are on by default.**
|
||||
|
||||
To keep your backups secure & private, it is recommended that you enable encryption on your backup files instead of storing them as plaintext data. **Starting from v2.6.0, encrypted backups are enabled by default for all users.**
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{backupExport}}` section
|
||||
3. Click the toggle next to `{{backupEncryption}}` to enable/disable encrypted backups
|
||||
|
||||
1. Go to Settings
|
||||
2. Scroll down in the Settings navigation menu and click on `Backup & export` section
|
||||
3. Click on the toggle next to `Backup encryption` to enable/disable encrypted backups
|
||||
== Mobile
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
1. Go to `{{settings}}` → `{{backupRestore}}`
|
||||
2. Tap `{{backups}}`
|
||||
3. Tap the toggle next to `{{backupEncryption}}` to enable/disable encrypted backups
|
||||
|
||||
1. Go to `Settings` > `Backup & Restore`
|
||||
2. Tap on `Backups`
|
||||
3. Tap on the toggle next to `Backup encryption` to enable/disable encrypted backups
|
||||
:::
|
||||
|
||||
---
|
||||
::: info
|
||||
Backups are always encrypted with your account password.
|
||||
|
||||
> info
|
||||
>
|
||||
> Backups are always encrypted with your account password.
|
||||
:::
|
||||
|
||||
# Restore a backup
|
||||
## Restore a backup
|
||||
|
||||
At any point in time, you can restore a backup to recover lost data. However, **to restore a backup, you must be logged in to your Notesnook account.** Backups created on one account can be restored on another Notesnook account.
|
||||
::: danger Restoring overwrites what you have now
|
||||
Restoring a backup replaces your current content in-place. Anything that changed since that backup was taken is reverted to how it was in the backup. Entirely new content — notes you created after the backup — is not touched.
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
**Always create a backup before restoring one.**
|
||||
|
||||
1. Go to Settings
|
||||
2. Scroll down in the Settings navigation menu and click on `Backup & export` section
|
||||
3. Click on `Restore` button next to `Restore backup` heading
|
||||
:::
|
||||
|
||||
### Recover a few old notes without losing today's work
|
||||
|
||||
If you only want something back from an old backup, don't restore it over your current data and hope for the best. Sandwich it:
|
||||
|
||||
1. Create a **new backup** of your current data.
|
||||
2. Restore the **old backup** and take out what you needed.
|
||||
3. Restore the **new backup** from step 1 to put everything back as it was.
|
||||
|
||||
That sequence means no recent change is lost. Be aware of one side effect: restoring an old backup can bring back notes you had deleted since, so check your trash and notes list afterwards.
|
||||
|
||||
At any point in time, you can restore a backup to recover lost data. Backups created on one account can be restored on another Notesnook account.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{backupExport}}` section
|
||||
3. Click `{{restore}}` button next to `{{restoreBackup}}` heading
|
||||
4. Select the `.nnbackupz` or `.nnbackup` file from your PC that you want to restore.
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Go to Settings from Sidebar
|
||||
2. Scroll down to `Backup & Restore` section
|
||||
3. Tap on `Restore backup`
|
||||
4. From `Restore backup` sheet, select the backup you want to restore. If your backup file is located in some other location, tap on `Restore from files` on top right corner of the sheet then select the backup file.
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{backupRestore}}`
|
||||
3. Tap `{{restoreBackup}}`
|
||||
4. From `{{restoreBackup}}` sheet, select the backup you want to restore. If your backup file is located in some other location, tap `{{restoreFromFiles}}` on top right corner of the sheet then select the backup file.
|
||||
|
||||
<img src="/restore-backup-mobile.png" height="700px">
|
||||

|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Exporting notes](/export-notes-from-notesnook) — taking your notes to another app
|
||||
- [Recovering your account](/recovering-your-account) — when you forget your password
|
||||
- [Attachments & files](/attachments-and-files) — managing the files in your notes
|
||||
- [Version history](/note-version-history) — going back to an earlier draft
|
||||
- [Plans & limits](/plans-and-limits) — what each plan unlocks and the exact limits
|
||||
|
||||
@@ -1,39 +1,52 @@
|
||||
---
|
||||
title: Create your first note
|
||||
description: Notesnook let's you create unlimited notes for free. Learn how you can create your first note in Notesnook.
|
||||
pageTitle: How do I create a note in Notesnook?
|
||||
description: Create your first note in Notesnook on desktop, web or mobile. Notes save themselves as you type, and you can start one from anywhere in the app.
|
||||
keywords:
|
||||
- create a note notesnook
|
||||
- how to use notesnook
|
||||
- notesnook first note
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Creating your first note
|
||||
|
||||
You are in a note taking app, the first thing you'd want to do is create a note.
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Click on the `+` button on top right corner or click anywhere inside the editor to focus it.
|
||||
1. Click the `+` button on top right corner or click anywhere inside the editor to focus it.
|
||||
2. Start typing in the editor and a new note will be automatically created.
|
||||
3. As you type, your note is saved automatically whenever you stop for a few seconds.
|
||||
|
||||

|
||||

|
||||
|
||||
> info
|
||||
>
|
||||
> The bottom right corner of the app will show the number of words of current note & the last saved time.
|
||||
>
|
||||
> 
|
||||
::: info
|
||||
The bottom right corner of the app will show the number of words of current note & the last saved time.
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||

|
||||
|
||||
== Mobile
|
||||
|
||||
1. On mobile regardless of what screen you are on, you can swipe from right to left to open the editor.
|
||||
2. You can also press the `+` button on bottom right corner to open the editor (note: the `+` button is visible only on some screens).
|
||||
3. Start typing in the editor and a new note will be automatically created.
|
||||
4. As you type, your note is saved automatically whenever you stop for a few seconds.
|
||||
|
||||

|
||||

|
||||
|
||||
> info
|
||||
>
|
||||
> Below the note title is the editor status bar. It shows you the number of words in the note and last saved time.
|
||||
::: info
|
||||
Below the note title is the editor status bar. It shows you the number of words in the note and last saved time.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
And that is how you create your first private note in Notesnook!
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Notebooks](/organizing-notes/organize-notes-using-notebooks) — nested notebooks for structure
|
||||
- [Editor toolbar](/rich-text-editor/rich-text-editor-toolbar) — every formatting tool
|
||||
- [Search & navigation](/search-and-navigation) — finding anything, fast
|
||||
- [How sync works](/sync/how-sync-works) — when and how your notes travel
|
||||
- [Plans & limits](/plans-and-limits) — what each plan unlocks and the exact limits
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
# Custom themes
|
||||
@@ -1,35 +1,48 @@
|
||||
---
|
||||
title: Theme Builder
|
||||
pageTitle: How do I create a custom Notesnook theme?
|
||||
description: Build a Notesnook theme in the Theme Builder without writing JSON — pick a starter theme, set your colors and metadata, and export it as a theme file.
|
||||
keywords:
|
||||
- notesnook theme builder
|
||||
- create notesnook theme
|
||||
- custom theme notes app
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Create a theme with the Theme Builder
|
||||
|
||||
The Theme Builder provides an easy and accessible way to create themes for Notesnook without prior technical knowledge. The purpose of this tool is to allow anyone, especially a layman, to tweak Notesnook according to their liking.
|
||||
|
||||
You can access the Theme Builder at [https://theme-builder.notesnook.com](https://theme-builder.notesnook.com).
|
||||
|
||||
> info
|
||||
>
|
||||
> The Theme Builder is the exact duplicate of the Notesnook Web application — just with the option to tweak the colors. You can use it to sign into your account, create notes, and everything else you do in the Notesnook app.
|
||||
::: info
|
||||
The Theme Builder is a full copy of the Notesnook web app, with an extra panel for tweaking the colors. You can use it to sign into your account, create notes, and everything else you do in the Notesnook app.
|
||||
|
||||
:::
|
||||
|
||||
Here's a look at the theme builder:
|
||||
|
||||

|
||||

|
||||
|
||||
Now let's walk through the whole process of creating your own theme using the Theme Builder.
|
||||
|
||||
## 1. Select a starter theme
|
||||
|
||||
Before you can create your own theme, it is best to select a starter theme to build upon. This allows us to quickly visualize all the changes without have to build from scratch.
|
||||
Before you can create your own theme, it is best to select a starter theme to build upon. That lets you see every change against a working app instead of building one from scratch.
|
||||
|
||||
The Theme Builder makes this very easy:
|
||||
|
||||
1. Open the [Theme Builder](https://theme-builder.notesnook.com).
|
||||
2. Go to `Settings > Appearance > Themes` and select any theme from the list.
|
||||
|
||||
> warn
|
||||
>
|
||||
> Keep in mind that a theme can only have one color scheme: `light` or `dark` so choose your starter theme accordingly.
|
||||
::: warning
|
||||
Keep in mind that a theme can only have one color scheme: `light` or `dark` so choose your starter theme accordingly.
|
||||
|
||||
:::
|
||||
|
||||
For our example, we are going to select "Notesnook Light" as our base theme.
|
||||
|
||||

|
||||

|
||||
|
||||
Once the theme is applied, you'll notice all the colors in the Theme Builder update with the colors of the Notesnook Light theme.
|
||||
|
||||
@@ -37,47 +50,50 @@ Once the theme is applied, you'll notice all the colors in the Theme Builder upd
|
||||
|
||||
Theme metadata allows better discoverability in search and gives users a quick idea of what the theme is. You can read about all the supported properties [here](/custom-themes/introduction#theme-metadata).
|
||||
|
||||

|
||||

|
||||
|
||||
> warn Theme ID conflicts
|
||||
>
|
||||
> Remember that the `id` for your custom theme should not conflict with other published themes on Notesnook. You can see the list of all published theme IDs [here](https://github.com/streetwriters/notesnook-themes/tree/main/themes).
|
||||
::: warning Theme ID conflicts
|
||||
Remember that the `id` for your custom theme should not conflict with other published themes on Notesnook. You can see the list of all published theme IDs [here](https://github.com/streetwriters/notesnook-themes/tree/main/themes).
|
||||
|
||||
:::
|
||||
|
||||
## 3. Configuring base theme scope
|
||||
|
||||
> info
|
||||
>
|
||||
> Before you proceed, it is recommended that you [learn about how theming in Notesnook works](/custom-themes/introduction#what-is-a-theme), what scopes, variants & colors do etc.
|
||||
::: info
|
||||
Before you proceed, it is recommended that you [learn about how theming in Notesnook works](/custom-themes/introduction#what-is-a-theme), what scopes, variants & colors do etc.
|
||||
|
||||
:::
|
||||
|
||||
Every Notesnook theme must implement the base theme scope. Colors from the `base` theme scope are used as a fallback in all other scopes if a specific color is not defined.
|
||||
|
||||

|
||||

|
||||
|
||||
For our example, we will be creating a Blue accented theme for Notesnook. In order to do that, we must replace all the occurences of the default green color (#008837) in the `base` theme scope with a nice blue color (#1d4ed8).
|
||||
For our example, we will be creating a Blue accented theme for Notesnook. In order to do that, we must replace all the occurrences of the default green color (#008837) in the `base` theme scope with a nice blue color (#1d4ed8).
|
||||
|
||||
Since we want to create a blue variant of our Notesnook light theme, we will replace the default green (#008837) in our base theme scope with blue(#1d4ed8). We have to go through all variants, primary, secondary, selected, disabled and replace the colors.
|
||||
|
||||

|
||||

|
||||
|
||||
As you change each color, you will see the changes reflected in the app in real-time. How cool is that!
|
||||
As you change each color, the app updates in real time.
|
||||
|
||||
## 4. Configuring optional scopes
|
||||
|
||||
After configuring `base` theme scope, you can optionally set colors for other scopes, such as `navigationMenu`, to make them look a little different.
|
||||
|
||||
> info An example
|
||||
>
|
||||
> For example, in the default Notesnook Light theme, the background color of the navigation menu is grayish instead of pure white.
|
||||
>
|
||||
> 
|
||||
>
|
||||
> This is because the default Notesnook Light theme has a different background color set for the `navigationMenu` scope.
|
||||
>
|
||||
> 
|
||||
::: info An example
|
||||
For example, in the default Notesnook Light theme, the background color of the navigation menu is grayish instead of pure white.
|
||||
|
||||
The sky is the limit here. In most cases, though, the `base` scope will suffice unless you want to get super creative like me.
|
||||

|
||||
|
||||

|
||||
This is because the default Notesnook Light theme has a different background color set for the `navigationMenu` scope.
|
||||
|
||||

|
||||
|
||||
:::
|
||||
|
||||
The sky is the limit here. In most cases, though, the `base` scope will suffice unless you want to get more adventurous.
|
||||
|
||||

|
||||
|
||||
And that's it! Your theme is ready to be exported.
|
||||
|
||||
@@ -85,7 +101,7 @@ And that's it! Your theme is ready to be exported.
|
||||
|
||||
Once you have finished working on your theme, you can export it by clicking the "Export theme" button at the top of Theme Builder pane.
|
||||
|
||||

|
||||

|
||||
|
||||
You will get a JSON file containing your theme which you can either [install directly into the Notesnook app](/custom-themes/install-a-theme-from-file) for personal use or [publish it](/custom-themes/publish-a-theme) for others to use as well.
|
||||
|
||||
@@ -93,3 +109,10 @@ You will get a JSON file containing your theme which you can either [install dir
|
||||
|
||||
- [Publish your theme](/custom-themes/publish-a-theme)
|
||||
- [Install a theme directly from JSON file](/custom-themes/install-a-theme-from-file)
|
||||
|
||||
## Related pages
|
||||
|
||||
- [How themes work](/custom-themes/introduction) — scopes, variants and colors
|
||||
- [Publish a theme](/custom-themes/publish-a-theme) — sharing a theme with everyone
|
||||
- [Install from file](/custom-themes/install-a-theme-from-file) — loading a theme.json
|
||||
- [Using themes](/custom-themes/using-themes) — light, dark and the theme store
|
||||
|
||||
@@ -1,15 +1,33 @@
|
||||
## Install a theme directly from theme.json file
|
||||
---
|
||||
title: Install from file
|
||||
pageTitle: How do I install a Notesnook theme from a file?
|
||||
description: Load a theme.json file directly into Notesnook on mobile, desktop or web, and set it as your default theme.
|
||||
keywords:
|
||||
- install notesnook theme
|
||||
- theme.json notesnook
|
||||
- load theme from file
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Install a theme directly from theme.json file
|
||||
|
||||
In both mobile and desktop/web apps, you can install themes directly from a JSON theme file.
|
||||
|
||||
> info You cannot currently import CSS for a code block.
|
||||
>
|
||||
> [Themes must be published](/custom-themes/publish-a-theme) in order for you to use custom CSS for code blocks.
|
||||
::: info You cannot currently import CSS for a code block.
|
||||
[Themes must be published](/custom-themes/publish-a-theme) in order for you to use custom CSS for code blocks.
|
||||
|
||||
:::
|
||||
|
||||
1. Open the Notesnook app
|
||||
2. Go to Settings > Appearance > Themes
|
||||
3. Click on "Load from file" button
|
||||

|
||||
3. Click "Load from file" button
|
||||

|
||||
4. Select the JSON file to load the theme from.
|
||||
5. Click on "Set as default"
|
||||

|
||||
5. Click "Set as default"
|
||||

|
||||
|
||||
## Related pages
|
||||
|
||||
- [Using themes](/custom-themes/using-themes) — light, dark and the theme store
|
||||
- [Theme Builder](/custom-themes/create-a-theme-with-theme-builder) — building a theme visually
|
||||
- [How themes work](/custom-themes/introduction) — scopes, variants and colors
|
||||
|
||||
@@ -1,8 +1,19 @@
|
||||
---
|
||||
title: Introduction
|
||||
pageTitle: How Notesnook themes work — scopes, variants and colors
|
||||
description: "How the Notesnook theme engine is built: the 11 scopes that split up the app, the 6 variants inside each one, and the 13 colors each variant defines."
|
||||
keywords:
|
||||
- notesnook theme spec
|
||||
- notesnook theme scopes
|
||||
- custom theme notes app
|
||||
---
|
||||
|
||||
# Introduction
|
||||
|
||||
> info
|
||||
>
|
||||
> This document reflects v1.0 of the Notesnook Theme specification.
|
||||
::: info
|
||||
This document reflects v1.0 of the Notesnook Theme specification.
|
||||
|
||||
:::
|
||||
|
||||
The goal of this document is to provide you with an exact idea of what each scope, variant & color in the theme does, how they all fit together, and how you can use them to create your own custom theme for Notesnook. This document will also serve as a descriptive guide for any `theme.json` file you may find online.
|
||||
|
||||
@@ -17,13 +28,13 @@ Suffice it to say, you can change every part of Notesnook independently. This is
|
||||
### 1. Scopes
|
||||
|
||||
Scopes allow you to independently theme various parts of the Notesnook app.
|
||||
Each scope represents a specific part of the app. For example, you can style the editor toolbar different than the rest of the UI. Since scopes never overlap with each other, you can style each part of Notesnook without worrying about the rest.
|
||||
Each scope represents a specific part of the app. For example, you can style the editor toolbar differently from the rest of the UI. Since scopes never overlap with each other, you can style each part of Notesnook without worrying about the rest.
|
||||
|
||||
Here's a quick schematic diagram of each scope used by the Notesnook Web app.
|
||||
|
||||

|
||||

|
||||
|
||||
Currently, Notesnook has 10 scopes:
|
||||
Currently, Notesnook has 11 scopes:
|
||||
|
||||
#### 1. `base`
|
||||
|
||||
@@ -42,55 +53,59 @@ This allows you to change only the colors you need without any duplication.
|
||||
|
||||
The `navigationMenu` scope is used by the left-most side bar that contains the links to your Notes, Notebooks, Favorites etc.
|
||||
|
||||

|
||||

|
||||
|
||||
#### 3. `statusBar`
|
||||
#### 3. `titleBar`
|
||||
|
||||
The `titleBar` scope is used by the title bar Notesnook draws along the top of the desktop window. It has no effect when you have switched to [your system's native titlebar](/desktop-integration/updates-and-advanced-settings).
|
||||
|
||||
#### 4. `statusBar`
|
||||
|
||||
The `statusBar` scope is used by the bottom most horizontal bar that contains your email address, the sync status etc.
|
||||
|
||||

|
||||

|
||||
|
||||
#### 4. `list`
|
||||
#### 5. `list`
|
||||
|
||||
The `list` scope is used by the list of notes, notebooks & everything else that is in the middle pane.
|
||||
|
||||

|
||||

|
||||
|
||||
#### 5. `editor`
|
||||
#### 6. `editor`
|
||||
|
||||
The `editor` scope is used by the editor and everything inside of it like task lists, outline lists, tables etc. This scope does not include the editor toolbar.
|
||||
|
||||

|
||||

|
||||
|
||||
#### 6. `editorToolbar`
|
||||
#### 7. `editorToolbar`
|
||||
|
||||
The `editorToolbar` scope is used specifically by the editor toolbar for styling all its icons, buttons & menus.
|
||||
|
||||

|
||||

|
||||
|
||||
#### 7. `editorSidebar`
|
||||
#### 8. `editorSidebar`
|
||||
|
||||
The `editorSidebar` scope is used by the right-most properties menu, and the PDF attachments preview.
|
||||
|
||||

|
||||

|
||||
|
||||
#### 8. `dialog`
|
||||
#### 9. `dialog`
|
||||
|
||||
All the dialogs in the app, regardless of how they are triggered or what they contain, use the `dialog` scope. This includes the settings dialog, notebook creation dialog, reminder creation dialog etc.
|
||||
|
||||

|
||||

|
||||
|
||||
#### 9. `contextMenu`
|
||||
#### 10. `contextMenu`
|
||||
|
||||
All the context menus & drop down menus in the app use the `contextMenu` scope. This includes the menus in the `editor`, `list`, and other scopes.
|
||||
|
||||

|
||||

|
||||
|
||||
#### 10. `sheet`
|
||||
#### 11. `sheet`
|
||||
|
||||
The `sheet` scope is a mobile specific scope, and is not used by the web app. It is used by all the popup action sheets displayed in the mobile app.
|
||||
|
||||
<img src="/custom-themes/theme-scope-sheet.png" height="500px"/>
|
||||

|
||||
|
||||
---
|
||||
|
||||
@@ -100,39 +115,44 @@ Each scope is further broken down into Variants.
|
||||
|
||||
Variants reflect either the state or importance of a UI element. Variants are NOT isolated and can be intermixed so it is important for a theme to have good contrast between the colors of each variant in order to avoid making some parts of Notesnook completely unreadable.
|
||||
|
||||
Currently, Notesnook has 5 variants:
|
||||
Currently, Notesnook has 6 variants:
|
||||
|
||||
1. `primary`
|
||||
\
|
||||
The `primary` variant is used by every element when it isn't in any of the other states.
|
||||
2. `secondary`
|
||||
\
|
||||
The `secondary` variant is complimentary to the `primary` variant. It is used in places to show elements or text of less importance. For example, the text `12h ago` shown under each note item uses the `paragraph` color from the `secondary` variant.
|
||||
3. `selected`
|
||||
The `secondary` variant is complementary to the `primary` variant. It is used in places to show elements or text of less importance. For example, the text `12h ago` shown under each note item uses the `paragraph` color from the `secondary` variant.
|
||||
3. `disabled`
|
||||
\
|
||||
The `disabled` variant is used for elements that are present but not currently actionable — a greyed-out button, or a tool the editor has switched off for the current selection.
|
||||
4. `selected`
|
||||
\
|
||||
This variant is used throughout the app for all elements in selected, toggled, or focused state.
|
||||
4. `error`
|
||||
5. `error`
|
||||
\
|
||||
The `error` variant contains colors for showing errored status anywhere inside the app. It is possible that the UI element using this variant may make use of colors from other variants.
|
||||
5. `success`
|
||||
6. `success`
|
||||
\
|
||||
The `success` variant contains colors for showing success status anywhere inside the app. It is possible that the UI element using this variant may make use of colors from other variants.
|
||||
|
||||
Each variant further contains a total of 12 Colors:
|
||||
Each variant further contains a total of 13 colors. The **Transparent** column shows which ones accept an alpha channel (`#dbdbdb99`) as well as plain hex:
|
||||
|
||||
| Color | Description | Transparent |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------------------------ | ----------- |
|
||||
| `accent` | Color used to make something stand out (like the primary button in dialogs). Can be both background or foreground. | ❌ |
|
||||
| `accentForeground` | Color for icons & text on accent background | ❌ |
|
||||
| `background` | Background color of elements | ❌ |
|
||||
| `background` | Background color of elements | ✅ |
|
||||
| `paragraph` | Color of paragraphs and other text | ❌ |
|
||||
| `heading` | Color of headings & titles | ❌ |
|
||||
| `backdrop` | The color of the overlay shown behind dialogs & modals | ✅ |
|
||||
| `hover` | Background color when hovering over elements (that support it) | ✅ |
|
||||
| `border` | Border color | ❌ |
|
||||
| `separator` | Color of the separator line between items | ❌ |
|
||||
| `placeholder` | Color of the placeholder in input fields | ❌ |
|
||||
| `placeholder` | Color of the placeholder in input fields | ✅ |
|
||||
| `icon` | Color of icons | ❌ |
|
||||
| `shade` | Tint laid over an element to shade it, usually derived from the accent color | ✅ |
|
||||
| `textSelection` | Background color of selected text | ✅ |
|
||||
|
||||
### Theme Metadata
|
||||
|
||||
@@ -150,3 +170,10 @@ Each variant further contains a total of 12 Colors:
|
||||
## Further reading
|
||||
|
||||
- [Build your own theme using the Theme Builder](/custom-themes/create-a-theme-with-theme-builder).
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Using themes](/custom-themes/using-themes) — light, dark and the theme store
|
||||
- [Theme Builder](/custom-themes/create-a-theme-with-theme-builder) — building a theme visually
|
||||
- [Publish a theme](/custom-themes/publish-a-theme) — sharing a theme with everyone
|
||||
- [Customizing the app](/customizing-notesnook) — home screen, sidebar, sorting and formats
|
||||
|
||||
@@ -1,56 +1,74 @@
|
||||
---
|
||||
title: Publish a new theme
|
||||
pageTitle: How do I publish a Notesnook theme?
|
||||
description: Submit your Notesnook theme to the official themes repository through a GitHub pull request, and push updates to it afterwards.
|
||||
keywords:
|
||||
- publish notesnook theme
|
||||
- notesnook themes repository
|
||||
- share notesnook theme
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Publish a new theme
|
||||
|
||||
## Prerequisites
|
||||
## What you need
|
||||
|
||||
1. A [GitHub](https://github.com/) account
|
||||
2. JSON file containing your theme (you can export the JSON file [using the Theme Builder](/custom-themes/create-a-theme-with-theme-builder))
|
||||
|
||||
## Instructions
|
||||
## Publish your theme
|
||||
|
||||
1. Go to [https://github.com/streetwriters/notesnook-themes](https://github.com/streetwriters/notesnook-themes) and "Fork" the repo. (Don't forget to "Star" it as well!)\
|
||||

|
||||
2. Click on the "Create fork" button on the next page.\
|
||||

|
||||

|
||||
2. Click the "Create fork" button on the next page.\
|
||||

|
||||
3. Once your fork has been created, go to the `themes/` directory and create a new file.\
|
||||

|
||||

|
||||
4. Enter the path for your file as `{your-theme-id}/v1/theme.json`. (Pressing `/` will create a new directory.)\
|
||||

|
||||
5. Paste the contents of the JSON theme file and click on "Commit changes".
|
||||

|
||||

|
||||
5. Paste the contents of the JSON theme file and click "Commit changes".
|
||||

|
||||
6. Enter title of your commit as "add {your-theme-id} theme"
|
||||
7. Click on "Commit changes"
|
||||

|
||||
8. On the next page, click on "Contribute" and then click on "Open pull request" from the popup.
|
||||

|
||||
9. Click on "Create pull request"
|
||||

|
||||
10. Click on "Create pull request"
|
||||

|
||||
7. Click "Commit changes"
|
||||

|
||||
8. On the next page, click "Contribute" and then click "Open pull request" from the popup.
|
||||

|
||||
9. Click "Create pull request"
|
||||

|
||||
10. Click "Create pull request"
|
||||

|
||||
11. And you are all done!
|
||||

|
||||

|
||||
|
||||
# Updating your theme
|
||||
## Update a published theme
|
||||
|
||||
Once your theme is published, you will probably need to push a new update for your theme to fix a color or change something. You can do this by [selecting your theme as the starter theme](/custom-themes/create-a-theme-with-theme-builder#1-select-a-starter-theme) in the Theme Builder and making the changes. Once everything is ready, just [export the changed theme](/custom-themes/create-a-theme-with-theme-builder#5-exporting-your-theme) as usual.
|
||||
Once your theme is published, you will probably need to push a new update for your theme to fix a color or change something. You can do this by [selecting your theme as the starter theme](/custom-themes/create-a-theme-with-theme-builder#1-select-a-starter-theme) in the Theme Builder and making the changes. Once everything is ready, [export the changed theme](/custom-themes/create-a-theme-with-theme-builder#5-exporting-your-theme) as usual.
|
||||
|
||||
> warn
|
||||
>
|
||||
> Don't forget to increment the version of your theme; otherwise, no one will be able to see the changes.
|
||||
::: warning
|
||||
Don't forget to increment the version of your theme; otherwise, no one will be able to see the changes.
|
||||
|
||||
:::
|
||||
|
||||
To publish the updated theme, you will need to submit a new pull request in the same way as you did while publishing:
|
||||
|
||||
1. Go to your fork on GitHub. (Mine is at [https://github.com/ammarahm-ed/notesnook-themes](https://github.com/ammarahm-ed/notesnook-themes)).
|
||||
2. Click on "Sync fork" and then click the "Update branch" button.
|
||||

|
||||
1. Go to your fork on GitHub.
|
||||
2. Click "Sync fork" and then click the "Update branch" button.
|
||||

|
||||
3. Go to `themes/your-theme-id/v1` directory and open the `theme.json` file.
|
||||
4. Click on the Edit button\
|
||||

|
||||
5. Paste your updated theme and click on "Commit changes".
|
||||
6. Enter title of your commit as `update {your-theme-id} theme` and click on "Commit changes".
|
||||

|
||||
7. Now go to the homepage of your fork and click on "Contribute" and then click on "Open pull request" in the popup.
|
||||

|
||||
8. Click on "Create pull request"
|
||||

|
||||
4. Click the Edit button\
|
||||

|
||||
5. Paste your updated theme and click "Commit changes".
|
||||
6. Enter title of your commit as `update {your-theme-id} theme` and click "Commit changes".
|
||||

|
||||
7. Now go to the homepage of your fork and click "Contribute" and then click "Open pull request" in the popup.
|
||||

|
||||
8. Click "Create pull request"
|
||||

|
||||
9. You are all done!
|
||||

|
||||

|
||||
|
||||
## Related pages
|
||||
|
||||
- [Theme Builder](/custom-themes/create-a-theme-with-theme-builder) — building a theme visually
|
||||
- [How themes work](/custom-themes/introduction) — scopes, variants and colors
|
||||
- [Using themes](/custom-themes/using-themes) — light, dark and the theme store
|
||||
|
||||
95
docs/help/contents/custom-themes/using-themes.md
Normal file
95
docs/help/contents/custom-themes/using-themes.md
Normal file
@@ -0,0 +1,95 @@
|
||||
---
|
||||
title: Using themes
|
||||
pageTitle: How do I change the theme in Notesnook?
|
||||
description: Switch between light and dark mode, install a theme from the Notesnook theme store, set separate light and dark themes, or load a theme from a file.
|
||||
keywords:
|
||||
- notesnook dark mode
|
||||
- notesnook themes
|
||||
- change notesnook theme
|
||||
- notesnook theme store
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I change the theme in Notesnook?
|
||||
|
||||
Notesnook keeps two themes at once — one for light mode and one for dark mode — and switches between them based on your color scheme. You can pick both from the built-in theme store, or load a theme from a `theme.json` file.
|
||||
|
||||
## Switch between light and dark
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{appearance}}`.
|
||||
3. Under `{{themes}}`, set `{{colorScheme}}` to `{{light}}`, `{{dark}}` or `{{auto}}`.
|
||||
|
||||
`{{auto}}` follows your operating system, so Notesnook flips with it.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{appearance}}`.
|
||||
3. Turn on `{{useSystemTheme}}` to follow your phone's light/dark setting, or turn it off and use the `{{darkMode}}` switch to choose yourself.
|
||||
|
||||
:::
|
||||
|
||||
::: tip Faster switching on desktop
|
||||
The side menu profile menu has a `{{toggleDarkLightMode}}` item, so you don't have to open settings.
|
||||
|
||||
:::
|
||||
|
||||
## Install a theme from the theme store
|
||||
|
||||
Every theme in the store is fetched from `themes-api.notesnook.com` and installed on your device. The list only shows themes that are compatible with the version of Notesnook you're running.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}` → `{{customization}}` → `{{appearance}}`.
|
||||
2. Scroll to `{{selectTheme}}`.
|
||||
3. Type in the `{{searchThemes}}` box to search, or use the `{{all}}`, `{{dark}}` and `{{light}}` filters to narrow the list.
|
||||
4. Click a theme to see its details, then confirm — or hover it and click `{{setAsDarkTheme}}` / `{{setAsLightTheme}}` directly.
|
||||
|
||||
A checkmark marks the themes you currently have applied.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}` → `{{customization}}` → `{{appearance}}`.
|
||||
2. Tap `{{themes}}`.
|
||||
3. Use the search box or the `{{all}}`, `{{dark}}` and `{{light}}` filters.
|
||||
4. Tap a theme to open its details, then tap `{{setAsDarkTheme}}` or `{{setAsLightTheme}}`.
|
||||
|
||||
An applied theme reads `{{appliedDark}}` or `{{appliedLight}}` on its details screen.
|
||||
|
||||
:::
|
||||
|
||||
<!-- TODO: screenshot — the theme store with the All/Dark/Light filters and a theme card -->
|
||||
|
||||
## Set separate light and dark themes
|
||||
|
||||
There is no separate "which theme goes where" setting — a theme's own color scheme decides it. Applying a dark theme replaces your dark theme; applying a light theme replaces your light theme. Your `{{colorScheme}}` setting then decides which of the two you see.
|
||||
|
||||
So to have both: install a light theme, install a dark theme, and set `{{colorScheme}}` to `{{auto}}` (or `{{useSystemTheme}}` on mobile).
|
||||
|
||||
## Load a theme from a file
|
||||
|
||||
If you have a `theme.json` file — one you built with the [Theme Builder](/custom-themes/create-a-theme-with-theme-builder), or one that isn't published yet — you can apply it directly.
|
||||
|
||||
1. Open the theme list as above.
|
||||
2. Click or tap `{{loadFromFile}}`.
|
||||
3. Pick the `.json` file. Notesnook validates it and shows the theme's details.
|
||||
4. Confirm to apply it.
|
||||
|
||||
If the file is missing required fields or isn't a valid theme, the app tells you instead of applying it. Full steps and caveats are on [install a theme from file](/custom-themes/install-a-theme-from-file).
|
||||
|
||||
## Where do the themes come from?
|
||||
|
||||
The theme store is an open collection. Themes are submitted as JSON files to the [notesnook-themes](https://github.com/streetwriters/notesnook-themes) repository, and once merged they appear in the store for everyone. If you have made a theme you like, you can [publish it](/custom-themes/publish-a-theme) the same way.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Publish a theme](/custom-themes/publish-a-theme) — get your theme into the store
|
||||
- [Create a theme with the Theme Builder](/custom-themes/create-a-theme-with-theme-builder) — build one without writing JSON
|
||||
- [Install a theme from file](/custom-themes/install-a-theme-from-file) — apply a `theme.json` directly
|
||||
- [Theme engine introduction](/custom-themes/introduction) — how scopes, variants and colors fit together
|
||||
- [Customizing the app](/customizing-notesnook) — home screen, side menu and list density
|
||||
167
docs/help/contents/customizing-notesnook.md
Normal file
167
docs/help/contents/customizing-notesnook.md
Normal file
@@ -0,0 +1,167 @@
|
||||
---
|
||||
title: Customizing the app
|
||||
pageTitle: How do I customize the Notesnook app?
|
||||
description: Choose which screen Notesnook opens on, reorder or hide side menu items, switch to compact lists, and change how dates, times and sorting work.
|
||||
keywords:
|
||||
- notesnook custom home screen
|
||||
- notesnook default sidebar tab
|
||||
- notesnook hide side menu items
|
||||
- notesnook compact list view
|
||||
- notesnook date format
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I customize the Notesnook app?
|
||||
|
||||
Notesnook lets you decide what it opens on, what your side menu contains and in what order, how dense your note lists are, and how dates and times are written. Everything on this page is per-device — none of it changes the notes themselves.
|
||||
|
||||
## Set your home screen <PlanTag plan="pro" />
|
||||
|
||||
The home screen is the screen Notesnook opens on when you launch it. By default that is your notes list, but you can point it at any side menu item, or at a specific notebook, tag or color.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Right click the item you want as your home screen — a side menu item such as `Notes` or `Favorites`, a color, a shortcut, or a notebook or tag in the list.
|
||||
2. Click `{{setAsHomepage}}`.
|
||||
3. A checkmark appears next to `{{setAsHomepage}}`. Click it again to go back to the default home screen.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Long press the item you want as your home screen.
|
||||
2. For a side menu item, tap `{{setAsHomepage}}` in the sheet that opens. For a notebook, tag or color, tap `{{setAsHomepage}}` in its properties sheet.
|
||||
3. For a notebook, tag or color you can undo it by opening the same menu and tapping `{{unsetAsHomepage}}`. For a side menu item there is no reset — set a different item as your home screen instead.
|
||||
|
||||
:::
|
||||
|
||||
Next time you open Notesnook it lands on the screen you picked.
|
||||
|
||||
::: info What happens if your plan expires
|
||||
A custom home screen is a Pro feature. If your subscription ends, Notesnook resets the home screen to the default. See [plans & limits](/plans-and-limits).
|
||||
|
||||
:::
|
||||
|
||||
## Choose the default sidebar tab <PlanTag plan="pro" />
|
||||
|
||||
The sidebar has three tabs — notes, notebooks and tags. This setting decides which one is selected when the app starts.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{behaviour}}`.
|
||||
3. Under `{{general}}`, set `{{defaultSidebarTab}}` to `Notes`, `{{notebooks}}` or `Tags`.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{behavior}}`.
|
||||
3. Tap `{{defaultSidebarTab}}` and pick `Home`, `{{notebooks}}` or `Tags`.
|
||||
|
||||
:::
|
||||
|
||||
## Reorder and hide side menu items <PlanTag plan="essential" />
|
||||
|
||||
You can drag the items in your side menu into the order you want, and hide the ones you never use. This covers the built-in items (`Notes`, `Favorites`, `{{reminders}}`, `{{monographs}}`, `{{trash}}`, `{{archive}}`) and your [colors](/organizing-notes/organize-notes-using-colors). `{{notebooks}}` and `Tags` are sidebar tabs rather than menu items, so they cannot be reordered or hidden. Hiding an item only removes it from the menu; nothing inside it is deleted.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Drag a side menu item up or down to move it.
|
||||
2. To hide items, right click any side menu item — the menu lists every item and color with a checkmark next to the visible ones.
|
||||
3. Click an item to uncheck it and hide it. Click it again to bring it back.
|
||||
4. To undo everything, right click a side menu item and click `{{resetSidebar}}`.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Long press a side menu item and tap `{{reorder}}`.
|
||||
2. Drag items into the order you want.
|
||||
3. Tap the **−** button beside an item to hide it, or the **+** button to show it again. Hidden items stay visible while you're reordering, dimmed.
|
||||
4. Tap `{{done}}` at the bottom of the side menu to leave reorder mode.
|
||||
|
||||
:::
|
||||
|
||||
<!-- TODO: screenshot — the side menu right click menu on desktop showing checked/unchecked items and Reset sidebar -->
|
||||
|
||||
::: info Shortcuts are separate
|
||||
Pinning notebooks and tags to the side menu is a different feature — see [side menu shortcuts](/organizing-notes/side-menu-shortcuts). Free plans can keep 10 shortcuts; Essential and above are unlimited.
|
||||
|
||||
:::
|
||||
|
||||
## Switch between detailed and compact lists
|
||||
|
||||
Compact mode strips a list down to one line per item, so more fits on screen. It is remembered per list type: on desktop and web there is one setting for notes (shared by the notes, favorites and search lists) and one for notebooks; on mobile, notes, notebooks and search results each have their own.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Find the list view icon at the top right of the list, next to the sort icon.
|
||||
2. Click it. The tooltip reads `Switch to compact view`, and `Switch to detailed view` once compact mode is on.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Tap the list view icon at the top right of the list, next to the sort icon.
|
||||
2. Tap it again to go back to the detailed list.
|
||||
|
||||
:::
|
||||
|
||||
## Change how notes are sorted and grouped
|
||||
|
||||
Sorting and grouping are stored per list, and separately for each notebook, tag and color you open — so your notebooks can be alphabetical while your notes stay newest-first.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Click the sort icon at the top right of the list. The menu is titled `Group & sort`, or `{{sort}}` where grouping doesn't apply.
|
||||
2. Use `{{orderBy}}` to flip the direction — `{{oldestToNewest}}` / `{{newestToOldest}}`, or `{{aToZ}}` / `{{zToA}}` when sorting by title.
|
||||
3. Use `{{sortBy}}` to choose `Date created`, `Date edited`, `Date modified`, `Date deleted`, `Due date`, `{{title}}` or `Relevance`, depending on the list.
|
||||
4. Use `{{groupBy}}` to choose `{{none}}`, `{{default}}`, `Year`, `{{month}}`, `Week` or `Abc`.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Tap the sort icon at the top right of the list.
|
||||
2. Tap the button beside `{{sortBy}}` to flip the direction between ascending and descending.
|
||||
3. Pick a field under `{{sortBy}}`, and a grouping under `{{groupBy}}`.
|
||||
|
||||
:::
|
||||
|
||||
Reminders and search results can be sorted but not grouped.
|
||||
|
||||
## Change the date, time, day and week formats
|
||||
|
||||
These settings control how every date in the app is written — in note lists, reminders and note properties.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{behaviour}}`.
|
||||
3. Under `{{dateAndTime}}`, set:
|
||||
- `{{dateFormat}}` — day/month/year, month/day/year or year/month/day, each with `-`, `/` or `.` as the separator, plus `MMM D, YYYY`. Every option previews today's date beside it.
|
||||
- `{{timeFormat}}` — `12h` or `24h`.
|
||||
- `{{dayFormat}}` — `Short (Mon, Tue)` or `Long (Monday, Tuesday)`.
|
||||
- `{{weekFormat}}` — whether the week starts on `Sunday` or `Monday`.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{behavior}}`.
|
||||
3. Tap `{{dateFormat}}`, `{{timeFormat}}`, `{{dayFormat}}` or `{{weekFormat}}` and pick an option.
|
||||
|
||||
:::
|
||||
|
||||
## Mobile-only settings
|
||||
|
||||
Three behaviour settings exist only in the mobile apps, under `{{settings}}` → `{{customization}}` → `{{behavior}}`:
|
||||
|
||||
- `{{keepScreenOn}}` — stops the screen from dimming while you're in the app.
|
||||
- `{{autoUpdateCheck}}` — turn off the update check on app start.
|
||||
- `{{clearDefaultNotebook}}` — clears the notebook new notes are filed into by default.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Plans & limits](/plans-and-limits) — which customizations need Essential or Pro
|
||||
- [Side menu shortcuts](/organizing-notes/side-menu-shortcuts) — pin notebooks and tags to the side menu
|
||||
- [Using themes](/custom-themes/using-themes) — light, dark and themes from the theme store
|
||||
- [Personalizing the editor](/rich-text-editor/personalizing-rich-text-editor) — font, size and line spacing while you write
|
||||
- [Organize notes using colors](/organizing-notes/organize-notes-using-colors) — the colors that appear in your side menu
|
||||
@@ -1,28 +1,46 @@
|
||||
---
|
||||
title: Deleting your account
|
||||
description: No questions asked! You can delete your account anytime from mobile and desktop apps with a single click and delete all your data
|
||||
pageTitle: How do I delete my Notesnook account?
|
||||
description: Delete your Notesnook account and all its data from the app in a few taps. What gets removed, and why none of it can be recovered afterwards.
|
||||
keywords:
|
||||
- delete notesnook account
|
||||
- remove notes app account
|
||||
- notesnook data deletion
|
||||
schema: faq
|
||||
faqs:
|
||||
- q: What information is deleted when I delete my Notesnook account?
|
||||
a: "Everything: all your notes, notebooks, attachments and other data, your login credentials, your subscription and billing information, and the account itself. Your email address is no longer associated with Notesnook and cannot be used to log in."
|
||||
- q: Can I recover my data after deleting my Notesnook account?
|
||||
a: No. Deletion is immediate and permanent, and because your data is end-to-end encrypted there is no copy anyone can restore from. Take a backup or export your notes before you delete the account.
|
||||
---
|
||||
|
||||
# Deleting your account
|
||||
|
||||
Notesnook allows you to delete your accounts and your data without any questions asked or keeping you waiting on email.
|
||||
|
||||
## [Web/Desktop](#/tab/web)
|
||||
::: danger This cannot be undone
|
||||
Deleting your account immediately and permanently erases all your notes, notebooks, attachments and other data. Because of end-to-end encryption, Notesnook cannot recover this data for you afterwards. Take a [backup](/backup-and-restore-notes-in-notesnook) or [export your notes](/export-notes-from-notesnook) first if you might need this data again.
|
||||
|
||||
:::
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Open Notesnook web or desktop app
|
||||
2. Make sure you are logged in
|
||||
3. Go to Settings
|
||||
4. Click on `Delete account` button next to **Account removal** heading
|
||||
3. Go to `{{settings}}`.
|
||||
4. Go to `{{account}}`
|
||||
5. Click `{{deleteAccount}}`
|
||||
|
||||
## [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Open the Notesnook app
|
||||
2. Make sure you are logged in
|
||||
3. Go to Settings
|
||||
4. Go to `Account Settings`
|
||||
5. Tap on `Delete account`
|
||||
3. Go to `{{settings}}`.
|
||||
4. Go to `{{account}}` then `{{manageAccount}}`
|
||||
5. Tap `{{deleteAccount}}`
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## FAQs
|
||||
|
||||
@@ -40,3 +58,10 @@ After deletion, your email address will no longer be associated with Notesnook a
|
||||
### Is there any way to recover deleted data?
|
||||
|
||||
No. Once you delete your account, it's gone for good and there is no way for us or anyone else to recover it. If your data is important to you, make sure to take a [backup](/backup-and-restore-notes-in-notesnook) or [export your notes](/export-notes-from-notesnook) before deleting your account.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — keeping your own encrypted copy
|
||||
- [Exporting notes](/export-notes-from-notesnook) — taking your notes to another app
|
||||
- [Account settings](/account-settings) — email, password and profile
|
||||
- [Plans & limits](/plans-and-limits) — what each plan unlocks and the exact limits
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
# Desktop integration
|
||||
@@ -1,19 +1,37 @@
|
||||
---
|
||||
title: Auto start
|
||||
pageTitle: Start Notesnook automatically when your computer boots
|
||||
description: Configure the Notesnook desktop app to launch at system startup, and to start minimized so it stays out of your way.
|
||||
keywords:
|
||||
- notesnook auto start
|
||||
- launch notes app on startup
|
||||
- notesnook start minimized
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Auto start on system startup
|
||||
|
||||
If your workflow requires Notesnook to be always opened, it's a good idea to enable auto start on system startup:
|
||||
|
||||
1. Go to `Settings`
|
||||
2. Click on `Desktop integration`
|
||||
3. Click on `Auto start on system startup` to enable/disable it.
|
||||
1. Go to `{{settings}}`
|
||||
2. Click `{{desktopIntegration}}`
|
||||
3. Click `{{autoStartOnSystemStartup}}` to enable/disable it.
|
||||
|
||||
## Start minimized
|
||||
|
||||
> info
|
||||
>
|
||||
> This only works when `Auto start on system startup` is enabled.
|
||||
::: info
|
||||
This only works when `{{autoStartOnSystemStartup}}` is enabled.
|
||||
|
||||
:::
|
||||
|
||||
Notesnook can also start minimized when it's opened on system startup:
|
||||
|
||||
1. Go to `Settings`
|
||||
2. Click on `Desktop integration`
|
||||
3. Click on `Start minimized` to enable/disable it.
|
||||
1. Go to `{{settings}}`
|
||||
2. Click `{{desktopIntegration}}`
|
||||
3. Click `{{startMinimized}}` to enable/disable it.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [System tray menu](/desktop-integration/system-tray-menu) — keeping Notesnook out of the way
|
||||
- [Jumplist & dock menu](/desktop-integration/jumplist-and-dock-menu) — new note from the taskbar
|
||||
- [Updates & advanced](/desktop-integration/updates-and-advanced-settings) — release track, DNS and zoom
|
||||
|
||||
@@ -1,25 +1,37 @@
|
||||
---
|
||||
title: Jumplist & dock menu
|
||||
pageTitle: The Notesnook jumplist and macOS dock menu
|
||||
description: Start a new note or notebook straight from the Notesnook jumplist on Windows and Linux, or from the dock menu on macOS.
|
||||
keywords:
|
||||
- notesnook jumplist
|
||||
- notesnook dock menu
|
||||
- taskbar quick actions
|
||||
---
|
||||
|
||||
# Jumplist & dock menu
|
||||
|
||||
Notesnook supports quick actions from the "jumplist" menu (dock menu on macOS):
|
||||
|
||||
## [Windows](#/tab/windows)
|
||||
:::tabs key:platform
|
||||
== Windows
|
||||

|
||||
== Linux
|
||||

|
||||
== macOS
|
||||

|
||||
|
||||

|
||||
|
||||
## [Linux](#/tab/linux)
|
||||
|
||||

|
||||
|
||||
## [macOS](#/tab/macos)
|
||||
|
||||

|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## How does it work?
|
||||
|
||||
Jumplist menu items are responsible for opening Notesnook at the specified page. For example:
|
||||
|
||||
1. Right click on the Notesnook icon in your taskbar/dock
|
||||
2. Click on "New notebook"
|
||||
1. Right click the Notesnook icon in your taskbar/dock
|
||||
2. Click "New notebook"
|
||||
3. Notice how the new notebook dialog is opened after the Notesnook app is focused
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Auto start](/desktop-integration/auto-start-on-system-startup) — launching with your computer
|
||||
- [System tray menu](/desktop-integration/system-tray-menu) — keeping Notesnook out of the way
|
||||
- [Keyboard shortcuts](/keyboard-shortcuts) — every shortcut in one place
|
||||
|
||||
@@ -1,40 +1,60 @@
|
||||
---
|
||||
title: Spell checker
|
||||
pageTitle: Turn on the spell checker in Notesnook desktop
|
||||
description: Enable the built-in spell checker in the Notesnook desktop app and choose which languages it checks against, including multiple at once.
|
||||
keywords:
|
||||
- notesnook spell check
|
||||
- notes app spell checker
|
||||
- spell check languages
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Spell checker
|
||||
|
||||
> error Desktop app only
|
||||
>
|
||||
> Configuring the spell checker is only available in the desktop app.
|
||||
::: info Desktop app only
|
||||
Configuring the spell checker is only available in the desktop app.
|
||||
|
||||
:::
|
||||
|
||||
## Toggling the spell checker
|
||||
|
||||
You can enable/disable the spell checker at any time from Settings:
|
||||
|
||||
1. Go to `Settings`
|
||||
2. Click on `Editor Settings`
|
||||
3. Click on the `Enable spellchecker` toggle to enable/disable the spell checker
|
||||
1. Go to `{{settings}}`
|
||||
2. Click `{{editor}}`
|
||||
3. Click the `{{enableSpellChecker}}` toggle to enable/disable the spell checker
|
||||
|
||||
## Choosing languages
|
||||
|
||||
> info For macOS users
|
||||
>
|
||||
> On macOS it is not possible to choose custom languages. Instead the spell checker uses your system settings.
|
||||
::: info For macOS users
|
||||
On macOS it is not possible to choose custom languages. Instead the spell checker uses your system settings.
|
||||
|
||||
> warn Network activity notice
|
||||
>
|
||||
> Notesnook supports spell checking text in multiple languages at the same time. However, it doesn't ship all the supported languages but gives you the choice to enable the languages you want.
|
||||
>
|
||||
> Selecting a new language will **download the dictionary from `dictionaries.notesnook.com`**.
|
||||
:::
|
||||
|
||||
::: warning Network activity notice
|
||||
Notesnook supports spell checking text in multiple languages at the same time. However, it doesn't ship all the supported languages but gives you the choice to enable the languages you want.
|
||||
|
||||
Selecting a new language will **download the dictionary from `dictionaries.notesnook.com`**.
|
||||
|
||||
:::
|
||||
|
||||
To select new languages:
|
||||
|
||||
1. Go to `Settings`
|
||||
2. Click on `Editor Settings`
|
||||
3. Click on `Spellchecker languages`
|
||||

|
||||
1. Go to `{{settings}}`
|
||||
2. Click `{{editor}}`
|
||||
3. Click `{{languages}}`
|
||||

|
||||
4. Select the languages you need
|
||||
5. Click on `Done` and spell checking should now be working for the languages you selected.
|
||||
5. Click `{{done}}` and spell checking should now be working for the languages you selected.
|
||||
|
||||
### My language is not included in the list
|
||||
|
||||
While we'd love to include all the languages, we are dependent on Electron (which, in turn, depends on Chromium) for adding the required dictionaries.
|
||||
|
||||
It might be possible in the future to implement a custom spell checker to support all the languages.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Personalizing the editor](/rich-text-editor/personalizing-rich-text-editor) — fonts, spacing and title formats
|
||||
- [Updates & advanced](/desktop-integration/updates-and-advanced-settings) — release track, DNS and zoom
|
||||
- [Customizing the app](/customizing-notesnook) — home screen, sidebar, sorting and formats
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
---
|
||||
title: System tray menu
|
||||
pageTitle: The Notesnook system tray menu
|
||||
description: Use the Notesnook system tray icon for quick actions, and set the app to minimize or close to the tray instead of the taskbar.
|
||||
keywords:
|
||||
- notesnook system tray
|
||||
- minimize to tray
|
||||
- close to tray notes app
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# System tray menu
|
||||
|
||||
Notesnook features a system tray menu to give quick access to some common functions such as:
|
||||
@@ -8,20 +19,26 @@ Notesnook features a system tray menu to give quick access to some common functi
|
||||
|
||||
See it in action here:
|
||||
|
||||

|
||||

|
||||
|
||||
## Minimize to tray
|
||||
|
||||
Instead of always taking space in your taskbar, you can hide Notesnook in your system tray on minimizing:
|
||||
|
||||
1. Go to `Settings`
|
||||
2. Click on `Desktop integration`
|
||||
3. Click on `Minimize to system tray` to enable/disable it.
|
||||
1. Go to `{{settings}}`
|
||||
2. Click `{{desktopIntegration}}`
|
||||
3. Click `{{minimizeToSystemTray}}` to enable/disable it.
|
||||
|
||||
## Close to tray
|
||||
|
||||
To prevent accidentally closing the Notesnook app, it is possible to always close it to the system tray:
|
||||
|
||||
1. Go to `Settings`
|
||||
2. Click on `Desktop integration`
|
||||
3. Click on `Close to system tray` to enable/disable it.
|
||||
1. Go to `{{settings}}`
|
||||
2. Click `{{desktopIntegration}}`
|
||||
3. Click `{{closeToSystemTray}}` to enable/disable it.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Auto start](/desktop-integration/auto-start-on-system-startup) — launching with your computer
|
||||
- [Jumplist & dock menu](/desktop-integration/jumplist-and-dock-menu) — new note from the taskbar
|
||||
- [Updates & advanced](/desktop-integration/updates-and-advanced-settings) — release track, DNS and zoom
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
---
|
||||
title: Updates & advanced
|
||||
pageTitle: Notesnook desktop updates, release track and network settings
|
||||
description: Control how the Notesnook desktop app updates, switch between the Stable and Beta release tracks, and change the titlebar, zoom, DNS, proxy and CORS proxy.
|
||||
keywords:
|
||||
- notesnook desktop update
|
||||
- notesnook beta release track
|
||||
- notesnook native titlebar
|
||||
- notesnook proxy
|
||||
- notesnook custom dns
|
||||
---
|
||||
|
||||
# Updates and advanced settings
|
||||
|
||||
::: info Mostly, but not only, the desktop app
|
||||
`{{useNativeTitlebar}}`, `{{zoomFactor}}` and `{{useCustomDns}}` are desktop-only. The update controls, `{{releaseTrack}}`, `{{proxy}}` and the CORS proxy also appear in the web app, where an "update" means swapping the service worker rather than downloading an installer.
|
||||
|
||||
:::
|
||||
|
||||
## Keep the app updated automatically
|
||||
|
||||
When automatic updates are on, the desktop app downloads new versions in the background. Updates are never installed silently on quit — you always trigger the install yourself, which avoids a half-written install directory if your machine shuts down mid-update.
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{behaviour}}`.
|
||||
3. Under `{{desktopApp}}`, toggle `{{automaticUpdates}}`.
|
||||
|
||||
## Check for updates manually
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{other}}` → `{{about}}`.
|
||||
3. The `{{version}}` row shows the version you're running. Click `{{checkForUpdates}}`.
|
||||
4. If a new version is found the description changes to `New version (vX.X.X) is available for download.` and the button becomes `{{installUpdate}}`. Clicking it downloads the update; once the download finishes, the update button in the status bar installs it and restarts the app.
|
||||
|
||||
::: info Flatpak, Snap and portable builds
|
||||
These builds are updated by the system that installed them, so the `{{automaticUpdates}}` toggle, `{{checkForUpdates}}` and `{{installUpdate}}` buttons don't appear. Only `{{copy}}` (for the version number) is shown.
|
||||
|
||||
:::
|
||||
|
||||
## Switch between the Stable and Beta release track
|
||||
|
||||
The release track decides which builds you receive. `{{beta}}` gets features earlier, with the usual caveat that they are less tested.
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{other}}` → `{{about}}`.
|
||||
3. Set `{{releaseTrack}}` to `{{stable}}` or `{{beta}}`.
|
||||
|
||||
Switching from `{{beta}}` back to `{{stable}}` is allowed to downgrade you, but only if the build you are running is itself a prerelease. This setting is also hidden on Flatpak, Snap and portable builds.
|
||||
|
||||
::: warning Beta builds are still beta
|
||||
Keep [current backups](/backup-and-restore-notes-in-notesnook) before moving to the beta track.
|
||||
|
||||
:::
|
||||
|
||||
## Use your system's native titlebar
|
||||
|
||||
By default Notesnook draws its own titlebar. You can switch to the one your operating system draws instead.
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{desktopIntegration}}`.
|
||||
3. Toggle `{{useNativeTitlebar}}`.
|
||||
4. A toast appears reading `{{restartAppToTakeEffect}}` — click `{{restartNow}}`, or restart later yourself.
|
||||
|
||||
## Change the zoom factor
|
||||
|
||||
Zoom scales the whole app, not only the editor text.
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{customization}}` → `{{appearance}}`.
|
||||
3. Under `{{general}}`, set `{{zoomFactor}}`. It accepts `0.5` to `3.0` in steps of `0.1`.
|
||||
|
||||
## Use custom DNS
|
||||
|
||||
Notesnook can resolve its own hostnames over DNS-over-HTTPS instead of using your system resolver. This sometimes gets around ISP-level blocking of Notesnook traffic.
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{privacyAndSecurity}}` → `{{privacy}}`.
|
||||
3. Under `{{advanced}}`, toggle `{{useCustomDns}}`.
|
||||
|
||||
When it is on, the app resolves through **Cloudflare DNS** (`mozilla.cloudflare-dns.com`) and **Quad9** (`dns.quad9.net`). Turn it off to go back to your system's DNS settings.
|
||||
|
||||
## Route the app through a proxy
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{privacyAndSecurity}}` → `{{privacy}}`.
|
||||
3. Under `{{advanced}}`, type your rules into `{{proxy}}`.
|
||||
|
||||
HTTP, HTTPS and SOCKS proxies are supported, for example:
|
||||
|
||||
```
|
||||
http://foobar:80
|
||||
socks4://proxy.example.com
|
||||
http://username:password@foobar:80
|
||||
```
|
||||
|
||||
## Change the CORS proxy
|
||||
|
||||
Remote content the editor has to fetch — images pasted by URL and YouTube embeds — is routed through a proxy so the browser's cross-origin rules don't block it. The default is `https://cors.notesnook.com`. You can point it at your own if you'd rather not use ours.
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{privacyAndSecurity}}` → `{{privacy}}`.
|
||||
3. Under `{{advanced}}`, next to `{{corsBypass}}`, click `{{changeProxy}}`.
|
||||
4. Enter the URL and confirm. Only the scheme and hostname are kept; an unparseable URL is rejected with `{{invalidCors}}`.
|
||||
|
||||
This setting exists in the web app too.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Auto start on system startup](/desktop-integration/auto-start-on-system-startup) — launch Notesnook when you log in
|
||||
- [System tray menu](/desktop-integration/system-tray-menu) — quick actions and minimize-to-tray
|
||||
- [Spell checker](/desktop-integration/spell-checker) — enable it and pick languages
|
||||
- [Privacy mode](/privacy-mode) — hide the app window from screen capture
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — before you switch release tracks
|
||||
16
docs/help/contents/docs.md
Normal file
16
docs/help/contents/docs.md
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
title: All help topics
|
||||
pageTitle: All Notesnook help topics
|
||||
description: Every page in the Notesnook help site, grouped by task — getting started, organizing notes, the editor, importing, sync, privacy, plans and more.
|
||||
aside: false
|
||||
keywords:
|
||||
- notesnook help
|
||||
- notesnook documentation
|
||||
- notesnook user guide
|
||||
---
|
||||
|
||||
# All help topics
|
||||
|
||||
Everything the Notesnook documentation covers. Use the search box (`Ctrl` `K`) if you already know what you're after.
|
||||
|
||||
<DocsIndex />
|
||||
@@ -1,69 +1,97 @@
|
||||
---
|
||||
title: Exporting notes
|
||||
description: Notesnook is zero lock-in. You can always export and backup your notes to pdf, html, markdown and plain text files anytime from iOS, Android & Desktop.
|
||||
pageTitle: Export notes from Notesnook as PDF, Markdown or HTML
|
||||
description: Export one note or your whole Notesnook library as PDF, Markdown, HTML or plain text — on Windows, macOS, Linux, Android and iOS.
|
||||
keywords:
|
||||
- export notes to markdown
|
||||
- export notes as pdf
|
||||
- notes app no lock in
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Exporting notes
|
||||
|
||||
You can export some or all your notes as PDF, HTML, Markdown and Plain text files on all Notesnook apps.
|
||||
You can export some or all your notes as **PDF**, **HTML**, **Markdown**, **Markdown + Frontmatter** and **Plain text** files on all Notesnook apps. Notesnook is zero lock-in — your notes leave in open formats that any other app can read.
|
||||
|
||||
::: info PDF is for one note at a time on desktop and web
|
||||
On desktop and web, PDF is only offered when you export a **single note** — multi-select exports and "export all notes" produce a `.zip` in Markdown, Markdown + Frontmatter, HTML or plain text. To get a PDF of several notes there, export them one at a time, or print the note from the desktop app. On mobile, PDF is available for multi-select and "export all notes" as well.
|
||||
|
||||
:::
|
||||
|
||||
## Exporting a single note
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Right click on a note
|
||||
2. Click on `Export as`
|
||||
1. Right click a note
|
||||
2. Click `{{exportAs}}`
|
||||
3. Select the desired format
|
||||
4. Wait a few moments while your note is exported
|
||||
5. Save the note at your desired location
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Tap the  button on a note
|
||||
2. Tap on `Export`
|
||||
2. Tap `{{export}}`
|
||||
3. Select the desired format
|
||||
4. Wait a few moments while your note is exported
|
||||
5. Exported notes are stored in `Notesnook/exported` folder.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## Exporting multiple notes
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Hold `Ctrl` & click on all the notes you want to export
|
||||
2. Right click & click on `Export as`
|
||||
2. Right click & click `{{exportAs}}`
|
||||
3. Select your desired export format
|
||||
4. Wait a few moments while your notes are exported
|
||||
5. Save the `.zip` file at your desired location
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Long press on a note to enter multi selection mode
|
||||
2. Tap on all the notes you want to export
|
||||
3. Press on the Export button on top right corner
|
||||
1. Long press a note to enter multi selection mode
|
||||
2. Tap all the notes you want to export
|
||||
3. Tap the Export button on top right corner
|
||||
4. Select the desired format
|
||||
5. Exported notes are stored in `Notesnook/exported` folder
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## Exporting all your notes
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to Settings
|
||||
2. Scroll down to `Import & export` section
|
||||
3. Click on `Backup & export`
|
||||
4. Click on `Select format` dropdown next to `Export all notes` heading
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{importExport}}`
|
||||
3. Click `{{backupExport}}`
|
||||
4. Click `Select format` dropdown next to `{{exportAllNotes}}` heading
|
||||
5. Select the desired format
|
||||
6. Enter account password for authentication
|
||||
7. Save the `.zip` file at your desired location
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Go to Settings from Sidebar
|
||||
2. Scroll down to `Backup and Restore`
|
||||
3. Tap on `Export all notes`
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{backupRestore}}`
|
||||
3. Tap `{{exportAllNotes}}`
|
||||
4. Select the desired format
|
||||
5. Enter account password for authentication
|
||||
6. Exported notes are stored in `Notesnook/exported` folder as a single .zip file
|
||||
|
||||
:::
|
||||
|
||||
::: info Exporting everything needs your password
|
||||
"Export all notes" asks for your account password before it runs. Locked notes are included only after you unlock the [vault](/lock-notes-with-private-vault) when prompted.
|
||||
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — encrypted backups you can restore into Notesnook, as opposed to exports for other apps
|
||||
- [Importing notes](/importing-notes/) — moving notes in from another app
|
||||
- [Publishing with monographs](/publish-notes-with-monographs) — sharing a single note as a link instead of a file
|
||||
- [Attachments & files](/attachments-and-files) — what happens to files attached to exported notes
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
# FAQs
|
||||
@@ -1,18 +1,35 @@
|
||||
---
|
||||
title: Is there an ETA for X feature?
|
||||
description: We do not provide any ETAs.
|
||||
pageTitle: When will a feature ship in Notesnook?
|
||||
description: Notesnook doesn't publish ETAs for features. Here's where to see what's planned, how to follow a feature's progress, and why dates aren't promised.
|
||||
keywords:
|
||||
- notesnook roadmap
|
||||
- notesnook feature request
|
||||
- when will notesnook add
|
||||
---
|
||||
|
||||
# Is there an ETA for X feature?
|
||||
|
||||

|
||||
No — Notesnook doesn't publish dates for unreleased features. The [roadmap](https://notesnook.com/roadmap) lists everything being worked on and everything planned, but nothing on it carries a delivery date.
|
||||
|
||||
We maintain an up-to-date [roadmap](https://notesnook.com/roadmap) which lists everything we are working on and everything we plan on adding in the future. There is no certainty _when_ something might land, though. It can be days, months, or even years before a feature becomes generally available. Asking us for ETAs is annoying and distracts us from what really matters.
|
||||
## Where to see what's planned
|
||||
|
||||
## Why we don't provide ETAs
|
||||
- The [roadmap](https://notesnook.com/roadmap) is the current picture of what is being built and what is queued.
|
||||
- [GitHub issues](https://github.com/streetwriters/notesnook/issues) track individual features and bugs. Subscribe to an issue and you'll be notified when it moves.
|
||||
- Release notes go out with each version, so a feature you're waiting on shows up there the moment it ships.
|
||||
|
||||
In case you are still curious, a huge part of developing any software are **deadlines**. Giving any ETA means we want to be held accountable for when a feature might land. That is something we cannot afford because another huge part of developing any software are **delays**. As any engineer might tell you, "X will land in 1 month" almost always means "X will land in 4 months".
|
||||
## Why we don't give ETAs
|
||||
|
||||
Users do not understand or tolerate delays, and developers do not like incessant pestering on why something didn't land on X date when we said it'll land on X date. To avoid all these headaches we simply do not give out any ETAs. Obviously, internally we do have timelines for each feature but disclosing these is unnecessary.
|
||||
Software estimates are unreliable, and a date given in good faith becomes a promise the moment it's published. Rather than set expectations we can't reliably meet, we'd rather ship the feature and announce it when it's real.
|
||||
|
||||
In short, it'll land when it'll land. No promises.
|
||||
Timelines do exist internally — they move too often to be useful to anyone outside the team.
|
||||
|
||||
## Can I make a feature more likely to happen?
|
||||
|
||||
Yes. Open or upvote an issue on [GitHub](https://github.com/streetwriters/notesnook/issues/new/choose) and describe the problem you're trying to solve rather than the solution you have in mind. What gets built is shaped heavily by how many people need it and how well we understand why.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Create your first note](/create-a-note-in-notesnook) — the two-minute version
|
||||
- [Plans & limits](/plans-and-limits) — what each plan unlocks and the exact limits
|
||||
- [Notesnook Circle](/notesnook-circle) — partner offers for subscribers
|
||||
|
||||
@@ -1,8 +1,39 @@
|
||||
---
|
||||
title: Login to restore attachments in backup.
|
||||
description: We require users to be logged in to restore attachments in backup.
|
||||
title: Login to restore attachments
|
||||
pageTitle: Why do I need to log in to restore attachments from a backup?
|
||||
description: A backup's attachments are encrypted with a key tied to your account, so Notesnook needs you signed in to decrypt them and re-upload them after a restore.
|
||||
keywords:
|
||||
- notesnook restore attachments backup
|
||||
- notesnook backup attachments login
|
||||
schema: faq
|
||||
faqs:
|
||||
- q: Why do I need to log in to restore attachments from a backup?
|
||||
a: Attachments are encrypted with a sub-key derived from your account's data encryption key. Restoring them means decrypting them with that key and re-uploading them to your account, and neither is possible while you are signed out.
|
||||
- q: Can I restore a backup without logging in?
|
||||
a: You can restore the notes, notebooks and tags in it. The attachments in the backup cannot be restored until you sign in.
|
||||
---
|
||||
|
||||
# Login to restore attachments in backup.
|
||||
# Why do I need to log in to restore attachments from a backup?
|
||||
|
||||
We require users to be logged in to restore attachments in backup. This is because attachments are encrypted using a sub-key derived from your database encryption key. Without a login, we cannot encrypt/upload/sync attachments.
|
||||
Attachments are encrypted with a sub-key derived from your account's data encryption key. Restoring them means decrypting them with that key and putting them back in your account — and while you are signed out, that key isn't available and there is no account to upload to.
|
||||
|
||||
## What restores without an account, and what doesn't
|
||||
|
||||
| In the backup | Restores while signed out? |
|
||||
| --------------------------------------------- | -------------------------- |
|
||||
| Notes, notebooks, tags, colors and reminders | Yes |
|
||||
| Attachments — images, files, audio, web clips | No, sign in first |
|
||||
|
||||
If you restore while signed out, your notes come back but the files inside them stay unavailable until you log in and run the restore again.
|
||||
|
||||
::: tip Sign in before you restore
|
||||
The simplest order is: log in, let the first sync finish, then restore the backup. That way notes and attachments come back in one pass.
|
||||
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — creating and restoring backups
|
||||
- [Attachments & files](/attachments-and-files) — managing the files in your notes
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — the keys this page is talking about
|
||||
- [Why do I need to log in to upload attachments?](/faqs/login-to-upload-attachments) — the same question, for new files
|
||||
|
||||
@@ -1,8 +1,35 @@
|
||||
---
|
||||
title: Login to upload attachments
|
||||
description: We require users to be logged in to upload attachments.
|
||||
title: Login to upload attachments
|
||||
pageTitle: Why do I need to log in to upload attachments?
|
||||
description: Attachments are encrypted with a key derived from your account's encryption key, so Notesnook needs you signed in before it can encrypt and upload a file.
|
||||
keywords:
|
||||
- notesnook login to upload attachments
|
||||
- notesnook attachment requires account
|
||||
schema: faq
|
||||
faqs:
|
||||
- q: Why do I need to log in to upload attachments in Notesnook?
|
||||
a: Attachments are encrypted with a sub-key derived from your account's data encryption key. That key only exists once you are logged in, so while you are signed out there is nothing to encrypt the file with and no account to sync it to.
|
||||
- q: Can I use Notesnook without an account?
|
||||
a: Yes. Notes, notebooks, tags, the editor and search all work fully offline with no account. Attachments are the one exception, because they are stored on Notesnook's servers in encrypted form.
|
||||
---
|
||||
|
||||
# Login to upload attachments
|
||||
# Why do I need to log in to upload attachments?
|
||||
|
||||
We require users to be logged in to upload attachments. This is because attachments are encrypted using a sub-key derived from your database encryption key. Without a login, we cannot encrypt/upload/sync attachments.
|
||||
Attachments are encrypted with a sub-key derived from your account's data encryption key. That key is created with your account and only exists once you are logged in, so while you are signed out there is nothing to encrypt the file with — and no account to sync it to.
|
||||
|
||||
This is why the editor shows `Login to upload attachments.` instead of inserting the file.
|
||||
|
||||
## What still works without an account
|
||||
|
||||
Everything that lives on your device: notes, notebooks, tags, colors, the [editor](/rich-text-editor/rich-text-editor-toolbar) and search all work fully offline with no account at all. Attachments are the one exception, because they are stored on Notesnook's servers in encrypted form rather than only on your device.
|
||||
|
||||
## What counts as an attachment
|
||||
|
||||
Images, files, audio recordings and [web clips](/web-clipper/clipping-your-first-web-page-with-web-clipper) all go through the same pipeline, so all of them need you signed in. See [attachments and files](/attachments-and-files) for the size and storage limits on each plan.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Attachments & files](/attachments-and-files) — managing the files in your notes
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — the keys this page is talking about
|
||||
- [Plans & limits](/plans-and-limits) — file size and storage limits on each plan
|
||||
- [Why do I need to log in to restore attachments?](/faqs/login-to-restore-attachments-in-backup) — the same question, for backups
|
||||
|
||||
@@ -1,25 +1,39 @@
|
||||
---
|
||||
title: What are merge conflicts?
|
||||
description: Merge conflicts occur when two or more devices edit the same note and then attempt to sync these changes. Since each device has a different version of the note, Notesnook cannot automatically determine which version should take precedence, resulting in a merge conflict.
|
||||
pageTitle: What is a merge conflict in Notesnook, and how do I fix it?
|
||||
description: A merge conflict happens when the same note is edited on two devices before they sync. How to spot one, and how to keep the version you want.
|
||||
keywords:
|
||||
- notesnook merge conflict
|
||||
- conflicted note
|
||||
- notes app sync conflict
|
||||
schema: faq
|
||||
faqs:
|
||||
- q: What is a merge conflict in Notesnook?
|
||||
a: It happens when the same note is edited on two devices and both edits reach the server. Notesnook will not guess which one you want, so it marks the note conflicted and asks you to choose.
|
||||
- q: Why doesn't Notesnook merge the two versions automatically?
|
||||
a: Because automatic merging can silently lose text that only exists in one version. Notesnook shows you both and lets you keep one, discard one, or save both as separate notes.
|
||||
- q: When does a merge conflict happen?
|
||||
a: Only when the two edits are more than a minute apart. Editing on two devices at the same time, with sync working on both, does not create a conflict.
|
||||
---
|
||||
|
||||
# What are merge conflicts?
|
||||
|
||||
Merge conflicts occur when two or more devices edit the same note and then attempt to sync these changes. Since each device has a different version of the note, Notesnook cannot automatically determine which version should take precedence, resulting in a merge conflict.
|
||||
A merge conflict happens when two devices edit the same note and then try to sync those changes. Since each device has a different version of the note, Notesnook cannot automatically determine which version should take precedence, resulting in a merge conflict.
|
||||
|
||||
### Example:
|
||||
## An example
|
||||
|
||||
Let’s say you’re using Notesnook on both your laptop and smartphone. You edit a note on your laptop making a lot of changes. Later, while commuting, you remember something important and edit the same note on your smartphone. When both devices eventually reconnect to the internet and sync, Notesnook detects that there are two different versions of the same note and triggers a merge conflict.
|
||||
|
||||
## Why do merge conflicts happen?
|
||||
|
||||
Merge conflicts happen because Notesnook cannot safely figure out which version of the name you want to keep. Unlike some apps that prioritize the most recent changes or attempt to merge content automatically (which can result in loss of important data or unwanted changes), Notesnook ensures you have full control over which version of a note you want to keep.
|
||||
Merge conflicts happen because Notesnook cannot safely figure out which version of the note you want to keep. Unlike some apps that prioritize the most recent changes or attempt to merge content automatically (which can result in loss of important data or unwanted changes), Notesnook ensures you have full control over which version of a note you want to keep.
|
||||
|
||||
> info Both edits must be at least a minute apart
|
||||
>
|
||||
> The changes on both devices must be at least a minute apart for a merge conflict to occur. For example, if you are editing on both devices simultaneously (and both devices have a working sync), a merge conflict will NOT occur.
|
||||
::: info Both edits must be at least a minute apart
|
||||
The changes on both devices must be at least a minute apart for a merge conflict to occur. For example, if you are editing on both devices simultaneously (and both devices have a working sync), a merge conflict will NOT occur.
|
||||
|
||||
### Why doesn't Notesnook automatically resolve merge conflicts?
|
||||
:::
|
||||
|
||||
## Why doesn't Notesnook resolve merge conflicts automatically?
|
||||
|
||||
1. Automatic conflict resolution can lead to unintended data loss. For example, if both versions of a note contain unique but crucial information, merging them automatically might result in losing an important part of the information.
|
||||
2. By allowing you to manually resolve conflicts, you can review each version of the note and decide which one is correct or if you want to keep both (i.e. both versions contain important information).
|
||||
@@ -33,35 +47,42 @@ Conflicted notes appear at the very top of your notes list.
|
||||
|
||||
## How to resolve merge conflicts
|
||||
|
||||
### [Desktop/Web](#/tab/web)
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
To resolve a merge conflict on your desktop or web app, follow these steps:
|
||||
|
||||
1. Locate the conflicted note at the top of your notes list.
|
||||
2. Click on the note to open the conflict resolution screen.
|
||||
2. Click the note to open the conflict resolution screen.
|
||||
3. On the conflict resolution screen, you’ll see two versions of your note side by side:
|
||||
1. **Current Note** is the version from the device you are using.
|
||||
2. **Incoming Note** is the version coming from the other device.
|
||||

|
||||

|
||||
3. The red and green highlights on the left side show the changes you made. Red indicates deletions and green indicates additions.
|
||||
4. Review both versions and decide which one you want to keep.
|
||||
5. Click the **Keep** button on the version you want to retain.
|
||||
6. Click the **Discard** button on the version you don’t want to keep, or press **Save a Copy** if you want to keep both versions.
|
||||

|
||||

|
||||
|
||||
### [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
To resolve a merge conflict on your mobile device, follow these steps:
|
||||
|
||||
1. Locate the conflicted note at the top of your notes list.
|
||||
2. Tap on the note to open the conflict resolution screen.
|
||||
2. Tap the note to open the conflict resolution screen.
|
||||
3. On the conflict resolution screen, you’ll see two versions of your note, one above the other:
|
||||
1. **This Device** is the version from the device you are using.
|
||||
2. **Incoming** is the version coming from the other device.
|
||||
<p><img src="/static/merge-conflicts-resolution-screen-mobile.png" alt="drawing" height="414"/></p>
|
||||

|
||||
4. Review both versions and decide which one you want to keep.
|
||||
5. Press the **Keep** button on the version you want to retain.
|
||||
6. Press the **Discard** button on the version you don’t want to keep, or press **Save a Copy** if you want to keep both versions.
|
||||
<p><img src="/static/merge-conflicts-resolution-screen-mobile-2.png" alt="drawing" height="414"/></p>
|
||||
5. Tap the **Keep** button on the version you want to retain.
|
||||
6. Tap the **Discard** button on the version you don’t want to keep, or press **Save a Copy** if you want to keep both versions.
|
||||

|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [How sync works](/sync/how-sync-works) — when and how your notes travel
|
||||
- [Troubleshooting sync](/sync/troubleshooting-sync) — when a note doesn't turn up
|
||||
- [Version history](/note-version-history) — going back to an earlier draft
|
||||
- [Sync settings](/sync/sync-settings) — offline mode and sync controls
|
||||
|
||||
@@ -1,6 +1,21 @@
|
||||
---
|
||||
title: Gift cards
|
||||
description: Gift your friends and family a Notesnook Pro subscription.
|
||||
pageTitle: Notesnook gift cards — buying and redeeming a gift code
|
||||
description: Buy a Notesnook gift card for one, three or five years, send the code to anyone, and redeem it on an account that is currently on the free plan.
|
||||
keywords:
|
||||
- notesnook gift card
|
||||
- gift notesnook subscription
|
||||
- redeem notesnook code
|
||||
schema: faq
|
||||
faqs:
|
||||
- q: Who can redeem a Notesnook gift code?
|
||||
a: Anyone whose account is currently on the free plan. You cannot redeem a gift code on an account with an active subscription, and a cancelled subscription counts as active until its billing period ends.
|
||||
- q: Can I use a gift card to extend my existing subscription?
|
||||
a: No. Your current subscription has to end completely before a gift code can be redeemed on that account.
|
||||
- q: Do Notesnook gift codes expire?
|
||||
a: Yes, one year from the date of purchase.
|
||||
- q: Are Notesnook gift cards refundable or auto-renewing?
|
||||
a: Neither. Gift codes are non-refundable and are a one-time purchase that never renews.
|
||||
---
|
||||
|
||||
# Gift cards
|
||||
@@ -19,39 +34,43 @@ You can purchase a gift card from [https://notesnook.com/giftcards](https://note
|
||||
- 3 years gift card
|
||||
- 5 years gift card
|
||||
|
||||
> info
|
||||
>
|
||||
> Gift cards are not attached to a user account and can be claimed by any Notesnook user.
|
||||
::: info
|
||||
Gift cards are not attached to a user account and can be claimed by any Notesnook user.
|
||||
|
||||
:::
|
||||
|
||||
## Redeem a gift code
|
||||
|
||||
> info
|
||||
>
|
||||
> You can't redeem a gift code on an account with an active Notesnook subscription. A cancelled subscription is still active until its current billing period ends.
|
||||
::: info
|
||||
You can't redeem a gift code on an account with an active Notesnook subscription. A cancelled subscription is still active until its current billing period ends.
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::
|
||||
|
||||
1. Go to `Settings`
|
||||
2. Go to `Subscription settings`
|
||||
3. Click on `Redeem a gift code` button
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}`
|
||||
2. Go to `{{subDetails}}`
|
||||
3. Click `{{redeemGiftCode}}` button
|
||||
4. Enter the gift code you received
|
||||
5. Click on `Submit` and wait for the app to verify your gift code.
|
||||
5. Click `{{submit}}` and wait for the app to verify your gift code.
|
||||
6. Once the process succeeds, you should be upgraded to Pro.
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Go to `Settings`
|
||||
2. Go to `Account settings`
|
||||
3. Tap on `Redeem a gift code`
|
||||
1. Go to `{{settings}}`
|
||||
2. Go to `{{account}}`
|
||||
3. Tap `{{redeemGiftCode}}`
|
||||
4. Enter the gift code you received
|
||||
5. Tap on `Redeem` and wait for the app to verify your gift code.
|
||||
5. Tap `{{redeem}}` and wait for the app to verify your gift code.
|
||||
6. Once the process succeeds, you should be upgraded to Pro.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
> info
|
||||
>
|
||||
> Once you redeem a gift code, the person who purchased it will receive an email informing them that one of their gift codes was claimed. The email **does not** contain any information about who claimed the gift code.
|
||||
::: info
|
||||
Once you redeem a gift code, the person who purchased it will receive an email informing them that one of their gift codes was claimed. The email **does not** contain any information about who claimed the gift code.
|
||||
|
||||
:::
|
||||
|
||||
## FAQs
|
||||
|
||||
@@ -81,4 +100,9 @@ No. Gift cards are a one-time purchase.
|
||||
|
||||
### Can I use cryptocurrency to purchase a gift card?
|
||||
|
||||
Currently, no. But we are actively working on a solution to support this so stay tuned.
|
||||
Yes! You can do so over at [Proxystore.](https://digitalgoods.proxysto.re/en)
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Plans & limits](/plans-and-limits) — what each plan unlocks and the exact limits
|
||||
- [Account settings](/account-settings) — email, password and profile
|
||||
|
||||
@@ -1,27 +1,40 @@
|
||||
---
|
||||
title: How is my data encrypted?
|
||||
description: Every byte of your notes data is encrypted with the strongest encryption algorithms on client with XChaCha-Poly1305-IETF & Argon2.
|
||||
pageTitle: How does Notesnook encrypt my notes?
|
||||
description: Every note is encrypted on your device with XChaCha20-Poly1305-IETF and a key derived with Argon2, before anything is sent. Here is exactly how it works.
|
||||
keywords:
|
||||
- notesnook encryption
|
||||
- end to end encrypted notes app
|
||||
- xchacha20 poly1305 notes
|
||||
- zero knowledge note taking
|
||||
schema: faq
|
||||
faqs:
|
||||
- q: How does Notesnook encrypt my notes?
|
||||
a: Every item is encrypted on your device with XChaCha20-Poly1305-IETF before it is synced. The key comes from a data encryption key that is itself protected by a master key derived from your password with Argon2. The server only ever receives ciphertext.
|
||||
- q: Can Notesnook read my notes?
|
||||
a: No. Your password never leaves your device, and the keys that decrypt your notes never leave it either. The server stores encrypted blobs it has no way to open.
|
||||
- q: What happens if I forget my password?
|
||||
a: Your account recovery key is the only way back to your data. Without your password and without that key, nobody — including Notesnook — can decrypt your notes.
|
||||
---
|
||||
|
||||
# How is my data encrypted?
|
||||
|
||||
> warn Note
|
||||
>
|
||||
> This document is not a spec, only an explanation of the encryption process.
|
||||
Everything you write is encrypted on your own device before it is sent anywhere. The Notesnook server stores ciphertext it cannot open, which is why nobody here can read your notes — and why nobody here can recover them for you if you lose both your password and your recovery key.
|
||||
|
||||
::: info This is an explanation, not a specification
|
||||
This page describes how the encryption works in practice. It is not a formal spec.
|
||||
|
||||
:::
|
||||
|
||||
## Algorithms & cryptographic library
|
||||
|
||||
1. XChaCha-Poly1305-IETF (for encryption/decryption)
|
||||
2. Argon2 (for password hashing & PKDF)
|
||||
1. `argon2i` for PKDF
|
||||
2. `argon2id` for password hashing
|
||||
3. [**libsodium**](https://libsodium.org)
|
||||
| Purpose | Algorithm |
|
||||
| ------------------------------------------- | ----------------------- |
|
||||
| Encrypting and decrypting your data | XChaCha20-Poly1305-IETF |
|
||||
| Deriving your master key from your password | Argon2i |
|
||||
| Hashing your password for the server | Argon2id |
|
||||
|
||||
On all three platforms we use the same exact library for all cryptographic functions. This ensures data integrity across platforms.
|
||||
|
||||
> info Fun story
|
||||
>
|
||||
> When we first added encryption, we used AES-GCM-256 across platforms but the cross-platform compatibility was abyssmal. That is when I found out about the great libsodium. Written in C, wrappers available for all platforms...what more could I want?
|
||||
All of it comes from [**libsodium**](https://libsodium.org). Web, desktop and mobile use the same library for every cryptographic operation, so a note encrypted on one platform decrypts identically on the others.
|
||||
|
||||
## Process
|
||||
|
||||
@@ -31,9 +44,10 @@ When you sign up for an account, the app takes your password and hashes it using
|
||||
|
||||
This predictable salt is generated using a `fixed client salt` + `your email`.
|
||||
|
||||
> info Your password never leaves your device
|
||||
>
|
||||
> Sending the hash over sending your plain text password ensures that there is no way for us (or anyone else) to get your password.
|
||||
::: info Your password never leaves your device
|
||||
Only the hash is sent, never the password itself, so there is no way for us — or anyone who intercepts the request — to learn your password.
|
||||
|
||||
:::
|
||||
|
||||
After the hash is generated, it is sent to the server. This hash is used as a `password` and is hashed again to mitigate password passthrough attacks.
|
||||
|
||||
@@ -41,25 +55,25 @@ This process is repeated every time you sign in.
|
||||
|
||||
### 2. Key generation
|
||||
|
||||
When you first sign up for an account, your client generates two encryption keys. One is a unique data encryption key that encrypts all your notes and other data. The second is your master encryption key, this is derived by your password and predictable salt. This key protects all your encryption keys, like the aforementioned data encryption key. If you change your password, your client will re-encrypt your existing data encryption key with your new master key.
|
||||
When you first sign up for an account, your client generates two encryption keys. One is a unique data encryption key that encrypts all your notes and other data. The second is your master encryption key, derived from your password and that predictable salt. This key protects all your encryption keys, like the aforementioned data encryption key. If you change your password, your client will re-encrypt your existing data encryption key with your new master key.
|
||||
|
||||
### 3. Encryption key storage
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
Instead of storing the key as plain text (and allowing anyone to copy/move it), we use browser's `IndexedDB` to store the key as a `CryptoKey`.
|
||||
|
||||
`CryptoKey` is stored securely by the browser and cannot be exported, viewed, or copied except by the app & browser.
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
On iOS and Android, the encryption key is stored in the phone's keychain.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
### 4. Data encryption
|
||||
|
||||
Encryption only takes place when you sync. Each item in the database is encrypted separately using XChaCha-Poly1305-IETF.
|
||||
Encryption takes place when you sync. Each item in the database is encrypted separately using XChaCha20-Poly1305-IETF.
|
||||
|
||||
#### How it works
|
||||
|
||||
@@ -72,14 +86,31 @@ Encryption only takes place when you sync. Each item in the database is encrypte
|
||||
4. Algorithm id `alg`
|
||||
5. ItemId `id`
|
||||
|
||||
> info
|
||||
>
|
||||
> See the whole process in action [here.](https://vericrypt.notesnook.com/)
|
||||
::: info
|
||||
See the whole process in action [here.](https://vericrypt.notesnook.com/)
|
||||
|
||||
:::
|
||||
|
||||
This object is then sent to the server for storage. The server performs no further operation on this data (because it can't).
|
||||
|
||||
## Faqs
|
||||
## FAQs
|
||||
|
||||
### I am an old user of Notesnook, I don't have a data encryption key.
|
||||
### Can Notesnook read my notes?
|
||||
|
||||
Your data encryption key will be created when you change your password.
|
||||
No. Your notes are encrypted on your device with keys that never leave it, and the server only ever receives ciphertext. This is also why we cannot reset your password or recover your notes for you — see [recovering your account](/recovering-your-account).
|
||||
|
||||
### What happens if I forget my password?
|
||||
|
||||
Your [account recovery key](/recovering-your-account) is the only way back into your data. Without your password and without that key, your notes cannot be decrypted by anyone.
|
||||
|
||||
### I am an old user of Notesnook and I don't have a data encryption key
|
||||
|
||||
Your data encryption key is created the next time you change your password.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Private vault](/lock-notes-with-private-vault) — locking individual notes
|
||||
- [Recovering your account](/recovering-your-account) — when you forget your password
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — keeping your own encrypted copy
|
||||
- [Two-factor authentication](/two-factor-authentication) — a second step at login
|
||||
- [Self-hosting](/self-hosting) — running your own servers
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
---
|
||||
title: Importing notes
|
||||
---
|
||||
|
||||
# Import notes from any notes app
|
||||
|
||||
Notesnook supports importing from most of the popular note apps and common export formats such as markdown, html and text files.
|
||||
|
||||
## Try it out
|
||||
|
||||
You can try out the importer by opening the web or desktop app and going to `Settings > Notesnook Importer`.
|
||||
|
||||
## Supported note apps and formats
|
||||
|
||||
1. Plain text files
|
||||
2. HTML files
|
||||
3. Markdown (.md) files
|
||||
4. EverNote
|
||||
5. Simplenote
|
||||
6. Google Keep
|
||||
7. Joplin
|
||||
8. Zoho Notebook
|
||||
9. Obsidian
|
||||
10. Skiff Pages
|
||||
|
||||
**Don't see your notes app?** No worries, create an issue on [Github](https://github.com/streetwriters/notesnook/issues)
|
||||
|
||||
## Is it safe to import?
|
||||
|
||||
Not a single byte of your data from other apps is sent to our servers. Everything is processed 100% on the client side inside this browser.
|
||||
@@ -1,15 +1,33 @@
|
||||
---
|
||||
title: ColorNote
|
||||
description: Move your notes from ColorNote into Notesnook by importing an encrypted ColorNote backup.
|
||||
pageTitle: How to import ColorNote notes into Notesnook
|
||||
keywords:
|
||||
- import colornote
|
||||
- colornote backup import
|
||||
- colornote alternative
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How to import notes from ColorNote notes app?
|
||||
|
||||
The following steps will help you import your notes from ColorNote easily.
|
||||
Here is how to move your notes from ColorNote into Notesnook.
|
||||
|
||||
1. Download the ColorNote mobile app.
|
||||
2. Go to `Settings > Backup` and create a backup. Make sure to remember the password you set while creating the backup as it will be needed during import.
|
||||
3. Open the Notesnook app (web or desktop).
|
||||
4. Go to `Settings > Notesnook Importer` and select `ColorNote` from list of apps.
|
||||
4. Go to `Settings > Import & export > Notesnook Importer` and select `ColorNote` from list of apps.
|
||||
5. Drop the backup file you exported earlier in the box or click anywhere to open system file picker to select the backup.
|
||||
7. Click on "Start importing" and enter the password you used while creating the backup in the popup.
|
||||
8. Once importing completes you should see all your notes in Notesnook. If you face any issues during importing, [report it on github](https://github.com/streetwriters/notesnook).
|
||||
6. Click "Start importing" and enter the password you used while creating the backup in the popup.
|
||||
7. Once importing completes you should see all your notes in Notesnook. If you face any issues during importing, [report it on github](https://github.com/streetwriters/notesnook).
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your ColorNote export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,33 +1,42 @@
|
||||
---
|
||||
title: Evernote
|
||||
description: Export your Evernote notebooks as .enex files and import them into Notesnook — attachments, web clips, tags and notebooks included.
|
||||
pageTitle: How to import Evernote notes into Notesnook (.enex)
|
||||
keywords:
|
||||
- import enex
|
||||
- how to export evernote notes
|
||||
- evernote to notesnook
|
||||
- evernote alternative import
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Evernote?
|
||||
|
||||
The following steps will help you quickly import your notes from Evernote into Notesnook.
|
||||
Here is how to move your notes from Evernote into Notesnook.
|
||||
|
||||
## Exporting your Evernote notebooks
|
||||
|
||||
> info
|
||||
>
|
||||
> If you are tech savvy and know your way around a computer, you can use a tool like [evernote-backup](https://github.com/vzhd1701/evernote-backup) to quickly export all your Evernote notes as .ENEX files.
|
||||
::: info
|
||||
If you are tech savvy and know your way around a computer, you can use a tool like [evernote-backup](https://github.com/vzhd1701/evernote-backup) to quickly export all your Evernote notes as .ENEX files.
|
||||
|
||||
1. Open the Evernote Desktop app (its not possible to export notes from the Evernote web app), and go to `Notebooks` from the side menu:
|
||||

|
||||
2. Click on the `three-dot` button on each notebook and click on `Export Notebook`
|
||||

|
||||
3. Choose `ENEX format` then click on `Export`, and save it to your desired location. Repeat this for all the Notebooks you want to import into Notesnook.
|
||||

|
||||
:::
|
||||
|
||||
1. Open the Evernote desktop app — exporting is not possible from the Evernote web app — and go to `{{notebooks}}` in the side menu:
|
||||

|
||||
2. Click the three dot button on each notebook and click `Export Notebook`
|
||||

|
||||
3. Choose `ENEX format` then click `{{export}}`, and save it to your desired location. Repeat this for all the Notebooks you want to import into Notesnook.
|
||||

|
||||
|
||||
## Importing .ENEX files into Notesnook
|
||||
|
||||
Once you have all the .ENEX files containing your Evernote notes, its time to import them into Notesnook.
|
||||
Once you have the `.enex` files containing your Evernote notes, it is time to import them.
|
||||
|
||||
1. Open the Notesnook app (web or desktop)
|
||||
2. Go to `Settings > Notesnook Importer` and select Evernote from the list of apps.
|
||||

|
||||
3. Drop (or select) the `.enex` files you exported earlier from Evernote, and click the "Start processing" button.
|
||||

|
||||
2. Go to `Settings > Import & export > Notesnook Importer` and select Evernote from the list of apps.
|
||||

|
||||
3. Drop (or select) the `.enex` files you exported earlier from Evernote, and click the "Start importing" button.
|
||||

|
||||
4. Once the importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
## Supported formats
|
||||
@@ -44,3 +53,14 @@ Notesnook Importer is one of the most robust Evernote importers, supporting almo
|
||||
- [x] Internal note links (limitation: links only resolve correctly if the link text exactly matches the Evernote note title)
|
||||
- [x] Notebooks
|
||||
- [x] Tags
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Evernote export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Import from Obsidian](/importing-notes/import-notes-from-obsidian) — moving notes out of Obsidian
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: Fusebase
|
||||
pageTitle: How to import Fusebase (Nimbus Note) notes into Notesnook
|
||||
description: Export your Fusebase — formerly Nimbus Note — workspace and import it into Notesnook, keeping folders, tags, colors and attachments.
|
||||
keywords:
|
||||
- import nimbus note
|
||||
- fusebase export notes
|
||||
- nimbus note alternative
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Fusebase?
|
||||
|
||||
Fusebase — the app formerly called **Nimbus Note** — can export your workspace as a `.zip` archive, and the Notesnook Importer reads it directly.
|
||||
|
||||
## Exporting from Fusebase
|
||||
|
||||
1. Open Fusebase on the web or desktop.
|
||||
2. Export your workspace. The export arrives as a `.zip` file (for example `nimbus-export.zip`) containing one folder per note.
|
||||
3. Save the file somewhere you can find it.
|
||||
|
||||
## Importing into Notesnook
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Open the Notesnook web or desktop app.
|
||||
2. Go to `Settings > Import & export > Notesnook Importer`.
|
||||
3. Select `Fusebase (formerly Nimbus Note)` from the list of apps.
|
||||
4. Drag and drop the `.zip` file, or click to browse for it.
|
||||
5. Click `Start importing` and wait for the import to finish.
|
||||
|
||||
== Mobile
|
||||
|
||||
The Notesnook Importer runs in the **web and desktop apps only**. Import on a computer and the notes will sync down to your phone automatically.
|
||||
|
||||
:::
|
||||
|
||||
## Supported formats
|
||||
|
||||
- [x] Notes, converted to Notesnook's rich text
|
||||
- [x] Folders — each Fusebase parent folder becomes a notebook
|
||||
- [x] Tags
|
||||
- [x] Note colors, mapped to Notesnook's colors
|
||||
- [x] Attachments and images embedded in a note
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Obsidian](/importing-notes/import-notes-from-obsidian) — moving a Markdown vault across
|
||||
- [Organizing with notebooks](/organizing-notes/organize-notes-using-notebooks) — where your imported folders land
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Fusebase export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
@@ -1,5 +1,12 @@
|
||||
---
|
||||
title: Google Keep
|
||||
description: Export Google Keep with Google Takeout and import the archive into Notesnook, keeping labels, images and checklists.
|
||||
pageTitle: How to import Google Keep notes into Notesnook
|
||||
keywords:
|
||||
- import google keep notes
|
||||
- google takeout notes
|
||||
- google keep alternative
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Google Keep?
|
||||
@@ -9,22 +16,22 @@ The following steps will help you quickly import your notes from Google Keep int
|
||||
## Exporting your Google Keep notes
|
||||
|
||||
1. Go to [Google Takeout](https://takeout.google.com/settings/takeout) and log into your Google account.
|
||||
2. On the Google Takeout page, first deselect all the items by clicking on `Deselect all`, and then scroll down and select only `Keep` from the list. Once selected, click on `Next Step` by scrolling to the very bottom of the page.
|
||||

|
||||
3. On the next section, leave everything as is and just click on the "Create export" button:
|
||||

|
||||
2. On the Google Takeout page, first deselect all the items by clicking on `Deselect all`, and then scroll down and select only `{{keep}}` from the list. Once selected, click `Next Step` by scrolling to the very bottom of the page.
|
||||

|
||||
3. Leave everything in the next section as it is and click the "Create export" button:
|
||||

|
||||
4. Download the exported .zip file once it becomes available:
|
||||

|
||||

|
||||
|
||||
## Importing Google Takeout into Notesnook
|
||||
|
||||
Once you have the Google Takeout containing your Google Keep notes, its time to import them into Notesnook.
|
||||
|
||||
1. Open the Notesnook app (web or desktop)
|
||||
2. Go to `Settings > Notesnook Importer` and select `Google Keep` from list of apps.
|
||||

|
||||
2. Go to `Settings > Import & export > Notesnook Importer` and select `Google Keep` from list of apps.
|
||||

|
||||
3. Drop the .zip backup file(s) you exported earlier from Google Takeout in the box or click anywhere to open system file picker to select the backup.
|
||||

|
||||

|
||||
4. Once the importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
## Supported formats
|
||||
@@ -38,3 +45,14 @@ Notesnook Importer is one of the most robust Google Keep importers around suppor
|
||||
- [x] Tags/Labels
|
||||
- [x] Pinned status
|
||||
- [x] Colors
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Google Keep export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Import from Obsidian](/importing-notes/import-notes-from-obsidian) — moving notes out of Obsidian
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,12 +1,29 @@
|
||||
---
|
||||
title: HTML files
|
||||
description: Import .html files into Notesnook and keep their formatting, links and images.
|
||||
pageTitle: How to import HTML files into Notesnook
|
||||
keywords:
|
||||
- import html files notes
|
||||
- html to notes app
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from HTML files?
|
||||
|
||||
1. Open the Notesnook app (web or desktop)
|
||||
2. Go to `Settings > Notesnook Importer` and select `HTML` from list of apps.
|
||||

|
||||
3. Drop your .html files, or click anywhere inside the box to browse and select your .html files. You can also provide a .zip file containing all your .html files. Then click "Start processing".
|
||||

|
||||
2. Go to `Settings > Import & export > Notesnook Importer` and select `HTML` from list of apps.
|
||||

|
||||
3. Drop your .html files, or click anywhere inside the box to browse and select your .html files. You can also provide a .zip file containing all your .html files. Then click "Start importing".
|
||||

|
||||
4. Once the importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your HTML files export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,19 +1,26 @@
|
||||
---
|
||||
title: Joplin
|
||||
description: Export your Joplin notebooks and import them into Notesnook without losing notebooks, tags or attachments.
|
||||
pageTitle: How to import Joplin notes into Notesnook
|
||||
keywords:
|
||||
- import joplin notes
|
||||
- joplin to notesnook
|
||||
- joplin jex import
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Joplin notes app?
|
||||
|
||||
The following steps will help you import your notes from Joplin easily.
|
||||
Here is how to move your notes from Joplin into Notesnook.
|
||||
|
||||
1. Open the Joplin Desktop app.
|
||||
2. Click on `File > Export All -> JEX - Joplin Export File` and save the .JEX file at your desired location.
|
||||

|
||||
2. Click `File > Export All -> JEX - Joplin Export File` and save the .JEX file at your desired location.
|
||||

|
||||
3. Open the Notesnook app (web or desktop)
|
||||
4. Go to `Settings > Notesnook Importer` and select `Joplin` from list of apps.
|
||||

|
||||
4. Go to `Settings > Import & export > Notesnook Importer` and select `Joplin` from list of apps.
|
||||

|
||||
5. Drop (or select) the .jex backup file you exported earlier from Joplin:
|
||||

|
||||

|
||||
6. Once the importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
## Supported formats
|
||||
@@ -23,3 +30,14 @@ The following steps will help you import your notes from Joplin easily.
|
||||
- [x] Tags
|
||||
- [x] Folders (currently only 2 levels of nesting is supported)
|
||||
- [ ] Internal links to other notes
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Joplin export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Obsidian](/importing-notes/import-notes-from-obsidian) — moving notes out of Obsidian
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,14 +1,21 @@
|
||||
---
|
||||
title: Markdown files
|
||||
description: Import .md files from any app or folder into Notesnook — headings, lists, code blocks and links are preserved.
|
||||
pageTitle: How to import Markdown files into Notesnook
|
||||
keywords:
|
||||
- import markdown files
|
||||
- markdown notes app import
|
||||
- md files to notes
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Markdown files?
|
||||
|
||||
1. Open the Notesnook app (web or desktop)
|
||||
2. Go to `Settings > Notesnook Importer` and select "Markdown".
|
||||

|
||||
3. Drop your .md files, or click anywhere inside the box to browse and select your .md files. You can also provide a .zip file containing all your .md files. Then click "Start processing".
|
||||

|
||||
2. Go to `Settings > Import & export > Notesnook Importer` and select "Markdown".
|
||||

|
||||
3. Drop your .md files, or click anywhere inside the box to browse and select your .md files. You can also provide a .zip file containing all your .md files. Then click "Start importing".
|
||||

|
||||
4. Once the importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
## Supported formats
|
||||
@@ -21,3 +28,14 @@ title: Markdown files
|
||||
- [x] Images and links (links that point to files get added as attachments)
|
||||
|
||||
> Note: For best results, it is recommended to ZIP all your .md files and their attachments so they can be found by the importer.
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Markdown files export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,21 +1,39 @@
|
||||
---
|
||||
title: Obsidian
|
||||
description: Import an Obsidian vault into Notesnook — your Markdown files, folders and attachments become encrypted notes.
|
||||
pageTitle: How to import an Obsidian vault into Notesnook
|
||||
keywords:
|
||||
- import obsidian vault
|
||||
- obsidian to notesnook
|
||||
- obsidian markdown import
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Obsidian?
|
||||
|
||||
1. Open the Notesnook app (web or desktop)
|
||||
2. Go to `Settings > Notesnook Importer` and select "Obsidian".
|
||||

|
||||
3. Drop your .md files from your Obsidian Vault, or click anywhere inside the box to browse and select your .md files. You can also provide a .zip file containing all your Obsidian .md files. Then click "Start processing".
|
||||

|
||||
2. Go to `Settings > Import & export > Notesnook Importer` and select "Obsidian".
|
||||

|
||||
3. Drop your .md files from your Obsidian Vault, or click anywhere inside the box to browse and select your .md files. You can also provide a .zip file containing all your Obsidian .md files. Then click "Start importing".
|
||||

|
||||
4. Once the importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
## Supported formats
|
||||
|
||||
- [ ] Internal links
|
||||
- [x] Embedded files (supporting both `![[path-to-file]]` and ``)
|
||||
- [x] Embedded files (supporting both `![[path-to-file]]` and ``)
|
||||
- [x] Full CommonMark Markdown syntax
|
||||
- [ ] Callouts
|
||||
- [x] Metadata (tags etc.)
|
||||
- [x] Comments (block & inline both get removed)
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Obsidian export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,12 +1,29 @@
|
||||
---
|
||||
title: Plaintext files
|
||||
description: Import .txt files into Notesnook, one note per file.
|
||||
pageTitle: How to import plain text files into Notesnook
|
||||
keywords:
|
||||
- import txt files notes
|
||||
- plain text notes import
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Plaintext files?
|
||||
|
||||
1. Open the Notesnook app (web or desktop)
|
||||
2. Go to `Settings > Notesnook Importer` and select "Text".
|
||||

|
||||
3. Drop your .txt files, or click anywhere inside the box to browse and select your .txt files. You can also provide a .zip file containing all your .txt files. Then click "Start processing".
|
||||

|
||||
2. Go to `Settings > Import & export > Notesnook Importer` and select "Text".
|
||||

|
||||
3. Drop your .txt files, or click anywhere inside the box to browse and select your .txt files. You can also provide a .zip file containing all your .txt files. Then click "Start importing".
|
||||

|
||||
4. Once the importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Plaintext files export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,22 +1,29 @@
|
||||
---
|
||||
title: Simplenote
|
||||
description: Export your Simplenote notes and import them into Notesnook, keeping tags and note history intact where possible.
|
||||
pageTitle: How to import Simplenote notes into Notesnook
|
||||
keywords:
|
||||
- import simplenote notes
|
||||
- simplenote to notesnook
|
||||
- simplenote alternative
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How to import notes from Simplenote notes app?
|
||||
|
||||
The following steps will help you import your notes from Simplenote easily.
|
||||
Here is how to move your notes from Simplenote into Notesnook.
|
||||
|
||||
1. Open Simplenote app on Desktop or Login to [https://app.simplenote.com](https://app.simplenote.com).
|
||||
2. Go to sidebar and click on Settings.
|
||||

|
||||
2. Go to sidebar and click Settings.
|
||||

|
||||
3. Go to `Tools` tab in Settings
|
||||

|
||||
4. Click on `Export notes` to download your notes as a .zip file.
|
||||

|
||||
4. Click `Export notes` to download your notes as a .zip file.
|
||||
5. Open the Notesnook app (web or desktop)
|
||||
6. Go to `Settings > Notesnook Importer` and select `Simplenote` from list of apps.
|
||||

|
||||
7. Drop the .zip backup file you exported earlier from Simplenote in the box or click anywhere to open system file picker to select the backup and click "Start processing".
|
||||

|
||||
6. Go to `Settings > Import & export > Notesnook Importer` and select `Simplenote` from list of apps.
|
||||

|
||||
7. Drop the .zip backup file you exported earlier from Simplenote in the box or click anywhere to open system file picker to select the backup and click "Start importing".
|
||||

|
||||
8. Once importing completes you should see all your notes in Notesnook. If you face any issues during importing, [report it on github](https://github.com/streetwriters/notesnook).
|
||||
|
||||
## Supported formats
|
||||
@@ -28,3 +35,14 @@ Simplenote's export is, well, pretty simple and the Notesnook Importer supports
|
||||
### Some of my notes have weird whitespacing and broken formatting after import. What do I do?
|
||||
|
||||
This can happen in notes for which you have enabled Markdown in Simplenote. Notesnook Importer follows this flag during processing and respects Markdown rules during the conversion to HTML. If you want to preserve the formatting of your notes, it is best that you disable the Markdown formatting for all your notes in Simplenote. This will force the Notesnook Importer to import all your notes as plaintext.
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Simplenote export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
---
|
||||
title: Skiff Pages
|
||||
description: Skiff is gone — export your Skiff Pages and import them into Notesnook so your notes survive the shutdown.
|
||||
pageTitle: How to import Skiff Pages into Notesnook
|
||||
keywords:
|
||||
- import skiff pages
|
||||
- skiff shut down notes
|
||||
- skiff alternative
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Skiff Pages?
|
||||
@@ -9,21 +16,21 @@ The following steps will help you quickly import your notes from Skiff Pages int
|
||||
## Exporting your Skiff Pages
|
||||
|
||||
1. Open the [Skiff Pages](https://app.skiff.com) app
|
||||
2. Open Settings > Export or just go directly to [https://app.skiff.com/dashboard/?settingTab=export](https://app.skiff.com/dashboard/?settingTab=export)
|
||||

|
||||
3. Click on the Export button next to `Pages and Files` — this might take a few minutes depending on how many pages you have.
|
||||
2. Open Settings > Export, or go straight to [https://app.skiff.com/dashboard/?settingTab=export](https://app.skiff.com/dashboard/?settingTab=export)
|
||||

|
||||
3. Click the Export button next to `Pages and Files` — this might take a few minutes depending on how many pages you have.
|
||||
4. Once the export is complete, save the `Skiff.zip` file at your preferred location.
|
||||

|
||||

|
||||
|
||||
## Importing Skiff.zip file into Notesnook
|
||||
|
||||
Once you have the `Skiff.zip` file containing your Skiff pages, its time to import them into Notesnook.
|
||||
|
||||
1. Open the Notesnook app (web or desktop)
|
||||
2. Go to `Settings > Notesnook Importer` and select "Skiff Pages".
|
||||

|
||||
3. Drop your Skiff.zip file, or click anywhere inside the box to browse and select your Skiff.zip file. Then click "Start processing".
|
||||

|
||||
2. Go to `Settings > Import & export > Notesnook Importer` and select "Skiff Pages".
|
||||

|
||||
3. Drop your Skiff.zip file, or click anywhere inside the box to browse and select your Skiff.zip file. Then click "Start importing".
|
||||

|
||||
4. Once the importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
## Supported formats
|
||||
@@ -34,3 +41,14 @@ Once you have the `Skiff.zip` file containing your Skiff pages, its time to impo
|
||||
- [x] Tables
|
||||
- [x] Rich text (bold, italic, headings, lists etc.)
|
||||
- [x] Task lists
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Skiff Pages export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,23 +1,60 @@
|
||||
---
|
||||
title: Standard Notes
|
||||
description: Moving from Standard Notes to Notesnook — export a decrypted backup and import it with the Markdown or plaintext importer.
|
||||
pageTitle: How to import Standard Notes into Notesnook
|
||||
keywords:
|
||||
- import standard notes
|
||||
- standard notes to notesnook
|
||||
- standard notes alternative
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Standard Notes?
|
||||
|
||||
The following steps will help you import your notes from Standard notes easily.
|
||||
Export a **decrypted backup** from Standard Notes, unzip it, and bring the files in with Notesnook's Markdown or plaintext importer.
|
||||
|
||||
1. Open Standard Notes app on Desktop or visit [https://app.standardnotes.org](https://app.standardnotes.org) and login to your account.
|
||||
2. Select all your notes, right click, and select `Export`.
|
||||
3. Open the Notesnook (app or desktop).
|
||||
4. Go to `Settings > Notesnook Importer` and select `Standard Notes` from list of apps.
|
||||

|
||||
5. Drop the .zip file you exported earlier from Standard Notes in the box or click anywhere to open system file picker to select the backup.
|
||||

|
||||
6. Once importing completes you should see all your notes in Notesnook. If you face any issues during importing, [report it on github](https://github.com/streetwriters/notesnook).
|
||||
::: warning There is no longer a Standard Notes importer
|
||||
Recent versions of the Notesnook Importer don't list Standard Notes as a source app, so you import the files it exports rather than the backup itself. The steps below take that route.
|
||||
|
||||
## Supported formats
|
||||
:::
|
||||
|
||||
- [x] Text files
|
||||
- [x] Authentication notes
|
||||
- [x] Spreadsheets
|
||||
- [ ] Tags
|
||||
## Export a decrypted backup from Standard Notes
|
||||
|
||||
1. Open the Standard Notes desktop app, or go to [https://app.standardnotes.com](https://app.standardnotes.com) and sign in.
|
||||
2. Select all your notes, right click, and choose `{{export}}`.
|
||||
3. Choose the **decrypted** backup option. An encrypted backup can only be read by Standard Notes, so nothing can import it.
|
||||
4. Save the `.zip` file somewhere you can find it.
|
||||
|
||||
## Import the files into Notesnook
|
||||
|
||||
1. Unzip the backup. Inside it, your notes are plain text and Markdown files.
|
||||
2. Open Notesnook on web or desktop.
|
||||
3. Go to `Settings > Import & export > Notesnook Importer`.
|
||||
4. Choose **Markdown** for `.md` files, or **Text** for `.txt` files. Run the importer once for each type you have.
|
||||
5. Drop the files in, or click the box to pick them, and start the import.
|
||||
|
||||
Full steps for each importer are on [import Markdown files](/importing-notes/import-notes-from-markdown-files) and [import plaintext files](/importing-notes/import-notes-from-plaintext-files).
|
||||
|
||||
## What carries across
|
||||
|
||||
| | Imported |
|
||||
| ----------------------------- | -------- |
|
||||
| Note titles and content | Yes |
|
||||
| Plain text and Markdown notes | Yes |
|
||||
| Tags | No |
|
||||
| Notebooks or folders | No |
|
||||
|
||||
Your notes arrive as a flat list, so plan to re-file them into [notebooks](/organizing-notes/organize-notes-using-notebooks) and re-apply [tags](/organizing-notes/organize-notes-using-tags) afterwards.
|
||||
|
||||
If you'd like a proper Standard Notes importer back, [open an issue](https://github.com/streetwriters/notesnook/issues/new/choose) — that is where importer requests are tracked.
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Standard Notes export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import Markdown files](/importing-notes/import-notes-from-markdown-files) — the importer this page routes you to
|
||||
- [Import plaintext files](/importing-notes/import-notes-from-plaintext-files) — for `.txt` exports
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
title: TextBundle files
|
||||
pageTitle: How to import TextBundle and TextPack files into Notesnook
|
||||
description: Import .textbundle and .textpack files into Notesnook — the portable note format used by Bear, Ulysses, iA Writer and other Markdown editors.
|
||||
keywords:
|
||||
- import textbundle
|
||||
- textpack import notes
|
||||
- bear notes export import
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import TextBundle files?
|
||||
|
||||
TextBundle is an open format for moving a note and its images between apps as a single package. Editors such as Bear, Ulysses and iA Writer export it, and the Notesnook Importer reads both `.textbundle` folders and their zipped form, `.textpack`.
|
||||
|
||||
## Exporting a TextBundle
|
||||
|
||||
Export from your current app as **TextBundle** or **TextPack**. Each package holds the note's text plus an `assets` folder with its images and files.
|
||||
|
||||
If your app offers both, `.textpack` is easier to move around because it's a single file.
|
||||
|
||||
## Importing into Notesnook
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Open the Notesnook web or desktop app.
|
||||
2. Go to `Settings > Import & export > Notesnook Importer`.
|
||||
3. Select `TextBundle` from the list of apps.
|
||||
4. Drag and drop your `.textbundle` or `.textpack` files, or click to browse for them. You can add as many as you like.
|
||||
5. Click `Start importing` and wait for the import to finish.
|
||||
|
||||
== Mobile
|
||||
|
||||
The Notesnook Importer runs in the **web and desktop apps only**. Import on a computer and the notes will sync down to your phone automatically.
|
||||
|
||||
:::
|
||||
|
||||
## Supported formats
|
||||
|
||||
The importer reads whichever text file the package contains, so a TextBundle written as Markdown, HTML or plain text all import correctly.
|
||||
|
||||
- [x] Markdown notes, including headings, lists, code blocks, tables and links
|
||||
- [x] HTML notes
|
||||
- [x] Plain text notes
|
||||
- [x] Images and attachments stored in the package
|
||||
|
||||
::: info macOS export folders
|
||||
Files inside a `__MACOSX` folder — the metadata macOS adds when zipping — are ignored automatically, so you can import an archive straight from Finder.
|
||||
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import Markdown files](/importing-notes/import-notes-from-markdown-files) — loose `.md` files instead of packages
|
||||
- [Import HTML files](/importing-notes/import-notes-from-html-files) — for `.html` exports
|
||||
- [Markdown shortcuts](/rich-text-editor/markdown-notes-editing) — writing Markdown once your notes are in
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your TextBundle is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
@@ -1,22 +1,40 @@
|
||||
---
|
||||
title: UpNote
|
||||
description: Export your UpNote notebooks and import them into Notesnook, keeping formatting, images and attachments.
|
||||
pageTitle: How to import UpNote notes into Notesnook
|
||||
keywords:
|
||||
- import upnote notes
|
||||
- upnote to notesnook
|
||||
- upnote alternative
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How to import notes from UpNote notes app?
|
||||
|
||||
The following steps will help you import your notes from UpNote easily.
|
||||
Here is how to move your notes from UpNote into Notesnook.
|
||||
|
||||
1. Download the UpNote desktop app.
|
||||
2. Click on settings icon on the header.
|
||||
3. Go to `General` tab in Settings
|
||||
4. Click on `Export All Notes`.
|
||||
2. Click settings icon on the header.
|
||||
3. Go to `{{general}}` tab in Settings
|
||||
4. Click `Export All Notes`.
|
||||
5. Export from the `Export to HTML` option to download your notes.
|
||||
6. Create a `.zip` file of the exported folder.
|
||||
7. Open the Notesnook app (web or desktop).
|
||||
8. Go to `Settings > Notesnook Importer` and select `UpNote` from list of apps.
|
||||
9. Drop the `.zip` file you exported earlier in the box or click anywhere to open system file picker to select the backup and click "Start processing".
|
||||
8. Go to `Settings > Import & export > Notesnook Importer` and select `UpNote` from list of apps.
|
||||
9. Drop the `.zip` file you exported earlier in the box or click anywhere to open system file picker to select the backup and click "Start importing".
|
||||
10. Once importing completes you should see all your notes in Notesnook. If you face any issues during importing, [report it on github](https://github.com/streetwriters/notesnook).
|
||||
|
||||
## Supported formats
|
||||
|
||||
UpNote's export is a folder with HTML files for each note and a folder for attachments. Make sure to create a `.zip` of the exported folder before importing to Notesnook. The Notesnook Importer preserves all formatting, images, and attachments in the imported notes.
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your UpNote export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
@@ -1,22 +1,39 @@
|
||||
---
|
||||
title: Zoho notebook
|
||||
description: Export your Zoho Notebook notecards and import them into Notesnook in a few steps.
|
||||
pageTitle: How to import Zoho Notebook notes into Notesnook
|
||||
keywords:
|
||||
- import zoho notebook
|
||||
- zoho notebook to notesnook
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# How do I import notes from Zoho notebook?
|
||||
|
||||
The following steps will help you import your notes from Zoho notebook easily.
|
||||
Here is how to move your notes from Zoho Notebook into Notesnook.
|
||||
|
||||
1. Go to Zoho notebook and click on account icon on top right corner.
|
||||

|
||||
1. Go to Zoho notebook and click account icon on top right corner.
|
||||

|
||||
2. From the Side menu, go to Settings.
|
||||

|
||||

|
||||
3. In the Migration section, select "Export".
|
||||

|
||||

|
||||
4. Wait while your notes are exported. Once export completes, download exported .zip file
|
||||

|
||||

|
||||
5. Open the Notesnook app (web or desktop)
|
||||
6. Go to `Settings > Notesnook Importer` and select `Zoho notebook` from the list of apps.
|
||||

|
||||
7. Drop the .zip backup file(s) you exported earlier in the box or click anywhere to open system file picker to select the backup then click start processing.
|
||||

|
||||
6. Go to `Settings > Import & export > Notesnook Importer` and select `Zoho Notebook` from the list of apps.
|
||||

|
||||
7. Drop the .zip backup file(s) you exported earlier in the box or click anywhere to open system file picker to select the backup then click "Start importing".
|
||||

|
||||
8. Once importing completes you should see all your notes in Notesnook. If you face any issues during importing, feel free to [report them on GitHub](https://github.com/streetwriters/notesnook-importer).
|
||||
|
||||
<GetNotesnook title="Your notes, encrypted the moment they land" text="Notesnook imports run entirely on your device — not one byte of your Zoho Notebook export is sent to our servers. Once imported, everything is end-to-end encrypted and syncs to all your devices for free." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Importing notes](/importing-notes/) — every app and file format Notesnook can import
|
||||
- [Import from Evernote](/importing-notes/import-notes-from-evernote) — moving notes out of Evernote
|
||||
- [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) — moving notes out of Google Keep
|
||||
- [Import from Joplin](/importing-notes/import-notes-from-joplin) — moving notes out of Joplin
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — protecting your notes once they're in
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what happens to your notes after the import
|
||||
|
||||
74
docs/help/contents/importing-notes/index.md
Normal file
74
docs/help/contents/importing-notes/index.md
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
title: Importing notes
|
||||
pageTitle: Import notes into Notesnook from any app
|
||||
description: Move your notes into Notesnook from Evernote, Google Keep, Obsidian, Simplenote, Joplin, UpNote and more — or from Markdown, HTML and text files.
|
||||
keywords:
|
||||
- import notes to notesnook
|
||||
- migrate notes app
|
||||
- notesnook importer
|
||||
schema: faq
|
||||
faqs:
|
||||
- q: Is it safe to import my notes into Notesnook?
|
||||
a: Yes. The Notesnook Importer runs entirely on your device. Not a single byte of your export file is sent to Notesnook's servers — the notes are encrypted on your device before anything is synced.
|
||||
- q: Which apps can I import from?
|
||||
a: Evernote, Simplenote, Google Keep, Joplin, Obsidian, ColorNote, UpNote, Zoho Notebook, Fusebase (Nimbus Note) and Skiff Pages, plus plain text, HTML, Markdown and TextBundle files.
|
||||
- q: Can I import notes on my phone?
|
||||
a: No. The Notesnook Importer runs in the web and desktop apps only. Import there, and your notes sync to your phone automatically.
|
||||
- q: Will my notebooks and tags survive the import?
|
||||
a: In most cases yes. Notebooks, tags, attachments and formatting are carried over where the source app's export format includes them; the page for each app lists exactly what is supported.
|
||||
---
|
||||
|
||||
# Import notes from any notes app
|
||||
|
||||
Notesnook supports importing from most of the popular note apps and common export formats such as markdown, html and text files. Imports run **on your device** — your old notes are never uploaded to us in the clear.
|
||||
|
||||
## Try it out
|
||||
|
||||
You can try out the importer by opening the web or desktop app and going to `Settings > Import & export > Notesnook Importer`.
|
||||
|
||||
::: info Import from a computer
|
||||
The Notesnook Importer is available in the **web and desktop apps only**. Import on a computer and your notes will sync down to your phone and tablet automatically.
|
||||
|
||||
:::
|
||||
|
||||
## Supported note apps and formats
|
||||
|
||||
| App or format | Guide |
|
||||
| --------------------------------------- | ------------------------------------------------------------------------------ |
|
||||
| Evernote (`.enex`) | [Import from Evernote](/importing-notes/import-notes-from-evernote) |
|
||||
| Google Keep | [Import from Google Keep](/importing-notes/import-notes-from-googlekeep) |
|
||||
| Simplenote | [Import from Simplenote](/importing-notes/import-notes-from-simplenote) |
|
||||
| Joplin | [Import from Joplin](/importing-notes/import-notes-from-joplin) |
|
||||
| Obsidian | [Import from Obsidian](/importing-notes/import-notes-from-obsidian) |
|
||||
| ColorNote | [Import from ColorNote](/importing-notes/import-notes-from-colornote) |
|
||||
| UpNote | [Import from UpNote](/importing-notes/import-notes-from-upnote) |
|
||||
| Zoho Notebook | [Import from Zoho Notebook](/importing-notes/import-notes-from-zoho-notebook) |
|
||||
| Skiff Pages | [Import from Skiff Pages](/importing-notes/import-notes-from-skiff-pages) |
|
||||
| Fusebase (Nimbus Note) | [Import from Fusebase](/importing-notes/import-notes-from-fusebase) |
|
||||
| TextBundle (`.textbundle`, `.textpack`) | [Import TextBundle files](/importing-notes/import-notes-from-textbundle-files) |
|
||||
| Markdown (`.md`) files | [Import Markdown files](/importing-notes/import-notes-from-markdown-files) |
|
||||
| HTML files | [Import HTML files](/importing-notes/import-notes-from-html-files) |
|
||||
| Plain text (`.txt`) files | [Import plaintext files](/importing-notes/import-notes-from-plaintext-files) |
|
||||
|
||||
**Don't see your notes app?** No worries, create an issue on [Github](https://github.com/streetwriters/notesnook/issues)
|
||||
|
||||
## Is it safe to import?
|
||||
|
||||
Not a single byte of your data from other apps is sent to our servers. Everything is processed 100% on the client side inside this browser.
|
||||
|
||||
Once the import finishes, your notes are [end-to-end encrypted](/how-is-my-data-encrypted) like everything else in Notesnook, and they sync to every device you sign in on.
|
||||
|
||||
## What happens after the import
|
||||
|
||||
- Imported notebooks and tags appear alongside your existing ones — see [organizing with notebooks](/organizing-notes/organize-notes-using-notebooks).
|
||||
- Attachments count towards your [storage limit](/plans-and-limits), so a large Evernote library may need a paid plan.
|
||||
- Take a [backup](/backup-and-restore-notes-in-notesnook) once you're happy with the result.
|
||||
|
||||
<GetNotesnook title="Bring your notes somewhere private" text="Notesnook is free, open source, and encrypts every note on your device before it syncs. Import once and your notes are readable only by you — on every device you own." />
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Exporting notes](/export-notes-from-notesnook) — leaving with your notes takes the same few steps as arriving
|
||||
- [Backup and restore](/backup-and-restore-notes-in-notesnook) — your safety net after a big import
|
||||
- [Attachments & files](/attachments-and-files) — what imported images and files count against
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — what protects your notes once they're in
|
||||
@@ -1 +0,0 @@
|
||||
# Inbox API
|
||||
@@ -1,6 +1,13 @@
|
||||
---
|
||||
title: Getting Started
|
||||
description: Learn about Notesnook's Inbox API.
|
||||
pageTitle: Getting started with the Notesnook Inbox API
|
||||
description: Send notes into your Notesnook account from other apps and services with the Inbox API — enabling it, creating keys, and posting your first note.
|
||||
keywords:
|
||||
- notesnook inbox api
|
||||
- notesnook api
|
||||
- send note to notesnook
|
||||
- notesnook zapier
|
||||
- notesnook inbox api html
|
||||
---
|
||||
|
||||
# Getting started with the Inbox API
|
||||
@@ -22,38 +29,43 @@ Some common use cases include:
|
||||
|
||||
### 1. Enable Inbox API from settings.
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to Settings > Inbox
|
||||
2. Turn on the `Enable Inbox API` toggle
|
||||
1. Go to Settings > Account > Inbox
|
||||
2. Turn on the `{{enableInboxAPI}}` toggle
|
||||
3. Choose whether you want to use your own PGP keypair or let Notesnook autogenerate one for you
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
`Settings > Inbox > Enable Inbox API`.
|
||||
`Settings > Account > Inbox API > Enable Inbox API`.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
> info
|
||||
>
|
||||
> The PGP keys are validated (round-trip encrypt/decrypt) before being saved.
|
||||
::: info
|
||||
The PGP keys are validated (round-trip encrypt/decrypt) before being saved.
|
||||
|
||||
:::
|
||||
|
||||
### 2. Create your Inbox API Key
|
||||
|
||||
A default API key is created automatically when you enable the Inbox API. You can create up to 10 API keys and revoke them individually.
|
||||
You create your own API keys — none is generated for you when you turn the Inbox API on. You can hold up to **10 keys at a time** and revoke them individually, so each service you connect can have its own.
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
Each key gets an expiry: `{{expiryOneDay}}`, `{{expiryOneWeek}}`, `{{expiryOneMonth}}` (the default), `{{expiryOneYear}}`, or `{{never}}`.
|
||||
|
||||
1. Go to Settings > Inbox
|
||||
2. Click `Create Key` in the `API Keys` section
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to Settings > Account > Inbox
|
||||
2. Click `{{createKey}}` in the `{{viewAPIKeys}}` section
|
||||
3. Set a name for the API Key (e.g. Zapier)
|
||||
4. Set an expiry date
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
`Settings > Inbox > View API Keys > +`.
|
||||
`Settings > Account > Inbox API > API Keys > Create Key`.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
### 3. Send data to the Inbox
|
||||
|
||||
@@ -84,9 +96,38 @@ A default API key is created automatically when you enable the Inbox API. You ca
|
||||
| `notebookIds` | string[] | Optional | Array of notebook IDs to assign the note to. |
|
||||
| `tagIds` | string[] | Optional | Array of tag IDs to apply to the note. |
|
||||
|
||||
> info Notebook & Tag IDs
|
||||
>
|
||||
> Notebook and Tag IDs can be found by right-clicking on a notebook/tag and selecting `Copy ID`.
|
||||
::: info Notebook & Tag IDs
|
||||
Notebook and Tag IDs can be found by right clicking on a notebook/tag and selecting `{{copyId}}`.
|
||||
|
||||
:::
|
||||
|
||||
#### What HTML can I send?
|
||||
|
||||
`content.data` is an HTML string, and `content.type` must be `"html"` — it is the only content format the Inbox API accepts. There is no `"text"` or `"markdown"` type, but you can send plain text with no tags in it at all and it becomes a paragraph.
|
||||
|
||||
You don't have to send a fragment. A whole document works too: a `<!doctype>`, `<html>`, `<head>` or `<body>` wrapper is unwrapped for you and only the body content is kept, so you can pipe an email body or a scraped page straight through.
|
||||
|
||||
The HTML is sanitized on your own device, after decryption and before the note is saved. Ordinary document markup survives:
|
||||
|
||||
- headings, paragraphs, lists, tables, blockquotes and preformatted text
|
||||
- inline formatting — `<strong>`, `<em>`, `<u>`, `<s>`, `<code>`, `<sub>`, `<sup>`
|
||||
- links with an `http` or `https` address
|
||||
- images
|
||||
- `<iframe>` with a safe `src`, so embeds are not stripped
|
||||
|
||||
Anything that could run code is removed, and the surrounding text is kept:
|
||||
|
||||
- `<script>` tags and their contents
|
||||
- inline event handlers — `onclick`, `onerror`, `onmouseover` and the rest
|
||||
- `javascript:` and `data:` addresses in `href` and `src`
|
||||
- `<object>`, `<embed>` and `<base>`
|
||||
|
||||
::: warning Unbalanced tags turn the whole note into a code block
|
||||
Your HTML is checked for balanced tags before anything else. An unclosed or mismatched tag anywhere in the payload is **not** repaired — the entire string is escaped and stored as one code block, so the note arrives showing your raw markup instead of formatted text. If a note lands looking like source code, that is why. Close every tag before you post.
|
||||
|
||||
:::
|
||||
|
||||
Notesnook stores the result in its own editor format, so markup is kept to the extent that it maps onto something the editor can represent. Presentational details that have no equivalent — most inline `style` attributes and layout scaffolding, for example — are dropped, and the text and structure remain.
|
||||
|
||||
#### Limits
|
||||
|
||||
@@ -157,9 +198,10 @@ This Zap sends every new email you receive in your Gmail inbox to your Notesnook
|
||||
| Data — `content__data` | _(Gmail)_ Body HTML |
|
||||
| Headers — `Authorization` | `<your-inbox-api-key>` |
|
||||
|
||||
> info
|
||||
>
|
||||
> In Zapier's nested JSON syntax, use double underscores (`__`) to represent nested keys. `content__type` maps to `content.type` and `content__data` maps to `content.data` in the JSON body.
|
||||
::: info
|
||||
In Zapier's nested JSON syntax, use double underscores (`__`) to represent nested keys. `content__type` maps to `content.type` and `content__data` maps to `content.data` in the JSON body.
|
||||
|
||||
:::
|
||||
|
||||
**4. Test and activate the Zap.** Zapier will POST a note to your Notesnook inbox for every matching email. The note will appear after your next sync.
|
||||
|
||||
@@ -178,13 +220,13 @@ This Applet sends any email you forward to your IFTTT trigger address into your
|
||||
|
||||
**3. Configure the Webhooks action:**
|
||||
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------ |
|
||||
| URL | `https://inbox.notesnook.com/` |
|
||||
| Method | `POST` |
|
||||
| Content Type | `application/json` |
|
||||
| Additional Headers | `Authorization: <your-inbox-api-key> |
|
||||
| Body | _(see below)_ |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------- |
|
||||
| URL | `https://inbox.notesnook.com/` |
|
||||
| Method | `POST` |
|
||||
| Content Type | `application/json` |
|
||||
| Additional Headers | `Authorization: <your-inbox-api-key>` |
|
||||
| Body | _(see below)_ |
|
||||
|
||||
Use the following JSON body template, substituting IFTTT ingredients:
|
||||
|
||||
@@ -214,14 +256,50 @@ Inbox uses OpenPGP asymmetric encryption to ensure your data is encrypted before
|
||||
1. **When you enable Inbox from settings:**
|
||||
|
||||
- The client generates an OpenPGP public/private keypair (or you provide your own). The public key is stored on Notesnook's servers. The private key is encrypted with your account's master key before being stored. Notesnook never sees it in plaintext.
|
||||
- You can now generate API keys for the inbox endpoint. These are short tokens (with a fixed lifetime) you paste into Zapier, IFTTT, or your own code. They tell the inbox server which account to deliver the note to. You can create multiple keys (one per service) and revoke them individually without affecting your account.
|
||||
- You can now generate API keys for the inbox endpoint. These are tokens you paste into Zapier, IFTTT, or your own code — each with the expiry you chose, or none at all if you picked `{{never}}`. They tell the inbox server which account to deliver the note to. You can create multiple keys (one per service) and revoke them individually without affecting your account.
|
||||
|
||||
2. **When data is posted to the Inbox API:**
|
||||
|
||||
- The inbox server fetches your PGP public key from Notesnook's API using the provided API key.
|
||||
- Your payload is encrypted using your PGP public key (`alg: pgp-aes256`). The result is an armored PGP ciphertext blob.
|
||||
- The encrypted payload is forwarded to Notesnook's servers and stored in the database. The inbox server never stores your data in plaintext or encrypted. It just acts as a relay.
|
||||
- The encrypted payload is forwarded to Notesnook's servers and stored in the database. The inbox server never stores your data in plaintext or encrypted. It only acts as a relay.
|
||||
|
||||
3. **When your client syncs:**
|
||||
- Encrypted inbox items are pushed to all your connected clients (web, desktop, and mobile) via sync.
|
||||
- Your device decrypts the payload using your PGP private key (decrypted from the master key on-device) and adds the note to your database.
|
||||
|
||||
## When an item fails to arrive
|
||||
|
||||
Every item the Inbox API processes is recorded, and anything that fails is kept with the reason it failed — a decryption failure, invalid JSON, or a payload that didn't match the schema, with the offending field named.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{account}}` > `Inbox`.
|
||||
3. Next to `{{failedInboxItems}}`, click `{{show}}`.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{account}}` > `{{inboxAPI}}`.
|
||||
3. Tap `{{failedInboxItems}}`.
|
||||
|
||||
:::
|
||||
|
||||
You can delete individual entries or clear the whole list. If a service keeps failing, check that `type` is `"note"`, `version` is `1`, and `content.type` is `"html"`.
|
||||
|
||||
A note that arrives as a **code block** full of raw markup is not a failure and won't show up in this list — it means the HTML you sent had an unclosed or mismatched tag. See [what HTML can I send?](#what-html-can-i-send).
|
||||
|
||||
## Turning the Inbox API off
|
||||
|
||||
::: danger Disabling revokes every key
|
||||
Turning off the Inbox API **deletes all your unsynced inbox items and revokes every API key you have created**. Any service still posting to your inbox will start getting `401 unauthorized`, and you will have to create new keys and update every integration if you turn it back on.
|
||||
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Self-hosting the Inbox API](/inbox-api/self-hosting-inbox-api) — running the relay yourself
|
||||
- [Account settings](/account-settings) — email, password and profile
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — the encryption behind every note
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
---
|
||||
title: Self-Hosting Inbox API
|
||||
description: Learn about self-hosting Notesnook's Inbox API.
|
||||
pageTitle: Self-host the Notesnook Inbox API
|
||||
description: Run your own Notesnook Inbox API server so inbound notes never touch Notesnook's infrastructure, and point the apps at it.
|
||||
keywords:
|
||||
- self host inbox api
|
||||
- notesnook inbox server
|
||||
- notesnook self hosting
|
||||
---
|
||||
|
||||
# Self-Hosting Inbox API
|
||||
@@ -18,9 +23,10 @@ The inbox server is a lightweight proxy: it fetches your PGP public key from Not
|
||||
|
||||
The source code and setup instructions are available in the [notesnook-sync-server](https://github.com/streetwriters/notesnook-sync-server/tree/master/Notesnook.Inbox.API) repository. Once running, replace `https://inbox.notesnook.com/` with your own instance URL in any API calls or automation tools.
|
||||
|
||||
> info
|
||||
>
|
||||
> Even on Notesnook's hosted instance, your payload is encrypted with your PGP public key before it leaves the server — it cannot be read in transit or at rest.
|
||||
::: info
|
||||
Even on Notesnook's hosted instance, your payload is encrypted with your PGP public key before it leaves the server — it cannot be read in transit or at rest.
|
||||
|
||||
:::
|
||||
|
||||
## Option 2: Encrypt locally and post directly
|
||||
|
||||
@@ -124,6 +130,13 @@ Usage:
|
||||
./send-to-notesnook.sh "Meeting notes" "<p>Discussed the Q4 roadmap.</p>"
|
||||
```
|
||||
|
||||
> info
|
||||
>
|
||||
> After rotating your PGP keys in Notesnook settings, re-fetch the public key (Step 1) and re-import it before encrypting new payloads.
|
||||
::: info
|
||||
After rotating your PGP keys in Notesnook settings, re-fetch the public key (Step 1) and re-import it before encrypting new payloads.
|
||||
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Inbox API](/inbox-api/getting-started) — sending notes in from other services
|
||||
- [Self-hosting](/self-hosting) — running your own servers
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — the encryption behind every note
|
||||
|
||||
73
docs/help/contents/index.md
Normal file
73
docs/help/contents/index.md
Normal file
@@ -0,0 +1,73 @@
|
||||
---
|
||||
layout: home
|
||||
title: Notesnook Help
|
||||
description: Your complete and free resource to using Notesnook as a daily note taking app to organize your work and life while safeguarding your privacy.
|
||||
|
||||
hero:
|
||||
name: Notesnook Help
|
||||
tagline: Helping you discover everything you can do with Notesnook
|
||||
image:
|
||||
src: /logo.png
|
||||
alt: Notesnook
|
||||
actions:
|
||||
- theme: brand
|
||||
text: Go to docs
|
||||
link: /docs
|
||||
- theme: alt
|
||||
text: Create your first note
|
||||
link: /create-a-note-in-notesnook
|
||||
- theme: alt
|
||||
text: Download Notesnook
|
||||
link: https://notesnook.com/downloads
|
||||
|
||||
features:
|
||||
- title: Organize your notes
|
||||
details: Notebooks, tags, colors, favorites, pins and the side menu — pick the structure that fits your work.
|
||||
link: /organizing-notes/organize-notes-using-notebooks
|
||||
linkText: Start with notebooks
|
||||
- title: Write and format
|
||||
details: The editor toolbar, markdown shortcuts, tables and task lists, on every platform.
|
||||
link: /rich-text-editor/rich-text-editor-toolbar
|
||||
linkText: Open the editor guide
|
||||
- title: Bring your notes over
|
||||
details: Import from Evernote, Google Keep, Obsidian, Joplin, Simplenote and plain markdown or HTML files.
|
||||
link: /importing-notes/
|
||||
linkText: Import your notes
|
||||
- title: Keep your notes safe
|
||||
details: Backups, restore, the private vault, app lock and how your data is encrypted end-to-end.
|
||||
link: /backup-and-restore-notes-in-notesnook
|
||||
linkText: Back up your notes
|
||||
- title: Recover your account
|
||||
details: What to do when you forget your password, and what your recovery key protects.
|
||||
link: /recovering-your-account
|
||||
linkText: Recover an account
|
||||
- title: Publish with Monographs
|
||||
details: Share a note as a link — optionally encrypted with a password only your reader knows.
|
||||
link: /publish-notes-with-monographs
|
||||
linkText: Publish a note
|
||||
---
|
||||
|
||||
<div class="vp-doc nn-home-note">
|
||||
|
||||
Notesnook is a free and open source note taking app focused on user privacy and ease of use. Everything is encrypted on your device with `XChaCha20-Poly1305` and `Argon2` before it ever leaves it — which also means nobody at Notesnook can read your notes, or recover them for you.
|
||||
|
||||
Can't find what you're looking for? [Contact us](https://notesnook.com/contact-us) or [open an issue](https://github.com/streetwriters/notesnook/issues/new/choose).
|
||||
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.nn-home-note {
|
||||
max-width: 768px;
|
||||
margin: 64px auto 0;
|
||||
padding: 32px 24px 72px;
|
||||
border-top: 1px solid var(--vp-c-divider);
|
||||
color: var(--vp-c-text-2);
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.nn-home-note {
|
||||
margin-top: 40px;
|
||||
padding-bottom: 56px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,86 +1,99 @@
|
||||
---
|
||||
title: Keyboard Shortcuts
|
||||
description: Keyboard shortcuts for Notesnook
|
||||
title: Keyboard shortcuts
|
||||
pageTitle: Every keyboard shortcut in Notesnook
|
||||
description: The complete list of Notesnook keyboard shortcuts for web, Windows, Linux and macOS — navigation, the editor, formatting and note actions.
|
||||
keywords:
|
||||
- notesnook keyboard shortcuts
|
||||
- notesnook hotkeys
|
||||
- notes app shortcuts
|
||||
---
|
||||
|
||||
# Keyboard shortcuts
|
||||
|
||||
The following keyboard shortcuts will help you navigate Notesnook faster.
|
||||
These are all the keyboard shortcuts the Notesnook desktop and web apps respond to, grouped by what they do. Press `Ctrl` `/` (`⌘` `/` on macOS) inside the app to bring the same list up.
|
||||
|
||||
### General
|
||||
## General
|
||||
|
||||
| Description | Web | Windows/Linux | Mac |
|
||||
| --- | --- | --- | --- |
|
||||
| Search in notes list view if editor is not focused | Ctrl F | Ctrl F | ⌘ F |
|
||||
| Settings | Ctrl , | Ctrl , | ⌘ , |
|
||||
| Keyboard shortcuts | Ctrl / | Ctrl / | ⌘ / |
|
||||
| New note | - | Ctrl N | ⌘ N |
|
||||
| Description | Web | Windows/Linux | Mac |
|
||||
| -------------------------------------------------- | ------ | ------------- | --- |
|
||||
| Search in notes list view if editor is not focused | Ctrl F | Ctrl F | ⌘ F |
|
||||
| Settings | Ctrl , | Ctrl , | ⌘ , |
|
||||
| Keyboard shortcuts | Ctrl / | Ctrl / | ⌘ / |
|
||||
| New note | - | Ctrl N | ⌘ N |
|
||||
|
||||
### Navigation
|
||||
## Navigation
|
||||
|
||||
| Description | Web | Windows/Linux | Mac |
|
||||
| --- | --- | --- | --- |
|
||||
| Next tab | Ctrl Alt → / Ctrl Alt ⇧ → | Ctrl tab | ⌘ tab |
|
||||
| Previous tab | Ctrl Alt ← / Ctrl Alt ⇧ ← | Ctrl ⇧ tab | ⌘ ⇧ tab |
|
||||
| Command palette | Ctrl ⇧ P / Ctrl ⇧ : | Ctrl ⇧ P / Ctrl ⇧ : | ⌘ ⇧ P / ⌘ ⇧ : |
|
||||
| Quick open | Ctrl P | Ctrl P | ⌘ P |
|
||||
| New tab | - | Ctrl T | ⌘ T |
|
||||
| Close active tab | - | Ctrl W | ⌘ W |
|
||||
| Close all tabs | - | Ctrl ⇧ W | ⌘ ⇧ W |
|
||||
| Description | Web | Windows/Linux | Mac |
|
||||
| ---------------- | ------------------------- | ------------------- | ------------- |
|
||||
| Next tab | Ctrl Alt → / Ctrl Alt ⇧ → | Ctrl tab | ⌘ tab |
|
||||
| Previous tab | Ctrl Alt ← / Ctrl Alt ⇧ ← | Ctrl ⇧ tab | ⌘ ⇧ tab |
|
||||
| Command palette | Ctrl ⇧ P / Ctrl ⇧ : | Ctrl ⇧ P / Ctrl ⇧ : | ⌘ ⇧ P / ⌘ ⇧ : |
|
||||
| Quick open | Ctrl P | Ctrl P | ⌘ P |
|
||||
| New tab | - | Ctrl T | ⌘ T |
|
||||
| Close active tab | - | Ctrl W | ⌘ W |
|
||||
| Close all tabs | - | Ctrl ⇧ W | ⌘ ⇧ W |
|
||||
|
||||
### Editor
|
||||
## Editor
|
||||
|
||||
| Description | Web | Windows/Linux | Mac |
|
||||
| --- | --- | --- | --- |
|
||||
| Add attachment | Ctrl ⇧ A | Ctrl ⇧ A | ⌘ ⇧ A |
|
||||
| Insert blockquote | Ctrl ⇧ B | Ctrl ⇧ B | ⌘ ⇧ B |
|
||||
| Toggle bold | Ctrl B | Ctrl B | ⌘ B |
|
||||
| Toggle bullet list | Ctrl ⇧ 8 | Ctrl ⇧ 8 | ⌘ ⇧ 8 |
|
||||
| Toggle check list | Ctrl ⇧ 9 | Ctrl ⇧ 9 | ⌘ ⇧ 9 |
|
||||
| Split list item | ↵ | ↵ | ↵ |
|
||||
| Lift list item | ⇧ Tab | ⇧ Tab | ⇧ Tab |
|
||||
| Sink list item | Ctrl ⇧ Down | Ctrl ⇧ Down | ⌘ ⇧ Down |
|
||||
| Toggle code | Ctrl E | Ctrl E | ⌘ E |
|
||||
| Toggle code block | Ctrl ⇧ C | Ctrl ⇧ C | ⌘ ⇧ C |
|
||||
| Insert date | Alt D | Alt D | ⌥ D |
|
||||
| Insert time | Alt T | Alt T | ⌥ T |
|
||||
| Insert date and time | Ctrl Alt D | Ctrl Alt D | ⌘ ⌥ D |
|
||||
| Insert date and time with timezone | Ctrl Alt Z | Ctrl Alt Z | ⌘ ⌥ Z |
|
||||
| Increase font size | Ctrl [ | Ctrl [ | ⌘ [ |
|
||||
| Decrease font size | Ctrl ] | Ctrl ] | ⌘ ] |
|
||||
| Insert paragraph | Ctrl Alt 0 | Ctrl Alt 0 | ⌘ ⌥ 0 |
|
||||
| Insert heading 1 | Ctrl Alt 1 | Ctrl Alt 1 | ⌘ ⌥ 1 |
|
||||
| Insert heading 2 | Ctrl Alt 2 | Ctrl Alt 2 | ⌘ ⌥ 2 |
|
||||
| Insert heading 3 | Ctrl Alt 3 | Ctrl Alt 3 | ⌘ ⌥ 3 |
|
||||
| Insert heading 4 | Ctrl Alt 4 | Ctrl Alt 4 | ⌘ ⌥ 4 |
|
||||
| Insert heading 5 | Ctrl Alt 5 | Ctrl Alt 5 | ⌘ ⌥ 5 |
|
||||
| Insert heading 6 | Ctrl Alt 6 | Ctrl Alt 6 | ⌘ ⌥ 6 |
|
||||
| Undo | Ctrl Z | Ctrl Z | ⌘ Z |
|
||||
| Redo | Ctrl ⇧ Z / Ctrl Y | Ctrl ⇧ Z / Ctrl Y | ⌘ ⇧ Z / ⌘ Y |
|
||||
| Add image | Ctrl ⇧ I | Ctrl ⇧ I | ⌘ ⇧ I |
|
||||
| Toggle italic | Ctrl I | Ctrl I | ⌘ I |
|
||||
| Remove formatting in selection | Ctrl \ | Ctrl \ | ⌘ \ |
|
||||
| Insert internal link | Ctrl ⇧ K | Ctrl ⇧ K | ⌘ ⇧ K |
|
||||
| Insert link | Ctrl K | Ctrl K | ⌘ K |
|
||||
| Insert math block | Ctrl ⇧ M | Ctrl ⇧ M | ⌘ ⇧ M |
|
||||
| Toggle ordered list | Ctrl ⇧ 7 | Ctrl ⇧ 7 | ⌘ ⇧ 7 |
|
||||
| Toggle outline list | Ctrl ⇧ O | Ctrl ⇧ O | ⌘ ⇧ O |
|
||||
| Toggle outline list expand | Ctrl Space | Ctrl Space | ⌘ Space |
|
||||
| Open search | Ctrl F | Ctrl F | ⌘ F |
|
||||
| Open search and replace | Ctrl Alt F | Ctrl Alt F | ⌘ ⌥ F |
|
||||
| Toggle strike | Ctrl ⇧ S | Ctrl ⇧ S | ⌘ ⇧ S |
|
||||
| Toggle subscript | Ctrl , | Ctrl , | ⌘ , |
|
||||
| Toggle superscript | Ctrl . | Ctrl . | ⌘ . |
|
||||
| Toggle task list | Ctrl ⇧ T | Ctrl ⇧ T | ⌘ ⇧ T |
|
||||
| Text align center | Ctrl ⇧ E | Ctrl ⇧ E | ⌘ ⇧ E |
|
||||
| Text align justify | Ctrl ⇧ J | Ctrl ⇧ J | ⌘ ⇧ J |
|
||||
| Text align left | Ctrl ⇧ L | Ctrl ⇧ L | ⌘ ⇧ L |
|
||||
| Text align right | Ctrl ⇧ R | Ctrl ⇧ R | ⌘ ⇧ R |
|
||||
| Underline | Ctrl U | Ctrl U | ⌘ U |
|
||||
| Toggle highlight | Ctrl Alt H | Ctrl Alt H | ⌘ ⌥ H |
|
||||
| Toggle text color | Ctrl Alt C | Ctrl Alt C | ⌘ ⌥ C |
|
||||
| Move line up | Alt ↑ | Alt ↑ | ⌥ ↑ |
|
||||
| Move line down | Alt ↓ | Alt ↓ | ⌥ ↓ |
|
||||
| Move parent node up | Alt ⇧ ↑ | Alt ⇧ ↑ | ⌥ ⇧ ↑ |
|
||||
| Move parent node down | Alt ⇧ ↓ | Alt ⇧ ↓ | ⌥ ⇧ ↓ |
|
||||
| Clear current line | Ctrl L | Ctrl L | ⌘ L |
|
||||
| Description | Web | Windows/Linux | Mac |
|
||||
| ---------------------------------- | ----------------- | ----------------- | ----------- |
|
||||
| Add attachment | Ctrl ⇧ A | Ctrl ⇧ A | ⌘ ⇧ A |
|
||||
| Insert blockquote | Ctrl ⇧ B | Ctrl ⇧ B | ⌘ ⇧ B |
|
||||
| Toggle bold | Ctrl B | Ctrl B | ⌘ B |
|
||||
| Toggle bullet list | Ctrl ⇧ 8 | Ctrl ⇧ 8 | ⌘ ⇧ 8 |
|
||||
| Toggle check list | Ctrl ⇧ 9 | Ctrl ⇧ 9 | ⌘ ⇧ 9 |
|
||||
| Split list item | ↵ | ↵ | ↵ |
|
||||
| Lift list item | ⇧ Tab | ⇧ Tab | ⇧ Tab |
|
||||
| Sink list item | Tab | Tab | Tab |
|
||||
| Toggle code | Ctrl E | Ctrl E | ⌘ E |
|
||||
| Toggle code block | Ctrl ⇧ C | Ctrl ⇧ C | ⌘ ⇧ C |
|
||||
| Insert date | Alt D | Alt D | ⌥ D |
|
||||
| Insert time | Alt T | Alt T | ⌥ T |
|
||||
| Insert date and time | Ctrl Alt D | Ctrl Alt D | ⌘ ⌥ D |
|
||||
| Insert date and time with timezone | Ctrl Alt Z | Ctrl Alt Z | ⌘ ⌥ Z |
|
||||
| Increase font size | Ctrl [ | Ctrl [ | ⌘ [ |
|
||||
| Decrease font size | Ctrl ] | Ctrl ] | ⌘ ] |
|
||||
| Insert paragraph | Ctrl Alt 0 | Ctrl Alt 0 | ⌘ ⌥ 0 |
|
||||
| Insert heading 1 | Ctrl Alt 1 | Ctrl Alt 1 | ⌘ ⌥ 1 |
|
||||
| Insert heading 2 | Ctrl Alt 2 | Ctrl Alt 2 | ⌘ ⌥ 2 |
|
||||
| Insert heading 3 | Ctrl Alt 3 | Ctrl Alt 3 | ⌘ ⌥ 3 |
|
||||
| Insert heading 4 | Ctrl Alt 4 | Ctrl Alt 4 | ⌘ ⌥ 4 |
|
||||
| Insert heading 5 | Ctrl Alt 5 | Ctrl Alt 5 | ⌘ ⌥ 5 |
|
||||
| Insert heading 6 | Ctrl Alt 6 | Ctrl Alt 6 | ⌘ ⌥ 6 |
|
||||
| Undo | Ctrl Z | Ctrl Z | ⌘ Z |
|
||||
| Redo | Ctrl ⇧ Z / Ctrl Y | Ctrl ⇧ Z / Ctrl Y | ⌘ ⇧ Z / ⌘ Y |
|
||||
| Add image | Ctrl ⇧ I | Ctrl ⇧ I | ⌘ ⇧ I |
|
||||
| Toggle italic | Ctrl I | Ctrl I | ⌘ I |
|
||||
| Remove formatting in selection | Ctrl \ | Ctrl \ | ⌘ \ |
|
||||
| Insert internal link | Ctrl ⇧ K | Ctrl ⇧ K | ⌘ ⇧ K |
|
||||
| Insert link | Ctrl K | Ctrl K | ⌘ K |
|
||||
| Insert math block | Ctrl ⇧ M | Ctrl ⇧ M | ⌘ ⇧ M |
|
||||
| Toggle ordered list | Ctrl ⇧ 7 | Ctrl ⇧ 7 | ⌘ ⇧ 7 |
|
||||
| Toggle outline list | Ctrl ⇧ O | Ctrl ⇧ O | ⌘ ⇧ O |
|
||||
| Toggle outline list expand | Ctrl Space | Ctrl Space | ⌘ Space |
|
||||
| Open search | Ctrl F | Ctrl F | ⌘ F |
|
||||
| Open search and replace | Ctrl Alt F | Ctrl Alt F | ⌘ ⌥ F |
|
||||
| Toggle strike | Ctrl ⇧ S | Ctrl ⇧ S | ⌘ ⇧ S |
|
||||
| Toggle subscript | Ctrl , | Ctrl , | ⌘ , |
|
||||
| Toggle superscript | Ctrl . | Ctrl . | ⌘ . |
|
||||
| Toggle task list | Ctrl ⇧ T | Ctrl ⇧ T | ⌘ ⇧ T |
|
||||
| Text align center | Ctrl ⇧ E | Ctrl ⇧ E | ⌘ ⇧ E |
|
||||
| Text align justify | Ctrl ⇧ J | Ctrl ⇧ J | ⌘ ⇧ J |
|
||||
| Text align left | Ctrl ⇧ L | Ctrl ⇧ L | ⌘ ⇧ L |
|
||||
| Text align right | Ctrl ⇧ R | Ctrl ⇧ R | ⌘ ⇧ R |
|
||||
| Underline | Ctrl U | Ctrl U | ⌘ U |
|
||||
| Toggle highlight | Ctrl Alt H | Ctrl Alt H | ⌘ ⌥ H |
|
||||
| Toggle text color | Ctrl Alt C | Ctrl Alt C | ⌘ ⌥ C |
|
||||
| Move line up | Alt ↑ | Alt ↑ | ⌥ ↑ |
|
||||
| Move line down | Alt ↓ | Alt ↓ | ⌥ ↓ |
|
||||
| Move parent node up | Alt ⇧ ↑ | Alt ⇧ ↑ | ⌥ ⇧ ↑ |
|
||||
| Move parent node down | Alt ⇧ ↓ | Alt ⇧ ↓ | ⌥ ⇧ ↓ |
|
||||
| Clear current line | Ctrl L | Ctrl L | ⌘ L |
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Editor toolbar](/rich-text-editor/rich-text-editor-toolbar) — the same actions as buttons, and how to rearrange them
|
||||
- [Markdown shortcuts](/rich-text-editor/markdown-notes-editing) — formatting that triggers as you type
|
||||
- [Find & replace](/rich-text-editor/search-and-replace) — searching inside the note you are editing
|
||||
- [Search & navigation](/search-and-navigation) — the command palette and quick open
|
||||
- [Tabs & panes](/rich-text-editor/editor-tabs-and-panes) — moving between open notes
|
||||
|
||||
@@ -1,51 +1,65 @@
|
||||
---
|
||||
title: Locking notes with private vault
|
||||
description: Password protect your most important and sensitive notes with private vault and store them encrypted even on your device.
|
||||
pageTitle: How do I password protect a note in Notesnook?
|
||||
description: Lock individual notes behind a second password with the Notesnook private vault, unlock with biometrics, and change or clear the vault.
|
||||
keywords:
|
||||
- password protect notes
|
||||
- notesnook vault
|
||||
- lock a note
|
||||
- private notes app
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Locking notes
|
||||
|
||||
Notesnook is a private notes app. All your notes are encrypted and secure by default. We can not read your notes even if we want to on our servers. However you can still add an extra layer of security and encrypt your most important and sensitive notes by adding them to a vault.
|
||||
Notesnook is a private notes app: every note is encrypted by default, and nobody here can read your notes on our servers even if we wanted to. However you can still add an extra layer of security and encrypt your most important and sensitive notes by adding them to a vault.
|
||||
|
||||
Adding notes to private vault is useful when you do not want anyone to read your notes, _even if they have access to your phone_.
|
||||
|
||||
## Creating a vault
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to Settings
|
||||
2. Go to `Vault` in `Security & privacy` section
|
||||
3. Click on `Create` button
|
||||
1. Go to `{{settings}}`.
|
||||
2. Go to `{{vault}}` in `{{privacyAndSecurity}}` section
|
||||
3. Click `{{create}}` button
|
||||
4. Enter the password for your vault (this password will be used to open all locked notes)
|
||||
5. Click on `Create` in the dialog to create the vault.
|
||||
5. Click `{{create}}` in the dialog to create the vault.
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Go to Settings from Sidebar
|
||||
2. Scroll down to `Privacy and Security` section
|
||||
3. Tap on `Create vault`
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{privacyAndSecurity}}`
|
||||
3. Tap `{{createVault}}`
|
||||
4. Enter password for the vault (this password will be used to open all locked notes)
|
||||
5. Tap on `Create` button to create the vault.
|
||||
5. Tap `{{create}}` button to create the vault.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## Lock a note
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Right click on any note
|
||||
2. Select `Lock` from the context menu
|
||||
1. Right click any note
|
||||
2. Select `{{lock}}` from the context menu
|
||||
3. Enter the password for the vault
|
||||
4. Press `Enter` key to lock the note
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Tap the  button on a note
|
||||
2. Tap on `Lock` button in the note properties
|
||||
2. Tap `{{lock}}` button in the note properties
|
||||
3. Enter password for the vault
|
||||
4. Press on `Lock` to add note to vault.
|
||||
4. Tap `{{lock}}` to add note to vault.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
::: danger Locking a note deletes its history
|
||||
When a note moves into the vault, every stored [version of that note](/note-version-history) is deleted. Restore or copy anything you still need from history **before** you lock it.
|
||||
|
||||
:::
|
||||
|
||||
## Open/edit/delete a locked note
|
||||
|
||||
@@ -53,79 +67,126 @@ To open, edit or delete a locked note, you must provide the password for the vau
|
||||
|
||||
## Unlock a note permanently
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Right click on any note
|
||||
2. Select `Unlock` from the context menu
|
||||
1. Right click any note
|
||||
2. Click `{{lock}}` again — while a note is locked, a checkmark shows next to it
|
||||
3. Enter the password for the vault in dialog.
|
||||
4. Click on Unlock to remove note from vault
|
||||
4. Click `{{unlock}}` to remove note from vault
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Tap the  button on a note
|
||||
2. Tap on `Unlock` button in the note properties
|
||||
2. Tap `{{unlock}}` button in the note properties
|
||||
3. Enter password for the vault
|
||||
4. Tap on `Unlock` to remove note from vault.
|
||||
4. Tap `{{unlock}}` to remove note from vault.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## How long the vault stays unlocked
|
||||
|
||||
Once you enter your vault password, the vault stays unlocked for a while so you aren't retyping it for every note. You choose how long.
|
||||
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{vault}}`.
|
||||
3. Set `{{lockVaultAfter}}` to `1`, `5`, `10`, `15`, `30`, `45` minutes, `1 hour` or `Never`.
|
||||
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{privacyAndSecurity}}` > `{{vault}}`.
|
||||
3. Set `{{lockVaultAfter}}`.
|
||||
|
||||
:::
|
||||
|
||||
`{{never}}` keeps the vault open until you close the app or lock it yourself. The setting only appears once a vault exists.
|
||||
|
||||
## Unlock with biometrics
|
||||
|
||||
On mobile you can open locked notes with your fingerprint or face instead of typing the vault password. Turn on `{{biometricUnlock}}` in `{{settings}}` > `{{privacyAndSecurity}}` > `{{vault}}` — you unlock with your password once, and it is then stored in the device's own secure keystore, tied to that device. The toggle only appears if the device has biometrics available.
|
||||
|
||||
::: warning Biometrics are per device
|
||||
Turning biometrics on doesn't replace your vault password, and it doesn't travel with your account. On a new device you'll be asked for the password again — so don't rely on biometrics as your only copy of it.
|
||||
|
||||
:::
|
||||
|
||||
## Change vault password
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to Settings
|
||||
2. Go to `Vault` in `Security & privacy` section
|
||||
3. Click on `Change` button next to `Change vault password` heading
|
||||
1. Go to `{{settings}}`.
|
||||
2. Go to `{{vault}}` in `{{privacyAndSecurity}}` section
|
||||
3. Click `{{change}}` button next to `{{changeVaultPassword}}` heading
|
||||
4. Enter the old and new password for the vault
|
||||
5. Click on `Change password` to update the password
|
||||
5. Click `{{changePassword}}` to update the password
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Go to Settings from Sidebar.
|
||||
2. Scroll down to `Privacy and Security` section
|
||||
3. Tap on `Vault`
|
||||
4. Press on `Change vault password`
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{privacyAndSecurity}}`
|
||||
3. Tap `{{vault}}`
|
||||
4. Tap `{{changeVaultPassword}}`
|
||||
5. Enter the old and new password for the vault
|
||||
6. Click on Change to update password
|
||||
6. Tap `{{change}}` to update the password
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## Clear vault
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to Settings
|
||||
2. Go to `Vault` in `Security & privacy` section
|
||||
3. Click on `Clear` button next to `Clear vault` heading
|
||||
4. Enter your vault password and click on clear vault. All notes in the vault will be deleted.
|
||||
1. Go to `{{settings}}`.
|
||||
2. Go to `{{vault}}` in `{{privacyAndSecurity}}` section
|
||||
3. Click `{{clear}}` button next to `{{clearVault}}` heading
|
||||
4. Enter your vault password and click clear vault. All notes in the vault will be deleted.
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
== Mobile
|
||||
|
||||
1. Go to Settings from Sidebar.
|
||||
2. Scroll down to `Privacy and Security` section
|
||||
3. Tap on `Vault`
|
||||
4. Tap on `Clear vault`
|
||||
5. Enter your vault password and tap on `Clear`. All notes in the vault will be deleted.
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{privacyAndSecurity}}`
|
||||
3. Tap `{{vault}}`
|
||||
4. Tap `{{clearVault}}`
|
||||
5. Enter your vault password and tap `{{clear}}`. All notes in the vault will be deleted.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## Delete vault
|
||||
|
||||
In the event that you have forgotten your vault password, you can delete the vault and (optionally) delete all the notes in it.
|
||||
|
||||
# [Desktop/Web](#/tab/web)
|
||||
::: danger Permanent data loss
|
||||
Deleting the vault only requires your account password, but if you also choose to delete all the notes in it, those notes are permanently and irrecoverably destroyed. Because of end-to-end encryption, there is no way for Notesnook to recover a forgotten vault password or restore deleted vault notes afterwards.
|
||||
|
||||
1. Go to Settings
|
||||
2. Go to `Vault` in `Security & privacy` section
|
||||
3. Click on `Delete` button next to `Delete vault` heading
|
||||
4. Enter your account password and click on `Delete vault` to delete the vault
|
||||
:::
|
||||
|
||||
# [Mobile](#/tab/mobile)
|
||||
:::tabs key:platform
|
||||
== Desktop/Web
|
||||
|
||||
1. Go to Settings from Sidebar.
|
||||
2. Scroll down to `Privacy and Security` section
|
||||
3. Tap on `Vault`
|
||||
4. Tap on `Delete vault`
|
||||
5. Enter your account password and tap on `Delete` to delete the vault
|
||||
1. Go to `{{settings}}`.
|
||||
2. Go to `{{vault}}` in `{{privacyAndSecurity}}` section
|
||||
3. Click `{{delete}}` button next to `{{deleteVault}}` heading
|
||||
4. Enter your account password and click `{{deleteVault}}` to delete the vault
|
||||
|
||||
---
|
||||
== Mobile
|
||||
|
||||
1. Go to `{{settings}}`.
|
||||
2. Open `{{privacyAndSecurity}}`
|
||||
3. Tap `{{vault}}`
|
||||
4. Tap `{{deleteVault}}`
|
||||
5. Enter your account password and tap `{{delete}}` to delete the vault
|
||||
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [App lock](/app-lock) — locking the whole app
|
||||
- [How is my data encrypted?](/how-is-my-data-encrypted) — the encryption behind every note
|
||||
- [Version history](/note-version-history) — going back to an earlier draft
|
||||
- [Privacy mode](/privacy-mode) — blocking screenshots and screen sharing
|
||||
- [Recovering your account](/recovering-your-account) — when you forget your password
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
# Mobile integration
|
||||
@@ -0,0 +1,67 @@
|
||||
---
|
||||
title: Android quick actions
|
||||
pageTitle: Notesnook quick actions on Android
|
||||
description: Start a note from the Android quick settings tile or the share sheet, and pin notes, notebooks and tags to your launcher.
|
||||
keywords:
|
||||
- notesnook android quick settings tile
|
||||
- notesnook android shortcut
|
||||
- notesnook make note share
|
||||
- pin note to android home screen
|
||||
---
|
||||
|
||||
# Quick actions on Android
|
||||
|
||||
::: info This page is Android only.
|
||||
The iOS app has its own share extension — see [share things from other apps.](/mobile-integration/share-things-from-other-apps)
|
||||
|
||||
:::
|
||||
|
||||
Android gives Notesnook three ways to start writing without opening the app first, plus a way to pin any note, notebook, tag or color to your launcher.
|
||||
|
||||
## Add the quick settings tile
|
||||
|
||||
Notesnook ships a quick settings tile labelled `{{newNote}}`. Tapping it collapses the shade and opens the same quick-compose screen the `Make Note` share target uses.
|
||||
|
||||
1. Pull down the notification shade twice to show the full quick settings panel.
|
||||
2. Tap the edit (pencil) button to see the available tiles.
|
||||
3. Drag the `{{newNote}}` tile into your active tiles.
|
||||
4. Tap it any time to start a note.
|
||||
|
||||
The tile requires Android 7.0 or newer.
|
||||
|
||||
<!-- TODO: screenshot — the New note tile in the Android quick settings editor -->
|
||||
|
||||
## Send text and files to Notesnook with "Make Note"
|
||||
|
||||
Notesnook registers as a share target under the name **Make Note**, for text, images, video and other files, including multiple items at once.
|
||||
|
||||
1. In any app, tap `{{share}}`.
|
||||
2. Choose `Make Note` from the share sheet.
|
||||
3. Edit the note that opens, then save it.
|
||||
|
||||
The same **Make Note** action appears in the text selection menu: highlight text anywhere in Android, tap the overflow (⋮) in the selection toolbar, and choose `Make Note` to drop the selection into a new note.
|
||||
|
||||
Details on what gets saved are on [share things from other apps](/mobile-integration/share-things-from-other-apps).
|
||||
|
||||
## Pin a note, notebook or tag to your launcher <PlanTag plan="pro" note="Android only" />
|
||||
|
||||
You can put a note, notebook, tag or color on your home screen as its own icon. Tapping it opens that item directly in Notesnook.
|
||||
|
||||
1. Long press the note, notebook, tag or color — or open its ⋮ menu.
|
||||
2. Tap `{{addToHome}}`.
|
||||
3. Android asks whether to add the shortcut. Confirm it.
|
||||
|
||||
The shortcut gets a generated icon based on the item's title and color, and its long label is the note headline or the notebook description. Pinned shortcuts need Android 8.0 or newer.
|
||||
|
||||
::: info What happens if your plan expires
|
||||
Launcher shortcuts are a Pro feature. See [plans & limits](/plans-and-limits) for everything each plan unlocks.
|
||||
|
||||
:::
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Share things from other apps](/mobile-integration/share-things-from-other-apps) — what the Make Note share target saves
|
||||
- [Quick notes from notifications](/mobile-integration/quick-note-from-notification) — write from the notification shade
|
||||
- [Home screen widgets](/mobile-integration/home-screen-widgets) — the quick note, note preview and reminder widgets
|
||||
- [Pin notes to notifications](/mobile-integration/pin-notes-to-notifications) — keep a note in your notification shade
|
||||
- [Plans & limits](/plans-and-limits) — which of these need a paid plan
|
||||
@@ -1,25 +1,83 @@
|
||||
---
|
||||
title: Home screen widgets
|
||||
pageTitle: Notesnook home screen widgets on Android and iOS
|
||||
description: Add the Notesnook quick note, note preview and reminders widgets to your Android or iOS home screen, and pick which note a widget shows.
|
||||
keywords:
|
||||
- notesnook widget
|
||||
- android notes widget
|
||||
- ios notes widget
|
||||
- quick note widget
|
||||
schema: howto
|
||||
---
|
||||
|
||||
# Home screen widgets
|
||||
|
||||
Basic home screen widgets are availble on both Android & iOS for quick note taking.
|
||||
Basic home screen widgets are available on both Android and iOS for quick note taking.
|
||||
|
||||
# [iOS](#/tab/ios)
|
||||
:::tabs key:platform
|
||||
== iOS
|
||||
|
||||
1. Long press on home screen
|
||||
2. Tap on the + button on top left
|
||||
1. Long press home screen
|
||||
2. Tap the + button on top left
|
||||
3. Select Notesnook Quick Note widget and add it to home screen
|
||||
|
||||

|
||||

|
||||
|
||||
4. Tap on the widget to directly launch the editor in the app.
|
||||
4. Tap the widget to directly launch the editor in the app.
|
||||
|
||||
# [Android](#/tab/android)
|
||||
== Android
|
||||
|
||||
1. Long press on home screen
|
||||
2. Tap on widgets
|
||||
1. Long press home screen
|
||||
2. Tap widgets
|
||||
3. Add Notesnook widget to home screen
|
||||
|
||||

|
||||

|
||||
|
||||
4. Tap on the widget to quickly take a note without launching the app.
|
||||
4. Tap the widget to quickly take a note without launching the app.
|
||||
|
||||
---
|
||||
:::
|
||||
|
||||
## Which widgets are available?
|
||||
|
||||
Android ships three widgets; iOS ships one.
|
||||
|
||||
| Widget | Android | iOS | What it does |
|
||||
| ------------------------------------------ | ------- | --- | ----------------------------------------------------------------------------------- |
|
||||
| `{{quickNoteTitle}}` (`Quick Note` on iOS) | Yes | Yes | Opens a small note-taking screen straight from the home screen. |
|
||||
| `{{note}}` | Yes | No | Shows the title and first line of a note you pick, and opens that note when tapped. |
|
||||
| `{{reminders}}` | Yes | No | Lists your upcoming reminders and lets you add a new one. |
|
||||
|
||||
### Quick note
|
||||
|
||||
On Android the widget is listed as `{{quickNoteTitle}}`, described as `Take a quick note.` in the widget picker, and appears as a single-line bar. Tapping it opens Notesnook's lightweight note screen without starting the full app.
|
||||
|
||||
On iOS the widget is listed as `Quick Note`, described as `A widget to add notes quickly.`, and shows a plus icon over `Add a quick note`. Tapping it launches the app straight into the editor with a new note.
|
||||
|
||||
### Note _(Android only)_
|
||||
|
||||
The `{{note}}` widget — `Add a note to home screen` in the widget picker — pins one specific note to your home screen and shows its title and headline. It updates whenever you edit the note.
|
||||
|
||||
1. Long press the home screen and open the widget picker.
|
||||
2. Drag the Notesnook `{{note}}` widget onto your home screen.
|
||||
3. The `Select a note` screen opens — pick the note you want on the widget.
|
||||
4. Tap the widget to open that note in the app.
|
||||
|
||||
Because the widget is reconfigurable, you can long press it later and choose a different note.
|
||||
|
||||
<!-- TODO: screenshot — the Android note preview widget on a home screen -->
|
||||
|
||||
### Reminders _(Android only)_
|
||||
|
||||
The `{{reminders}}` widget — `Quick overview of upcoming reminders` in the widget picker — shows a scrollable list of your upcoming [reminders](/reminders).
|
||||
|
||||
1. Long press the home screen and open the widget picker.
|
||||
2. Drag the Notesnook `{{reminders}}` widget onto your home screen.
|
||||
3. Tap a reminder in the list to open it in the app, or tap the `+` button on the widget to create a new reminder.
|
||||
|
||||
<!-- TODO: screenshot — the Android reminders widget on a home screen -->
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Android quick actions](/mobile-integration/android-quick-actions) — tiles, shortcuts and the share sheet
|
||||
- [Quick notes](/mobile-integration/quick-note-from-notification) — writing without opening the app
|
||||
- [Reminders](/reminders) — getting notified about a note
|
||||
|
||||
@@ -1,11 +1,28 @@
|
||||
# Pin to notifications
|
||||
---
|
||||
title: Pin to notifications
|
||||
pageTitle: Pin a note to your Android notifications
|
||||
description: Keep a Notesnook note in your Android notification shade so it is always one swipe away, and unpin it when you no longer need it there.
|
||||
keywords:
|
||||
- pin note to notification
|
||||
- android sticky note
|
||||
- notesnook notification
|
||||
schema: howto
|
||||
---
|
||||
|
||||
> error This feature is Android only.
|
||||
# Pin to notifications <PlanTag plan="pro" note="Android only" />
|
||||
|
||||
Android allows you to add sticky/on-going notifications to the System Notifications drawer. In Notesnook we use this feature to allow you to pin notes in notifications.
|
||||
Android lets apps keep an ongoing notification in the shade. Notesnook uses that to keep a note one swipe away — useful for a shopping list, a door code, or anything you keep reaching for during the day.
|
||||
|
||||

|
||||
Pinning a note to your notifications needs a Pro plan and is Android only — see [Plans & limits](/plans-and-limits).
|
||||
|
||||
1. Tap on the  on a note
|
||||
2. Select `Pin to notifications`
|
||||
3. The pinned note will appear in notifications permanently until you `Unpin` it.
|
||||

|
||||
|
||||
1. Tap the  on a note
|
||||
2. Select `{{pinToNotifications}}`
|
||||
3. The pinned note will appear in notifications permanently until you select `{{unpinFromNotifications}}` on it.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Quick notes](/mobile-integration/quick-note-from-notification) — writing without opening the app
|
||||
- [Home screen widgets](/mobile-integration/home-screen-widgets) — notes and reminders on your home screen
|
||||
- [Plans & limits](/plans-and-limits) — what each plan unlocks and the exact limits
|
||||
|
||||
@@ -1,12 +1,29 @@
|
||||
# Quick notes from notifications
|
||||
---
|
||||
title: Quick notes
|
||||
pageTitle: Write a note from the Android notification drawer
|
||||
description: Turn on the Notesnook quick note notification so you can write a note straight from your Android notification shade without opening the app.
|
||||
keywords:
|
||||
- quick note android
|
||||
- note from notification
|
||||
- notesnook quick note
|
||||
schema: howto
|
||||
---
|
||||
|
||||
> error This feature is Android only.
|
||||
# Quick notes from notifications <PlanTag plan="pro" note="Android only" />
|
||||
|
||||
Taking a note from the notification drawer requires a Pro plan and is available on Android only — see [Plans & limits](/plans-and-limits).
|
||||
|
||||
A simple, quick and convenient way to take notes on your phone from notifications. This works the same way as a messaging/chat app allows you to reply to messages from notifications.
|
||||
|
||||

|
||||

|
||||
|
||||
1. Go to Settings from Side Menu
|
||||
2. Scroll down to `Productivity` section
|
||||
3. Enable `Notes in notifications` option
|
||||
4. Open notifications drawer, you should see a notification with button `Take note`.
|
||||
2. Open `{{productivity}}`
|
||||
3. Enable `{{quickNoteNotification}}`
|
||||
4. Open notifications drawer, you should see a notification with button `{{takeNote}}`.
|
||||
|
||||
## Related pages
|
||||
|
||||
- [Pin to notifications](/mobile-integration/pin-notes-to-notifications) — a note that lives in your shade
|
||||
- [Android quick actions](/mobile-integration/android-quick-actions) — tiles, shortcuts and the share sheet
|
||||
- [Plans & limits](/plans-and-limits) — what each plan unlocks and the exact limits
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user