TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
굿노트처럼 PDF를 가져와 필기하는 웹앱
Translation pending
ProductivityJavaScript · CSSGitHub @progh2OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
굿노트처럼 PDF 위에 펜으로 필기하는 웹앱. 서버도 로그인도 없습니다. • 종이가 먼저. 툴바·서랍이 종이 크기나 비율을 깎지 않습니다(미리보기 서랍만 예외로 밀어냅니다). • 바 하나. 굿노트4식 유틸리티 바 한 줄. 두 번째 알약이나 레일을 만들지 않습니다. • 조용히 이기지 않습니다. 남의 기기가 고친 것을 덮어쓰지 않고, 지운 것은 되돌릴 수 있고, 실패는 한 줄로 말합니다. • 펜이 먼저입니다. S펜·애플펜슬이 보고하는 표본을 하나도 버리지 않고 곡선으로 잇고, 그리는 동안에는 그 획만 따로 얹어 필기가 쌓여도 느려지지 않습니다. 저장은 획 사이가 아니라 한가할 때 합니다. • 필기는 좌표입니다. 1000쪽 문서라도 저장은 몇 KB, 언제든 다시 고칠 수 있습니다. 1. PDF만 올려요 상자에 PDF를 놓습니다. 드롭박스·구글 드라이브에서 바로 열 수도 있습니다. 2. 문서는 잠금(보기)으로 열립니다. 헤더 오른쪽 자물쇠로 편집으로 바꿉니다. 3. 바에서 도구를 고르고 씁니다. 클라우드 문서라면 2.5초 뒤 알아서 올라갑니다 — 평소엔 저장을 누를 일이 없습니다.Read the full README ↗
굿노트처럼 PDF 위에 펜으로 필기하는 웹앱. 서버도 로그인도 없습니다.
써 보기 → https://pdf-ink.vercel.app
| 무엇 | PDF를 열어 펜·형광·색연필로 쓰고, 쪽을 오리고 붙이고, 목차를 달고, PDF로 굽는다 |
| 어디에 남나 | 필기는 이 브라우저에. 원하면 드롭박스·구글 드라이브의 PDF 옆에 작은 파일로 |
| 서버 | 없음. 정적 호스팅뿐이라 우리 쪽에 남는 문서가 없다 |
| 기술 | 바닐라 JS + Vite · pdf.js(렌더) · pdf-lib(쓰기) · PWA(오프라인) |
| 라이선스 | AGPL-3.0-or-later |
| 칸 | 탭하면 | 길게 누르면(400ms) |
|---|---|---|
| 펜 | 펜으로 쓰기 | 색·굵기 팔레트 |
| 형광 | 형광펜(끌 정도 투명, 납작한 팁) | 팔레트 |
| 색연필 | 색연필(기본 채점 빨강) | 팔레트 |
| 지우개 | 쓰던 모드로 지우기 | 획/픽셀 모드와 크기 |
| 손바닥 | 종이를 끌어 옮기기 (편집 진입 시 기본) | — |
| 선택 | 상자로 고르기 · 영역 잡기 | — |
| 되돌리기 / 다시 실행 | 한 단계 | 되돌리기를 길게 = 다시 실행 |
| ⋯ | 전체화면 · 이미지 · 쪽 가져오기 · 스티커 · 회전 · 쪽 복사/붙여넣기 · 선반 · 저장 · PDF에 굽기 · 다른 이름으로 저장 · 내보내기 · 필기 옮기기 |
PC에서는 스페이스를 누르는 동안만 손바닥이 되고, 떼면 쓰던 도구로 돌아옵니다.
펜·형광·색연필로 한 획을 긋고 끝에서 400ms 멈추면 후보 도형이 40% 고스트로 뜨고 직선·사각·원 칩이 종이 위에 납니다. 칩을 눌러야 도형이 되고, 안 고르면 손 획 그대로입니다.
헤더 왼쪽 위 아이콘으로 엽니다. 눌러 두면 종이를 만지거나 획을 그어도 열린 채 남고, 본문을 가리지 않고 왼쪽 자리를 차지하며 밀어냅니다(오른쪽 가장자리를 끌어 96~360px). 썸에는 필기도 함께 보이고, 한 번 그린 쪽 그림은 저장해 두었다가 다시 열 때 바로 씁니다.
목차 항목은 쪽 번호가 아니라 그 쪽 자체를 가리켜서, 순서를 바꾸거나 앞에 쪽을 끼워도 같은 쪽으로 갑니다. 탭하면 이동, 더블탭하면 이름 고치기, 길게 누르면 이름 변경·삭제입니다. 원래 목차가 든 PDF를 열면 그 목차를 읽어 채웁니다. 목차와 책갈피(별)는 내보낸 PDF 안에 박힙니다.
같은 자료의 다른 판에서 필기를 가져옵니다. 쪽 번호가 아니라 쪽에 적힌 글자(없으면 쪽 그림)로 짝을 찾으므로 판마다 쪽 수가 달라도 제자리를 찾아갑니다. 두 문서를 나란히 놓고 짝을 고쳐 정할 수 있고, 되돌리기 한 번으로 통째 취소됩니다.
| 무엇 | 어디에 |
|---|---|
| 필기·쪽 구성·목차 | 이 브라우저(localStorage, 넘치면 IndexedDB) + 클라우드 사이드카 <이름>.pdf.ink |
| PDF 원본 | 열어 온 곳(로컬 파일 · 드롭박스 · 구글 드라이브) + 다시 열기용 사본(IndexedDB) |
| 쪽 그림(썸네일) | IndexedDB. 문서별 설정으로 <이름>.pdf.thumbs 공유 |
| 스티커 | IndexedDB + (고르면) 드롭박스·드라이브 |
이름-필기.pdf를 내려받습니다.PDF에 들어 있던 링크는 잠금(보기)일 때 눌러 따라갑니다(http·https·mailto만). 자리는 옅은 하늘색으로 보이고, 설정에서 표시만 끌 수 있습니다. 굿노트 export처럼 파일 안에서 이미 목적지가 끊긴 링크는 길게 눌러 「이 문서의 몇 쪽」이나 웹 주소로 고칩니다 — 같은 곳을 가리키던 링크 전부를 한 번에 고칠 수도 있습니다. 고친 목적지는 쪽 자체를 가리키고, 사이드카에 담겨 다른 기기까지 따라가며 굽기·내보내기 때 파일에 박힙니다. 확인은 node scripts/inspect-links.mjs 문서.pdf.
| 항목 | 하는 일 |
|---|---|
| 툴바 위치 | 위·아래·왼쪽·오른쪽·떠 있게 (그립을 끌어도 됩니다) |
| 보기 | 페이지 넘김 ↔ 세로 스크롤 |
| 펜만 | S펜·애플펜슬만 그리기, 손가락은 이동 |
| 이 문서 썸네일 올리기 | 쪽 그림을 드롭박스에 함께 두고 다른 기기에서 한 번 내려받기 |
| 링크 자리 표시 | 링크 자리의 하늘색 표시 |
| 스티커 동기화 | 안 함 · 드롭박스 · 드라이브 |
| 배율 고정 | 핀치가 배율을 바꾸지 않게 |
| Ctrl/Cmd + C · V · X · Z | 복사 · 붙여넣기 · 잘라내기 · 되돌리기 (다시 실행은 Ctrl+Shift+Z 또는 Ctrl+Y) |
| Space (누르는 동안) | 손바닥 |
| Ctrl + 휠 · 헤더의 +/- | 확대·축소 (PC) |
| 화살표 / Shift·Alt + 화살표 | 고른 것 밀기 |
| 두 손가락 | 확대·이동 (0.7~8배, 멈추면 그 배율로 다시 그려 또렷하게) |
| 빠르게 튕기기 | 관성으로 쪽이 넘어갑니다 |
바깥 앱에서 복사한 것은 Ctrl+V가 가장 잘 붙습니다 — 브라우저의 클립보드 읽기는 몇 형식만 내주지만 진짜 붙여넣기는 원본 앱이 넣은 것을 그대로 들고 오기 때문입니다. 굿노트처럼 필기를 앱 안에만 담는 앱은 어떤 웹앱도 읽을 수 없어서, 그럴 땐 그렇다고 알려 주고 이미지로 내보내 끌어다 놓으라고 안내합니다.
브라우저의 설치(홈 화면에 추가)로 앱처럼 씁니다. 주소창이 사라져 종이가 넓어지고, 앱 껍데기와 PDF 엔진이 캐시돼 오프라인에서도 최근 문서를 엽니다. 새 버전이 준비되면 한 줄로 알리고 새로고침할 때 바뀝니다. 문서를 처음 열 때 저장공간 유지를 한 번 요청합니다 — 필기는 이 기기에만 있으니까요.
npm install
npm run dev # http://localhost:5173
npm test # node --test (순수 모듈 + 계약 테스트)
npm run build && npm run preview
npm run smoke # 빌드한 dist를 진짜 크로미움으로 — 열기·링크·펜·되돌리기·성능 예산
npm run notices # 서드파티 표시 다시 만들기
npm run smoke는 CI(GitHub Actions의 smoke 잡)가 매 PR마다 돌립니다. 로컬에서 돌리려면 npx playwright install chromium으로 크로미움을 받거나, 이미 있는 실행 파일을 SMOKE_CHROME으로 가리킵니다(루트 없이 apt-get download로 받은 라이브러리는 SMOKE_LD). /tmp가 작은 tmpfs라 차 있으면 크로미움 렌더러가 조용히 죽으니 TMPDIR를 넉넉한 곳으로 두세요.
src/main.js가 DOM과 이벤트를 배선하고, 나머지 순수 모듈 47개가 각자 *.test.js를 답니다. 배선·디자인 수치는 정규식 계약 테스트로 못 박습니다.드롭박스 App key는 코드에 들어 있어 바로 됩니다. 구글 드라이브는 값 두 개가 필요하고, 없으면 「구글 드라이브에서 열기」 버튼이 아예 보이지 않습니다.
VITE_GOOGLE_CLIENT_ID=...apps.googleusercontent.com
VITE_GOOGLE_API_KEY=AIza...
로컬은 .env.example을 .env.local로 복사해 채우고, 배포는 Vercel 환경변수에 같은 이름으로 넣고 재배포합니다(빌드 때 박힙니다). 둘 다 브라우저에 노출되는 공개값이라 시크릿이 아니며, 보호는 승인된 JavaScript 원본과 리퍼러 제한으로 합니다. 그래서 저장소에는 넣지 않습니다.
Vite 정적 호스팅만 씁니다. vercel.json이 빌드·출력(dist)·SPA fallback과 **콘텐츠 보안 정책(CSP)**을 지정합니다 — 스크립트는 우리 것만, 연결은 드롭박스·드라이브 원본만 허용합니다. 서버·로그인·시크릿은 없습니다.
| docs/PRD.md | 제품 정의 — 원칙, 되는 것, 아직 아닌 것 |
| docs/ARCHITECTURE.md | 구조와 UML(컴포넌트·모델·열기/저장 흐름) |
| docs/PROCESS.md | 이슈별로 무엇을 왜 그렇게 했는지의 기록 |
| docs/LICENSES.md | 무엇이 실려 나가고 왜 섞어도 되는지 |
| docs/BOARD.md | 이슈 보드 |
GNU AGPL-3.0-or-later (LICENSE). 자유롭게 쓰고 고치고 나눠 주되, 고친 것을 웹에서 서비스하면 그 소스도 같은 라이선스로 공개해야 합니다(13조). 그냥 쓰는 사람에게는 아무 의무가 없고, 가져가서 자기 서비스로 다시 파는 경우에만 걸립니다. 그래서 앱 화면에 소스 링크를 둡니다.
「필기웹」·「pdf-ink」라는 이름과 아이콘은 라이선스에 포함되지 않습니다. 포크는 다른 이름을 쓰세요.
함께 쓰는 것: pdfjs-dist(Apache-2.0), pdf-lib(MIT)와 그 의존성(MIT·Zlib·0BSD), workbox-window(MIT) — 모두 AGPL 안에 넣을 수 있습니다. 저작권 표시는 public/THIRD-PARTY-NOTICES.txt에 모아 앱의 다른 코드 링크로 엽니다.