Keep to Markdown

Paste a Google Takeout Keep export — a note's JSON, an array of notes, or the Keep HTML — and get one clean Markdown note per file, with labels, checkboxes and dates preserved. Runs entirely in your browser; nothing is uploaded.

Try:
Markdown bundle

What this tool does

Google Takeout hands your Keep notes back as a folder of one .json (and one .html) file per note — machine-readable, but not something you can read or drop into a notes app. This tool turns that export into Markdown: one clean .md note per Keep note, with the labels, the checkboxes, the dates and the pinned/archived flags all preserved.

Everything runs locally in WebAssembly. Your notes are never uploaded, and the page keeps working offline once it has loaded.

What you paste in

The input format is auto-detected:

What you get

Each note becomes one Markdown file in the output, preceded by an ==== filename.md ==== header so you can see — and split out — every file:

Options

OptionChoicesWhat it does
Metadatafrontmatter (default), inline, nonefrontmatter writes a YAML block with title, dates, labels and flags. inline writes no YAML and appends the labels as #hashtags. none emits just the heading and body.
Filename styledate-title (default), title, label-titledate-title names files 2026-01-15-grocery-list.md; title drops the date; label-title puts each note in a folder named after its first label (shopping/grocery-list.md, or unlabeled/). Duplicate names get a -1, -2, … suffix.
Checklist itemstask-list (default), bullet, plaintask-list writes - [ ] Milk / - [x] Eggs; bullet writes - Milk and drops the checked state; plain writes one bare line per item.
Include archived noteson (default)Archived notes are exported and marked archived: true. Turn off to skip them.
Include trashed notesoff (default)Trashed notes are skipped unless you turn this on.
Link attachmentson (default)Writes ![photo.jpg](photo.jpg) for image attachments and [voice.3gp](voice.3gp) for the rest.

Example

Paste this Keep Takeout note:

{ "title": "Grocery List", "color": "BLUE", "isPinned": true,
  "labels": [{ "name": "Shopping" }, { "name": "Home" }],
  "createdTimestampUsec": 1768469400000000,
  "userEditedTimestampUsec": 1768557600000000,
  "listContent": [
    { "text": "Milk", "isChecked": false },
    { "text": "Eggs", "isChecked": true } ] }

…with frontmatter metadata, date-title filenames and task-list checkboxes, and you get:

==== 2026-01-15-grocery-list.md ====
---
title: "Grocery List"
created: 2026-01-15T09:30:00Z
updated: 2026-01-16T10:00:00Z
labels: ["Shopping", "Home"]
pinned: true
color: BLUE
---

# Grocery List

- [ ] Milk
- [x] Eggs

Limits and edge cases

FAQ

Where do I get the Google Keep Takeout export?

Go to Google Takeout, deselect everything, tick Keep, and export. The download contains a Takeout/Keep/ folder with one .json and one .html file per note (plus any attachment files). Open a note's .json and paste its contents here — or paste several notes as a JSON array.

Do checkboxes survive the conversion?

Yes. Keep stores a checklist as listContent entries with an isChecked flag, and the HTML export uses ☐/☑ glyphs. Both become Markdown task list items — - [ ] for open items and - [x] for ticked ones — which Obsidian, Logseq, Joplin, GitHub and VS Code all render as real checkboxes.

What happens to my labels?

With frontmatter metadata they become a YAML labels: ["Shopping", "Home"] list. With inline they are appended to the note as #shopping #home. And with the label-title filename style the first label also becomes the note's folder, so Shopping notes land under shopping/.

Can I convert my whole Keep export at once?

Paste the notes as a JSON array — [ {note1}, {note2}, … ] — and every note is converted in one run, each with its own ==== filename.md ==== header. The 4 MB input cap keeps very large exports to a few batches. Notes with the same title get a -1, -2 suffix so nothing is overwritten.

Is my data private?

Yes. The conversion runs entirely in your browser with WebAssembly — the notes never leave your device, there is no sign-up, and the page keeps working with the network switched off once it has loaded.

How do I turn the output into separate files?

Each note in the output starts with an ==== filename.md ==== header. Copy the text under a header into a new file with that name. The date-title style keeps your notes in chronological order when sorted by filename; label-title gives you the folder path to create.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool keep-to-markdown '{ "title": "Grocery List", "labels": [{ "name": "Shopping" }], "createdTimestampUsec": 1768469400000000, "listContent": [{ "text": "Milk", "isChecked": false }] }'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/keep-to-markdown/?input=%7B%20%22title%22%3A%20%22Grocery%20List%22%2C%20%22labels%22%3A%20%5B%7B%20%22name%22%3A%20%22Shopping%22%20%7D%5D%2C%20%22createdTimestampUsec%22%3A%201768469400000000%2C%20%22listContent%22%3A%20%5B%7B%20%22text%22%3A%20%22Milk%22%2C%20%22isChecked%22%3A%20false%20%7D%5D%20%7D&metadata=frontmatter&filename_style=date-title&checkbox_style=task-list&include_archived=true&include_trashed=true&link_attachments=true

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.