Show HN: Kekkai – 터미널에서 대화형 보안 트리아지

Show HN: Kekkai – Interactive security triage in the terminal

3 pointsby kirumachi2026. 2. 3.3 comments

안녕하세요 HN,<p>앱 보안 엔지니어로서 Trivy, Semgrep, Gitleaks, Dojo와 같은 오픈 소스 보안 스캐너를 실행하고 조정하는 데 많은 시간을 보냈습니다. 제가 발견한 것은 스캐너를 실행하는 것은 쉽지만 결과를 검토하는 것은 그렇지 않다는 것입니다. 각 도구는 다른 JSON을 출력하고, 오탐이 쌓이며, CI는 노이즈가 되거나 모든 것을 차단합니다.<p>그래서 저는 이 스캐너들을 래핑하고 특히 사람 트리아지에 중점을 둔 작은 오픈 소스 CLI인 Kekkai(이전 Hokage)를 만들었습니다.<p>Kekkai는 격리된 Docker 컨테이너에서 스캐너를 실행하고, 출력을 단일 형식으로 정규화하며, 결과를 검토하고, 오탐을 표시하고, 결정을 로컬에 저장하기 위한 대화형 터미널 UI를 제공합니다.<p>다음과 같이 사용해 볼 수 있습니다:<p>``` pipx install kekkai-cli kekkai scan kekkai triage ```<p>현재 기능:<p>- Trivy(종속성), Semgrep(코드), Gitleaks(비밀) 실행<p>- 결과를 통합 보고서로 정규화<p>- 발견된 사항을 검토하고 표시하기 위한 키보드 기반 TUI 제공<p>- 오탐을 위한 .kekkaiignore 지원<p>- 심각도 기반 실패 임계값을 가진 CI 모드<p>디자인 선택:<p>- 기본적으로 로컬 우선(SaaS 불필요)<p>- 독점적인 스캐닝 로직 없음, 기존 도구 위에 구축됨<p>- 스캐너는 읽기 전용, 네트워크 없는 Docker 컨테이너에서 실행됨<p>이것은 아직 초기 단계이며 개별 개발자와 소규모 팀을 대상으로 합니다. 제가 작업 중인 다음 사항은 실행 간 지속적인 트리아지 상태(기준선)와 더 나은 PR 수준 워크플로입니다.<p>저장소 및 문서:<p><a href="https:&#x2F;&#x2F;github.com&#x2F;kademoslabs&#x2F;kekkai" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;kademoslabs&#x2F;kekkai</a><p>트레이드오프, 제한 사항 또는 이것이 존재하는 이유에 대해 질문해 주시면 답변해 드리겠습니다.

Hey HN,<p>As an AppSec engineer, I’ve spent a lot of time running and tunning open-source security scanners like Trivy, Semgrep, Gitleaks and Dojo. What I have found is that running them is easy, reviewing the results, not so much. Each tool outputs different JSON, false positives pile up, and CI either becomes noisy or blocks everything.<p>So I built Kekkai (formerly Hokage), a small open-source CLI that wraps these scanners and focuses specifically on human triage.<p>Kekkai runs the scanners in isolated Docker containers, normalizes their outputs into a single format, and provides an interactive terminal UI to review findings, mark false positives, and save decisions locally.<p>You can try it out:<p>``` pipx install kekkai-cli kekkai scan kekkai triage ```<p>What it currently does:<p>- Runs Trivy (dependencies), Semgrep (code), and Gitleaks (secrets) - Normalizes findings into a unified report - Provides a keyboard-driven TUI for reviewing and marking findings - Supports .kekkaiignore for false positives - Has a CI mode with severity-based failure thresholds<p>Design choices:<p>- Local-first by default (no SaaS required) - No proprietary scanning logic, it sits on top of existing tools - Scanners run in read-only, no-network Docker containers<p>This is still early and aimed at individual developers and small teams. The next things I’m working on are persistent triage state across runs (baselines) and better PR-level workflows.<p>Repo and docs: <a href="https:&#x2F;&#x2F;github.com&#x2F;kademoslabs&#x2F;kekkai" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;kademoslabs&#x2F;kekkai</a><p>I’m around to answer questions about tradeoffs, limitations, or why this exists at all.

댓글 (3)

kirumachi5일 전
It’s open source (Apache 2.0) and Written in Python/Textual.
jostkolega5일 전
+1 on triage being the real problem. Question, when Semgrep surfaces something ambiguous, lets say a SQL query that looks parameterized but the ORDER BY is built elsewhere, what does reviewing that actually look like? I'm wondering how much context you get before needing to jump out to the codebase.
kirumachi5일 전
Great question. Right now (v2.0.1), The TUI is optimized for metadata triage. You see the Rule ID, Severity, the full Semgrep message (which often contains the taint trace), and the File/Line location. The Workflow:

1. I see [High] SQL Injection in db.py:45. 2. If the description is obvious (like a string concatenation), I mark it Confirmed (c) or False Positive (f) right there. 3. For ambiguous cases (like your ORDER BY example where the context is split), I currently keep the TUI open on one side and my IDE on the other. I use the TUI to quickly filter the noise and jump to code only for the complex ones.

We are actually adding a Syntax widget to render the surrounding 10 lines of code and the taint trace directly in the TUI so you don't have to alt-tab, this is coming in v2.1. But for now, we prioritize keeping the interface snappy.