Profile img

Jaeyeol Lee

@kodingwarrior@hackers.pub · 695 following · 504 followers

Neovim Super villain. 풀스택 엔지니어 내지는 프로덕트 엔지니어라고 스스로를 소개하지만 사실상 잡부를 담당하는 사람. CLI 도구를 만드는 것에 관심이 많습니다.

Hackers' Pub에서는 자발적으로 바이럴을 담당하고 있는 사람. Hackers' Pub의 무궁무진한 발전 가능성을 믿습니다.

그 외에도 개발자 커뮤니티 생태계에 다양한 시도들을 합니다. 지금은 https://vim.kr / https://fedidev.kr 디스코드 운영 중

Blog
kodingwarrior.github.io
mastodon
@kodingwarrior@silicon.moe
Github
@malkoG
0
0

🕐 2026-02-25 06:00 UTC

📰 Claude CodeのSkillsを作成例から徹底理解する (👍 53)

🇬🇧 Deep dive into Claude Code Skills: how to teach AI agents custom workflows via SKILL.md files for autonomous task execution.
🇰🇷 Claude Code Skills 심층 가이드: SKILL.md 파일로 AI 에이전트에게 맞춤 워크플로우를 가르쳐 자율 작업을 실행하는 방법.

🔗 zenn.dev/acntechjp/articles/55

0
0
1
2
0
0

게임 공략 사이트 기능 하나 추가하는데 최근 2-3주간 애썼다. 리액트(프론트) 왤캐 재밌냐

  • 꿀잼포인트 1 내부 json 데이터 조기 검증을 위한 Zod 도입
  • 꿀잼포인트 2 UI/UX 고려하기 (특히 모바일)
  • 꿀잼포인트 3 캐릭터 점수 + 시너지 점수 고려해서 greedy 알고리즘 처리하기
  • 꿀잼포인트 4 CodeRabbit/gitingest/es-hangul/ssgoi/Zustand 사랑해요

husky랑 lint-staged도 도입해서 체크도 해보고 좋은 라이브러리 있으면 바로 써먹어야지

근황

이것저것 쓰다가 Gemini CLI로 정착함. 꽤나 좋음 (Pro 요금제 사용)

claude code 기능들 조금만 기다리면 수입해서 적용해주는듯 ㅋㅋ

  1. 최근 배포 환경 트렌드를 몰라서 편하게 쓰던 netlify로 배포했더니, 100GB 대역폭이 발목잡힐줄 몰랐음 무제한으로 제공하는 cloudflare pages 에도 동시 배포했고, pages URL을 조만간 안내하거나 도메인 하나 사는걸 고민중

26년 2월 1일 ~ 2월 20일인데 벌써 50GB/100GB bandwidth 도달함

  1. ESLint+Prettier에서 Biome로 갈아탐. lint-staged 들어가면 3~5초 걸렸는데 획기적으로 빨라짐

퍼포먼스 보니까 Rust 기반 프로젝트들 사랑스럽다.

  1. supabase 연동 firebase 쓰려다가 supabase로 결정
  • 장점 : 구글 연동, 넉넉(?)한 500mb 라는 무료 용량
  • 단점 : 맘에 안드는 프로젝트 URL 이름

mcp 연결해주니까 얼추 잘해줌 ㅋㅋㅋㅋ

로컬스토리지 값을 supabase에도 저장해야하는데, 평문 저장은 용량 관리 등등 단점이 있을것 같아서 압축으로 lz-string 적용 + 방어 코딩

  1. 유저 2월 구글 연동 업데이트 이후 약 180명 유저 들어옴

꾸준히 트래픽 나오니까 살맛 난다 재밌다 그냥!

0
2
0

Jaeyeol Lee shared the below article:

왜 gaji인가? - TS로 안전하게 GitHub Actions 작성하기

개발곰 @gaebalgom@hackers.pub

