Google Keep은 마크다운 내보내기를 지원하지 않습니다. 구글 테이크아웃으로 데이터를 받으면 Keep 메모는 메모 하나당 JSON 파일 하나로, 보통 같은 이름의 HTML 파일과 첨부한 이미지·오디오와 함께 담겨 옵니다. Google Keep → 마크다운 변환기는 이 ZIP을 읽어 메모마다 .md 파일을 하나씩 만듭니다. 본문 맨 위에는 # 제목이 들어가고, 제목, 라벨, 색, 고정·보관·휴지통 상태와 두 시각은 옵시디언, Logseq, 정적 사이트 생성기가 이해하는 YAML 머리말에 담깁니다. 머리말에 넣을 항목, 파일 이름 방식, 첨부 파일 폴더, 라벨을 tags로 쓸지는 직접 고를 수 있습니다.
설계 목표는 정직함입니다. 노트와 함께 preservation-report.json을 만들어, ZIP 안의 파일마다 변환·복사·중복 표현·제외·미지원 중 무엇으로 처리했는지, 노트의 필드마다 보존·변환·옵션으로 생략·누락 중 무엇인지 기록합니다. 변환기가 매핑하지 않는 기능을 메모가 쓰고 있어도 나중에 발견하는 대신 요약에서 바로 보입니다. ZIP은 브라우저 안의 백그라운드 워커가 변환하며 메모는 업로드되지 않습니다.
사용 방법
Google Takeout에서 Keep 데이터 요청
Google Takeout에서 Keep만 선택해 내보내기를 만들고 ZIP을 내려받으세요. 원본은 그대로 백업해 둡니다. 변환기는 메모가 Keep이라는 폴더에 있는 표준 구조를 기대합니다.
변환기에서 ZIP 열기
.zip 파일을 끌어다 놓거나 선택하세요. 먼저 결과를 보고 싶다면 기본 제공 샘플 내보내기를 열 수 있습니다. 압축 상태 25MiB 이하, 항목 5,000개 이하, 압축을 풀었을 때 전체 100MiB 이하여야 합니다.
출력 옵션을 고르고 변환
머리말 항목을 켜고 끄고, 파일 이름을 제목 또는 생성 날짜 + 제목으로 정하고, 첨부 파일 폴더 이름을 바꾸고, 라벨을
labels나tags로 쓸지 선택합니다. 변환은 자동으로 실행되고 옵션을 바꾸면 다시 실행됩니다. 진행 막대가 검증, 변환, 압축 단계를 보여 주며, 노트를 쓰기 전에 모든 파일의 무결성을 검사하고 손상된 아카이브는 결과물 없이 중단됩니다.대시보드와 경고 읽기
결과는 완료, 부분, 비어 있음 중 하나이고 노트, 체크리스트, 첨부, 경고 수와 실패·미지원 파일 수가 표시됩니다. 경고는 코드별 개수로 나열되며 코드를 누르면 해당 파일과 필드 위치를 볼 수 있습니다.
노트 검색과 미리보기
제목, 라벨, 본문으로 검색한 뒤 노트를 열어 렌더링된 모습이나 마크다운 원문을 봅니다. 미리보기는 안전합니다. 링크와 이미지는 글자로만 표시되고 노트 안의 어떤 내용도 실행되지 않습니다. 긴 노트는 미리보기에서만 잘립니다.
ZIP과 보고서 내려받기
노트와 첨부 파일이 든
google-keep-markdown.zip과 전체 기록이 든preservation-report.json을 내려받습니다. 내려받기는 변환이 성공한 뒤에만 켜집니다.
작동 원리
Takeout이 주는 것과 결과물의 위치
Takeout은 메모를 title, textContent, 체크리스트용 listContent, labels, attachments, color, isPinned, isArchived, isTrashed, createdTimestampUsec, userEditedTimestampUsec 같은 필드가 있는 JSON으로 저장합니다. 변환기는 경로 구간에 Keep이 들어 있는 파일만 읽습니다. 다른 구글 서비스 파일처럼 ZIP 안의 나머지는 제외로 표시해 개수만 세고 변환하지 않습니다.
메모는 각각 notes/<제목>.md가 됩니다. 참조된 첨부 파일은 첨부 폴더(기본값 assets/)로 복사되고 노트 기준 상대 경로로 링크됩니다. 메모의 .html이나 .txt 짝은 JSON의 중복 표현으로 인식되어 두 번 변환하지 않으며, JSON 짝이 없는 HTML이나 텍스트 파일은 미지원으로 보고합니다.
| Keep JSON 필드 | 마크다운 결과 |
|---|---|
| title | 본문 맨 위의 # 제목, 선택하면 머리말 title도 함께 |
| textContent | 본문 텍스트, 줄바꿈은 줄 끝 공백 두 칸으로 유지 |
| listContent | - [x], - [ ] 작업 목록 줄 |
| labels[].name | 머리말 labels 목록, 또는 공백을 하이픈으로 바꾼 tags |
| createdTimestampUsec / userEditedTimestampUsec | 원래 값(선택)과 UTC ISO 8601 마이크로초 형식의 created, updated(선택) |
| isPinned, isArchived, isTrashed, color | 머리말 키(선택) |
| attachments[].filePath | [이름](../assets/파일) 링크, 파일은 첨부 폴더로 복사 |
마이크로초 단위 타임스탬프
Keep은 시간을 유닉스 에포크 이후 마이크로초로 저장하며, 이 값은 자바스크립트 숫자가 항상 정확히 담을 수 있는 크기보다 큽니다. 변환기는 원래 값을 문자열로 머리말에 그대로 두고, 정수 연산으로 ISO 날짜를 계산합니다. JSON 파서가 이미 반올림했을 값은 정확한 것처럼 내보내지 않고 정밀도 경고로 표시하며, 서기 1년에서 9999년을 벗어난 값은 범위 초과로 표시합니다.
createdTimestampUsec: 1700000000000000 -> created: 2023-11-14T22:13:20.000000Z
userEditedTimestampUsec: 1700000100123456 -> updated: 2023-11-14T22:15:00.123456Z파일 이름, 이스케이프, 첨부 파일 매칭
노트 파일 이름은 제목에서 가져오며, 선택하면 생성 날짜 + 제목이 됩니다. 일반 파일 시스템에서 쓸 수 없는 문자는 밑줄이 되고, 끝의 점과 공백은 바뀌며, CON 같은 윈도우 예약 이름은 앞에 밑줄이 붙고, 이름은 유니코드 NFC로 정규화되어 바이트 길이로 제한됩니다. 대소문자를 합쳐서 같아지는 이름에는 --2, --3이 붙으므로 대소문자 구분 없는 디스크에서도 덮어쓰이지 않습니다.
마크다운이 서식으로 해석하는 문자만 이스케이프합니다. *, 백틱, [, ], < 같은 인라인 문법에는 역슬래시가 붙고, 밑줄은 강조가 될 수 있는 위치에서만, #, -, 1., > 같은 기호는 줄 맨 앞에 올 때만 이스케이프합니다. 쉼표, 콜론, 슬래시, 마침표 같은 일반 문장 부호는 입력한 그대로 둡니다. 첨부 경로는 대소문자를 구분해 정확히 찾으며, 먼저 노트 폴더 기준으로, 다음에 압축 파일 최상위부터 봅니다. 일치하는 파일이 없거나 둘 이상이면 파일명으로 추측하지 않고 보고합니다.
실제 예시
Keep/Shopping.json: title Shopping, textContent "Milk\nEggs", labels [home], isPinned true, color YELLOW, 생성 1700000000000000, 수정 1700000100123456, 첨부 photo.jpgnotes/Shopping.md
---
title: Shopping
labels:
- home
isPinned: true
color: YELLOW
createdTimestampUsec: "1700000000000000"
created: 2023-11-14T22:13:20.000000Z
userEditedTimestampUsec: "1700000100123456"
updated: 2023-11-14T22:15:00.123456Z
---
# Shopping
Milk
Eggs
[photo.jpg](../assets/photo.jpg)photo.jpg는 assets/photo.jpg로 복사되고, 짝이 되는 Shopping.html은 중복 표현으로 집계됩니다. 머리말 키는 JSON 파일에 적힌 순서를 따릅니다.
Keep/Todo.json: title "Todo: a/b", listContent [bread 체크됨, "call *mom*" 체크 안 됨]파일 notes/Todo_ a_b.md, 본문 줄: "# Todo: a/b", "- [x] bread", "- [ ] call \*mom\*"콜론과 슬래시는 파일 이름에 쓸 수 없어서 밑줄이 되었습니다. 항목 안의 별표만 이스케이프됩니다. 보고서에는 체크리스트에 대한 LIST_FLATTENED 경고가 기록됩니다.
Keep/Tags.json: title Tags, labels ["home office"], 생성 1700000000000000, 타임스탬프와 날짜 항목은 끄고 라벨을 tags로 저장---
title: Tags
tags:
- home-office
---
# Tags태그 이름에는 공백을 쓸 수 없어서 공백이 하이픈이 되었습니다. 끈 항목은 보고서에 생략으로 표시되고, 모든 항목을 끄면 노트에 머리말이 아예 없습니다.
textContent 없이 textContentHtml만 있는 Keep/Rich.json변환하지 않음. 결과 unsupported, 이유 RICH_TEXT_ONLY와 FORMATTING_NOT_PRESERVED, 필드 값은 preservation-report.json에 보관전체 상태는 부분이 되지만 데이터는 보고서에서 복구할 수 있습니다.
자주 하는 실수
서식은 옮겨지지 않습니다
변환기는 일반 텍스트와 체크리스트만 매핑합니다. HTML 필드에만 있는 서식은 변환되지 않고, 서식 있는 텍스트로만 존재하는 노트는 미지원으로 보고됩니다. 경고에서 FORMATTING_NOT_PRESERVED를 확인하세요.
체크리스트는 평평해집니다
체크된 항목과 안 된 항목이 저장된 순서대로 하나의 평평한 작업 목록이 됩니다. 중첩이나 재정렬된 구조는 복원하지 않으며, LIST_FLATTENED 경고가 어떤 노트가 해당되는지 알려 줍니다.
매핑하지 않는 필드는 노트가 아니라 보고서에 남습니다
링크 주석 같은 알 수 없거나 미지원인 필드는 경고로 세고 값은 마크다운이 아니라
preservation-report.json에 저장합니다. 무언가 빠진 것 같으면 보고서를 열어 보세요.머리말 항목을 끄면 노트에서 그 정보가 빠집니다
끈 항목은 어느 노트에도 쓰이지 않습니다. 보고서에는 생략으로 표시되므로 내보내기에서 사라지는 것은 아니지만 마크다운 파일에는 더 이상 들어 있지 않습니다. 나중에 필요할 수 있다면 날짜와 상태는 켜 두세요.
크기 제한이 엄격합니다
압축 상태 25MiB 초과, 항목 5,000개 초과, 항목 하나가 10MiB를 넘는 해제, 전체 해제 100MiB 초과, 압축률 200배 초과인 ZIP은 거절됩니다. Keep 내보내기에 큰 오디오가 많다면 더 작게 나눠서 Takeout을 요청하세요.
경로가 모호한 첨부는 추측하지 않습니다
노트가 없는 파일을 가리키거나 둘 이상의 항목과 일치하면 링크를 만들지 않고 이유를 기록합니다. 엉뚱한 파일이 조용히 붙는 일을 막기 위해서입니다.
자주 묻는 질문
Google Keep 메모는 어떻게 마크다운으로 내보내나요?
Keep만 담은 Takeout 내보내기를 요청해 ZIP을 내려받고 이 변환기에서 열면 됩니다. 메모마다 YAML 머리말이 있는 마크다운 파일 하나, 첨부 폴더, 보고서가 만들어집니다.
노트가 업로드되나요?
아니요. ZIP은 브라우저 안의 백그라운드 워커가 읽고 변환합니다. 변환 과정에서 네트워크 요청은 없으며 노트가 서버로 전송되지 않습니다.
결과를 옵시디언에서 열 수 있나요?
가능합니다. 보관함 폴더에 압축을 풀고 notes 폴더와 첨부 폴더를 나란히 두세요. 머리말 키는 평범한 YAML이고, 라벨은 tags로 저장할 수 있으며, 첨부 파일은 상대 경로로 링크됩니다.
보관된 메모와 휴지통 메모는 어떻게 되나요?
다른 노트와 똑같이 변환되며 머리말의 isArchived나 isTrashed가 true로 들어갑니다. 요약에 개수가 나오므로 나중에 휴지통 노트를 정리할 수 있습니다.
일부 문자 앞에 역슬래시가 왜 붙어 있나요?
별표, 대괄호, 백틱, 줄 맨 앞의 #이나 -처럼 마크다운이 서식으로 오해할 수 있는 문자만 이스케이프했기 때문입니다. 렌더링한 노트에는 원래 문자가 그대로 보입니다.
결과가 '부분'이면 무슨 뜻인가요?
미지원이거나 실패한 파일이 하나 이상 있거나 경고가 기록되었다는 뜻입니다. 변환할 수 있었던 노트는 ZIP에 들어 있고 나머지는 보고서에 목록으로 나옵니다.
ZIP이 손상되었거나 악성이면 안전한가요?
변환 전에 경로, 중복, 크기, 체크섬을 검증하고, 안전하지 않은 경로와 지나치게 크거나 압축률이 높은 항목은 거절하며, 치명적 오류가 나면 출력을 버립니다.
더 깊이 읽기
마지막 업데이트:
