시작하기
FastFind 로 무엇을 만들 수 있나요?
FastFind 는 켜져 있는 동안 내 PC 안에 작은 검색 서버를 함께 띄웁니다. 그래서 다른 프로그램이 검색 결과를 받아 갈 수 있습니다.
- 파워셸·파이썬 스크립트에서 파일 목록 받아오기
- 자기가 만든 런처·도구에 검색 붙이기
- 결과 우클릭 메뉴에 내 기능 끼워 넣기 (플러그인)
색인은 내 PC 안에만 있고 밖으로 나가지 않습니다. 서버도 127.0.0.1 에만 답합니다.
서버는 어디에 떠 있나요?
기본 9090 번입니다. 설정에서 바꾸실 수 있습니다.
http://127.0.0.1:9090
프로그램이 꺼져 있으면 서버도 없습니다. 먼저 떠 있는지 /api/status 로 확인하고 쓰시는 편이 안전합니다.
실제로 이렇게 만든 것이 있습니다
브라우저 시작 페이지에서 내 PC 파일을 바로 찾습니다. 웹 검색과 로컬 파일을 한 자리에서 봅니다.
검색어를 친다
읽기만 중계
/api/search
브라우저가 FastFind 를 직접 부르지 않습니다. 웹 화면에 API 가 노출되면
아무 사이트나 내 파일 목록을 긁어 갈 수 있으니, 믿을 수 있는 에이전트가 가운데에서
읽기만 넘겨 줍니다.
부르기 전에 /api/status 로 떠 있는지 먼저 보고, 없으면
503 fastfind_not_running 을 돌려주고 설치 안내로 넘깁니다.
사용자는 FastFind 를 설치·실행만 하면 됩니다 — 로그인도 설정도 없습니다.
인증
토큰이 필요합니다
아무나 내 파일 목록을 긁어 갈 수 있으면 안 되므로, 토큰 없이는 답하지 않습니다.
두 가지 방법 중 하나로 보내십시오.
Authorization: Bearer <토큰> | 머리말에 담아 보내기 |
ff_local_token=<토큰> | 쿠키로 보내기 (브라우저에서 쓸 때) |
토큰은 /login 화면에서 받습니다. 이 두 주소만 토큰 없이 열립니다.
POST /api/local-auth/login
REST API
검색 — GET /api/search
curl -H "Authorization: Bearer $TOKEN" \
"http://127.0.0.1:9090/api/search?q=견적서%20ext:pdf&max=50"
보낼 것
q | 검색어. 사용법의 검색 문법 을 그대로 씁니다 (ext: size: path: 초성 …) |
max | 최대 몇 개까지 (생략하면 기본값) |
name_only | true 면 이름에서만, false 면 전체 경로에서 |
case | 대소문자 구분 |
word | 낱말 단위로 |
regex | 정규식으로 |
sort asc | 정렬 기준과 방향 |
받을 것
{
"results": [
{
"name": "견적서_한빛건설.pdf",
"path": "C:\\작업\\2026\\견적서_한빛건설.pdf",
"size": 284915,
"ext": "pdf",
"modified": 1786012800,
"is_dir": false
}
],
"total": 12,
"time_ms": 5.3,
"query": "견적서 ext:pdf"
}
total 은 조건에 맞는 전체 개수이고 results 는 그중 돌려준 만큼입니다. modified 는 1970년부터의 초입니다.
상태 — GET /api/status
색인이 준비됐는지, 몇 개나 담고 있는지 봅니다. 검색을 보내기 전에 이걸 먼저 확인하시면 프로그램이 꺼져 있거나 아직 색인 중일 때를 가려낼 수 있습니다.
{
"indexed_files": 4663246,
"version": "0.42.1",
"status": "ready"
}
응답에 engine engine_gen mem 같은 칸도 함께 오는데, 그건 저희가 문제를 찾을 때 쓰는 값이라 예고 없이 바뀝니다. 기대지 마십시오.
자동 완성 — GET /api/suggest
치는 중에 보여 줄 후보를 받습니다. 글자 배열 하나만 돌려줍니다.
GET /api/suggest?q=견적
["견적서_한빛건설.pdf", "견적서_양식.hwp", "견적_2026.xlsx"]
파워셸에서 쓰는 짧은 보기
$t = "여기에 토큰"
$r = Invoke-RestMethod -Uri "http://127.0.0.1:9090/api/search?q=ext:log" `
-Headers @{ Authorization = "Bearer $t" }
$r.results | Select-Object name, path, size | Format-Table
파이썬에서 쓰는 짧은 보기
import requests, urllib.parse
TOKEN = "여기에 토큰"
q = urllib.parse.quote("견적서 ext:pdf")
r = requests.get(f"http://127.0.0.1:9090/api/search?q={q}&max=20",
headers={"Authorization": f"Bearer {TOKEN}"})
for f in r.json()["results"]:
print(f["size"], f["path"])
그 밖의 경로 — 있지만 약속하지 않습니다
아래도 열려 있습니다. 다만 저희 웹 화면이 쓰려고 만든 것이라 예고 없이 바뀝니다. 쓰시더라도 깨질 수 있다는 것을 알고 쓰십시오.
GET /api/recent | 최근 만들어지거나 고쳐진 파일 |
GET /api/open?path=… | 그 파일을 엽니다 |
GET /api/open-folder?path=… | 그 파일이 있는 폴더를 엽니다 |
GET /api/preview?path=… | 미리보기 그림 (이미지로 돌려줍니다) |
GET /api/content-search | 파일 안 내용에서 찾기. 느립니다 |
GET /api/analysis | 어디가 용량을 많이 쓰는지 |
GET /api/browse?path=… | 폴더 안 목록 |
/api/favorites /add /remove | 즐겨찾기 |
/api/smart-folders /add /remove /search | 저장된 검색 |
/api/history /clear | 검색 기록 |
이 중 자주 쓰시는 것이 있으면 알려 주십시오. 쓰는 분이 있는 것부터 약속 목록으로 옮기겠습니다.
실패했을 때
| 연결 거부 | 프로그램이 꺼져 있습니다. 또는 포트가 다릅니다 |
401 | 토큰이 없거나 틀렸습니다 |
404 | 없는 경로입니다 |
프로그램은 사용자가 끄면 함께 사라집니다. 항상 떠 있다고 여기지 마십시오. 부르기 전에 /api/status 로 확인하고, 안 되면 조용히 넘어가도록 만드시는 편이 안전합니다.
포트를 어떻게 아나요?
기본은 9090 이지만 사용자가 설정에서 바꿀 수 있습니다. 배포하실 도구라면 포트를 물어보거나 설정할 수 있게 만들어 두십시오.
설정 파일에서 읽으실 수도 있습니다.
%LOCALAPPDATA%\FastFind\settings.json
플러그인
플러그인은 어떻게 동작하나요?
검색 결과를 오른쪽 클릭했을 때 나오는 메뉴에 내 기능을 끼워 넣는 것입니다.
플러그인은 별도 실행파일입니다. DLL 로 앱 안에 넣지 않습니다 — 남이 만든 코드가 잘못돼도 FastFind 가 같이 죽으면 안 되기 때문입니다. 그래서 어떤 언어로든 만드실 수 있습니다.
FastFind → 플러그인 : myplugin.exe --path "C:\\file.txt"
플러그인 → FastFind : 표준출력으로 JSON 한 덩어리
돌려줄 수 있는 것
message | 알림창을 띄웁니다 |
copy | 클립보드에 담습니다 |
open | 그 경로를 엽니다 |
{"action":"message","title":"줄 수","text":"1,284줄"}
{"action":"copy","text":"복사할 내용"}
{"action":"open","path":"C:\\어딘가"}
가장 짧은 플러그인 — 파이썬 다섯 줄
고른 파일이 몇 줄인지 세어 알려 주는 것입니다.
import sys, json
path = sys.argv[sys.argv.index("--path") + 1]
n = sum(1 for _ in open(path, encoding="utf-8", errors="ignore"))
print(json.dumps({"action": "message", "title": "줄 수",
"text": f"{n:,}줄"}, ensure_ascii=False))
이것을 exe 로 만들어 아래 자리에 넣고, 옆에 plugin.json 을 둡니다.
%LOCALAPPDATA%\\FastFind\\plugins\\linecount\\
run.exe
plugin.json
{
"id": "linecount",
"name": "줄 수 세기",
"description": "고른 파일의 줄 수를 셉니다",
"version": "1.0.0",
"author": "내 이름"
}
FastFind 를 다시 켜면 결과 우클릭 메뉴에 줄 수 세기 가 나옵니다.
이미 딸려 있는 것들
넷이 함께 설치됩니다. 만들 때 참고하십시오.
- 파일 정보 — 크기·시각·속성
- 해시 — SHA-256 계산
- 이미지 정보 — 크기·형식
- 글자 통계 — 줄·낱말·글자 수
약속과 한계
어디까지 안 바뀐다고 약속하나요?
정직하게 적겠습니다. 이 페이지에 적은 것만 약속합니다.
/api/search | 약속합니다. 칸을 빼거나 뜻을 바꾸지 않습니다 |
/api/status | indexed_files version status 세 칸만 약속합니다 |
/api/suggest | 약속합니다 |
| 플러그인 규약 | 약속합니다 |
| 그 밖의 경로 | 내부용입니다. 예고 없이 바뀝니다 |
프로그램 안에는 이보다 많은 경로가 있지만 대부분 저희 웹 화면이 쓰는 것들입니다. 공개하면 함부로 못 고치는 약속이 되므로, 안정된 것만 골라 여기 적었습니다.
새 칸이 늘어나는 일은 있습니다. 그건 기존 것을 깨지 않으니, 모르는 칸이 오면 그냥 무시하도록 만들어 두십시오.
지금은 없는 것
- 공식 라이브러리가 없습니다. HTTP 로 직접 부르셔야 합니다
- 변화 알림(웹훅)이 없습니다. 파일이 생겼을 때 알려 주는 길이 없어, 필요하면 되물어 보셔야 합니다
- 플러그인이 결과 목록을 바꿀 수는 없습니다. 지금은 우클릭 메뉴에서 한 가지 일을 하는 것까지입니다
필요하신 것이 있으면 알려 주십시오. 쓰시는 분이 있으면 만듭니다.