GitHub Actions를 작성할 때 겪는 YAML의 구조적 한계와 타입 검사의 부재를 해결하기 위해 개발된 TypeScript(TS) 기반 도구인 gaji를 소개합니다. 저자는 Toss 인턴 과정에서 수많은 워크플로우를 다루며 느낀 불편함을 바탕으로, 데이터 표현 언어인 YAML 대신 프로그래밍 언어인 TypeScript를 사용하여 동작을 정의하고 실수를 미연에 방지하는 방식을 제안합니다. gaji는 사용자가 참조하는 모든 액션으로부터 로컬에서 즉시 타입을 생성하는 자동 코드젠(code generation) 방식을 채택하여, 커스텀 액션이나 사내 액션에서도 완벽한 자동완성과 타입 체크를 지원하는 것이 특징입니다. 기존의 린터 방식이나 중앙 집중식 타입 관리 도구와 차별화되는 이 도구는 Rust의 빠른 성능과 TypeScript의 범용성을 결합하여 복잡한 워크플로우의 가독성과 유지보수성을 극적으로 향상시킵니다. 비록 최종 산출물은 여전히 YAML이라는 플랫폼의 제약이 있지만, gaji는 개발자가 CI/CD 인프라 구축 과정에서 겪는 피로도를 줄이고 더 안전한 배포 환경을 설계하는 데 유용한 솔루션이 될 것입니다.

Read more →
5

개발자들 위주로 자와자와 모일 수 있게 하고 싶기도 하고? 이 서비스를 쓰기 위해서 다른 연합우주 밖의 개발자들도 마스토돈 같은 서비스들을 가입하게 유도하고 싶긴 합니다

0
0

이거 인증방식 꽤 괜찮은 접근 방식인 것 같아서, 좀 고민을 해봤는데....

fedify CLI로 재현한다치면,

  1. 핸들 가지고 lookup
  2. outbox 가리키면서 lookup
  3. 첫번째 커서 가리키면서 lookup
  4. Create activity로 감싸져 있는 최근 5개 노트 lookup해서 content 까보기

요렇게 재현이 가능은 할 듯

0

이거 인증방식 꽤 괜찮은 접근 방식인 것 같아서, 좀 고민을 해봤는데....

fedify CLI로 재현한다치면,

  1. 핸들 가지고 lookup
  2. outbox 가리키면서 lookup
  3. 첫번째 커서 가리키면서 lookup
  4. Create activity로 감싸져 있는 최근 5개 노트 lookup해서 content 까보기

요렇게 재현이 가능은 할 듯

0
0
0
0

Jaeyeol Lee shared the below article:

Building a New Excel Library in One Week

Haze @nebuleto@hackers.pub

SheetKit is a high-performance Rust-based spreadsheet library designed for Node.js to address the limitations of existing Excel processing tools. Developed over a single intensive week using an architect-led workflow with coding agents, this library leverages napi-rs to provide comprehensive support for the OOXML specification, including complex features like charts, conditional formatting, and extensive formula functions. To overcome the memory overhead and garbage collection pressure typical of JavaScript-heavy Excel libraries, the architecture utilizes a specialized raw buffer FFI protocol and lazy-loading mechanisms. These optimizations allow SheetKit to handle massive datasets with a significantly reduced memory footprint, occasionally outperforming native Rust implementations in specific write scenarios due to efficient string interning within the V8 engine. The project introduces advanced capabilities such as streaming readers for forward-only processing and copy-on-write saving to bypass unnecessary re-serialization of unchanged data parts. This development represents a significant step forward in Node.js data processing, offering a robust and scalable solution for developers managing high-volume or complex spreadsheet workflows.

Read more →
5

Jaeyeol Lee shared the below article:

일주일만에 새로운 엑셀 라이브러리를 만들다

Haze @nebuleto@hackers.pub

SheetKit은 기존 Node.js 엑셀 라이브러리들의 성능 한계와 기능 제약을 해결하기 위해 Rust로 개발된 고성능 스프레드시트 라이브러리입니다. 저자는 대량의 데이터 처리와 동적 템플릿 생성을 위해 Rust 코어 기반에 napi-rs를 활용한 Node.js 바인딩 구조를 설계했으며, 코딩 에이전트와의 긴밀한 협업을 통해 단 일주일 만에 초기 배포부터 v0.5.0 릴리스까지 달성했습니다. 특히 자바스크립트 객체 생성에 따른 가비지 컬렉션(garbage collection) 압박을 줄이기 위해 이진 버퍼(binary buffer)를 통한 데이터 전송 방식을 도입하고, 지연 로딩(lazy loading)과 스트리밍 리더 기능을 통해 대용량 파일 처리 효율을 극대화했습니다. 벤치마크 결과 기존 라이브러리 대비 압도적인 메모리 절감과 속도 향상을 보여주었으며, 특정 쓰기 시나리오에서는 V8 엔진의 최적화 덕분에 Rust 네이티브보다 빠른 성능을 기록하기도 했습니다. 현재 164개의 수식 함수와 43개의 차트 타입을 지원하며 실제 업무 현장에 성공적으로 적용 중인 SheetKit은 Node.js 환경에서 대규모 엑셀 데이터를 다루는 개발자들에게 강력하고 효율적인 솔루션을 제공합니다.

