방법론
시행일 2026-10-07
What It Calls 는 깃허브 공개 저장소의 코드를 읽어, 그 도구가 어떤 외부 API 를 부르는지와 그 근거가 되는 코드 줄을 보여 줍니다. 판단하거나 평가하지 않고, 코드에서 확인한 사실과 그 위치만 적습니다. 이 문서는 그 사실을 어떤 규칙으로 찾는지 설명합니다.
무엇을 하는가
깃허브 주소의 github.com 을 whatitcalls.reactiveworks.dev 로 바꾸면 됩니다. 예를 들어 github.com/owner/repo 는 whatitcalls.reactiveworks.dev/owner/repo 가 됩니다.
서버는 저장소를 clone 하지 않습니다. GitHub REST API 와 raw 파일 주소로 필요한 파일만 내려받아 메모리에서 읽고, 원문을 디스크에 남기지 않습니다. 저장하는 것은 찾아낸 사실, 그 위치(파일 경로와 줄 번호), 화면에 보여 줄 짧은 인용뿐입니다.
모든 근거는 점검한 순간의 커밋 SHA 에 고정됩니다. 근거 링크는 그 커밋의 그 줄을 가리키므로, 저장소가 나중에 바뀌어도 무엇을 보고 판단했는지 그대로 확인할 수 있습니다.
저장소 상태 4종
저장소 상태는 「무엇을 부르는가」만 말합니다. 그 호출이 꼭 있어야 하는지는 상태로 단정하지 않고, 근거가 확실한 행에서만 사실 문장으로 덧붙입니다.
| 상태 | 뜻 | 조건 |
|---|---|---|
| 외부 API 사용 | 코드에 외부 API 를 실제로 부르는 호출 구문이 있습니다. | HTTP 클라이언트·SDK 메서드 호출·클라이언트 생성자의 주소 인자, 또는 그 호출로 흘러가는 상수·설정 기본값이 코드나 설정 파일에 있습니다. |
| 외부 API 사용 · 로컬 대안 있음 | 위와 같고, 코드 안에 로컬로 바꾸는 길이 있습니다. | 로컬 런타임 선택지, 사용자가 정하는 base URL, 로컬 기본값 가운데 하나가 코드나 설정 근거로 있습니다. 문서 언급은 보조 근거입니다. |
| 외부 API 발견 안 됨 | 점검 범위 안에서 외부 API 호출을 찾지 못했습니다. | 저장소를 끝까지 읽었거나, 매니페스트·진입점·우선순위 파일을 전부 읽었고 어느 매니페스트에도 요금 카탈로그 공급자의 SDK 가 없으며 읽은 코드 어디에도 외부 API 호출이 없을 때입니다. 뒤의 경우에는 「부분 점검 n/N」 꼬리표가 붙습니다. |
| 확인 필요 | 읽지 못한 범위가 있어 호출이 있는지 없는지 말할 수 없습니다. | 위 세 가지 어디에도 해당하지 않을 때만 붙습니다. |
상태는 사실 표시입니다. 「외부 API 사용」은 그 도구가 외부 서비스 없이는 전혀 쓸 수 없다는 뜻이 아니며, 「외부 API 발견 안 됨」도 점검 범위 안에서의 결과입니다.
호출로 세는 것과 세지 않는 것
호출로 셉니다
- HTTP 클라이언트 호출(
fetch·axios·requests등)에 들어간 외부 주소 - 공급자 SDK 의 메서드 호출, 클라이언트 생성자에 넘긴 주소 인자
- 그 호출로 흘러가는 상수와 설정 기본값(코드 파일·설정 파일 모두)
호출로 세지 않습니다
- 도움말·로그·디버그·오류 메시지 안의 주소
- 비교식(
host === "api.example.com"같은 검사) - 문자열 속 문서·마크다운, 화면 예시, 링크
- 주석, 테스트, 예제 코드
- 빌드·릴리스·마이그레이션 같은 유지보수 스크립트에서만 부르는 호출
- 설정 파일에만 있고 실제로 요청을 보내지 않는 주소(빌드 도구 설정 포함)
세지 않은 주소는 버리지 않고 「호출이 아닌 언급」으로 결과 페이지에 따로 적습니다.
로컬 대안 기준
「로컬 대안 있음」은 다음 가운데 하나가 저장소의 코드나 설정에 근거로 있을 때만 붙습니다.
- 로컬 런타임 선택지 — Ollama, LM Studio, llama.cpp, vLLM 등
- 사용자가 바꿀 수 있는 base URL(OpenAI 호환 주소 등)
- 로컬 주소를 기본값으로 두는 설정
README 나 문서에 「로컬로도 돌릴 수 있다」고만 적혀 있는 경우는 이 조건을 채우지 않습니다.
결과 페이지의 「로컬로 바꾸는 길」 상자는 그 저장소 자체 코드에 있는 설정(환경 변수 이름, 설정 키 등)만 보여 줍니다. 저장소 밖의 다른 도구를 일반적으로 추천하지 않습니다.
행 꼬리표
외부 API 표의 각 행에는 공급자, 커밋에 고정된 호출 위치(파일:줄), 기능 이름과 함께 다음 꼬리표가 붙습니다.
| 꼬리표 | 뜻 |
|---|---|
| 사용자 키 필요 | 사용자가 API 키나 토큰을 넣어야 하는 공급자입니다. |
| 인증 필요(API 키 아님) | 클라우드 계정 권한, 서비스 계정, OAuth 같은 인증을 씁니다. |
| 별도 자격증명 불필요 | 키나 인증 없이 부를 수 있는 공급자입니다. |
| 유료 | 요금 카탈로그 기준으로 쓰려면 비용이 드는 공급자입니다. |
| 무료 등급 있음 | 요금 카탈로그 기준으로 반복해서 쓸 수 있는 무료 한도가 있습니다. |
| 기본값 클라우드 | 기본 설정은 외부 호스트이고, 코드 안에 로컬 대안이 있습니다. |
| 로컬 주소로 변경 가능 | 호출 주소를 로컬 주소로 바꿀 수 있는 설정이 있습니다. |
| 저장소 자체 서비스 | 호출하는 호스트가 저장소 소유자·이름·홈페이지와 같은 도메인입니다. |
| 하위 명령 | CLI 의 하위 명령에서만 부르는 호출입니다. |
| 별도 배포 단위 | GitHub Action, 브라우저·편집기 확장처럼 저장소 안의 별도 배포물에서 부릅니다. |
범위 꼬리표(하위 명령·별도 배포 단위)는 사실 표시일 뿐 저장소 상태를 바꾸지 않습니다.
근거가 확실한 행에는 「키가 없으면 401 로 멈춥니다」, 「키가 없으면 이 호출을 건너뜁니다」 같은 사실 문장을 덧붙입니다. 진입점에서 그 호출까지 도달하는지, 키가 없을 때 어느 분기로 가는지를 코드에서 확인한 경우에만 씁니다.
인프라 호스트는 따로 표시합니다
다음 호스트는 외부 API 로 세지 않고, 결과 페이지의 「외부로 나가는 데이터」에만 적습니다.
- 패키지·모델 저장소(npm, PyPI, crates.io, 모델 가중치 내려받기 등)
- GitHub API, 릴리스 내려받기, 업데이트 확인
- 정적 파일 CDN
- 분석·텔레메트리
- 문서 사이트
점검 범위
기본 점검
한 번의 점검은 커밋 하나를 다음 상한 안에서 읽습니다.
- 파일 최대 400개
- 전체 최대 8MB
- 파일 하나당 최대 512KB(넘는 파일은 앞부분만 읽고 「부분 점검」 사유로 남깁니다)
node_modules, vendor, dist, build 같은 의존성·빌드 결과 폴더는 읽지 않습니다.
읽는 순서
- 매니페스트(
package.json,pyproject.toml,go.mod등) - 설정 파일
- Dockerfile
- README
- 진입점 파일(
main,app,server,index등) - 경로에 공급자 이름이나 SDK 이름이 들어간 소스 파일
- 그 밖의 소스 파일
1~5번이 우선순위 파일입니다. 상한 때문에 우선순위 파일을 다 읽지 못하면 결과에 그 사실을 적습니다.
깊이 점검
기본 점검이 읽기 상한에 걸려 「확인 필요」가 되면, 같은 커밋을 더 넓은 상한으로 한 번 더 읽습니다.
- 파일 최대 2,000개
- 전체 최대 64MB
- 파일 하나당 상한은 기본 점검과 같습니다(512KB)
따라가지 않는 것
- Git 서브모듈 — 목록만 적고 내용은 읽지 않습니다.
- Git LFS 파일 — 포인터만 있고 내용은 받지 않습니다.
- 심볼릭 링크 — 목록만 적고 대상을 따라가지 않습니다.
언어별 지원
진입점에서 호출까지 import 경로를 따라가는 분석은 JavaScript·TypeScript 와 Python 만 합니다. Go, Rust, Ruby, PHP, Java, Kotlin, Swift 파일은 호출과 주소를 추출만 하고 경로는 따라가지 않습니다.
부분 점검
상한, 서브모듈, 해석하지 못한 import 같은 이유로 저장소 전체를 읽지 못했으면 「부분 점검」 꼬리표와 읽은 파일 수(n/N)를 함께 보여 줍니다.
요금 카탈로그
코드 근거는 「이 저장소가 어떤 공급자를 부른다」까지만 증명합니다. 그 공급자가 유료인지, 무료 등급이 있는지는 따로 관리하는 요금 카탈로그가 근거입니다. 카탈로그의 각 항목은 공식 가격 페이지를 직접 열어 확인한 내용이며, 결과 페이지에 가격 페이지 링크와 확인일을 함께 보여 줍니다.
현재 카탈로그 판 2 · 공급자 36곳 · 최근 확인일 2026-10-05
판정 기준
| 값 | 기준 |
|---|---|
free_tier · 무료 등급 있음 | 공식 페이지에 가입만으로 계속 쓸 수 있는 무료 한도(매월·매일 다시 차는 한도, 무료 플랜, 무료 모델)가 적혀 있습니다. 카드 등록이 필요하면 메모로 적습니다. |
paid · 유료 | 쓰려면 돈을 냅니다(선불 크레딧, 종량제, 구독). 가입할 때 한 번 주는 체험 크레딧은 무료 등급으로 치지 않습니다. |
unverified · 확인 안 됨 | 공식 페이지를 열지 못했거나, 판정할 문구가 없었습니다. |
확인일에서 90일이 지난 공급자는 결과 페이지에 「요금 정보 오래됨」으로 표시합니다. 카탈로그를 고치면 판 번호가 올라가고, 그 공급자를 부르는 결과는 새 판본으로 다시 게시됩니다.
모델 해설
결과 페이지의 짧은 해설 문장은 언어 모델이 씁니다. 다만 모델이 쓴 문장은 서버가 코드 근거에서 먼저 만든 주장(주장 ID)에 묶인 것만 게시합니다. 주장에 없는 내용, 평가하는 표현이 들어간 문장은 버립니다. 모델에 보내는 것은 공개 저장소의 README·코드 줄과 규칙 문장이며, 비밀값처럼 보이는 문자열은 보내기 전에 가립니다.
모델 호출이 실패하거나 조건을 통과한 문장이 없으면, 규칙으로 만든 문장을 그대로 게시합니다.
한계
- 정적 분석은 코드를 실행하지 않고 읽기만 합니다. 실행 환경에서 일어날 수 있는 모든 경우를 증명하지 못합니다.
- 동적 import, 리플렉션, 플러그인처럼 실행할 때 정해지는 경로는 해석하지 못하고 「미해결」로 남깁니다.
- 사용자가 실행할 때 직접 넣는 주소나 설정은 알 수 없습니다.
- 읽기 상한과 언어 지원 범위 밖의 파일은 결과에 반영되지 않으며, 그 사실은 「부분 점검」으로 표시합니다.
판본과 다시 점검
결과 하나는 하나의 판본입니다. 판본은 다음 네 가지로 정해집니다.
- 점검한 커밋(과 읽은 깊이)
- 스캐너·판정 규칙 버전 — 현재
scan-5+verdict-4 - 요금 카탈로그 판 — 현재 2
- 정정 리비전
이 가운데 하나가 바뀌면 새 판본이 만들어집니다. 저장소에 새 커밋이 올라왔다면 결과 페이지의 「최신 커밋으로 다시 점검」 버튼으로 다시 점검할 수 있습니다(저장소마다 10분에 한 번).
북마클릿
아래 버튼을 브라우저 북마크바로 끌어다 놓으세요. 깃허브 저장소 페이지에서 그 북마크를 누르면 새 탭에 그 저장소의 결과가 열립니다.
이 사이트에서 누르면 이동하지 않고 설치 안내만 보여 줍니다.
결과가 틀렸을 때
결과 페이지의 「이 결과가 틀렸어요」로 알려 주세요. 접수와 처리 방식은 정정 정책에 적어 두었습니다.