{"standard":"Model Context Protocol & Agentic Tool Catalog v1.0","service":"Haru Utils","homepage":"https://utils.haruspace.app","llmsTxt":"https://utils.haruspace.app/llms.txt","llmsFullTxt":"https://utils.haruspace.app/llms-full.txt","totalTools":146,"tools":[{"name":"regex-tester","title":"정규식 테스트·치환","category":"developer","url":"https://utils.haruspace.app/tools/regex-tester","description":"실시간 매칭과 그룹을 확인하고 문자열을 치환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"flags":{"type":"string","maxLength":8,"pattern":{}},"view":{"type":"enum","values":["replace","extract","split"]}},"terms":[["정규식","문자열의 패턴을 표현하는 규칙"],["캡처 그룹","괄호로 묶어 따로 참조할 수 있는 일치 부분"],["플래그","전역·대소문자 무시 등 검색 방식을 바꾸는 옵션"]],"steps":[],"limitations":null},{"name":"json-formatter","title":"JSON 포맷·검증","category":"developer","url":"https://utils.haruspace.app/tools/json-formatter","description":"JSON을 정리하고 문법 오류 위치를 찾아요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"sortKeys":{"type":"boolean"},"view":{"type":"enum","values":["source","tree"]}},"terms":[["JSON","키와 값으로 구조화된 데이터 형식"],["파싱","문자열을 데이터 구조로 해석하는 과정"],["Minify","불필요한 공백과 줄바꿈을 제거하는 작업"]],"steps":[],"limitations":null},{"name":"json-diff","title":"JSON 비교","category":"developer","url":"https://utils.haruspace.app/tools/json-diff","description":"두 JSON의 추가·삭제·변경 항목을 비교해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"filter":{"type":"enum","values":["all","added","removed","changed"]}},"terms":[["경로(Path)","중첩된 값의 위치를 나타내는 표기"],["Added/Removed","한쪽에만 추가되거나 삭제된 항목"],["Changed","같은 경로에서 값이 달라진 항목"]],"steps":[],"limitations":null},{"name":"sql-in-generator","title":"SQL IN절 생성기","category":"developer","url":"https://utils.haruspace.app/tools/sql-in-generator","description":"줄 단위 목록을 안전한 IN절 값으로 바꿔요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"delimiter":{"type":"enum","values":["auto","newline","comma","tab","custom"]},"mode":{"type":"enum","values":["string","auto","number","qmark","dollar","named"]},"unique":{"type":"boolean"},"caseInsensitive":{"type":"boolean"},"sort":{"type":"boolean"},"wrap":{"type":"boolean"},"multiline":{"type":"boolean"}},"terms":[["IN절","여러 후보 중 하나와 일치하는지 검사하는 SQL 조건"],["이스케이프","따옴표 같은 특수문자를 안전하게 표현하는 처리"],["중복 제거","같은 입력을 하나만 남기는 처리"]],"steps":[],"limitations":null},{"name":"list-cleaner","title":"목록 정리·중복 제거","category":"text","url":"https://utils.haruspace.app/tools/list-cleaner","description":"중복·빈 줄을 지우고 정렬과 구분자를 적용해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"inputSeparator":{"type":"enum","values":["newline","comma","tab","custom"]},"trim":{"type":"boolean"},"removeEmpty":{"type":"boolean"},"normalizeWhitespace":{"type":"boolean"},"deduplicate":{"type":"boolean"},"caseInsensitive":{"type":"boolean"},"sort":{"type":"enum","values":["none","asc","desc","length","frequency","reverse"]},"separator":{"type":"enum","values":["newline","comma","tab","pipe","semicolon","custom"]},"quote":{"type":"enum","values":["none","single","double"]},"wrapper":{"type":"enum","values":["none","square","round","curly"]}},"terms":[["구분자","목록의 각 항목을 나누는 문자"],["Trim","항목 앞뒤 공백을 제거하는 처리"],["정렬","문자·숫자·길이 기준으로 순서를 바꾸는 처리"]],"steps":[],"limitations":null},{"name":"text-diff","title":"텍스트 비교","category":"text","url":"https://utils.haruspace.app/tools/text-diff","description":"두 텍스트를 줄 단위로 비교해 차이를 표시해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["word","character","line"]},"ignoreCase":{"type":"boolean"},"ignoreWhitespace":{"type":"boolean"}},"terms":[["Diff","두 자료 사이의 차이를 찾는 작업"],["Line-based","줄바꿈을 기준으로 비교하는 방식"],["Added/Removed","새로 생긴 줄과 사라진 줄"]],"steps":[],"limitations":null},{"name":"date-dday","title":"날짜·디데이 계산","category":"calculator","url":"https://utils.haruspace.app/tools/date-dday","description":"두 날짜의 차이와 기준일의 디데이를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"inclusive":{"type":"boolean"},"businessOnly":{"type":"boolean"}},"terms":[["D-day","기준일까지 남거나 지난 날짜를 나타내는 표기"],["경과일","시작 시점부터 지나간 날짜 수"],["포함 계산","시작일이나 종료일을 계산에 포함하는 방식"]],"steps":[],"limitations":null},{"name":"url-base64","title":"URL·Base64 변환","category":"developer","url":"https://utils.haruspace.app/tools/url-base64","description":"문자열을 URL 또는 Base64 형식으로 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["url-encode","url-decode","uri-encode","uri-decode","form-encode","form-decode","base64-encode","base64-decode","base64url-encode","base64url-decode"]},"padding":{"type":"boolean"},"lineWidth":{"type":"enum","values":["0","64","76"]}},"terms":[["URL Encode","예약 문자와 한글을 안전한 주소 문자로 바꾸는 처리"],["Base64","바이너리 데이터를 문자로 표현하는 인코딩"],["Decode","인코딩된 값을 원래 표현으로 되돌리는 처리"]],"steps":[],"limitations":null},{"name":"unix-timestamp","title":"Unix Timestamp 변환","category":"calculator","url":"https://utils.haruspace.app/tools/unix-timestamp","description":"초·밀리초 타임스탬프와 날짜를 상호 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"unit":{"type":"enum","values":["auto","seconds","milliseconds","microseconds","nanoseconds"]},"timezone":{"type":"enum","values":["Asia/Seoul","UTC","Asia/Tokyo","Asia/Shanghai","America/New_York","America/Los_Angeles","Europe/London","Europe/Paris"]}},"terms":[["Unix Timestamp","1970-01-01 UTC부터 흐른 시간"],["Epoch","타임스탬프 계산의 기준 시점"],["UTC","시간대 차이가 없는 국제 표준시"]],"steps":[],"limitations":null},{"name":"image-converter","title":"이미지 압축·WebP 변환","category":"image","url":"https://utils.haruspace.app/tools/image-converter","description":"크기와 품질을 조절해 WebP·JPEG·PNG로 저장해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"format":{"type":"enum","values":["jpeg","png","webp"]},"quality":{"type":"integer","min":30,"max":100},"fit":{"type":"enum","values":["contain","cover"]}},"terms":[["WebP","용량 대비 화질이 좋은 웹 이미지 형식"],["Quality","손실 압축 시 화질과 용량의 균형 값"],["Resize","픽셀 가로·세로 크기를 바꾸는 작업"]],"steps":[],"limitations":null},{"name":"qr-tool","title":"QR 코드 생성·읽기","category":"image","url":"https://utils.haruspace.app/tools/qr-tool","description":"텍스트 QR을 만들거나 이미지 속 QR을 읽어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"size":{"type":"integer","min":128,"max":2048},"level":{"type":"enum","values":["L","M","Q","H"]},"margin":{"type":"integer","min":4,"max":16},"dark":{"type":"string","maxLength":9,"pattern":{}},"light":{"type":"string","maxLength":9,"pattern":{}},"printPreset":{"type":"enum","values":["shelf","inventory","counter"]},"printCopies":{"type":"integer","min":1,"max":48},"showPrintCaption":{"type":"boolean"}},"terms":[["QR 코드","문자나 URL을 2차원 패턴으로 저장한 코드"],["오류 복원","일부가 가려져도 읽을 수 있게 하는 중복 데이터"],["Quiet Zone","QR 주변에 필요한 빈 여백"],["실제 크기","인쇄 배율을 확대·축소하지 않고 지정한 mm 크기로 출력하는 방식"]],"steps":[],"limitations":null},{"name":"barcode-tool","title":"바코드 생성·인식","category":"image","url":"https://utils.haruspace.app/tools/barcode-tool","description":"EAN·UPC·Code 128 바코드를 만들고 이미지와 카메라로 읽어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["create","image","store"]},"format":{"type":"enum","values":["Code128","EAN13","EAN8","UPCA","ITF14","Code39","DataMatrix","PDF417","QRCode"]},"scale":{"type":"integer","min":2,"max":8},"rotation":{"type":"enum","values":["0","90","180","270"]},"showText":{"type":"boolean"},"ecLevel":{"type":"enum","values":["","L","M","Q","H","0","2","4","6","8"]},"scanPreset":{"type":"enum","values":["retail","linear","matrix","all"]},"tryHarder":{"type":"boolean"},"tryRotate":{"type":"boolean"},"tryInvert":{"type":"boolean"},"continuous":{"type":"boolean"},"printPreset":{"type":"enum","values":["retail","shelf","warehouse"]},"printCopies":{"type":"integer","min":1,"max":48},"showPrintCaption":{"type":"boolean"}},"terms":[["심볼로지","바코드가 데이터를 막대나 셀로 표현하는 규격"],["GTIN","국제적으로 상품과 포장 단위를 식별하는 번호 체계"],["체크 디지트","앞자리 숫자로 계산해 입력 오류를 확인하는 마지막 숫자"],["Quiet Zone","스캐너가 코드 경계를 구분하도록 비워 두는 주변 여백"],["HRI","바코드 아래 사람이 읽을 수 있게 인쇄한 값"]],"steps":[],"limitations":null},{"name":"random-picker","title":"랜덤 추첨·팀 나누기","category":"calculator","url":"https://utils.haruspace.app/tools/random-picker","description":"명단에서 당첨자를 뽑고 균형 있게 팀을 나눠요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["winner","team"]},"count":{"type":"integer","min":1,"max":1000},"useWeights":{"type":"boolean"}},"terms":[["난수","예측하기 어려운 무작위 값"],["Shuffle","항목의 순서를 무작위로 섞는 처리"],["중복 추첨","같은 항목이 여러 번 선택되는 방식"]],"steps":[],"limitations":null},{"name":"character-counter","title":"글자 수 세기","category":"text","url":"https://utils.haruspace.app/tools/character-counter","description":"공백 포함·제외 글자 수와 단어 수를 확인해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["문자 수","화면상 문자 단위의 개수"],["바이트","저장·전송 용량을 세는 단위"],["UTF-8","한글을 보통 3바이트로 표현하는 문자 인코딩"]],"steps":[],"limitations":null},{"name":"age-calculator","title":"만 나이 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/age-calculator","description":"생년월일을 입력하고 오늘의 만 나이를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"leapPolicy":{"type":"enum","values":["february","march"]}},"terms":[["만 나이","생일이 지난 횟수를 기준으로 한 나이"],["기준일","나이를 계산하는 대상 날짜"],["총 개월 수","출생 후 지난 완전한 개월의 수"]],"steps":[],"limitations":null},{"name":"password-generator","title":"비밀번호 생성기","category":"developer","url":"https://utils.haruspace.app/tools/password-generator","description":"원하는 조건으로 안전한 비밀번호를 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"length":{"type":"integer","min":8,"max":128},"upper":{"type":"boolean"},"lower":{"type":"boolean"},"number":{"type":"boolean"},"symbol":{"type":"boolean"},"excludeAmbiguous":{"type":"boolean"},"minimum":{"type":"integer","min":1,"max":3},"count":{"type":"integer","min":1,"max":10}},"terms":[["엔트로피","비밀번호를 추측하기 어려운 정도"],["특수문자","영문·숫자 이외의 기호"],["혼동 문자","0/O, 1/l처럼 구분하기 어려운 문자"]],"steps":[],"limitations":null},{"name":"regex-builder","title":"정규식 생성기","category":"developer","url":"https://utils.haruspace.app/tools/regex-builder","description":"조건을 선택해 자주 쓰는 정규식을 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"kind":{"type":"enum","values":["number","integer","decimal","email","phone","korean","english","url","date","ipv4","slug"]},"exact":{"type":"boolean"},"global":{"type":"boolean"},"ignoreCase":{"type":"boolean"},"multiline":{"type":"boolean"}},"terms":[["앵커(^, $)","문자열의 시작과 끝을 고정하는 기호"],["문자 클래스","허용할 문자 범위를 묶은 표현"]],"steps":[],"limitations":null},{"name":"json-csv","title":"JSON ↔ CSV 변환","category":"developer","url":"https://utils.haruspace.app/tools/json-csv","description":"JSON 배열과 CSV 표를 양방향으로 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["json","csv"]},"delimiter":{"type":"enum","values":[",","\t",";","|"]},"protectFormula":{"type":"boolean"},"inferTypes":{"type":"boolean"},"includeBom":{"type":"boolean"}},"terms":[["CSV","쉼표로 열을 구분하는 표 형식"],["헤더","각 열의 이름이 들어 있는 첫 행"]],"steps":[],"limitations":null},{"name":"sql-formatter","title":"SQL 포매터","category":"developer","url":"https://utils.haruspace.app/tools/sql-formatter","description":"SQL 키워드와 들여쓰기를 읽기 좋게 정리해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"keywordCase":{"type":"enum","values":["upper","lower","preserve"]},"indentSize":{"type":"integer","min":2,"max":8}},"terms":[["절(Clause)","SELECT·WHERE처럼 역할이 구분된 SQL 부분"],["들여쓰기","구조를 읽기 쉽게 공백으로 표현하는 방식"]],"steps":[],"limitations":null},{"name":"jwt-viewer","title":"JWT 뷰어","category":"developer","url":"https://utils.haruspace.app/tools/jwt-viewer","description":"토큰의 Header·Payload와 만료 시간을 로컬에서 확인해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["JWT","점으로 나뉜 서명 가능한 토큰 형식"],["Payload","클레임 데이터가 담긴 본문"],["exp","토큰 만료 시각을 나타내는 표준 클레임"]],"steps":[],"limitations":null},{"name":"uuid-generator","title":"UUIDv7·ULID 생성기","category":"developer","url":"https://utils.haruspace.app/tools/uuid-generator","description":"UUID v4·v7과 ULID를 원하는 개수만큼 안전하게 생성해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"version":{"type":"enum","values":["v4","v7","ulid"]},"outputFormat":{"type":"enum","values":["lines","comma","json","sql"]},"uppercase":{"type":"boolean"},"hyphens":{"type":"boolean"},"count":{"type":"integer","min":1,"max":1000}},"terms":[["UUID v4","무작위 비트로 만드는 128비트 식별자"],["UUID v7","밀리초 타임스탬프와 난수를 결합한 시간 정렬형 UUID"],["ULID","48비트 시간과 80비트 난수를 Crockford Base32로 표현한 26자 식별자"],["단조 증가","같은 밀리초 안에서 생성 순서대로 정렬되도록 난수 부분을 증가시키는 방식"]],"steps":[],"limitations":null},{"name":"security-key-generator","title":"보안키 생성 도구","category":"developer","url":"https://utils.haruspace.app/tools/security-key-generator","description":"암호화 키 등에 사용할 32바이트 난수를 Base64 형식으로 생성합니다","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"bytes":{"type":"integer","min":8,"max":128},"format":{"type":"enum","values":["base64","base64url","hex"]}},"terms":[["바이트(Byte)","8비트로 구성된 데이터 크기 단위"],["CSPRNG","예측하기 어려운 값을 만드는 암호학적으로 안전한 난수 생성기"],["Base64","바이너리 데이터를 텍스트로 표현하는 인코딩 형식"],["엔트로피","값을 추측하기 어렵게 만드는 무작위성의 크기"]],"steps":[],"limitations":null},{"name":"hash-generator","title":"Hash 생성기","category":"developer","url":"https://utils.haruspace.app/tools/hash-generator","description":"텍스트의 SHA 해시값을 브라우저에서 생성해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"algorithm":{"type":"enum","values":["SHA-1","SHA-256","SHA-384","SHA-512"]},"uppercase":{"type":"boolean"}},"terms":[["해시","입력을 고정 길이 값으로 요약하는 단방향 함수"],["HEX","바이트를 16진수 문자로 표현하는 형식"],["Digest","해시 계산의 최종 결과값"]],"steps":[],"limitations":null},{"name":"cron-builder","title":"Cron 생성기","category":"developer","url":"https://utils.haruspace.app/tools/cron-builder","description":"실행 주기를 선택해 Cron 표현식을 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"dialect":{"type":"enum","values":["unix","quartz"]},"includeSeconds":{"type":"boolean"}},"terms":[["Cron","반복 작업 시간을 표현하는 문법"],["와일드카드(*)","모든 가능한 값을 뜻하는 기호"]],"steps":[],"limitations":null},{"name":"color-converter","title":"컬러 변환기","category":"developer","url":"https://utils.haruspace.app/tools/color-converter","description":"HEX·RGB·HSL 색상값을 상호 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"output":{"type":"enum","values":["hex","rgb","hsl"]},"alpha":{"type":"boolean"}},"terms":[["HEX","RGB 채널을 16진수로 표현한 색상값"],["RGB","빨강·초록·파랑의 조합"],["HSL","색상·채도·밝기로 표현하는 방식"]],"steps":[],"limitations":null},{"name":"http-status","title":"HTTP 상태코드 검색","category":"developer","url":"https://utils.haruspace.app/tools/http-status","description":"상태코드의 의미와 기본 점검 방법을 찾아요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"category":{"type":"enum","values":["all","1","2","3","4","5"]}},"terms":[["HTTP 상태코드","요청 처리 결과를 나타내는 세 자리 숫자"],["4xx/5xx","클라이언트 오류와 서버 오류 범위"]],"steps":[],"limitations":null},{"name":"url-query-parser","title":"URL 쿼리 분석기","category":"developer","url":"https://utils.haruspace.app/tools/url-query-parser","description":"긴 URL을 경로와 쿼리 파라미터로 분해해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"removeTracking":{"type":"boolean"},"sortParameters":{"type":"boolean"}},"terms":[["Query Parameter","? 뒤에 key=value로 붙는 주소 정보"],["Origin","프로토콜·도메인·포트 조합"],["Hash","# 뒤의 페이지 내부 위치 정보"]],"steps":[],"limitations":null},{"name":"utm-builder","title":"UTM 링크 생성기","category":"developer","url":"https://utils.haruspace.app/tools/utm-builder","description":"캠페인 추적용 UTM 파라미터를 안전하게 조합해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"normalize":{"type":"boolean"}},"terms":[["UTM","유입 경로를 분석하기 위한 URL 추적 파라미터"],["Campaign","프로모션이나 콘텐츠 묶음의 식별값"]],"steps":[],"limitations":null},{"name":"deep-link-builder","title":"모바일 딥링크 생성기","category":"developer","url":"https://utils.haruspace.app/tools/deep-link-builder","description":"앱 스킴과 폴백 URL을 조합해 딥링크를 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["custom","android"]}},"terms":[["Deep Link","앱의 특정 화면을 바로 여는 링크"],["Scheme","링크가 사용할 앱 프로토콜 이름"],["Fallback","앱이 없을 때 이동할 대체 웹 주소"]],"steps":[],"limitations":null},{"name":"youtube-thumbnail","title":"YouTube 썸네일 추출","category":"developer","url":"https://utils.haruspace.app/tools/youtube-thumbnail","description":"영상 주소에서 썸네일 이미지 주소를 추출해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Video ID","YouTube 영상을 구분하는 11자리 식별자"],["maxresdefault","최대 해상도 썸네일의 일반 파일명"]],"steps":[],"limitations":null},{"name":"browser-info","title":"브라우저·화면 정보","category":"developer","url":"https://utils.haruspace.app/tools/browser-info","description":"현재 브라우저·OS·화면과 언어 정보를 확인해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Viewport","현재 웹페이지가 실제로 보이는 영역"],["Pixel Ratio","CSS 픽셀과 실제 화면 픽셀의 비율"],["User Agent","브라우저가 제공하는 실행 환경 문자열"]],"steps":[],"limitations":null},{"name":"password-rule","title":"비밀번호 규칙 테스트","category":"developer","url":"https://utils.haruspace.app/tools/password-rule","description":"비밀번호가 지정한 길이와 문자 조건을 만족하는지 검사해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["정책(Policy)","비밀번호가 만족해야 하는 규칙"],["복잡도","여러 문자 유형을 사용하는 정도"]],"steps":[],"limitations":null},{"name":"test-data-generator","title":"랜덤 테스트 데이터","category":"developer","url":"https://utils.haruspace.app/tools/test-data-generator","description":"가짜 이름·이메일·전화번호 데이터를 로컬에서 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Mock Data","테스트 목적으로 만든 가상 데이터"],["UUID","중복 가능성이 매우 낮은 식별자"]],"steps":[],"limitations":null},{"name":"privacy-masking","title":"개인정보 마스킹","category":"text","url":"https://utils.haruspace.app/tools/privacy-masking","description":"이름·전화번호·이메일의 일부를 자동으로 가려요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"names":{"type":"boolean"},"phones":{"type":"boolean"},"emails":{"type":"boolean"}},"terms":[["마스킹","민감한 값의 일부를 가리는 처리"],["PII","개인을 식별하거나 연결할 수 있는 정보"]],"steps":[],"limitations":null},{"name":"table-markdown","title":"표 → Markdown","category":"document","url":"https://utils.haruspace.app/tools/table-markdown","description":"탭·CSV 표를 Markdown 테이블로 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"alignment":{"type":"enum","values":["none","left","center","right"]},"trim":{"type":"boolean"}},"terms":[["Markdown","간단한 기호로 문서 구조를 표현하는 문법"],["Delimiter","표의 열을 나누는 구분 문자"]],"steps":[],"limitations":null},{"name":"kakao-chat-cleaner","title":"카카오톡 대화 정리","category":"document","url":"https://utils.haruspace.app/tools/kakao-chat-cleaner","description":"내보낸 대화를 날짜·이름·메시지 형태로 정리해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["파싱","일정한 규칙으로 문장을 항목별 분리하는 과정"],["타임스탬프","메시지가 기록된 날짜와 시간"]],"steps":[],"limitations":null},{"name":"hidden-character","title":"숨은 문자 탐지기","category":"text","url":"https://utils.haruspace.app/tools/hidden-character","description":"공백·탭·제로폭 문자와 줄바꿈을 눈에 보이게 표시해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["제로폭 문자","화면 너비 없이 문자열에 존재하는 유니코드 문자"],["탭","다음 탭 위치로 이동시키는 공백 제어 문자"]],"steps":[],"limitations":null},{"name":"text-extractor","title":"이메일·전화·IP 추출","category":"text","url":"https://utils.haruspace.app/tools/text-extractor","description":"텍스트에서 이메일·전화번호·IP 주소만 추출해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"emails":{"type":"boolean"},"phones":{"type":"boolean"},"ipv4":{"type":"boolean"},"ipv6":{"type":"boolean"}},"terms":[["패턴 추출","규칙에 맞는 부분 문자열만 골라내는 작업"],["IPv4","점으로 나눈 네 개 숫자의 IP 주소 형식"]],"steps":[],"limitations":null},{"name":"domain-extractor","title":"URL 도메인 추출","category":"text","url":"https://utils.haruspace.app/tools/domain-extractor","description":"여러 URL에서 호스트와 도메인 목록만 추출해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"unique":{"type":"boolean"},"includeSubdomain":{"type":"boolean"},"sort":{"type":"boolean"}},"terms":[["Hostname","URL에서 서버를 나타내는 도메인 부분"],["Subdomain","기본 도메인 앞에 붙는 하위 이름"]],"steps":[],"limitations":null},{"name":"missing-number","title":"번호 누락값 찾기","category":"text","url":"https://utils.haruspace.app/tools/missing-number","description":"숫자 목록에서 범위 안의 빠진 번호를 찾아요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["범위","최솟값과 최댓값 사이의 구간"],["누락값","예상된 연속 목록에 없는 값"]],"steps":[],"limitations":null},{"name":"range-compressor","title":"숫자 범위 압축","category":"text","url":"https://utils.haruspace.app/tools/range-compressor","description":"연속된 숫자를 1-3, 5-7 형태로 압축해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"sort":{"type":"boolean"},"unique":{"type":"boolean"},"minimumRun":{"type":"integer","min":2,"max":10}},"terms":[["연속 범위","1씩 증가하며 이어지는 숫자 구간"],["압축 표기","여러 숫자를 시작-끝으로 줄이는 표현"]],"steps":[],"limitations":null},{"name":"privacy-scanner","title":"개인정보 포함 검사","category":"text","url":"https://utils.haruspace.app/tools/privacy-scanner","description":"텍스트에 이메일·전화·주민번호 패턴이 있는지 로컬 검사해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["로컬 검사","데이터를 외부로 보내지 않고 기기에서 분석하는 방식"],["오탐","실제 민감정보가 아닌데 패턴으로 검출되는 경우"]],"steps":[],"limitations":null},{"name":"document-privacy-scanner","title":"문서 민감정보 검사·가명화","category":"document","url":"https://utils.haruspace.app/tools/document-privacy-scanner","description":"PDF·DOCX·HWPX·TXT·MD를 기기에서 검사하고 마스킹 보고서를 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["가명화","원래 값을 직접 드러내지 않는 일관된 토큰으로 바꾸는 처리"],["잔여 검사","마스킹 결과에 탐지 가능한 민감정보가 남았는지 다시 확인하는 과정"],["오탐·미탐","민감하지 않은 값을 잘못 찾거나 실제 민감정보를 놓치는 현상"],["텍스트 레이어","PDF 화면의 글자를 선택·검색할 수 있게 포함된 문자 정보"]],"steps":["PDF·DOCX·HWPX·TXT·MD 중 한 파일을 선택하고, 필요한 민감정보 유형을 확인하세요.","문서 분석을 시작하면 기기 안에서 텍스트 추출·가명화·전체 규칙 잔여 검사를 순서대로 실행합니다.","탐지 후보와 잔여 위험을 사람이 검토한 뒤 마스킹 Excel 보고서 또는 가명화 TXT를 저장하세요."],"limitations":"스캔 PDF·이미지 속 글자·PDF 첨부 파일·임베디드 객체·구형 HWP·암호화 문서는 검사하지 못하며 원본 파일 자체를 정화하지 않습니다. 원문 복원을 피하기 위해 개별 후보 제외는 지원하지 않으며, 유형 단위로 다시 분석할 수 있습니다. 이름·주소 같은 문맥 규칙은 오탐과 미탐이 있을 수 있으므로 자동 결과를 사람이 최종 검토하세요."},{"name":"requirements-fp-analyzer","title":"요구사항·FP 1차 정리","category":"document","url":"https://utils.haruspace.app/tools/requirements-fp-analyzer","description":"가명화된 문서에서 요구사항과 기능점수 산정 후보를 로컬로 추출해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["요구사항 후보","의무 표현과 업무 동사를 기준으로 자동 추출한 1차 문장"],["FP","사용자 관점의 기능 규모를 EI·EO·EQ·ILF·EIF로 분류해 산정하는 기능점수"],["DET","사용자가 인식할 수 있는 고유 데이터 요소 유형"],["FTR·RET","트랜잭션이 참조하는 파일 유형과 논리 파일의 레코드 요소 유형"]],"steps":["먼저 문서 민감정보 검사·가명화에서 잔여 후보가 없는 TXT를 준비하세요.","요구사항 후보를 분석하고 분류·우선순위·채택 여부를 검토하세요.","FP 후보의 유형과 DET·FTR·RET를 입력한 뒤 Excel·JSON·Markdown 산출물을 내려받으세요."],"limitations":"규칙 기반 1차 분류이므로 복합 문장·표·도식의 의미를 완전히 이해하지 못합니다. FP 유형과 DET·FTR·RET는 발주 기준 및 IFPUG 해석에 따라 담당자가 확정해야 하며 공식 견적·계약 산정값이 아닙니다."},{"name":"mojibake-helper","title":"깨진 한글 복구 도우미","category":"text","url":"https://utils.haruspace.app/tools/mojibake-helper","description":"UTF-8·Latin-1 변환을 시도해 깨진 한글을 복구해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Mojibake","문자 인코딩 불일치로 글자가 깨지는 현상"],["인코딩","문자를 바이트로 표현하는 규칙"]],"steps":[],"limitations":null},{"name":"similar-character","title":"비슷한 문자 구분기","category":"text","url":"https://utils.haruspace.app/tools/similar-character","description":"0/O, 1/l/I처럼 혼동하기 쉬운 문자를 표시해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["동형이의 문자","모양은 비슷하지만 코드가 다른 문자"],["Unicode","전 세계 문자를 번호로 정의한 표준"]],"steps":[],"limitations":null},{"name":"emoji-symbols","title":"이모지·특수문자 모음","category":"text","url":"https://utils.haruspace.app/tools/emoji-symbols","description":"자주 쓰는 이모지·화살표·괄호를 검색하고 복사해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Emoji","그림 형태로 표시되는 유니코드 문자"],["Code Point","유니코드에서 문자마다 부여한 번호"]],"steps":[],"limitations":null},{"name":"excel-column","title":"엑셀 열 문자 변환","category":"document","url":"https://utils.haruspace.app/tools/excel-column","description":"열 번호와 A·AB 같은 열 문자를 상호 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["열 인덱스","스프레드시트 열의 1부터 시작하는 번호"],["열 문자","A~Z 조합으로 나타낸 스프레드시트 열 이름"]],"steps":[],"limitations":null},{"name":"date-list","title":"날짜 목록 생성","category":"document","url":"https://utils.haruspace.app/tools/date-list","description":"시작일부터 종료일까지 날짜 목록을 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Interval","목록에서 날짜 사이의 간격"],["ISO Date","YYYY-MM-DD 형태의 표준 날짜 표현"]],"steps":[],"limitations":null},{"name":"business-days","title":"근무일 계산기","category":"document","url":"https://utils.haruspace.app/tools/business-days","description":"주말을 제외한 평일 수를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["근무일","업무가 이루어지는 날"],["영업일","주말·휴일을 제외한 서비스 운영일"]],"steps":[],"limitations":null},{"name":"filename-generator","title":"파일명 일괄 생성","category":"document","url":"https://utils.haruspace.app/tools/filename-generator","description":"접두사·번호·날짜 규칙으로 파일명 목록을 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Zero Padding","1을 001처럼 고정 자릿수로 채우는 방식"],["확장자","파일 형식을 나타내는 이름 끝부분"]],"steps":[],"limitations":null},{"name":"ratio-calculator","title":"비율 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/ratio-calculator","description":"증가율·할인율·비례식을 간편하게 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["증가율","기준값 대비 늘어난 비율"],["비례식","두 비율이 같다는 관계식"]],"steps":[],"limitations":null},{"name":"unit-converter","title":"단위 변환기","category":"calculator","url":"https://utils.haruspace.app/tools/unit-converter","description":"길이·무게·온도·용량 단위를 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"category":{"type":"enum","values":["length","weight","area","speed","time","temperature","data"]}},"terms":[["환산 계수","한 단위를 다른 단위로 바꾸는 배율"],["SI 단위","미터·킬로그램 등을 쓰는 국제 단위 체계"]],"steps":[],"limitations":null},{"name":"discount-vat","title":"할인·부가세 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/discount-vat","description":"할인가와 부가세 포함·별도 금액을 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"vatRate":{"type":"integer","min":0,"max":100},"rounding":{"type":"enum","values":["none","floor","round","ceil"]}},"terms":[["공급가액","부가세를 제외한 상품·서비스 금액"],["부가세","공급가액에 일정 비율로 붙는 세금"]],"steps":[],"limitations":null},{"name":"area-converter","title":"평수 ↔ 제곱미터","category":"calculator","url":"https://utils.haruspace.app/tools/area-converter","description":"평과 제곱미터를 빠르게 상호 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"precision":{"type":"integer","min":0,"max":10}},"terms":[["제곱미터(㎡)","가로 1m × 세로 1m의 면적"],["평","국내 부동산에서 관용적으로 쓰는 면적 단위"]],"steps":[],"limitations":null},{"name":"split-bill","title":"여행 경비 더치페이","category":"calculator","url":"https://utils.haruspace.app/tools/split-bill","description":"총액·인원·추가 비용으로 1인 금액을 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"rounding":{"type":"enum","values":["1","10","100","1000"]}},"terms":[["더치페이","비용을 참여자끼리 나누어 부담하는 방식"],["정산 차액","반올림 때문에 총액과 합계가 달라지는 금액"]],"steps":[],"limitations":null},{"name":"fuel-cost","title":"연비·유류비 계산","category":"calculator","url":"https://utils.haruspace.app/tools/fuel-cost","description":"거리·연비·유가로 예상 주유비를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["연비","연료 1L로 주행할 수 있는 거리"],["유류비","주행에 필요한 연료의 예상 비용"]],"steps":[],"limitations":null},{"name":"childcare-months","title":"육아 개월 수 계산","category":"calculator","url":"https://utils.haruspace.app/tools/childcare-months","description":"생년월일 기준 개월 수와 다음 개월 날짜를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["월령","출생 후 지난 개월 수"],["교정 연령","미숙아의 예정일을 고려한 발달 기준 나이"]],"steps":[],"limitations":null},{"name":"file-size-converter","title":"파일 크기 단위 변환","category":"calculator","url":"https://utils.haruspace.app/tools/file-size-converter","description":"Byte·KB·MB·GB·TB 단위를 상호 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"base":{"type":"enum","values":["1000","1024"]},"precision":{"type":"integer","min":0,"max":10}},"terms":[["Byte","데이터 크기의 기본 단위"],["Binary Unit","1024배를 기준으로 하는 KiB·MiB 체계"]],"steps":[],"limitations":null},{"name":"file-checksum","title":"파일 체크섬 생성","category":"file","url":"https://utils.haruspace.app/tools/file-checksum","description":"파일의 SHA-256·SHA-512 체크섬을 생성해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Checksum","파일이 변하지 않았는지 비교하는 요약값"],["SHA-256","256비트 결과를 만드는 해시 알고리즘"]],"steps":[],"limitations":null},{"name":"filename-list","title":"파일명 목록 추출","category":"file","url":"https://utils.haruspace.app/tools/filename-list","description":"선택한 여러 파일의 이름·크기·형식을 목록으로 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["MIME Type","파일 콘텐츠 형식을 나타내는 표준 문자열"],["Last Modified","브라우저가 제공하는 마지막 수정 시각"]],"steps":[],"limitations":null},{"name":"image-metadata-cleaner","title":"이미지 메타데이터 제거","category":"image","url":"https://utils.haruspace.app/tools/image-metadata-cleaner","description":"이미지를 다시 인코딩해 위치·EXIF 정보를 제거해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"format":{"type":"enum","values":["image/jpeg","image/png","image/webp"]},"quality":{"type":"integer","min":1,"max":100}},"terms":[["EXIF","촬영 기기·시간·위치 등이 담길 수 있는 사진 메타데이터"],["Re-encode","픽셀을 새 이미지 파일로 다시 저장하는 처리"]],"steps":[],"limitations":null},{"name":"image-palette","title":"이미지 색상 팔레트","category":"image","url":"https://utils.haruspace.app/tools/image-palette","description":"이미지에서 자주 쓰인 대표 색상을 추출해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Palette","함께 사용하는 대표 색상 묶음"],["Quantization","비슷한 색을 묶어 색상 수를 줄이는 처리"]],"steps":[],"limitations":null},{"name":"svg-converter","title":"SVG 미리보기·PNG 변환","category":"image","url":"https://utils.haruspace.app/tools/svg-converter","description":"SVG 코드를 미리 보고 PNG로 저장해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["SVG","벡터 도형을 XML로 표현한 이미지 형식"],["Rasterize","벡터 이미지를 픽셀 이미지로 바꾸는 작업"]],"steps":[],"limitations":null},{"name":"favicon-generator","title":"파비콘 이미지 생성","category":"image","url":"https://utils.haruspace.app/tools/favicon-generator","description":"원본 이미지를 파비콘·앱 아이콘 크기로 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Favicon","브라우저 탭과 북마크에 표시되는 사이트 아이콘"],["PWA Icon","설치형 웹 앱에 쓰는 고해상도 아이콘"]],"steps":[],"limitations":null},{"name":"image-padding","title":"이미지 여백 추가","category":"image","url":"https://utils.haruspace.app/tools/image-padding","description":"색상과 비율을 지정해 이미지에 여백을 추가해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"fit":{"type":"enum","values":["contain","cover"]},"background":{"type":"string","maxLength":9,"pattern":{}}},"terms":[["Canvas","최종 이미지 전체 영역"],["Padding","콘텐츠 바깥쪽에 두는 내부 여백"]],"steps":[],"limitations":null},{"name":"sns-resizer","title":"SNS 이미지 리사이즈","category":"image","url":"https://utils.haruspace.app/tools/sns-resizer","description":"SNS 권장 크기에 맞춰 이미지를 자동 배치해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"fit":{"type":"enum","values":["contain","cover"]},"format":{"type":"enum","values":["image/jpeg","image/png","image/webp"]},"quality":{"type":"integer","min":1,"max":100}},"terms":[["Aspect Ratio","가로와 세로 길이의 비율"],["Preset","자주 쓰는 값을 미리 묶어 둔 설정"]],"steps":[],"limitations":null},{"name":"image-merge","title":"이미지 이어 붙이기","category":"image","url":"https://utils.haruspace.app/tools/image-merge","description":"여러 이미지를 가로 또는 세로로 합쳐요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"direction":{"type":"enum","values":["horizontal","vertical","grid"]},"gap":{"type":"integer","min":0,"max":200},"background":{"type":"string","maxLength":9,"pattern":{}}},"terms":[["Merge","여러 이미지를 하나의 캔버스로 합치는 작업"],["Gap","이미지와 이미지 사이의 간격"]],"steps":[],"limitations":null},{"name":"image-split","title":"이미지 분할","category":"image","url":"https://utils.haruspace.app/tools/image-split","description":"이미지를 행·열 기준으로 나누어 저장해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"rows":{"type":"integer","min":1,"max":20},"columns":{"type":"integer","min":1,"max":20},"format":{"type":"enum","values":["image/png","image/jpeg","image/webp"]}},"terms":[["Grid","행과 열로 나눈 격자"],["Tile","분할된 각각의 이미지 조각"]],"steps":[],"limitations":null},{"name":"profile-square","title":"정사각형 프로필 이미지","category":"image","url":"https://utils.haruspace.app/tools/profile-square","description":"사진을 중앙 기준 정사각형으로 잘라 저장해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"shape":{"type":"enum","values":["square","circle"]},"format":{"type":"enum","values":["image/png","image/jpeg","image/webp"]},"quality":{"type":"integer","min":1,"max":100}},"terms":[["Crop","필요한 영역만 남도록 이미지를 자르는 작업"],["Pan","이미지를 드래그해 보이는 위치를 옮기는 조작"],["Zoom","이미지를 확대하거나 축소하는 조작"]],"steps":[],"limitations":null},{"name":"yaml-json-toml","title":"YAML·JSON·TOML 변환","category":"developer","url":"https://utils.haruspace.app/tools/yaml-json-toml","description":"YAML·JSON·TOML을 브라우저에서 검증하고 정리해 서로 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"source":{"type":"enum","values":["yaml","json","toml"]},"target":{"type":"enum","values":["yaml","json","toml"]},"indent":{"type":"integer","min":2,"max":4}},"terms":[["YAML","들여쓰기와 간결한 문법으로 설정 데이터를 표현하는 형식"],["TOML","키·테이블 중심으로 설정을 읽기 쉽게 표현하는 형식"],["직렬화","메모리의 데이터 구조를 텍스트 형식으로 바꾸는 과정"],["스칼라","문자열·숫자·불리언처럼 더 나뉘지 않는 단일 값"]],"steps":[],"limitations":"입력은 브라우저에서만 파싱하며 서버에 저장하지 않습니다. 형식마다 주석·앵커·키 순서·날짜 타입 표현 방식이 달라 완전한 왕복 변환을 보장하지 않으며, 신뢰할 수 없는 태그나 실행 가능한 확장 문법은 처리하지 않습니다."},{"name":"xml-formatter","title":"XML 포매터·검증","category":"developer","url":"https://utils.haruspace.app/tools/xml-formatter","description":"XML을 브라우저에서 들여쓰기·검증하고 JSON으로 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["format","json"]},"indent":{"type":"integer","min":2,"max":4}},"terms":[["XML","태그와 속성으로 계층 구조를 표현하는 마크업 형식"],["Namespace","같은 태그 이름의 충돌을 막기 위한 이름 공간"],["CDATA","내용을 마크업으로 해석하지 않고 문자 그대로 다루는 구역"],["Well-formed","태그 짝과 문법이 XML 기본 규칙에 맞는 상태"]],"steps":[],"limitations":"처리는 로컬 브라우저 안에서 이루어집니다. 외부 DTD·엔티티는 불러오지 않으며 스키마 적합성, 전자서명, 비즈니스 규칙까지 검증하지 않습니다."},{"name":"jsonpath-tester","title":"JSONPath 테스터","category":"developer","url":"https://utils.haruspace.app/tools/jsonpath-tester","description":"JSONPath 표현식을 브라우저에서 실행해 일치한 값과 경로를 바로 확인해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"showPaths":{"type":"boolean"}},"terms":[["JSONPath","JSON 트리에서 원하는 값을 선택하는 경로 표현식"],["Root($)","JSONPath 탐색을 시작하는 최상위 값"],["Wildcard(*)","현재 위치의 모든 키나 배열 항목을 선택하는 기호"],["Filter","조건에 맞는 배열 항목만 고르는 표현식"]],"steps":[],"limitations":"JSON과 검색 결과는 브라우저 메모리에서만 처리됩니다. 임의 스크립트·정규식 함수·다중 재귀 하강은 지원하지 않으며 입력 25만 자, 경로 512자, 방문 10만 회로 제한합니다."},{"name":"json-schema-tool","title":"JSON Schema 검증기","category":"developer","url":"https://utils.haruspace.app/tools/json-schema-tool","description":"JSON 데이터와 Schema를 브라우저에서 비교해 오류 경로와 원인을 찾아요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["validate","generate"]}},"terms":[["JSON Schema","JSON 데이터의 구조·타입·제약을 선언하는 표준"],["Draft","JSON Schema 규격의 세대 또는 버전"],["required","객체에 반드시 있어야 하는 속성 이름 목록"],["$ref","다른 스키마 정의를 참조하는 키워드"]],"steps":[],"limitations":"검사는 브라우저에서만 수행됩니다. 외부 URL의 $ref와 임의 pattern·patternProperties 정규식은 거부하며, 스키마 1만 노드·32단계와 검증 방문 10만 회를 제한합니다. 전체 표준 적합성 인증이나 데이터 신뢰성을 보장하지 않습니다."},{"name":"json-type-generator","title":"JSON 타입 생성기","category":"developer","url":"https://utils.haruspace.app/tools/json-type-generator","description":"JSON 예시에서 TypeScript·Java·C# 타입을 브라우저에서 생성해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"language":{"type":"enum","values":["typescript","java","csharp"]}},"terms":[["타입 추론","예제 값에서 문자열·숫자·객체 등의 타입을 예상하는 과정"],["Interface","객체가 가져야 할 속성과 타입을 선언하는 구조"],["Union Type","여러 타입 중 하나가 될 수 있음을 나타내는 타입"],["Nullable","값이 null일 수 있는 상태"]],"steps":[],"limitations":"원본 JSON은 로컬에서만 분석합니다. 생성 결과는 예제에 나타난 값만 추론하므로 실제 API의 선택 필드·범위·날짜 의미를 알 수 없고, 컴파일과 런타임 검증을 대신하지 않습니다."},{"name":"env-converter","title":".env 정리·변환","category":"developer","url":"https://utils.haruspace.app/tools/env-converter","description":".env의 중복·형식을 검사하고 마스킹해 JSON·YAML과 상호 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["env-json","env-yaml","json-env","yaml-env"]},"mask":{"type":"boolean"}},"terms":[["환경 변수","실행 환경에서 애플리케이션에 전달하는 키·값 설정"],["dotenv","KEY=VALUE 형태의 환경 변수 파일 관례"],["Escape","줄바꿈·따옴표 같은 문자를 안전하게 표현하는 처리"],["Secret","API 키처럼 외부에 공개하면 안 되는 비밀값"]],"steps":[],"limitations":"변환은 브라우저 안에서만 수행되지만 화면·클립보드·브라우저 확장 프로그램에는 값이 노출될 수 있습니다. 이 도구는 비밀 저장소가 아니며 변수 확장, 쉘 명령 실행, 운영 환경 적용을 수행하지 않습니다."},{"name":"curl-code-converter","title":"cURL 코드 변환기","category":"developer","url":"https://utils.haruspace.app/tools/curl-code-converter","description":"cURL을 실행하지 않고 fetch·Python·Java 코드와 구조화 JSON으로 바꿔요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["curl","structured"]},"target":{"type":"enum","values":["javascript","python","java","curl"]},"mask":{"type":"boolean"},"method":{"type":"enum","values":["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"]}},"terms":[["cURL","터미널에서 HTTP 요청을 만드는 명령줄 도구"],["Header","요청 메타데이터를 전달하는 이름·값 쌍"],["Payload","POST·PUT 요청 등에 담는 본문 데이터"],["Bearer Token","Authorization 헤더에 자주 쓰는 접근 토큰 형식"]],"steps":[],"limitations":"명령은 로컬에서 파싱할 뿐 실행하거나 네트워크로 전송하지 않습니다. 쉘 변수·파일 참조·복잡한 리디렉션과 모든 cURL 옵션을 재현하지 못하며, 생성 코드는 실행 전 보안 검토가 필요합니다."},{"name":"html-string-escape","title":"문자열 이스케이프 변환","category":"developer","url":"https://utils.haruspace.app/tools/html-string-escape","description":"HTML Entity와 JSON 문자열을 브라우저에서 이스케이프하고 복원해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["html-encode","html-decode","json-escape","json-unescape"]},"nonAscii":{"type":"boolean"}},"terms":[["HTML Entity","HTML 예약 문자를 안전한 문자 참조로 표현한 값"],["Escape","특별한 의미가 있는 문자를 데이터로 다루도록 바꾸는 처리"],["XSS","공격자가 페이지에 스크립트를 삽입하는 취약점"],["Context","HTML 본문·속성·스크립트처럼 값이 삽입되는 위치"]],"steps":[],"limitations":"문자열은 브라우저에서만 변환됩니다. 단순 escape는 HTML 정화나 XSS 방어 전체를 대신하지 않으며, URL·CSS·JavaScript 등 컨텍스트가 달라지면 필요한 인코딩도 달라집니다."},{"name":"unicode-analyzer","title":"Unicode 문자 분석기","category":"developer","url":"https://utils.haruspace.app/tools/unicode-analyzer","description":"문자의 코드 포인트·UTF-8 바이트·정규화 차이를 브라우저에서 분석해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"normalization":{"type":"enum","values":["NFC","NFD","NFKC","NFKD"]},"limit":{"type":"integer","min":50,"max":1000}},"terms":[["Code Point","Unicode에서 문자에 부여한 고유 번호"],["Grapheme","사용자가 화면에서 한 글자로 인식하는 문자 묶음"],["Normalization","같아 보이는 Unicode 조합을 정해진 형태로 통일하는 처리"],["Combining Mark","앞 문자와 결합해 악센트 등을 만드는 코드포인트"]],"steps":[],"limitations":"분석은 로컬에서 수행됩니다. Unicode 이름·스크립트 데이터는 포함된 버전을 기준으로 하며, 글꼴과 운영체제에 따라 렌더링이 다를 수 있습니다. 정규화는 문맥상 의미를 바꿀 수 있어 원문 백업이 필요합니다."},{"name":"number-base-converter","title":"진법 변환기","category":"developer","url":"https://utils.haruspace.app/tools/number-base-converter","description":"큰 정수를 2·8·10·16·36진수로 브라우저에서 정확하게 상호 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"sourceBase":{"type":"integer","min":2,"max":36},"targetBase":{"type":"integer","min":2,"max":36},"group":{"type":"integer","min":0,"max":8},"uppercase":{"type":"boolean"}},"terms":[["Radix","숫자를 표현할 때 사용하는 진법의 밑"],["Binary","0과 1을 사용하는 2진수 표현"],["Hexadecimal","0~9와 A~F를 사용하는 16진수 표현"],["Two's Complement","음수를 비트 패턴으로 표현하는 일반적인 방식"]],"steps":[],"limitations":"계산은 브라우저의 정수 연산으로만 수행됩니다. 소수와 2의 보수 해석은 지원하지 않으며, 고정 폭을 지정하지 않은 음수 표기는 시스템의 실제 저장 형식과 다를 수 있습니다."},{"name":"semver-tool","title":"Semantic Version 도구","category":"developer","url":"https://utils.haruspace.app/tools/semver-tool","description":"SemVer 버전을 브라우저에서 비교·정렬하고 범위 충족 여부를 확인해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["compare","range","sort"]},"includePrerelease":{"type":"boolean"},"loose":{"type":"boolean"}},"terms":[["Semantic Versioning","MAJOR.MINOR.PATCH 규칙으로 호환성을 표현하는 버전 체계"],["Prerelease","정식 릴리스 전 버전을 나타내는 식별자"],["Range","여러 버전을 허용하는 비교 조건"],["Breaking Change","기존 사용 방식과 호환되지 않는 변경"]],"steps":[],"limitations":"버전 문자열은 로컬에서만 비교합니다. 특정 패키지 관리자의 range 확장 문법과 태그 정책은 모두 같지 않으며, 버전 번호만으로 실제 API 호환성을 보장할 수 없습니다."},{"name":"cidr-calculator","title":"IP·CIDR 계산기","category":"developer","url":"https://utils.haruspace.app/tools/cidr-calculator","description":"IPv4·IPv6 CIDR의 네트워크·주소 범위·주소 수를 브라우저에서 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["CIDR","IP 주소와 prefix 길이로 네트워크 범위를 표현하는 방식"],["Prefix Length","네트워크 부분으로 사용하는 앞쪽 비트 수"],["Netmask","IPv4 네트워크 비트를 점 표기로 나타낸 값"],["Subnet","더 작은 주소 범위로 나눈 네트워크"]],"steps":[],"limitations":"모든 계산은 브라우저에서 이루어집니다. 결과는 주소 수학만 제공하며 실제 라우팅, 클라우드 예약 주소, 브로드캐스트 정책이나 접근 권한을 검증하지 않습니다."},{"name":"hmac-tool","title":"HMAC 생성·검증","category":"security","url":"https://utils.haruspace.app/tools/hmac-tool","description":"비밀키와 메시지로 HMAC을 브라우저에서 생성·검증하며 입력값을 전송하지 않아요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"algorithm":{"type":"enum","values":["SHA-256","SHA-384","SHA-512"]},"format":{"type":"enum","values":["hex","base64"]}},"terms":[["HMAC","비밀키와 해시 함수를 결합해 메시지 무결성과 인증을 확인하는 방식"],["MAC","메시지가 변하지 않았고 키 보유자가 만들었음을 확인하는 코드"],["Digest","해시 계산으로 만들어진 고정 길이 결과"],["Constant-time Compare","시간 차이를 줄여 비교값 추측을 어렵게 하는 방식"]],"steps":[],"limitations":"키와 메시지는 브라우저 메모리에서만 처리되지만 클립보드·화면에는 노출될 수 있습니다. HMAC은 암호화가 아니며 원문을 숨기지 않고, 실제 서버 검증에서는 재전송 방지와 상수 시간 비교도 필요합니다."},{"name":"aes-gcm-tool","title":"AES-GCM 암호화","category":"security","url":"https://utils.haruspace.app/tools/aes-gcm-tool","description":"텍스트를 AES-GCM과 Web Crypto로 브라우저 안에서 암호화·복호화해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["encrypt","decrypt"]},"keyEncoding":{"type":"enum","values":["base64","hex"]}},"terms":[["AES-GCM","암호화와 무결성 인증을 함께 제공하는 대칭키 모드"],["IV","같은 키로 암호화할 때 매번 달라야 하는 초기화 값"],["Authentication Tag","암호문과 AAD의 변조를 확인하는 인증값"],["AAD","암호화하지 않지만 인증에는 포함하는 추가 데이터"]],"steps":[],"limitations":"모든 암호 연산은 Web Crypto를 이용해 로컬에서 수행합니다. 이 도구는 키 보관소가 아니며 키·평문이 브라우저 메모리와 화면에 남을 수 있습니다. 운영 비밀키는 전용 KMS/HSM에서 관리하고 인증 실패 암호문을 신뢰하지 마세요."},{"name":"key-derivation-tool","title":"키 유도 도구","category":"security","url":"https://utils.haruspace.app/tools/key-derivation-tool","description":"PBKDF2·HKDF 설정으로 키 재료를 브라우저에서 안전하게 유도해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"method":{"type":"enum","values":["PBKDF2","HKDF"]},"hash":{"type":"enum","values":["SHA-256","SHA-384","SHA-512"]},"length":{"type":"integer","min":16,"max":64},"format":{"type":"enum","values":["base64","hex"]},"iterations":{"type":"integer","min":10000,"max":2000000}},"terms":[["KDF","비밀번호나 초기 키 재료에서 용도별 키를 만드는 함수"],["PBKDF2","반복 해시로 비밀번호 대입 공격 비용을 높이는 KDF"],["HKDF","초기 키 재료를 추출·확장해 여러 키를 만드는 방식"],["Salt","동일 입력이 같은 결과를 만들지 않도록 더하는 공개 난수"]],"steps":[],"limitations":"파생은 브라우저에서만 수행되지만 입력 비밀번호와 결과 키를 안전하게 보관해 주지는 않습니다. PBKDF2는 메모리 하드 KDF가 아니므로 신규 비밀번호 저장 시스템은 Argon2id 등 최신 권고와 조직 정책을 우선 검토하세요."},{"name":"certificate-viewer","title":"인증서 분석기","category":"security","url":"https://utils.haruspace.app/tools/certificate-viewer","description":"X.509 PEM·JWK의 발급자·만료·알고리즘·지문을 브라우저에서 확인해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["X.509","TLS 등에 사용하는 공개키 인증서 표준"],["Subject","인증서가 식별하는 주체"],["Issuer","인증서를 발급하고 서명한 기관"],["SAN","인증서가 유효한 도메인·IP 이름 목록"]],"steps":[],"limitations":"인증서는 로컬에서 파싱하며 네트워크 조회를 하지 않습니다. 표시 정보만으로 서명 신뢰, 체인 구축, hostname 일치, OCSP·CRL 폐기 상태를 완전히 검증하지 않습니다. 개인키는 절대 입력하지 마세요."},{"name":"security-header-builder","title":"보안 헤더 생성기","category":"security","url":"https://utils.haruspace.app/tools/security-header-builder","description":"CSP·HSTS·Referrer·Permissions Policy를 브라우저에서 구성하고 위험 설정을 점검해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"profile":{"type":"enum","values":["strict","compatible"]},"upgrade":{"type":"boolean"},"permissions":{"type":"boolean"},"hsts":{"type":"boolean"}},"terms":[["CSP","페이지가 불러오거나 실행할 수 있는 리소스 출처를 제한하는 정책"],["HSTS","브라우저가 해당 도메인에 HTTPS만 사용하도록 지시하는 헤더"],["Nonce","허용된 인라인 스크립트를 구분하는 일회성 값"],["Report-Only","차단하지 않고 정책 위반만 관찰하는 CSP 모드"]],"steps":[],"limitations":"설정 생성은 로컬에서만 이루어지며 실제 서버 상태를 검사하거나 배포하지 않습니다. 잘못된 CSP는 기능을 차단하고 HSTS의 includeSubDomains·preload는 복구가 어려울 수 있으므로 테스트 환경과 공식 배포 지침을 반드시 확인하세요."},{"name":"cookie-analyzer","title":"Cookie 헤더 분석기","category":"security","url":"https://utils.haruspace.app/tools/cookie-analyzer","description":"Cookie·Set-Cookie를 브라우저에서 파싱하고 Secure·HttpOnly·SameSite 설정을 점검해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["set-cookie","cookie"]}},"terms":[["Cookie","브라우저가 사이트 요청과 함께 저장·전송하는 작은 값"],["HttpOnly","JavaScript에서 쿠키 값을 읽지 못하게 하는 속성"],["SameSite","교차 사이트 요청에 쿠키를 보낼 조건을 제한하는 속성"],["Secure","HTTPS 연결에서만 쿠키를 보내도록 하는 속성"]],"steps":[],"limitations":"붙여넣은 문자열은 로컬에서만 파싱하고 모든 쿠키값을 결과에서 마스킹합니다. 이 도구는 현재 사이트의 HttpOnly 쿠키를 읽을 수 없고 실제 전송 조건, 도메인 소유권, 서버 세션 보안을 검증하지 않습니다."},{"name":"gzip-tool","title":"Gzip 압축·해제","category":"developer","url":"https://utils.haruspace.app/tools/gzip-tool","description":"텍스트와 파일을 서버 업로드 없이 브라우저에서 Gzip으로 압축하고 풀어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["compress","decompress"]},"inputEncoding":{"type":"enum","values":["text","base64"]},"outputEncoding":{"type":"enum","values":["text","hex"]}},"terms":[["GZIP","Deflate 압축과 파일 메타데이터를 묶은 널리 쓰이는 형식"],["Deflate","반복 데이터를 줄이는 무손실 압축 알고리즘"],["Compression Ratio","원본 대비 압축 결과의 크기 비율"],["Base64","바이너리 데이터를 텍스트로 전달하기 위한 인코딩"]],"steps":[],"limitations":"파일은 브라우저 메모리에서만 처리하며 업로드하지 않습니다. 기본 스트림 API가 없는 환경에서는 로컬 폴백을 사용하지만, 입력 1MB·결과 2MB·압축비 200배 제한이 있습니다. 압축 해제 폭탄이 의심되는 파일은 열지 마세요."},{"name":"openapi-validator","title":"OpenAPI 검증기","category":"developer","url":"https://utils.haruspace.app/tools/openapi-validator","description":"OpenAPI JSON·YAML 문서를 브라우저에서 검증하고 엔드포인트와 오류를 정리해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["OpenAPI","HTTP API 구조와 요청·응답을 기술하는 표준 문서"],["Operation","경로와 HTTP 메서드로 정의되는 하나의 API 동작"],["Component","여러 위치에서 재사용하는 스키마·응답·파라미터 정의"],["$ref","다른 정의를 가리키는 참조 키워드"]],"steps":[],"limitations":"명세는 로컬에서만 검사합니다. 외부 URL $ref는 자동으로 불러오지 않으며 모든 공급자 확장과 비즈니스 규칙을 지원하지 않습니다. 검증 통과가 서버 구현과 명세의 일치를 보장하지 않습니다."},{"name":"code-formatter","title":"코드 포매터·압축","category":"developer","url":"https://utils.haruspace.app/tools/code-formatter","description":"여러 코드 형식을 정리하고 JavaScript·JSON을 브라우저에서 압축해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"language":{"type":"enum","values":["javascript","typescript","json","css","scss","html","markdown","yaml"]},"action":{"type":"enum","values":["format","minify"]},"tabWidth":{"type":"integer","min":2,"max":4},"printWidth":{"type":"integer","min":80,"max":120},"singleQuote":{"type":"boolean"},"semi":{"type":"boolean"},"mangle":{"type":"boolean"}},"terms":[["Formatter","코드 의미를 유지하며 공백·줄바꿈·표기 스타일을 정리하는 도구"],["Parser","코드 문법을 구조로 해석하는 프로그램"],["Indentation","중첩 구조를 나타내는 앞쪽 공백"],["AST","파싱된 코드 구조를 트리로 표현한 값"]],"steps":[],"limitations":"코드는 브라우저에서만 파싱하고 실행하지 않습니다. AST 메모리 증폭을 막기 위해 5만 자로 제한하며, 포매팅은 타입 오류·취약점·동작 정확성을 검사하지 않습니다."},{"name":"case-converter","title":"대소문자·Case 변환","category":"text","url":"https://utils.haruspace.app/tools/case-converter","description":"문장을 camelCase·snake_case 등 개발·문서 형식으로 바꿔요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"caseStyle":{"type":"enum","values":["camel","pascal","snake","kebab","constant","title","sentence","lower","upper"]},"locale":{"type":"enum","values":["ko","en","tr"]}},"terms":[["camelCase","첫 단어는 소문자, 다음 단어부터 첫 글자를 대문자로 잇는 이름"],["snake_case","단어를 밑줄로 연결하는 이름"],["Unicode 정규화","같아 보이는 여러 문자 표현을 일정한 형태로 맞추는 처리"]],"steps":[],"limitations":"문자는 브라우저에서만 변환됩니다. 자연어 의미나 브랜드가 의도한 대문자 표기까지 판단하지 않으며 입력을 저장하지 않습니다."},{"name":"slug-generator","title":"Slug 생성기","category":"text","url":"https://utils.haruspace.app/tools/slug-generator","description":"제목을 URL에 쓰기 좋은 짧고 안전한 경로 문자열로 정리해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"separator":{"type":"enum","values":["-","_","."]},"maxLength":{"type":"integer","min":8,"max":200},"unicode":{"type":"boolean"},"lowercase":{"type":"boolean"}},"terms":[["Slug","URL 경로에서 글을 식별하는 짧은 문자열"],["Percent encoding","한글과 예약 문자를 %와 16진수로 표현하는 URL 인코딩"],["NFKD","문자 호환 형태와 결합 기호를 분해하는 Unicode 정규화 방식"]],"steps":[],"limitations":"ASCII 모드는 한글을 음역하지 않고 제거합니다. 고유성 확인과 중복 slug 번호 부여는 서버·CMS 영역이므로 수행하지 않습니다."},{"name":"word-frequency","title":"단어 빈도 분석","category":"text","url":"https://utils.haruspace.app/tools/word-frequency","description":"긴 텍스트의 자주 등장하는 단어와 횟수를 로컬로 분석해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"locale":{"type":"enum","values":["ko","en","ja"]},"minLength":{"type":"integer","min":1,"max":20},"limit":{"type":"integer","min":10,"max":500},"ignoreCase":{"type":"boolean"},"includeNumbers":{"type":"boolean"}},"terms":[["Token","분석을 위해 나눈 단어나 숫자 단위"],["빈도","같은 토큰이 나타난 횟수"],["불용어","분석에서 제외하도록 사용자가 지정한 흔한 단어"],["Intl.Segmenter","언어별 단어 경계를 찾는 브라우저 기능"]],"steps":[],"limitations":"최대 100만 자를 로컬에서 처리합니다. 형태소·감정·문맥을 분석하지 않으며 브라우저별 단어 분리 결과가 조금 다를 수 있습니다."},{"name":"text-normalizer","title":"공백·개행 정규화","category":"text","url":"https://utils.haruspace.app/tools/text-normalizer","description":"공백·제로폭 문자·줄바꿈을 원하는 규칙으로 통일해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"newline":{"type":"enum","values":["lf","crlf","cr"]},"blankLines":{"type":"integer","min":0,"max":2},"trimLines":{"type":"boolean"},"collapseSpaces":{"type":"boolean"},"removeZeroWidth":{"type":"boolean"}},"terms":[["LF","Unix와 현대 macOS에서 주로 쓰는 줄바꿈"],["CRLF","Windows 텍스트 파일의 일반적인 줄바꿈"],["제로폭 문자","화면 너비 없이 문자열에 남는 Unicode 문자"],["NBSP","줄바꿈되지 않는 특수 공백"]],"steps":[],"limitations":"정리는 현재 브라우저 메모리에서만 이루어지며 최대 100만 자를 처리합니다. 문서 형식의 의미를 해석하지 않습니다."},{"name":"text-wrapper","title":"텍스트 감싸기·풀기","category":"text","url":"https://utils.haruspace.app/tools/text-wrapper","description":"각 행이나 전체 텍스트에 따옴표·괄호를 일괄 적용하거나 제거해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"wrapper":{"type":"enum","values":["double","single","round","square","curly","angle","custom"]},"eachLine":{"type":"boolean"},"escapeQuotes":{"type":"boolean"}},"terms":[["Wrapper","내용의 시작과 끝에 붙이는 문자 쌍"],["Escape","따옴표가 내용인지 구문인지 구분하도록 앞에 역슬래시를 붙이는 처리"],["Unwrap","바깥쪽 문자 한 쌍을 제거하는 처리"]],"steps":[],"limitations":"사용자 텍스트를 실행하거나 HTML로 해석하지 않습니다. 직접 입력 wrapper는 최대 20자로 제한됩니다."},{"name":"template-replacer","title":"템플릿 변수 치환","category":"document","url":"https://utils.haruspace.app/tools/template-replacer","description":"JSON 변수로 템플릿의 여러 자리표시자를 안전하게 한 번에 바꿔요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"missing":{"type":"enum","values":["keep","empty","error"]}},"terms":[["Placeholder","나중에 실제 값으로 바꿀 자리표시자"],["Dot path","user.name처럼 점으로 중첩 객체를 찾아가는 경로"],["Prototype pollution","특수 객체 키로 프로그램의 기본 동작을 오염시키는 공격"]],"steps":[],"limitations":"eval이나 함수 실행은 지원하지 않으며 __proto__·prototype·constructor 경로를 차단합니다. 입력은 각 50만 자, 결과는 100만 자로 제한됩니다."},{"name":"markdown-preview","title":"Markdown 미리보기·HTML","category":"document","url":"https://utils.haruspace.app/tools/markdown-preview","description":"Markdown을 정화된 HTML로 변환하고 격리된 화면에서 미리 봐요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"allowHtml":{"type":"boolean"}},"terms":[["Markdown","간단한 기호로 제목·목록·링크·코드를 표현하는 문법"],["Sanitize","스크립트와 위험 속성을 제거해 HTML을 정화하는 처리"],["Sandbox","미리보기 문서를 본 페이지와 격리하는 브라우저 제한"],["GFM","표·체크박스 등을 포함한 GitHub 계열 Markdown 문법"]],"steps":[],"limitations":"script·iframe·form·SVG·MathML과 원격 이미지·미디어 src, javascript/data URI를 차단합니다. 네트워크 리소스를 불러오지 않고 입력 5만 자·HTML 50만 자·요소 1만 개로 제한합니다."},{"name":"csv-viewer","title":"CSV 뷰어·열 필터","category":"document","url":"https://utils.haruspace.app/tools/csv-viewer","description":"CSV·TSV를 표로 보고 원하는 행과 열을 추출해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"delimiter":{"type":"enum","values":["auto","comma","tab","semicolon"]},"header":{"type":"boolean"},"protectFormulas":{"type":"boolean"}},"terms":[["RFC 4180","CSV의 인용부호·쉼표·줄바꿈 처리에 널리 쓰이는 규칙"],["Delimiter","열을 나누는 쉼표·탭 같은 문자"],["CSV injection","스프레드시트가 셀을 수식으로 실행하는 위험"],["BOM","파일 시작에서 문자 인코딩을 알리는 바이트 표시"]],"steps":[],"limitations":"데이터는 HTML로 삽입하지 않고 텍스트 셀로 렌더합니다. 5MB, 10만 행, 200열, 전체 50만 셀로 제한하며 미리보기는 앞 200행만 표시합니다."},{"name":"ics-generator","title":"캘린더 ICS 생성기","category":"document","url":"https://utils.haruspace.app/tools/ics-generator","description":"일정·반복·알림을 입력해 캘린더 가져오기 파일을 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"repeat":{"type":"enum","values":["none","daily","weekly","monthly","yearly"]},"alarmMinutes":{"type":"integer","min":0,"max":60},"allDay":{"type":"boolean"}},"terms":[["ICS/iCalendar","캘린더 사이에서 일정을 교환하는 텍스트 형식"],["VEVENT","하나의 일정을 표현하는 iCalendar 구성요소"],["RRULE","반복 일정의 주기를 표현하는 규칙"],["VALARM","일정 알림을 표현하는 구성요소"]],"steps":[],"limitations":"쉼표·세미콜론·역슬래시·개행을 escape하고 75-octet 규칙으로 줄을 접어 CRLF injection을 차단합니다. 시간대 없는 floating local time으로 저장되므로 가져오는 캘린더의 기본 시간대를 확인해야 합니다."},{"name":"korean-number-converter","title":"숫자 ↔ 한글 금액","category":"document","url":"https://utils.haruspace.app/tools/korean-number-converter","description":"큰 정수를 반올림 없이 한글 수 표현과 양방향 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["BigInt","아주 큰 정수를 반올림 없이 다루는 JavaScript 타입"],["4자리 묶음","만·억·조처럼 10⁴마다 커지는 한국어 큰 수 체계"],["기수법","수량을 읽고 쓰는 표현 규칙"]],"steps":[],"limitations":"정수만 지원하며 소수·단위 환산·법적 금액 표기를 보장하지 않습니다. 최대 52자리이며 원문을 저장하지 않습니다."},{"name":"text-encoding-converter","title":"텍스트 인코딩·개행 변환","category":"file","url":"https://utils.haruspace.app/tools/text-encoding-converter","description":"텍스트 파일의 UTF·EUC-KR 인코딩과 줄바꿈을 기기 안에서 바꿔요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"sourceEncoding":{"type":"enum","values":["utf8","utf16le","utf16be","euc-kr","windows-1252","shift_jis"]},"targetEncoding":{"type":"enum","values":["utf8","utf16le","utf16be","euc-kr","shift_jis"]},"newline":{"type":"enum","values":["preserve","lf","crlf","cr"]},"fatalDecode":{"type":"boolean"}},"terms":[["Encoding","문자를 파일 바이트로 표현하는 규칙"],["Decode","바이트를 문자로 해석하는 처리"],["Encode","문자를 선택한 규칙의 바이트로 저장하는 처리"],["Replacement character","해석하지 못한 바이트 대신 표시되는 � 문자"]],"steps":[],"limitations":"파일은 기기 안에서만 처리하며 모바일 메모리 보호를 위해 2MB로 제한합니다. 잘못된 바이트 중단 옵션을 권장하고 바이너리 파일 변환에는 사용하지 마세요."},{"name":"loan-calculator","title":"대출 상환표 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/loan-calculator","description":"상환 방식·금리·추가 상환을 반영해 월별 예상 상환표를 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"method":{"type":"enum","values":["annuity","principal","bullet"]}},"terms":[["원리금 균등","매회 원금과 이자의 합계를 비슷하게 내는 방식"],["원금 균등","원금을 같은 크기로 나누고 잔액 이자를 더하는 방식"],["만기 일시","기간 중 이자를 내고 만기에 원금을 상환하는 방식"],["상환표","회차별 납입·이자·잔액 내역"]],"steps":[],"limitations":"월 이율=연 이율÷12를 사용하는 간편 예상값입니다. 수수료·중도상환금·변동금리·법적 조건을 포함하지 않으며 최대 1,200회입니다."},{"name":"compound-interest-calculator","title":"복리·예금·적금 계산","category":"calculator","url":"https://utils.haruspace.app/tools/compound-interest-calculator","description":"초기금·정기 납입·복리 주기로 만기 금액을 예상해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"frequency":{"type":"integer","min":1,"max":52}},"terms":[["복리","발생한 이자에도 다음 이자가 붙는 방식"],["명목 금리","복리 횟수를 반영하기 전 연간 표시 금리"],["기초 납입","각 회차 이자가 붙기 전에 납입하는 방식"],["기말 납입","각 회차 이자가 붙은 뒤 납입하는 방식"]],"steps":[],"limitations":"최대 2,400회까지 계산하며 우대금리·중도해지·일할 계산·법정 세율은 반영하지 않습니다."},{"name":"margin-markup-calculator","title":"마진·마크업 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/margin-markup-calculator","description":"원가·판매가·수수료로 순이익과 목표 판매가를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Margin","순이익을 판매가로 나눈 비율"],["Markup","순이익을 원가로 나눈 비율"],["목표 판매가","수수료와 목표 마진을 만족하도록 역산한 가격"]],"steps":[],"limitations":"회계·세무 처리나 반품·광고비·재고 손실은 자동 반영하지 않으며 계산 결과는 간편 예상값입니다."},{"name":"work-hours-calculator","title":"근무 시간·시급 계산","category":"calculator","url":"https://utils.haruspace.app/tools/work-hours-calculator","description":"자정 통과·휴게·사용자 가산 배율을 반영해 근무 시간과 임금을 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["순 근무 시간","전체 체류 시간에서 무급 휴게를 뺀 시간"],["자정 통과","근무 종료가 다음 달력 날짜에 있는 경우"],["가산 배율","기준 시간을 넘은 시간에 사용자가 적용하는 임금 배수"]],"steps":[],"limitations":"법정 휴게·주휴수당·최저임금·가산 조건을 판단하지 않습니다. 근무일은 최대 31일이며 값은 저장하지 않습니다."},{"name":"timezone-converter","title":"타임존 변환기","category":"calculator","url":"https://utils.haruspace.app/tools/timezone-converter","description":"출발 지역 시각을 다른 시간대로 바꾸고 DST 예외를 알려줘요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"sourceTimezone":{"type":"enum","values":["Asia/Seoul","UTC","Asia/Tokyo","Asia/Shanghai","Asia/Singapore","Europe/London","Europe/Paris","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","Australia/Sydney"]},"targetTimezone":{"type":"enum","values":["Asia/Seoul","UTC","Asia/Tokyo","Asia/Shanghai","Asia/Singapore","Europe/London","Europe/Paris","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","Australia/Sydney"]}},"terms":[["IANA time zone","Asia/Seoul처럼 지역별 시간 규칙을 나타내는 이름"],["DST","계절에 따라 시계를 앞뒤로 조정하는 일광절약시간"],["Ambiguous time","시계를 되돌릴 때 같은 현지 시각이 두 번 생기는 상태"],["Nonexistent time","시계를 앞당길 때 일부 현지 시각이 사라지는 상태"]],"steps":[],"limitations":"현재 브라우저의 IANA 데이터를 사용합니다. 정부의 최근 시간대 제도 변경이 오래된 브라우저에 반영되지 않았을 수 있습니다."},{"name":"running-pace-calculator","title":"달리기 페이스 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/running-pace-calculator","description":"거리와 완주 시간으로 km·mile 페이스와 평균 속도를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"distanceUnit":{"type":"enum","values":["km","mile"]}},"terms":[["Pace","일정 거리를 이동하는 데 걸린 시간"],["Speed","일정 시간에 이동한 거리"],["Split","전체 코스를 일정 거리로 나눈 구간 기록"]],"steps":[],"limitations":"같은 페이스가 유지된다는 산술 계산이며 경사·날씨·피로·건강 상태를 고려하지 않습니다."},{"name":"recipe-scaler","title":"레시피 비율 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/recipe-scaler","description":"인분 변화에 맞춰 여러 재료의 수량을 같은 배율로 바꿔요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"precision":{"type":"integer","min":0,"max":3}},"terms":[["Scaling factor","목표 인분÷기준 인분으로 구한 배율"],["Mixed fraction","1 1/2처럼 정수와 분수를 함께 쓴 값"],["Density","부피와 무게를 바꿀 때 필요한 재료별 밀도"]],"steps":[],"limitations":"단위는 그대로 보존하고 밀도 없이 cup·ml·g를 변환하지 않습니다. 읽지 못한 행은 경고 표시와 함께 원문을 유지합니다."},{"name":"aspect-ratio-calculator","title":"종횡비 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/aspect-ratio-calculator","description":"가로·세로 비율을 줄이고 한 변에 맞는 다른 길이를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Aspect ratio","가로와 세로 길이의 비"],["GCD","두 정수를 함께 나눌 수 있는 가장 큰 수"],["Scale","원본 한 변 대비 새 한 변의 배율"]],"steps":[],"limitations":"회전·픽셀 종횡비·EXIF 방향은 반영하지 않고 입력한 표시 가로·세로만 계산합니다."},{"name":"gpa-calculator","title":"GPA 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/gpa-calculator","description":"과목별 등급과 학점을 가중 평균해 평점 기준별 GPA를 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"scale":{"type":"enum","values":["4.5","4.3","4.0"]}},"terms":[["GPA","과목 성적을 학점으로 가중 평균한 값"],["Credit","과목의 학업량을 나타내는 가중치"],["Weighted average","각 값에 다른 가중치를 곱해 구한 평균"],["P/F","평점 숫자 없이 통과·실패만 기록하는 과목"]],"steps":[],"limitations":"최대 50과목의 간편 가중 평균이며 학교 규정·백분위·장학 기준을 자동 적용하지 않습니다."},{"name":"bmi-bmr-calculator","title":"BMI·BMR 계산기","category":"calculator","url":"https://utils.haruspace.app/tools/bmi-bmr-calculator","description":"성인 BMI와 Mifflin-St Jeor 기초대사량 참고값을 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"sexConstant":{"type":"enum","values":["male","female"]},"activity":{"type":"enum","values":["1.2","1.375","1.55","1.725"]}},"terms":[["BMI","체중 kg을 키 m의 제곱으로 나눈 체질량지수"],["BMR","휴식 상태에서 필요한 기초대사량 추정값"],["Mifflin-St Jeor","성인 BMR 추정에 쓰이는 경험식"],["TDEE","활동량을 포함한 하루 에너지 소비 추정값"]],"steps":[],"limitations":"18세 이상 참고용이며 임신·성장기·선수·노인·질환자의 진단이나 섭취 처방에 사용할 수 없습니다."},{"name":"random-number-generator","title":"범위 랜덤 숫자 생성","category":"calculator","url":"https://utils.haruspace.app/tools/random-number-generator","description":"암호학적 난수로 지정 범위의 정수를 편향 없이 생성해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"unique":{"type":"boolean"},"sort":{"type":"boolean"}},"terms":[["CSPRNG","예측하기 어려운 암호학적 난수 생성기"],["Rejection sampling","범위를 벗어난 난수를 버려 나머지 연산 편향을 피하는 방식"],["Inclusive range","양쪽 경계값을 모두 포함하는 범위"]],"steps":[],"limitations":"JavaScript 안전 정수 범위와 최대 10,000개로 제한합니다. 복권·도박·보안키 생성에는 각 목적의 검증된 별도 절차를 사용하세요."},{"name":"data-transfer-time-calculator","title":"데이터 전송 시간 계산","category":"calculator","url":"https://utils.haruspace.app/tools/data-transfer-time-calculator","description":"파일 크기·통신 속도·효율로 예상 전송 시간을 계산해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"sizeUnit":{"type":"enum","values":["B","kB","MB","GB","KiB","MiB","GiB","TiB"]},"speedUnit":{"type":"enum","values":["bps","Kbps","Mbps","Gbps","B/s","kB/s","MB/s","MiB/s"]}},"terms":[["Bit/Byte","1 Byte는 8 bit인 데이터 단위"],["SI unit","kB·MB·GB처럼 1,000배를 사용하는 단위"],["IEC unit","KiB·MiB·GiB처럼 1,024배를 사용하는 단위"],["Efficiency","표시 링크 속도 중 실제 데이터에 쓰이는 비율"]],"steps":[],"limitations":"네트워크 혼잡·프로토콜 재전송·서버 제한·압축·디스크 속도는 예측하지 않으며 입력 기준의 산술 예상값입니다."},{"name":"image-cropper","title":"자유 이미지 크롭","category":"image","url":"https://utils.haruspace.app/tools/image-cropper","description":"드래그와 좌표 입력으로 원하는 영역을 자유 비율 또는 규격 비율로 잘라요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"aspect":{"type":"enum","values":["free","square","4:3","16:9","3:4"]},"format":{"type":"enum","values":["png","jpeg","webp"]},"quality":{"type":"integer","min":50,"max":100}},"terms":[["Crop","이미지에서 필요한 사각 영역만 남기는 작업"],["Aspect Ratio","가로와 세로 길이의 비율"],["좌표","원본 이미지 왼쪽 위를 기준으로 한 X·Y 위치"],["손실 압축","일부 정보를 줄여 JPEG·WebP 용량을 낮추는 방식"]],"steps":[],"limitations":null},{"name":"image-watermark","title":"이미지 워터마크","category":"image","url":"https://utils.haruspace.app/tools/image-watermark","description":"한글 문구나 로고를 위치·반복·투명도에 맞춰 이미지에 새겨요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"position":{"type":"enum","values":["top-left","top-center","top-right","middle-left","middle-center","middle-right","bottom-left","bottom-center","bottom-right"]},"size":{"type":"integer","min":2,"max":35},"opacity":{"type":"integer","min":5,"max":100},"rotation":{"type":"integer","min":-90,"max":90},"color":{"type":"string","maxLength":9,"pattern":{}},"format":{"type":"enum","values":["png","jpeg","webp"]},"quality":{"type":"integer","min":50,"max":100},"tiled":{"type":"boolean"}},"terms":[["Watermark","저작권이나 출처를 알리기 위해 이미지 위에 넣는 표시"],["Opacity","워터마크가 비치는 정도"],["Tiling","같은 표시를 이미지 전체에 반복 배치하는 방식"],["Flatten","레이어를 최종 픽셀에 합쳐 분리하기 어렵게 만드는 처리"]],"steps":[],"limitations":null},{"name":"image-redactor","title":"이미지 개인정보 가리기","category":"image","url":"https://utils.haruspace.app/tools/image-redactor","description":"민감한 영역을 직접 선택해 불투명 덮기·모자이크·블러로 평탄화해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["cover","mosaic","blur"]},"coverColor":{"type":"string","maxLength":9,"pattern":{}},"strength":{"type":"integer","min":4,"max":64}},"terms":[["Redaction","공개하면 안 되는 정보를 되돌리기 어렵게 제거하거나 가리는 작업"],["Mosaic","작은 색상 블록으로 세부 정보를 흐리는 방식"],["Blur","주변 픽셀을 섞어 경계를 흐리는 방식"],["Opaque Cover","단색 픽셀로 원본을 완전히 덮는 가장 보수적인 방식"]],"steps":[],"limitations":null},{"name":"image-inspector","title":"이미지·파일 상세 정보","category":"image","url":"https://utils.haruspace.app/tools/image-inspector","description":"파일 서명·해시·이미지 크기와 지원되는 EXIF 정보를 브라우저에서 확인해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Magic Byte","확장자가 아니라 파일 내용으로 형식을 식별하는 시작 바이트"],["EXIF","카메라·촬영 시각·위치 등이 담길 수 있는 이미지 메타데이터"],["SHA-256","파일 내용이 같은지 확인하는 256비트 해시"],["MIME Type","브라우저가 선언한 콘텐츠 형식 문자열"]],"steps":[],"limitations":null},{"name":"duplicate-file-finder","title":"중복 파일 탐색","category":"file","url":"https://utils.haruspace.app/tools/duplicate-file-finder","description":"크기가 같은 후보를 SHA-256으로 순차 비교해 내용이 같은 파일을 찾아요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Duplicate","이름과 무관하게 바이트 내용이 같은 파일"],["Candidate","크기가 같아 추가 비교가 필요한 후보"],["Digest","해시 함수가 만든 고정 길이 결과"],["Sequential Processing","메모리 사용을 줄이기 위해 파일을 하나씩 처리하는 방식"]],"steps":[],"limitations":null},{"name":"zip-tool","title":"ZIP 생성·안전 해제","category":"file","url":"https://utils.haruspace.app/tools/zip-tool","description":"여러 파일을 ZIP으로 묶고 위험한 경로·암호화·압축 폭탄을 검사해 개별 해제해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Central Directory","ZIP 항목의 이름·크기·위치를 기록한 색인"],["CRC32","압축 데이터 손상 여부를 확인하는 체크섬"],["Zip Slip","../ 같은 경로로 대상 폴더 밖에 파일을 쓰려는 공격"],["Zip Bomb","작은 압축 파일이 해제 후 매우 커져 자원을 소모하는 공격"]],"steps":[],"limitations":null},{"name":"image-to-pdf","title":"이미지 → PDF","category":"document","url":"https://utils.haruspace.app/tools/image-to-pdf","description":"여러 이미지를 페이지 크기·방향·여백에 맞춰 하나의 PDF로 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"pageSize":{"type":"enum","values":["a4","letter","image"]},"orientation":{"type":"enum","values":["auto","portrait","landscape"]},"margin":{"type":"integer","min":0,"max":72},"maxSide":{"type":"enum","values":["1600","2400"]},"quality":{"type":"integer","min":60,"max":100}},"terms":[["Page Size","PDF 한 페이지의 실제 가로·세로 크기"],["Point","PDF에서 사용하는 1/72인치 길이 단위"],["Embed","이미지 데이터를 PDF 파일 안에 포함하는 처리"],["Raster","픽셀로 이루어진 이미지 형식"]],"steps":[],"limitations":null},{"name":"file-split-join","title":"파일 분할·결합","category":"file","url":"https://utils.haruspace.app/tools/file-split-join","description":"파일을 조각으로 나누고 SHA-256 매니페스트로 누락·변조를 확인해 다시 결합해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"partSize":{"type":"enum","values":["1","5","10","20"]}},"terms":[["Chunk","큰 파일을 일정 크기로 나눈 각각의 조각"],["Manifest","원본과 모든 조각의 검증 정보를 기록한 JSON 파일"],["Integrity","데이터가 누락·변경되지 않은 상태"],["Reassembly","순서대로 조각을 이어 원본 파일을 복원하는 작업"]],"steps":[],"limitations":null},{"name":"file-hex-viewer","title":"파일 HEX 뷰어","category":"file","url":"https://utils.haruspace.app/tools/file-hex-viewer","description":"대용량 파일도 필요한 구간만 읽어 오프셋·16진수·ASCII로 살펴봐요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"pageSize":{"type":"enum","values":["256","512","1024","4096"]}},"terms":[["Hexadecimal","한 바이트를 00~FF의 16진수 두 자리로 표현하는 방식"],["Offset","파일 시작부터 현재 바이트까지의 위치"],["Byte","0~255 값을 가지는 8비트 데이터 단위"],["ASCII","영문·숫자·기호를 정의한 기본 문자 코드"]],"steps":[],"limitations":null},{"name":"document-scanner","title":"문서 스캔·원근 보정","category":"image","url":"https://utils.haruspace.app/tools/document-scanner","description":"사진의 네 모서리를 직접 맞춰 원근을 보정하고 컬러·회색조·흑백으로 저장해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"filter":{"type":"enum","values":["color","gray","bw"]},"contrast":{"type":"integer","min":-50,"max":80},"maxSide":{"type":"enum","values":["1200","1600","2000"]}},"terms":[["Perspective","비스듬히 촬영해 가까운 쪽과 먼 쪽 크기가 달라 보이는 현상"],["Homography","평면의 원근 관계를 다른 평면 좌표로 바꾸는 수학적 변환"],["Grayscale","색을 밝기 단계만으로 표현하는 방식"],["Threshold","밝기를 기준으로 흰색과 검정으로 나누는 경계값"]],"steps":[],"limitations":null},{"name":"sprite-sheet-generator","title":"Sprite Sheet 생성","category":"image","url":"https://utils.haruspace.app/tools/sprite-sheet-generator","description":"여러 이미지를 규격 셀에 배치하고 PNG와 좌표 JSON을 함께 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"padding":{"type":"integer","min":0,"max":64},"fit":{"type":"enum","values":["contain","cover"]},"background":{"type":"enum","values":["transparent","#ffffff","#000000"]}},"terms":[["Sprite Sheet","여러 작은 이미지를 하나의 큰 이미지에 모은 파일"],["Cell","각 스프라이트가 배치되는 고정 사각 영역"],["Atlas","스프라이트 이름과 좌표를 기록한 데이터"],["Padding","셀과 이미지 사이 또는 셀 사이의 빈 공간"]],"steps":[],"limitations":null},{"name":"signature-maker","title":"서명 이미지 생성","category":"image","url":"https://utils.haruspace.app/tools/signature-maker","description":"마우스·손가락으로 서명하고 획을 되돌린 뒤 여백을 잘라 PNG로 저장해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"color":{"type":"string","maxLength":9,"pattern":{}},"width":{"type":"integer","min":2,"max":24},"background":{"type":"enum","values":["transparent","#ffffff","#f5f4ef"]}},"terms":[["Stroke","포인터를 누른 뒤 뗄 때까지 이어진 하나의 선"],["Trim","내용이 없는 바깥 여백을 제거하는 작업"],["Transparent Background","배경 픽셀의 알파값이 0인 상태"],["Pointer Event","마우스·펜·터치 입력을 통합해 처리하는 웹 입력 방식"]],"steps":[],"limitations":null},{"name":"placeholder-image","title":"Placeholder 이미지 생성","category":"image","url":"https://utils.haruspace.app/tools/placeholder-image","description":"크기·색상·문구·패턴을 정해 안전한 임시 이미지를 즉시 만들어요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"background":{"type":"string","maxLength":9,"pattern":{}},"foreground":{"type":"string","maxLength":9,"pattern":{}},"pattern":{"type":"enum","values":["none","grid","diagonal"]},"format":{"type":"enum","values":["png","jpeg","webp"]},"quality":{"type":"integer","min":50,"max":100}},"terms":[["Placeholder","실제 콘텐츠가 준비되기 전에 크기와 위치를 보여 주는 임시 이미지"],["Canvas","브라우저에서 픽셀 그래픽을 그리는 영역"],["Resolution","이미지의 가로·세로 픽셀 수"],["Pattern","레이아웃과 크기를 알아보기 쉽게 반복해 그린 선"]],"steps":[],"limitations":null},{"name":"pdf-toolbox","title":"PDF 작업대","category":"document","url":"https://utils.haruspace.app/tools/pdf-toolbox","description":"여러 PDF를 병합하고 페이지 순서·회전·삭제를 편집하거나 분할해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Merge","여러 PDF의 페이지를 한 문서 순서로 합치는 작업"],["Extract","필요한 페이지만 남겨 별도 PDF로 만드는 작업"],["Split","한 PDF 페이지 목록을 여러 개의 작은 PDF로 나누는 작업"],["Rotation","페이지 표시 방향을 90도 단위로 바꾸는 속성"]],"steps":[],"limitations":null},{"name":"pdf-sign-watermark","title":"PDF 서명·워터마크","category":"document","url":"https://utils.haruspace.app/tools/pdf-sign-watermark","description":"PDF에 보이는 서명·도장·텍스트 워터마크와 페이지 번호를 추가해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Visible Signature","인증서 서명이 아니라 페이지 위에 보이도록 합성한 서명 이미지"],["Watermark","문서 상태·소유권을 알리기 위해 흐리게 반복하거나 겹치는 표시"],["Page Range","1-3, 7처럼 처리할 페이지 번호를 지정하는 표현"],["Digital Signature","인증서와 암호 기술로 문서 무결성과 서명자를 검증하는 별도 기능"]],"steps":[],"limitations":null},{"name":"pdf-to-image","title":"PDF 이미지·텍스트 추출","category":"document","url":"https://utils.haruspace.app/tools/pdf-to-image","description":"PDF 페이지를 JPG·PNG로 저장하거나 포함된 텍스트를 추출해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Rasterize","PDF 페이지를 고정된 픽셀 이미지로 그리는 작업"],["Rendering Scale","PDF 기본 크기에 곱해 결과 해상도를 정하는 배율"],["Text Layer","PDF 안에 저장되어 검색·선택할 수 있는 문자 정보"],["OCR","이미지 속 글자 모양을 문자로 인식하는 별도 처리"]],"steps":[],"limitations":null},{"name":"image-background-remover","title":"단색 이미지 배경 제거 베타","category":"image","url":"https://utils.haruspace.app/tools/image-background-remover","description":"가장자리와 연결된 단색·스튜디오 배경을 제거하고 브러시로 복원해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{},"terms":[["Edge-connected","이미지 바깥 테두리에서 이어져 있는 픽셀만 같은 배경으로 보는 방식"],["Tolerance","기준색과 어느 정도 다른 색까지 배경 후보로 허용할지 정하는 값"],["Feather","피사체와 배경 경계의 투명도를 단계적으로 바꾸는 처리"],["Alpha","PNG 픽셀의 투명도를 나타내는 값"]],"steps":[],"limitations":null},{"name":"data-workbook-converter","title":"CSV·JSON ↔ XLSX 변환","category":"developer","url":"https://utils.haruspace.app/tools/data-workbook-converter","description":"CSV·JSON과 XLSX를 서버 전송 없이 변환하고 워크시트를 선택해 내보내요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"direction":{"type":"enum","values":["text-to-xlsx","xlsx-to-text"]},"sourceFormat":{"type":"enum","values":["csv","json"]},"outputFormat":{"type":"enum","values":["csv","json"]},"delimiter":{"type":"enum","values":[",","\t",";","|"]},"inferTypes":{"type":"boolean"},"protectFormulas":{"type":"boolean"},"includeBom":{"type":"boolean"},"sheetIndex":{"type":"integer","min":0,"max":255}},"terms":[["XLSX","Excel이 사용하는 ZIP 기반 Open XML 스프레드시트 형식"],["워크시트","하나의 Excel 통합문서 안에 있는 개별 표 탭"],["수식 주입","CSV 셀의 =·+·-·@ 시작값이 스프레드시트 수식으로 실행되는 문제"],["BOM","일부 Excel 환경이 UTF-8 한글 인코딩을 식별하도록 파일 앞에 넣는 표시"]],"steps":[],"limitations":"모든 처리는 브라우저 Worker에서 이루어집니다. XLSX 12MB·압축 해제 32MB·20,000행·200열·200,000셀로 제한하며 XLSM, 암호화, 차트·수식·서식 왕복 보존은 지원하지 않습니다."},{"name":"json-flatten","title":"JSON 평탄화·복원","category":"developer","url":"https://utils.haruspace.app/tools/json-flatten","description":"중첩 JSON을 점 경로나 JSON Pointer로 평탄화하고 안전하게 원래 구조로 복원해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"style":{"type":"enum","values":["dot","pointer"]}},"terms":[["평탄화","중첩 구조의 각 값을 하나의 경로와 값 쌍으로 바꾸는 작업"],["JSON Pointer","/ 경로와 ~0·~1 이스케이프를 사용하는 RFC 6901 표기"],["경로 충돌","같은 위치를 값과 하위 객체로 동시에 만들려는 모순"],["Prototype pollution","특수 속성 경로로 JavaScript 객체의 공통 원형을 오염시키는 공격"]],"steps":[],"limitations":"입력은 서버로 전송하지 않고 별도 Worker에서 처리합니다. 64단계·200,000개 항목·4,000,000자 결과로 제한하며 __proto__·constructor·prototype 경로와 자동 덮어쓰기를 거부합니다."},{"name":"ndjson-tool","title":"NDJSON·JSON Lines 분석","category":"developer","url":"https://utils.haruspace.app/tools/ndjson-tool","description":"JSONL을 행별 검증하고 필드 검색·필터·정렬한 뒤 NDJSON·JSON·CSV로 변환해요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"inputFormat":{"type":"enum","values":["auto","ndjson","json-array"]},"outputFormat":{"type":"enum","values":["ndjson","json","csv"]},"operator":{"type":"enum","values":["contains","equals","not-equals","gt","gte","lt","lte","exists","missing"]},"sortDirection":{"type":"enum","values":["asc","desc"]},"caseSensitive":{"type":"boolean"},"protectFormulas":{"type":"boolean"},"includeBom":{"type":"boolean"},"pretty":{"type":"boolean"}},"terms":[["NDJSON","한 줄마다 독립된 JSON 값 하나를 기록하는 Newline Delimited JSON 형식"],["JSON Lines·JSONL","NDJSON과 같은 방식으로 널리 쓰이는 이름과 파일 확장자"],["JSON Pointer","중첩 필드 위치를 /user/name처럼 표시하는 RFC 6901 경로 표기"],["수식 주입","=·+·-·@로 시작하는 CSV 셀이 스프레드시트에서 수식으로 실행되는 문제"]],"steps":["NDJSON·JSONL을 붙여넣거나 UTF-8 파일을 선택한 뒤 입력 형식을 확인하세요.","행별 분석·변환을 눌러 오류 행과 발견한 필드를 확인하고 필요한 검색·필터·정렬 옵션을 고르세요.","조건을 바꾼 뒤 다시 분석하고, 정상 레코드 수를 확인해 NDJSON·JSON·CSV 결과를 복사하거나 다운로드하세요."],"limitations":"모든 처리는 실행 버튼을 누른 뒤 브라우저 Worker에서 이루어집니다. UTF-8 파일 12MB, 입력 8,000,000자, 100,000행·레코드, 중첩 64단계로 제한합니다. 실시간 스트리밍·서버 tail·압축 파일은 지원하지 않으며 __proto__·constructor·prototype 키는 안전상 거부합니다."},{"name":"log-analyzer","title":"로그 분석기","category":"developer","url":"https://utils.haruspace.app/tools/log-analyzer","description":"일반 로그와 JSON log를 자동 감지해 레벨·키워드·기간별로 찾고 오류 주변 문맥을 모아요","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"includeUndated":{"type":"boolean"},"caseSensitive":{"type":"boolean"},"timeZone":{"type":"enum","values":["local","utc"]},"contextRadius":{"type":"integer","min":0,"max":10},"sort":{"type":"enum","values":["source","oldest","newest"]},"outputFormat":{"type":"enum","values":["text","json","csv"]},"pretty":{"type":"boolean"}},"terms":[["로그 레벨","이벤트 중요도를 TRACE부터 FATAL까지 구분한 표기"],["JSON log","timestamp·level·message 같은 필드를 JSON 객체 한 줄로 남긴 구조화 로그"],["오류 문맥","ERROR·FATAL 이벤트의 원인을 찾도록 함께 보는 앞뒤 로그 이벤트"],["UTC 오프셋","Z·+09:00처럼 timestamp가 어느 시간대를 기준으로 하는지 나타내는 값"]],"steps":["일반 텍스트 로그나 한 줄 JSON 로그를 붙여넣거나 UTF-8 .log 파일을 선택하세요.","로그 분석을 눌러 자동 감지 결과를 확인하고 레벨·키워드·기간과 오류 앞뒤 범위를 조정하세요.","레벨·시간대 요약과 오류 문맥을 원본 행 번호로 대조한 뒤 필터 결과를 로그·JSON·CSV로 저장하세요."],"limitations":"붙여넣은 로그와 파일은 서버로 전송하지 않습니다. UTF-8 파일 12MB, 입력 8,000,000자, 120,000행·100,000이벤트로 제한합니다. 제품별 사용자 정의 로그 문법을 모두 해석하지는 못하며, 라이브 로그·원격 서버·로그인·DB·네트워크 조회는 지원하지 않습니다."},{"name":"gigalog-stream-analyzer","title":"대용량 로그 스트림 분석 (GigaLog)","category":"developer","url":"https://utils.haruspace.app/tools/gigalog-stream-analyzer","description":"브라우저 메모리 부하 없이 대용량 로그 파일(.log)을 청크 파싱해 레벨 통계, 타임라인, 에러 인시던트 문맥(Context)을 추출해요 (로그 분석, Spring Boot, Nginx, 스택트레이스, GigaLog)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"filterLevel":{"type":"enum","values":["ALL","ERRORS_ONLY","WARN_AND_ERROR","ERROR","WARN","INFO","DEBUG"]},"useRegex":{"type":"boolean"},"invertMatch":{"type":"boolean"}},"terms":[["스트림 청크 파싱","브라우저 메모리 고갈을 막기 위해 대용량 파일을 조각 단위로 분할하여 점진적으로 해석하는 기법"],["인시던트 문맥(Context)","에러가 발생한 원인을 빠르게 추적할 수 있도록 예외 발생 행 전후의 연속된 로그를 묶은 블록"],["타임라인 히스토그램","시간 경과에 따른 로그 발생 빈도와 에러 집중 구간을 막대형 그래프로 시각화한 도표"],["정규식 역일치(NOT)","특정 키워드나 정상 헬스체크 로그 패턴을 필터링에서 제외하고 이상치만 골라내는 기법"]],"steps":["로그 파일(.log, .txt, .jsonl)을 드래그 앤 드롭하거나 텍스트 입력창에 붙여넣으세요.","레벨별 통계 배지와 타임라인 히스토그램을 확인하고, 레벨 드롭다운이나 키워드/정규식을 지정하세요.","'에러 인시던트 문맥' 탭에서 예외 원인을 추적하거나 필터링된 로그 결과를 복사·저장하세요."],"limitations":"모든 연산은 기기 내부 브라우저 메모리에서만 수행됩니다. 압축된 아카이브 파일(.gz, .zip)은 압축 해제 후 텍스트 파일 상태로 투입해야 하며, 원격 서버의 실시간 소켓 tail 조회는 지원하지 않습니다."},{"name":"sqlite-studio","title":"SQLite 스튜디오 & ERD 뷰어","category":"developer","url":"https://utils.haruspace.app/tools/sqlite-studio","description":"SQLite DB 파일(.db, .sqlite)이나 SQL 덤프를 로컬에서 즉시 열람하고 쿼리 실행, 테이블 통계, 자동 외래키 ERD 다이어그램을 시각화해요 (DB 뷰어, SQL 쿼리, ERD 다이어그램, 테이블 관계도, Mermaid)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"activeTab":{"type":"enum","values":["query","schema","erd"]}},"terms":[["SQLite 헤더","파일 시작부 100바이트에 기록된 페이지 크기, 인코딩, 스키마 쿠키 등 DB 구조 메타데이터"],["인메모리 릴레이셔널 쿼리","별도 DB 서버 없이 브라우저 메모리 안에서 관계형 테이블을 탐색하는 SQL 실행 엔진"],["ERD(개체 관계도)","테이블 간의 외래키 및 데이터 참조 관계를 시각적인 다이어그램으로 도식화한 것"],["암시적 외래키 추론","명시적인 FOREIGN KEY 제약이 없더라도 컬럼명(user_id)과 테이블명(users)의 패턴을 분석해 관계를 찾는 기법"]],"steps":[".db, .sqlite 바이너리 파일이나 .sql 덤프 스크립트를 드롭하거나 붙여넣으세요.","상단 테이블 태그를 클릭해 스키마와 데이터 프리뷰를 확인하세요.","'SQL 쿼리 랩'에서 SELECT 문을 실행하거나 '자동 ERD 다이어그램' 코드를 복사해 사용하세요."],"limitations":"순수 인메모리 파서이므로 암호화된 SQLCipher DB는 암호 해제 후 열람해야 하며, 수십 GB 이상의 초대형 데이터베이스는 메모리 제약이 있을 수 있습니다."},{"name":"iac-security-linter","title":"IaC & K8s 인프라 보안 진단","category":"developer","url":"https://utils.haruspace.app/tools/iac-security-linter","description":"Kubernetes YAML, Terraform HCL, Dockerfile의 권한 상승, 시크릿 노출, 포트 개방 등 30+ 보안 취약점을 로컬 진단해요 (쿠버네티스 보안, K8s Linter, 테라폼 보안, Terraform, Dockerfile, CIS 벤치마크)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"targetOverride":{"type":"enum","values":["auto","kubernetes","terraform","dockerfile"]}},"terms":[["AST(추상 구문 트리)","소스코드의 문법적 구조를 컴퓨터가 분석하기 쉬운 트리 형태로 표현한 데이터 모델"],["CIS 벤치마크","인터넷 보안 센터(CIS)에서 제정한 클라우드 및 컨테이너 인프라 보안 설정 가이드라인"],["최소 권한의 원칙","컨테이너나 클라우드 리소스에 업무 수행에 필요한 최소한의 퍼미션만 부여하는 보안 원칙"],["하드코딩 시크릿","API 키, 데이터베이스 패스워드 등 민감 정보가 소스코드에 평문으로 기록된 안티패턴"]],"steps":["YAML, TF, 또는 Dockerfile 내용을 붙여넣거나 파일을 드래그 앤 드롭하세요.","자동 감지된 포맷과 종합 보안 점수(100점 만점) 및 취약점 통계를 확인하세요.","발견된 취약점 카드의 '💡 권장 조치 방법'을 참고해 코드를 수정한 후 보고서를 복사하세요."],"limitations":"정적 텍스트/AST 기반 진단이므로 런타임 클라우드 인프라의 실제 통신 상태나 IAM Role의 동적 Assume 정책까지는 검증하지 않습니다."},{"name":"mock-api-sandbox","title":"목(Mock) API & cURL 샌드박스","category":"developer","url":"https://utils.haruspace.app/tools/mock-api-sandbox","description":"cURL 명령어를 파싱하고 HTTP 상태코드, 지연시간, 동적 JSON 응답을 브라우저 메모리 안에서 시뮬레이션해요 (Mock API, 가상 서버, cURL 파서, OpenAPI, REST API 테스트)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"statusCode":{"type":"integer","min":100,"max":599},"delayMs":{"type":"integer","min":0,"max":10000}},"terms":[["cURL 파싱","터미널용 HTTP 요청 명령어를 웹 브라우저가 해석할 수 있는 구조화된 객체로 분해하는 과정"],["가상 목(Mock) 서버","실제 백엔드가 준비되지 않은 상태에서 동일한 규격의 응답을 반환하도록 흉내 내는 시험용 시스템"],["네트워크 지연(Latency)","클라이언트가 요청을 보낸 후 서버로부터 응답을 받기까지 걸리는 시간(밀리초)"],["오프-서버 샌드박스","네트워크 트래픽을 외부 인터넷으로 전송하지 않고 브라우저 탭 안에서만 완결하는 테스트 환경"]],"steps":["cURL 명령어를 붙여넣거나 엔드포인트를 입력하세요.","테스트할 HTTP 상태 코드와 지연 시간(ms), 모크 JSON 응답을 설정하세요.","'모크 응답 복사' 또는 'JS 연동 스니펫'을 복사하여 프론트엔드 코드에 적용하세요."],"limitations":"실제 인터넷 외부 도메인의 소켓 서버를 개설하는 것이 아니라 브라우저 내부 가상 시뮬레이터이므로 다른 기기에서의 원격 호출은 지원하지 않습니다."},{"name":"semantic-deduplicator","title":"의미론적 문서 중복·모순 탐지기","category":"developer","url":"https://utils.haruspace.app/tools/semantic-deduplicator","description":"계약서나 RFP의 문단을 로컬 벡터라이징해 표현은 다르나 의미가 일치하는 중복 문단과 상반된 모순 조항을 검출해요 (문서 감사, 계약서 검토, 중복 조항, 모순 탐지, 자연어 분석)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"threshold":{"type":"enum","values":["0.5","0.65","0.75","0.85"]}},"terms":[["TF-IDF 코사인 유사도","단어의 출현 빈도와 중요도를 벡터로 변환하여 두 문서나 문단의 의미적 근접도를 0~1 사이로 측정하는 알고리즘"],["N-Gram 토큰화","문장을 연속된 N개의 단어 단위로 묶어 어순과 문맥 정보를 보존하는 자연어 처리 기법"],["모순 조항(Conflict)","동일하거나 유사한 조건에 대해 상반된 권리나 의무(허용 vs 금지)를 규정하는 논리적 오류"],["의미론적 중복","표현된 단어는 다르지만 본질적인 지시 사항이나 내용이 동일한 텍스트"]],"steps":["검토할 계약서나 문서를 붙여넣거나 .txt 파일을 드롭하세요.","유사도 임계치 슬라이더를 조절하여 유사/중복 문단과 모순 조항을 확인하세요.","'중복 제거 텍스트 복사'를 눌러 정제된 문서를 클립보드에 저장하세요."],"limitations":"100% 브라우저 메모리 연산 모델이므로 초거대 LLM 수준의 상식 추론보다는 N-Gram 통계 벡터 기반의 의미론적 유사도에 집중합니다."},{"name":"pcap-packet-analyzer","title":"로컬 PCAP 네트워크 패킷 분석기","category":"developer","url":"https://utils.haruspace.app/tools/pcap-packet-analyzer","description":"Wireshark 패킷 덤프(.pcap) 바이너리를 직접 디코딩해 프로토콜 통계(TCP, UDP, DNS, TLS)와 평문 인증 정보 유출을 진단해요 (패킷 분석, 와이어샤크, Wireshark, 네트워크 보안)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"maxPackets":{"type":"integer","min":100,"max":5000}},"terms":[["PCAP 포맷","네트워크 인터페이스에서 캡처한 원시 패킷 데이터를 바이너리 형태로 기록하는 표준 파일 규격"],["매직 넘버","파일의 포맷과 엔디안(Little/Big Endian)을 식별하기 위해 헤더 시작부 4바이트에 기록된 식별값"],["TLS 핸드셰이크","클라이언트와 서버가 암호화 통신을 시작하기 위해 암호 스위트와 인증서를 교환하는 절차"],["평문 자격증명 노출","암호화되지 않은 HTTP 프로토콜 상에서 패스워드나 인증 토큰이 그대로 노출되는 취약점"]],"steps":[".pcap 또는 .cap 패킷 캡처 파일을 드래그 앤 드롭하세요.","프로토콜별 패킷 분포와 상단 '평문 민감 정보 유출 경고'를 확인하세요.","패킷 상세 테이블에서 송수신 IP, 포트, 시간대별 흐름을 점검하세요."],"limitations":"브라우저 순수 자바스크립트 파서이므로 암호화된 TLS 페이로드의 복호화는 지원하지 않으며 헤더 메타데이터 및 평문 구간을 중점 진단합니다."},{"name":"forensic-watermark","title":"비가시적 디지털 포렌식 워터마크","category":"developer","url":"https://utils.haruspace.app/tools/forensic-watermark","description":"대외비 이미지에 육안으로 보이지 않는 사번, 부서코드, 날짜를 LSB 비트 암호화로 은닉 삽입하고 유출본에서 역추출해요 (스테가노그래피, 워터마크, 유출 추적, 보안 감사)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"mode":{"type":"enum","values":["encode","decode"]}},"terms":[["스테가노그래피","정보가 존재한다는 사실 자체를 숨기기 위해 다른 매체(이미지, 오디오) 안에 데이터를 은닉하는 기술"],["LSB(최하위 비트)","RGB 색상값의 가장 끝 비트를 치환하여 인간의 시각으로는 색상 변화를 인지할 수 없게 만드는 기법"],["디지털 포렌식","디지털 매체에 남겨진 흔적을 분석하여 문서 유출 경로와 유출자를 추적·증명하는 절차"],["무손실 인코딩","압축이나 변환 과정에서 픽셀 비트 데이터가 손실되지 않아 은닉된 정보를 100% 복원할 수 있는 방식"]],"steps":["은닉할 식별값(사번, 부서명, 타임스탬프)을 입력하고 원본 이미지를 업로드하세요.","워터마크가 은닉된 이미지를 'PNG 다운로드'로 저장하세요.","유출본 검증 시에는 오른쪽 '유출 의심 이미지' 영역에 드롭하여 은닉값을 역추출하세요."],"limitations":"강한 JPEG 손실 압축이나 화면 캡처 시 비트 변형이 발생할 수 있으므로 원본 픽셀 보존을 권장합니다."},{"name":"git-conflict-resolver","title":"Git 충돌 해결 & 3-Way 패치 스튜디오","category":"developer","url":"https://utils.haruspace.app/tools/git-conflict-resolver","description":"머지 충돌 마커(<<<<<<< HEAD) 소스코드를 파싱해 Ours/Theirs 원클릭 채택, 3단 비교, 클린 병합 파일 및 .patch를 생성해요 (Git 충돌, 깃 머지, 3-Way 병합, Git Patch)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"preferredResolution":{"type":"enum","values":["ours","theirs","both"]}},"terms":[["머지 충돌 마커","Git이 두 브랜치의 변경 사항을 자동으로 합치지 못할 때 소스코드에 삽입하는 표식 (<<<<<<<, =======, >>>>>>>)"],["Ours vs Theirs","현재 체크아웃된 로컬 브랜치의 변경 사항(Ours)과 병합하려는 원격/대상 브랜치의 변경 사항(Theirs)"],["3-Way 병합","공통 조상(Base)과 두 브랜치의 변경점을 비교하여 최종 결과물을 도출하는 알고리즘"],["Unified Diff (.patch)","파일 변경 내역을 표준 diff 규격으로 기록하여 패치 적용이 가능하게 만든 텍스트 파일"]],"steps":["충돌 마커가 포함된 소스코드 파일을 드롭하거나 붙여넣으세요.","구역별로 'Ours 채택', 'Theirs 채택', 또는 '둘 다 병합'을 선택하세요.","하단 '병합 소스코드 복사' 또는 '.patch 복사'를 눌러 Git 레포지토리에 반영하세요."],"limitations":"텍스트 기반의 충돌 마커를 해석하므로 바이너리 파일(.jar, .png 등)의 충돌 병합은 지원하지 않습니다."},{"name":"sbom-license-auditor","title":"SBOM 공급망 라이선스 감사기","category":"developer","url":"https://utils.haruspace.app/tools/sbom-license-auditor","description":"package-lock.json, pom.xml, Cargo.lock을 분석해 AGPL, GPL 등 소스코드 의무 공개 독소 라이선스를 오프라인 진단해요 (오픈소스 라이선스, SPDX, 공급망 보안, SBOM 감사)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"filterRisk":{"type":"enum","values":["all","critical","high","safe"]}},"terms":[["SBOM(소프트웨어 자재명세서)","소프트웨어를 구성하는 모든 오픈소스 라이브러리와 의존성 목록을 체계적으로 명시한 문서"],["강한 카피레프트(Copyleft)","해당 라이브러리를 사용하거나 링크할 경우 상용 서비스의 전체 소스코드도 공개해야 하는 라이선스 (AGPL, GPL)"],["허용적 라이선스(Permissive)","저작권 고지만 유지하면 상용 서비스에서도 소스코드 공개 없이 자유롭게 사용 가능한 라이선스 (MIT, Apache-2.0, BSD)"],["SPDX 식별자","리눅스 재단에서 표준화한 오픈소스 라이선스 고유 식별 코드 (예: MIT, Apache-2.0, GPL-3.0)"]],"steps":["package-lock.json, pom.xml, Cargo.lock 등의 락파일을 드래그 앤 드롭하세요.","종합 컴플라이언스 점수와 치명적(CRITICAL) 라이선스 감지 여부를 확인하세요.","'감사 보고서 복사'를 눌러 사내 보안 심사 자료로 활용하세요."],"limitations":"오프라인 정적 매핑 엔진이므로 신규 등록된 사설 라이선스나 패키지 메타데이터에 기재되지 않은 커스텀 라이선스는 UNKNOWN으로 분류될 수 있습니다."},{"name":"data-sanity-autofix","title":"엑셀·CSV 결측치·수식 오류 자동 복원기","category":"developer","url":"https://utils.haruspace.app/tools/data-sanity-autofix","description":"깨진 엑셀 데이터, #N/A·#REF! 오류, 유령 제로폭 공백, 열 어긋남을 일괄 진단하고 원클릭 복원해요 (CSV 복원, 엑셀 정제, 데이터 클렌징, 제로폭 공백 제거)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"autoFixZeros":{"type":"boolean"},"cleanInvisible":{"type":"boolean"}},"terms":[["제로폭 공백(Zero-width space)","화면에는 보이지 않지만 바이트를 차지하여 검색이나 DB 저장을 방해하는 유령 특수문자"],["수식 오류(#N/A, #REF!)","엑셀에서 잘못된 참조나 계산 오류로 인해 셀에 텍스트 형태로 굳어져버린 결측치"],["열 불일치(Column Mismatch)","행마다 포함된 쉼표나 탭 개수가 달라 데이터베이스 임포트 시 오류를 유발하는 행 구조 결함"],["데이터 정규화","불완전한 데이터를 표준화된 규칙에 맞추어 결측치를 채우고 불필요한 공백을 제거하는 작업"]],"steps":["손상되었거나 검증이 필요한 CSV/TSV 텍스트를 붙여넣거나 파일을 드롭하세요.","발견된 수식 오류와 유령 공백 개수를 대시보드에서 확인하세요.","'원클릭 결함 자동 복원'을 누른 뒤 '클린 CSV 복사'로 안전한 데이터를 추출하세요."],"limitations":"구조적 텍스트 정제 도구이므로 셀 내부에 포함된 복잡한 비즈니스 로직(예: 계산식의 수학적 재연산)은 수행하지 않습니다."},{"name":"design-token-transpiler","title":"디자인 토큰 다중 플랫폼 변환기","category":"developer","url":"https://utils.haruspace.app/tools/design-token-transpiler","description":"Figma 및 W3C DTCG 디자인 토큰 JSON을 Tailwind v4, CSS 변수, SCSS, Flutter, Swift, Jetpack Compose로 원클릭 변환해요 (디자인 토큰, Tailwind v4, Flutter, SwiftUI, Figma Tokens)","execution":"client-side-deterministic","dataRetention":"zero-retention","options":{"targetPlatform":{"type":"enum","values":["tailwind","css","scss","flutter","swift","compose"]}},"terms":[["디자인 토큰(Design Token)","색상, 폰트, 간격 등 디자인 시스템의 시각적 요소를 플랫폼 독립적인 데이터 형태로 정의한 변수"],["W3C DTCG 포맷","W3C 디자인 토큰 커뮤니티 그룹에서 제정한 $value, $type 기반의 표준 토큰 규격"],["Tailwind CSS v4 @theme","Tailwind 최신 4.0 버전에서 도입된 CSS 퍼스트 테마 변수 선언 방식"],["크로스 플랫폼 트랜스파일","하나의 토큰 데이터를 웹(CSS), 모바일(Flutter, Swift, Compose) 등 각 환경의 고유 언어로 자동 변환하는 과정"]],"steps":["Figma 또는 W3C 규격의 디자인 토큰 JSON을 붙여넣거나 파일을 드롭하세요.","타깃 프레임워크(Tailwind v4, CSS, Flutter, Swift, Compose)를 선택하세요.","생성된 소스코드를 확인하고 '코드 스니펫 복사'를 눌러 프로젝트에 붙여넣으세요."],"limitations":"토큰 변수명에 한글이나 특수기호가 포함된 경우 타깃 언어의 문법에 맞게 영문 식별자로 치환될 수 있습니다."}]}