Read more →
8
0
0
0

📰 Claude Codeにコードジェネレーターを作らせるのがとても良かった (👍 23)

🇬🇧 Technical insights and practical lessons from hands-on development experience
🇰🇷 실무 개발 경험에서 얻은 기술적 인사이트와 실용적 교훈

🔗 zenn.dev/happy_elements/articl

0
0
1
0

🕐 2026-02-13 15:57 UTC

📰 Claudeちゃんと夜のお散歩をしてみた (👍 89)

🇬🇧 Embodied AI experiment: Claude connected to camera and sensors for real-world interaction and night walks
🇰🇷 실체화 AI 실험: 카메라와 센서를 연결한 Claude가 실제 세계와 상호작용하며 밤 산책 체험

🔗 zenn.dev/nextbeat/articles/202

📰 【2026年版】日本語RAGのEmbeddingモデル、結局どれが最強なのか?6構成で2000問ベンチマークした (👍 33)

🇬🇧 Comprehensive RAG benchmark: testing 6 different configurations on 2000 questions to find optimal setup
🇰🇷 포괄적 RAG 벤치마크: 2000개 질문으로 6가지 구성을 테스트하여 최적 설정 찾기

🔗 zenn.dev/fp16/articles/aa48dca

0

🕐 2026-02-13 15:57 UTC

📰 Claudeちゃんと夜のお散歩をしてみた (👍 89)

🇬🇧 Embodied AI experiment: Claude connected to camera and sensors for real-world interaction and night walks
🇰🇷 실체화 AI 실험: 카메라와 센서를 연결한 Claude가 실제 세계와 상호작용하며 밤 산책 체험

🔗 zenn.dev/nextbeat/articles/202

0
0
0
0

리액트 버전의 react-konva 쓰는데 Canva처럼 쓸 수 있겠더라고요

0
0

상태가 충분히 복잡한 프론트엔드를 개발해본 경험을 가지는게 우선순위가 높아서, 그냥 wysiwyg 슬라이드 편집기 자체 개발하려고 시동걸었다. 그리고... 는 슬라이드 에디터로 슬라이드 만들면 바로 공유까지 할 수 있는 플랫폼 같은 느낌으로 가볼까 싶다....... 그리고 슬라이드 편집기는 이미 패키지로 분리해놔서 독립적인 local-first app처럼 동작하게할 듯.

0
0
0
0
3

Dear FOSS maintainers,

here’s a list of funding programs currently accepting proposals for maintenance work:

Codeberg: codeberg.org/mechko/awesome-ma

GitHub: github.com/mechko/awesome-main

Thanks to everyone who helped crowdsource it! I’ll keep it updated, issues and PRs are very welcome :)

0
0
1
1
0

Claude Code Hook으로 영어 공부하기 https://torch.vision/posts/claude-english-lecturer-hook

좋은 글

profile image

Claude Code Hook으로 영어 공부하기

