TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
아이젠하워 매트릭스 데스크톱 위젯. Electron 기반, Windows와 macOS용. Claude 계열의 밝은 베이지 테마 + 다크 테마를 지원합니다. 이름은 네 칸(4분면)에서 왔습니다. 앱 안팎에서 표기는 Nekan 하나로 통일합니다. 웹페이지는 holdn2.github.io/Nekan 입니다 — 개인정보처리방침과 계정·데이터 삭제 요청 창구가 거기 있습니다. The English version of this document is at README.en.md. Releases에서 받습니다. (x.y.z는 버전입니다.) Windows — Nekan-Setup-x.y.z.exe를 받아 실행합니다. 클릭 한 번으로 끝나고 관리자 권한을 묻지 않습니다 — 내 계정 폴더에만 설치되기 때문입니다. 설치가 끝나면 바탕화면과 시작 메뉴에 Nekan 바로가기가 생깁니다. 코드 서명을 아직 하지 않아서 Windows SmartScreen이 "PC를 보호했습니다" 경고를 띄웁니다. 추가 정보 → 실행을 누르면 설치됩니다. macOS — 쓰는 칩에 맞는 .dmg를 받습니다.README 전문 보기 ↗
아이젠하워 매트릭스 데스크톱 위젯. Electron 기반, Windows와 macOS용. Claude 계열의 밝은 베이지 테마 + 다크 테마를 지원합니다.
이름은 네 칸(4분면)에서 왔습니다. 앱 안팎에서 표기는 Nekan 하나로 통일합니다.
웹페이지는 holdn2.github.io/Nekan 입니다 — 개인정보처리방침과 계정·데이터 삭제 요청 창구가 거기 있습니다.
The English version of this document is at README.en.md.
Releases에서 받습니다. (x.y.z는 버전입니다.)
Windows — Nekan-Setup-x.y.z.exe를 받아 실행합니다.
클릭 한 번으로 끝나고 관리자 권한을 묻지 않습니다 — 내 계정 폴더에만 설치되기 때문입니다.
설치가 끝나면 바탕화면과 시작 메뉴에 Nekan 바로가기가 생깁니다.
코드 서명을 아직 하지 않아서 Windows SmartScreen이 "PC를 보호했습니다" 경고를 띄웁니다. 추가 정보 → 실행을 누르면 설치됩니다.
macOS — 쓰는 칩에 맞는 .dmg를 받습니다.
| 맥 | 파일 |
|---|---|
| Apple Silicon (M1 · M2 · M3 · M4) | Nekan-x.y.z-arm64.dmg |
| Intel | Nekan-x.y.z-x64.dmg |
어느 쪽인지는 애플 메뉴 → 이 Mac에 관하여에서 봅니다 — 칩이면 Apple Silicon,
프로세서에 Intel이 보이면 Intel입니다. .dmg를 열어 Nekan을 응용 프로그램으로
옮기면 끝입니다.
같이 올라가는
.zip은 앱이 스스로 업데이트할 때 쓰는 파일이라 따로 받지 않습니다.맥에서는 단축키가
Ctrl대신Cmd입니다. 이 문서의Ctrl을 전부Cmd로 읽으면 되고, 가이드 탭은 도는 운영체제에 맞춰 스스로 바꿔 적습니다.
처음 실행하면 할 일을 어디에 둘지 먼저 묻습니다.
한 번 고르면 다시 묻지 않고, 나중에 설정에서 언제든 바꿀 수 있습니다. 이미 할 일이 있는 상태라면 "그것도 계정에 합칠까요?"를 같은 화면에서 함께 묻습니다.
타이틀바의 톱니바퀴를 누르면 한곳에서 다룹니다.
| 언어 | 한국어 ↔ English (고르면 바로 바뀝니다) |
| 테마 | 일반 ↔ 다크 (Ctrl + D로도 됩니다) |
| 내보내기 | PDF · HTML · Markdown (Ctrl + E로도 됩니다) |
| 기기 간 동기화 | 로그인 · 로그아웃 · 지금 상태 |
바 모드에서 누르면 창을 먼저 펼칩니다.
macOS에서는 이 문서의 Ctrl을 전부 Cmd로 읽으면 됩니다 — 앱은 그 OS의 조합키를 씁니다.
가이드 탭은 다릅니다 — 단축키가 나오는 자리마다 Ctrl / Cmd처럼 둘을 나란히 적습니다.
가이드는 지금 쓰는 기계가 아니라 다른 기계 것을 확인하려고 읽는 일이 많아서입니다. 앱 안의
다른 안내(설정 패널의 내보내기 힌트)는 지금 쓰는 조합키만 적습니다.
언어는 처음 켤 때 컴퓨터 설정을 따라 정해집니다 — 한국어 환경이면 한국어, 그 밖에는 영어입니다. 한 번 고르면 그 선택이 저장되고, 나중에 컴퓨터 언어가 바뀌어도 덮어쓰지 않습니다. 바꾸면 앱을 다시 켤 필요 없이 그 자리에서 반영되고, 내보낸 문서도 고른 언어로 나갑니다. 가이드 탭 본문도 함께 바뀝니다.
로그인하면 여러 기기에서 같은 목록을 씁니다. Google이나 Apple 계정 하나면 되고, 로그인 창은 앱 안이 아니라 평소 쓰는 브라우저에서 열립니다 (어디를 눌러 로그인하는지는 가이드 탭에 있습니다). 다른 기기와 같은 방법(Google 또는 Apple)으로 로그인하세요 — 방법이 다르면 목록이 따로 생길 수 있습니다.
로그인한 뒤에는 신경 쓸 것이 없습니다. 바꾼 내용은 몇 초 뒤 자동으로 올라가고, 다른 기기에서 바꾼 것은 알아서 내려옵니다.
인터넷이 없어도 앱은 평소대로 씁니다. 떠오른 것을 즉시 던져넣는 것이 이 앱의 일이라, 연결이 끊겼다고 입력이 막히지 않습니다. 그동안의 변경은 이 컴퓨터에 저장돼 있다가 연결되면 올라갑니다.
톱니바퀴에 점이 붙으면 아직 안 올라간 것이 있다는 뜻입니다. 바 모드에서도 보입니다.
| 톱니바퀴 | 뜻 |
|---|---|
| 점 없음 | 전부 올라갔거나, 로그인하지 않았습니다 |
| 주황 점 | 아직 이 컴퓨터에만 있는 변경이 있습니다 |
| 빨강 점 | 서버에 닿지 못했습니다. 변경은 안전하게 저장돼 있습니다 |
정확히 몇 개가 남았는지는 설정을 열면 적혀 있습니다 (동기화됨 · 대기 N개 · 오프라인).
같은 항목을 두 기기에서 거의 동시에 고치면 나중에 고친 쪽이 남습니다. 이때 아직 올라가지 않았던 내 수정이 덮이면 덮어썼다고 알려드립니다 — 조용히 사라지지 않게.
로그아웃해도 이 컴퓨터의 할 일은 지워지지 않습니다. 서버가 멈춰도 마찬가지입니다.
계정을 아주 지우려면 설정의 회원탈퇴입니다. 서버에 있는 사본과 다른 기기와의 동기화가
사라지고 되돌릴 수 없습니다. 대신 이 컴퓨터의 할 일은 그대로 남아서, 계정 없이 계속
쓸 수 있습니다. 누르면 바로 지우지 않고 그 내용을 한 번 더 보여준 뒤 확인을 받습니다.
앱을 이미 지웠다면 웹에서도 요청할 수 있습니다.
로컬에 할 일이 있는 채로 처음 로그인하면 그것도 계정에 합칠지 물어봅니다. 합치지 않기를
고르면 지우지 않고 %APPDATA%\Nekan\data.before-login.json으로 옮겨 둡니다 — 남의 컴퓨터에
잠깐 로그인했을 때 그 사람 할 일이 내 계정으로 올라가는 것을 막기 위한 선택지입니다.
따로 할 일이 없습니다. 앱이 켜져 있는 동안 알아서 새 버전을 확인하고 백그라운드로 받아둡니다. 받아둔 버전은 앱을 닫을 때 저절로 적용되므로, 신경 쓰지 않아도 다음에 켤 때는 최신입니다.
확인하는 때는 세 가지입니다: 켠 직후, 앱으로 돌아왔을 때나 컴퓨터가 절전에서 깨어났을 때, 그리고 그와 무관하게 6시간마다. 며칠씩 켜 둔 채로도 새 버전을 늦게 알지 않도록 한 것이고, 너무 자주 묻지 않게 확인과 확인 사이는 최소 30분을 둡니다.
기다리기 싫으면 타이틀바에 나타나는 ↑ 버튼(또는 함께 뜨는 알림의 지금 재시작)을 누르면 그 자리에서 재시작하며 적용합니다. 이 버튼은 받아둔 버전이 있을 때만 보입니다 — 보이지 않는다면 이미 최신이거나 아직 받는 중입니다. 확인에 실패해도(네트워크 없음 등) 아무 것도 뜨지 않습니다.
할 일 데이터는 설치 폴더가 아니라 %APPDATA%\Nekan에 있어서 업데이트해도 그대로 남습니다.
지금 몇 버전인지는 타이틀바의 앱 이름 옆에 작게 적혀 있습니다 (바 모드에서는 앱 이름과 함께 빠지므로 바 폭에는 영향이 없습니다).
가이드 탭 맨 아래에는 버전과 함께 업데이트 상태(최신 버전입니다 ·
새 버전을 받는 중… · 준비됨), 릴리스 노트 링크가 있습니다. 확인에 실패했을 때는 아무 말도
하지 않습니다.
npm install # 최초 1회
npm start # 빌드한 뒤 앱을 띄웁니다
npm test # 빌드한 뒤 단위 테스트 (저장·정규화·날짜·동기화 판정)
npm run build # src/ → out/ 컴파일만
npm run build:watch # 고치는 동안 계속 컴파일
설치 파일 빌드
npm run dist # dist\Nekan-Setup-1.0.0.exe — 로컬 확인용, 업로드하지 않음
npm run release # 빌드 + GitHub Release에 업로드 (아래 GH_TOKEN 참고)
EBUSY ... unlink ...\dist\win-unpacked\resources\app.asar로 죽으면 저장소 밖으로 내보내면 된다. 이 기계에서는 그 경로의.asar를 무언가가 계속 붙잡고 있고(실시간 검사로 보인다) 폴더를 지우지도 이름을 바꾸지도 못하는데, electron-builder는 Electron을 풀기 전에<출력>/win-unpacked를 비운다. 우리 프로세스가 잡는 것이 아니다 — 그 경로에서 도는 것은 하나도 없다.$env:NEKAN_DIST = "$env:LOCALAPPDATA\Temp\nekan-dist" npm run release
tools/dist.js가 그 값을 정해 electron-builder와check-release.js양쪽에 넘긴다. 둘이 같은 곳을 봐야 하기 때문이다 — draft가 갈라졌을 때 검사가 디스크에서 파일을 다시 올리는데, 빌드가 쓴 곳을 봐야 찾는다. 맥 워크플로는 따라오지 않는다: 자산 글롭과 codesign 단계가dist를 그대로 적고 있어서,build.directories.output을 옮기려면 거기도 함께 고쳐야 한다.
릴리스 절차
package.json의 version을 올리고 커밋한다.npm run release — main에서, 커밋되지 않은 변경 없이 돌려야 한다. 아니면
빌드를 시작하기 전에 멈춘다. 테스트를 먼저 지나고, electron-builder가 설치 파일과
latest.yml을 만들어 해당 버전의 draft Release로 올린다. 빌드한 커밋은
출력 폴더의 built-from.txt에 적힌다.npm run release:check가 통과해야 하고, 빌드 이후에 커밋이 들어갔으면
거기서 멈춘다 — 태그는 publish 시점의 main에서 만들어지므로, 그대로 두면 태그가
아무도 받지 않은 빌드를 가리킨다.latest.yml이 곧 업데이트 피드다. 설치 파일만 따로 올리면 아무도 업데이트되지 않는다.
위 2번은 Windows 절반이다. 이 저장소에 맥이 없어서 맥 번들은 GitHub Actions의
Mac build 워크플로가 만든다. 그래서 2번과 3번 사이에 한 단계가 들어간다:
2-1. Actions → Mac build → Run workflow, 브랜치 main, publish 체크.
서명·공증을 거쳐 검증한 뒤(codesign · stapler · spctl) 같은 draft에 맥 자산을
올린다 — 아키텍처마다 dmg · zip · 두 blockmap, 그리고 latest-mac.yml 하나.
끝에 check-release.js가 두 플랫폼이 다 갖춰졌는지 본다.
순서를 지켜야 한다. 그 잡은 릴리스를 만들지 않는다 — 없으면 "먼저
npm run release를 돌려라"라고 말하고 멈춘다. 만들게 두면 같은 태그에 draft가 둘이 되고,
그건 check-release.js가 기계가 달라서 고칠 수 없는 유일한 고장이다.
아니라고 답할 수 있는 것은 전부 앞에서 묻는다. publish를 main 아닌 브랜치에서
켜거나, 그 버전의 릴리스가 아직 없으면 preflight 잡이 십몇 초 만에 죽는다 — 빌드와
공증에 드는 30분(맥 러너는 Linux의 10배로 과금된다)을 쓰고 나서 알게 되는 가드는
맞더라도 쓸모가 없다.
PR 빌드에서는 서명이 되지 않는다. electron-builder가 PR 빌드에서 서명을 거부하므로
(isSignAllowed()), 서명 경로 확인은 수동 실행뿐이다. publish를 끄고 돌리면 서명·공증만
하고 아티팩트로 남긴다.
electron-builder는 같은 태그로 draft를 두 개 만든다. 업로드가 병렬로 돌면서 둘 다 "릴리스가 없네"라고 판단해 각자 만드는 경쟁 상태이고, v1.0.0과 v1.0.1 두 번 다 이렇게 갈렸다(매번
.blockmap이 혼자 떨어져 나갔다). 그래서npm run release가 끝에tools/check-release.js를 돌려 자동으로 합치고 파일 세 개를 확인한다. 손댈 것은 없고, 뭔가 빠지면 종료 코드로 알려준다.갈린 채로 publish하면 조용히 망가진다:
latest.yml이 없는 쪽을 올리면 아무도 업데이트되지 않고,.blockmap이 없는 쪽을 올리면 모두가 매번 100MB를 통째로 받는다.
조작 방법은 앱 안의 가이드 탭에 있습니다. 어디를 누르면 무엇이 되는지는 거기가 원본이고, 이 절은 무엇이 되는 앱인지와 왜 그렇게 만들었는지를 적습니다.
타이틀바의 업무 / 일상 토글로 매트릭스를 두 벌 나눠 씁니다. 퇴근하고 나서 회사 할 일이 눈에 밟히지 않게, 반대로 업무 중에 개인 일이 섞이지 않게 하려는 기능입니다.
공유 표시가 붙어 있습니다.분류하기 전에 머릿속에 있는 걸 일단 전부 쏟아내는 공간입니다. 매트릭스 바로 위에 있습니다.
업무·일상 매트릭스가 함께 쓰는 유일한 목록입니다 (헤더의 공유 표시). 어느 쪽 일인지는 나중에 분면으로 내릴 때 정해집니다.
Urgent & Important / Important & Not Urgent / Urgent & Not Important / Not Urgent & Not Important). 두 축의 이름이 곧 분면 이름이라 옮기면 길어지기만 하고, 분면 아래의 Do 진행하기 · Plan 계획하기 · Delegate 위임하기 · Delete 제거하기가 네 개의 D를 기억장치로 쓰고 있어서 위아래가 같은 낱말이어야 합니다.경계를 드래그해 4분면 비율을 바꿉니다. 비율은 0.15~0.85로 제한되고 종료 후에도 유지됩니다. 조절 바를 따로 두지 않은 것은 화면 한쪽을 계속 차지하는 위젯이라 픽셀을 거기 쓰고 싶지 않아서입니다.
남은 기간에 따라 지남 / 오늘 / 3일 이내 / 그 이후 네 단계로 색이 갈립니다. 며칠 켜둬도 자정이 지나면 다시 계산합니다 — 절전에서 깨어난 경우까지 포함해서요. 표시 형식은 언어마다 다르고, 요일 이름은 카탈로그가 아니라 Intl이 만듭니다.
할 일 하나당 메모 하나이고 최대 2000자, 내용은 할 일과 함께 data.json에 남습니다.
메모 패널은 매트릭스에서 높이를 뺏지 않고 창을 키웁니다. 드래그해서 맞춰둔 분면 비율을 패널이 건드리지 않게 하려는 것이고, 화면에 여유가 없으면 늘어나는 만큼만 반영됩니다. 히스토리·휴지통에서는 읽기 전용입니다.
지금 화면에 있는 다 꺼내기 + 4분면을 PDF·HTML·Markdown으로 저장합니다.
Nekan 업무 2026-08-02.pdf).src/shared/export.ts 하나뿐이고 src/renderer/styles/와는 무관합니다.완료한 항목은 히스토리에, 삭제한 항목은 휴지통에 날짜별로 남습니다. 둘 다 지금 선택한 매트릭스 것만 보입니다.
휴지통 비우기는 지금 탭이 들고 있는 전체를 지웁니다 — 보이는 한 페이지가 아니라, 선택한 매트릭스의 기록 전부입니다.앱을 켠 사람이 읽는 사용 설명서입니다. 아이젠하워 매트릭스가 무엇인지와 이 앱을 쓰는 법 전부가 여기 있습니다 — 단축키까지 포함해서요. 그 탭만 보고도 앱을 다 쓸 수 있어야 한다는 것이 이 문서와의 경계입니다.
두 층입니다. 열면 보이는 것은 네 칸을 줄여 그린 그림과 쓰는 순서 셋, 기본 조작 넷뿐이고, 나머지는 그 아래 다섯 개의 접힌 절에 들어 있습니다(아이젠하워 매트릭스란? · 할 일과 다 꺼내기 · 마감일과 메모 · 기록과 내보내기 · 창 · 단축키 · 동기화). 접었을 뿐 줄인 것은 아닙니다 — 조작 설명은 한 문단도 빠지지 않았습니다.
src/shared/i18n/{ko,en}.json 의 guide.* 에 있고, src/renderer/index.html 의 #guideView 는 그 문단들이 들어갈 자리입니다.build\icon.ico (16~256px 멀티 사이즈)가 exe·작업표시줄·타이틀바 로고에 모두 쓰입니다.
디자인을 바꾸고 싶으면 색상만 고쳐서 다시 생성하면 됩니다.
분면 네 색은 한때 이 아이콘의 색상과 채도를 그대로 쓰고 밝기만 옮긴 값이었습니다
(같은 hex는 아니었습니다). 2026-08-28에 분면 쪽이 더 선명한 값으로 바뀌면서 둘이
갈라졌으니, 아이콘을 다시 그린다면 src/shared/theme.ts 의 QUAD 를 보고 맞추면 됩니다.
powershell -ExecutionPolicy Bypass -File tools\make-icon.ps1
%APPDATA%\Nekan\data.json
이름이 바뀌기 전 폴더(EisenhowerMatrix, 그 전의 eisenhower-matrix)에 데이터가 있으면
처음 실행할 때 한 번 복사해 옵니다. 옛 폴더는 그대로 남으니 확인한 뒤 지우면 됩니다.
할 일(마감일·메모 포함)과 완료 기록, 휴지통 항목, 창·테마 설정이 모두 이 파일에 JSON으로 저장됩니다. 업무·일상 매트릭스도 파일이 갈리지 않습니다 — 항목마다 어느 쪽인지가 붙어 있고(다 꺼내기 항목은 비어 있음), 지금 보고 있는 쪽만 설정에 기록됩니다. 저장은 임시 파일에 쓴 뒤 rename 하는 방식이라 중간에 끊겨도 파일이 깨지지 않습니다. 백업하려면 이 파일만 복사하면 됩니다.
로그인 정보는 이 파일에 들어 있지 않습니다. %APPDATA%\Nekan\auth.json에 OS가 암호화해
따로 보관하므로, data.json을 복사해도 계정 정보는 따라가지 않습니다.
build/icon.ico # exe / 작업표시줄 아이콘
tools/make-icon.ps1 # 아이콘 생성 스크립트
tools/seed-dev-data.js # 대량 더미 데이터 생성 (성능 확인용)
tools/dist.js # 패키징 진행자 — dist · dist:mac · release 셋이 여기를 지난다
tools/check-release.js # 릴리스 draft 검사·복구 (dist.js 가 부름)
tools/find-untranslated.js # 소스에 남은 한글 줄 수를 셈
src/ # 쓰는 곳 (TypeScript)
main.ts # 앱 생명주기와 조립
preload.ts # contextBridge 기반 IPC 브리지
assets/icon.* # 런타임에서 쓰는 아이콘 사본
main/
store.ts # data.json 메모리 사본 + 디바운스 저장
store-io.ts # data.json 읽기/쓰기 (temp write + rename)
window.ts # 창 생성, 확장/바 모드
export-service.ts # PDF·HTML·MD 쓰기
updater.ts # GitHub Releases 확인 · 백그라운드 다운로드
api-client.ts # Supabase와 말하는 유일한 곳
token-store.ts # 세션을 암호화해 auth.json에 보관
sync.ts # 당기고 밀고 다시 시도하는 루프
oauth.ts # Google·Apple 로그인의 브라우저 쪽 (PKCE + loopback)
i18n.ts # 메인 프로세스의 문자열
ipc.ts # ipcMain 핸들러 전부
shared/ # 메인·렌더러·테스트 공용. Node도 DOM도 쓰지 않는다
types.ts # Task · Place · Space · Layout · Session 등 어휘
core.ts # 날짜·정규화·레이아웃 비율·업무/일상 규칙
export.ts # 내보내기 문서 생성 (Markdown / 인쇄용 HTML → PDF)
sync.ts # 동기화 판정 (LWW·행 변환·커서·시계 오차)
auth.ts # 세션 모양과 만료 판정
i18n/ # ko.json · en.json · GLOSSARY.md · locales.ts
renderer/ # React (Vite가 묶는다 — import는 .js 확장자를 그대로 쓴다)
index.html
app.ts # 진입점: 렌더 디스패처, 단축키, 초기화
store.ts # 할 일 배열과 모든 변경 (DOM을 모름)
render-bus.ts # "다시 그려라" 신호
i18n.ts # 렌더러의 문자열
dom.ts # 공통 DOM 헬퍼
selection.ts # 어느 할 일의 메모를 보고 있나
panels.ts # 설정 패널이 열려 있나
react/ # 아이콘, 스토어 구독 훅, 테스트 헬퍼
components/ # 마감일 칩, 메모 표시, 토스트, 인라인 편집, 추가 폼
views/ # 4분면 · 다 꺼내기 · 히스토리/휴지통 · 메모 패널 · 계정 · 설정 · 첫 실행
window/ # 타이틀바·탭 · 바/창 모드 · 분면 경계 드래그 ·
# 드래그앤드롭 · 내보내기
styles/ # 영역별 15개 (라이트/다크 팔레트는 base.css, 공용 토글은 switch.css)
out/ # `npm run build`가 만든다. 앱이 실제로 읽는 것
test/ # node --test 단위 테스트 (TypeScript)
# 컴포넌트 테스트는 vitest로, 소스 옆 *.test.tsx