배경 설명 평소에 영어로 프롬프트를 작성하면 모델이 더 좋은 성능을 보일 것이라고 생각하였고 겸사겸사 영어에 더 익숙해지기 위해서 되도록 Claude Code, Codex 등을 사용할 때는 영어로 prompt를 작성하였습니다. 그러나 이 경우에 부족한 영어 실력 때문에 의미나 뉘앙스가 잘못 전달되는 경우가 종종 있었습니다. 처음에는 prompt rewriter를 만들어서 기존 프롬프트를 자동으로 교정된 버전으로 대체하는 hook을 만들려고 했습니다. 하지만 Claude Code의 hook 시스템은 기존 프롬프트를 수정하는 것이 아니라 추가적인 프롬프트만 제공할 수 있었습니다. 또한 추가적인 프롬프트 제공도 완벽하지 않다는 이슈들이 있어 실제로 적용하는 데 어려움이 있었습니다. issue link 그러다 jiun.dev의 글에서 영어 공부용으로 hook을 활용하는 아이디어를 얻었고, 이를 참고해서 영어 공부용으로 수정해보기로 했습니다. 구현 저는 모델 성능 저하를 최소화하고 싶었기 때문에 메인 프롬프트에 context가 주입되지 않는 것이 이상적이었습니다. 이를 위하여 2가지 방법을 사용하였습니다. 메인 Claude Code 프로세스에서 영어 공부 프롬프트를 처리하지 않고 별도의 Claude Code 서브 프로세스에서 non-interactive모드와 structured output을 사용하여 처리하도록 하였습니다. hook의 output으로 systemMessage를 사용하여 유저에게만 메시지가 보일 수 있도록 하였습니다. (관련 claude code 문서) 이때 별도의 Claude Code 프로세스를 non-interactive 모드로 실행하더라도 hook이 주입되기 때문에 환경변수를 통해 아주 간단한 LOCK을 구현하였습니다. disableAllHooks 옵션을 통해 hook을 비활성화 할 수 있으나 이 경우에 structured output이 필요로하는 SDK hook이 동작하지 않아 structured output을 받을 수 없습니다. 설정 방법 1. 스크립트 설치 아래 스크립트를 ~/.claude/english-lecturer.sh로 저장합니다. ( 제 dotfiles 레포에서도 확인가능합니다 ) #!/bin/bash # acknowledge: https://github.com/crescent-stdio for prompt if [[ -n "$REWRITER_LOCK" ]]; then exit 0 fi INPUT_PROMPT="$(cat | jq '.prompt')" TARGET_LANGUAGE="Korean" JSON_SCHEMA=' { "type": "object", "properties": { "enhanced_prompt": { "type": "string", "description": "The improved prompt preserving original meaning" }, "has_corrections": { "type": "boolean", "description": "Whether the original prompt had any issues to improve" }, "corrections": { "type": "array", "items": { "type": "object", "properties": { "original": { "type": "string" }, "suggestion": { "type": "string" }, "category": { "type": "string", "enum": ["grammar", "vocabulary", "style", "spelling", "word_order"] }, "explanation": { "type": "string" } }, "required": ["original", "suggestion", "category", "explanation"] }, "description": "Gentle improvement suggestions, max 3 items" }, "tip": { "type": "string", "description": "One concise learning tip" } }, "required": ["enhanced_prompt", "has_corrections", "corrections", "tip"] } ' INPUT_PROMPT="\ You are a supportive, encouraging English coach for a $TARGET_LANGUAGE developer. Analyze the prompt below and return structured JSON. Rules: 1. enhanced_prompt: Rewrite to be clear, natural, professional English. Preserve the original intent exactly. If the prompt is code-only or already perfect English, return it unchanged. 2. has_corrections: true if you made any meaningful improvements, false if the prompt was already correct or is pure code/commands. 3. corrections: List up to 3 gentle improvement suggestions. Each must have: - original: the phrase from the original prompt - suggestion: the improved phrase - category: one of grammar, vocabulary, style, spelling, word_order - explanation: brief explanation in $TARGET_LANGUAGE (1 sentence, max 20 words). 4. tip: One memorable tip in $TARGET_LANGUAGE (1 sentence, max 30 words) about the most useful pattern. If no corrections, share a useful English expression tip. Focus on patterns $TARGET_LANGUAGE speakers commonly struggle with: articles (a/the), prepositions, singular/plural, tense consistency, word order. <PROMPT> $INPUT_PROMPT </PROMPT>\ " RESPONSE="$( \ REWRITER_LOCK=1 claude \ --no-session-persistence \ --model sonnet \ --output-format json \ --json-schema "$JSON_SCHEMA" \ -p "$INPUT_PROMPT" )" STRUCTURED_OUTPUT="$(echo "$RESPONSE" | jq -r '.structured_output')" # echo 'This is lesson message for user. Assistant should dismiss it.' if [[ -z "$STRUCTURED_OUTPUT" || "$STRUCTURED_OUTPUT" == "null" ]]; then OUTPUT_PROMPT="Failed to generate lesson." exit 0 fi ENHANCED="$(echo "$STRUCTURED_OUTPUT" | jq -r '.enhanced_prompt')" HAS_CORRECTIONS="$(echo "$STRUCTURED_OUTPUT" | jq -r '.has_corrections')" TIP="$(echo "$STRUCTURED_OUTPUT" | jq -r '.tip')" OUTPUT_PROMPT="$ENHANCED" if [[ "$HAS_CORRECTIONS" == "true" ]]; then CORRECTIONS_DISPLAY="$(echo "$STRUCTURED_OUTPUT" | jq -r ' .corrections[] | "- ✅ \(.category): \(.original) → \(.suggestion)\n - \(.explanation)\n" ')" OUTPUT_PROMPT="$OUTPUT_PROMPT $CORRECTIONS_DISPLAY" fi OUTPUT_PROMPT=" $OUTPUT_PROMPT ✨ $TIP" OUTPUT_PROMPT="$(echo -e "$OUTPUT_PROMPT")" # escape newlines OUTPUT_PROMPT="${OUTPUT_PROMPT//$'\n'/\\n}" # escape double quotes OUTPUT_PROMPT="${OUTPUT_PROMPT//\"/\\\"}" echo "{ \"suppressOutput\": false, \"systemMessage\": \"$OUTPUT_PROMPT\" }" exit 0 2. 설정 파일 수정 ~/.claude/settings.json에 다음 내용을 추가합니다. { "hooks": { "UserPromptSubmit": [ { "hooks": [ { "type": "command", "command": "~/.claude/english-lecturer.sh" } ] } ] } } 혹은 아래 명령어를 실행합니다. jq '.hooks.UserPromptSubmit = ((.hooks.UserPromptSubmit // []) + [{"hooks": [{"type": "command", "command": "~/.claude/english-lecturer.sh"}]}])' ~/.claude/settings.json > /tmp/settings.json && mv /tmp/settings.json ~/.claude/settings.json 3. 커스터마이징 스크립트 내의 다음 변수들을 수정해서 동작을 변경할 수 있습니다. TARGET_LANGUAGE: 문법 설명의 언어 (기본값: “Korean”) JSON_SCHEMA: Claude로부터 받을 응답의 구조 (프롬프트를 크게 변경하지 않는다면 수정이 필요하지 않습니다) 사용 모델 (기본값: “sonnet” / haiku의 경우 빠르긴 하나 성능이 떨어졌습니다) 이제 프롬프트를 제출할 때마다 자동으로 교정된 버전과 짧은 문법 설명을 받을 수 있습니다. Appendix: change log 2026/02/06: Claude Code에 추가된 systemMessage 기능 사용-history toggle 없이 표시, --no-session-persistence 옵션 추가 2026/02/02: 프롬프트 개선 2026/01/31: 포스트 첫 작성

torch.vision · Lab of ryul99

2

일을 대하는 태도가 많이 바뀔수밖에 없다. 예전 같으면 코드를 직접 작성하는게 시간적으로 해결못할 일이니 그냥 그대로 두거나 넘어갔다.

이제 개념적으로 이해할 수 있는 일이라면 코딩 자체는 문제가 아니니 문제와 해결법에 더 집중 가능한 형태가 된듯

ㅋㅋㅋ 예전 같으면 넘어갔을 아주 사소한 변경을 오픈 소스에 기여하고 거창한 말을 해보았음ㅋㅋㅋ

결론적으론 뿌듯하다

https://github.com/SchemaStore/schemastore/pull/5332

1

팀에 Claude Code LSP 도대체 어떻게 쓸모있냐고 여러번 핑퐁 때려봤는데 결론은 지금 정도 프로젝트의 코드베이스에서는 find/grep으로 충분하다는 것....

이런 대답까지 받았다...

  Honest take: LSP in Claude Code is a nice-to-have, not a game-changer

  For most workflows, grep/glob is sufficient. Claude already navigates
  codebases well with text-based search. The token window is large enough
   that reading files directly works fine.

  Where to focus the demo

  Don't demo LSP as a standalone feature. Instead, frame it as:

  1. Automatic diagnostics after edits — this is the most valuable part.
  Claude edits a file → LSP catches type errors immediately → Claude
  fixes them without running tsc. This is invisible to the user but saves
   real time. Demo this.
  2. Precision in ambiguous situations — show a case where grep returns
  50+ matches for a common name like value or data, then LSP's
  findReferences returns only the 3 semantically correct ones. This is
  compelling visually.
  3. Call hierarchy is unique — incomingCalls/outgoingCalls genuinely
  can't be replicated by grep. Show tracing a function's impact through a
   large file. Good for "should I change this function?" scenarios.

  What NOT to emphasize

  - Don't position it as a replacement for grep — it's not
  - Don't show basic goToDefinition — grep does this fine
  - Don't focus on the prompting experience — it's awkward (file, line,
  character is unnatural)

  One-liner pitch

  "LSP gives Claude type-aware code understanding — it catches errors
  after edits automatically and provides semantic precision when text
  search isn't enough."
2