blog
노트
직접 만들고 굴려 보면서 막혔던 문제와 그걸 푸는 과정을 남긴 기록입니다. 설정값·에러 문구·재현 절차를 그대로 적어 다음에 같은 구덩이에 다시 빠지지 않는 것을 목표로 합니다.
목록의 날짜는 이 사이트에 처음 공개한 날입니다. 글에서 다룬 작업이 먼저 시작된 경우에는 본문에 작업 기록일을 따로 적었습니다.
reading paths
- 10분
launchctl input/output error: Bootstrap failed 5를 10가지로 재현해 찾은 점검 순서
launchctl input/output error는 원인 하나를 가리키지 않았습니다. macOS 27.0.1에서 이미 로드된 서비스, disabled 표시, plist 권한 666, 샌드박스까지 10가지 경우가 모두 같은 에러 5로 끝났습니다. 원인을 가르는 명령을 순서대로 적었습니다.
- macOS
- 자동화
- 트러블슈팅
- 15분
Coolify API deploy: GitHub 자동 배포와 겹쳐 같은 커밋을 두 번 빌드한 기록
Coolify API deploy를 git push 뒤에 습관처럼 불렀더니 GitHub 자동 배포와 겹쳐 같은 커밋을 다시 빌드하고 있었습니다. 이 사이트에서만 12번입니다. 배포 기록의 is_webhook·is_api로 찾은 방법과 push 뒤 확인 순서를 적었습니다.
- 셀프호스팅
- Docker
- 트러블슈팅
- 17분
앱인토스 게임 출시: 웹게임 RAYFRAME을 토스 미니앱으로 옮기고 등급분류에서 멈춘 기록
앱인토스 게임 출시를 준비하며 웹 메카 슈팅 RAYFRAME을 토스 미니앱 빌드로 옮겼고, 지금은 출시 전 게임 등급분류를 기다리고 있습니다. 가로 고정, 안전 영역과 ⋯/X 버튼, 안드로이드 뒤로가기, 백그라운드 음소거, 토스 공유 초대를 고친 과정과 mTLS 인증 코드 교환으로 사용자를 식별한 방법, 등급분류를 받는 두 길과 비용을 적었습니다.
- RAYFRAME
- 웹게임
- 제품 개발
- 15분
크레이지게임즈 개발자 제출: RAYFRAME을 Basic Launch에 올리며 고친 다섯 가지
크레이지게임즈 개발자 포털에 3대3 메카 슈팅 RAYFRAME을 10월 19일에 제출했고, 지금은 Basic Launch로 일부 이용자에게만 공개돼 있습니다. SDK v3 신호, 전체 화면에서 막히는 Esc 키, 작은 iframe의 글자 크기, 초대 링크와 즉시 멀티, 로그인 감지 순서를 고친 과정과 Basic Launch 판정 조건을 적었습니다.
- RAYFRAME
- 웹게임
- 제품 개발
- 11분
애드센스 승인상태 주의필요: 5번 반려되며 확인한 원인과 고친 순서
애드센스 승인상태 주의필요가 다섯 번 떴고, 마지막에 남은 원인은 apex 검색 유입 부족이었습니다. 사유는 모두 가치가 별로 없는 콘텐츠였습니다.
- 애드센스
- SEO
- 트러블슈팅
- 경험담
- 22분
learncave 적금 계산기: 연 5% 적금에 360만 원을 넣어도 이자가 9만 7,500원인 이유
learncave 적금 계산기가 쓰는 단리 공식, 15.4% 세후 계산, 같은 돈을 처음부터 예금했을 때와의 비교를 calc 함수를 직접 돌린 값으로 적었습니다. 먼저 만든 복리 계산기에서 고친 버그 세 가지가 적금 계산기로 어떻게 넘어왔는지도 코드로 확인했습니다.
- learncave
- 제품 개발
- 19분
앱을 열지 않고 막힌 카드에 답하기: Plan Wall에 앱 배지, 공유 시트, 알림 「승인」 버튼을 붙인 기록
Plan Wall은 에이전트 카드가 막히면 푸시를 보내지만, 답하려면 앱을 열어야 했습니다. 매니페스트의 shortcuts·share_target, 서비스 워커의 setAppBadge, 알림 action으로 그 단계를 줄이고, 조용히 끊기던 푸시 구독까지 고친 과정입니다.
- Plan Wall
- 제품 개발
- 에이전트
- 22분
주사위 눈을 난수로 정하지 않았습니다: Jelly Dice가 XPBD로 멈춘 윗면을 읽는 방식
Playground의 Jelly Dice는 결과를 난수로 뽑지 않고, 물리 시뮬레이션이 멈춘 뒤 회전 행렬에서 위를 향한 면을 읽습니다. 그 구조를 코드로 다시 읽고 1,000번 굴려 보니 18번은 주사위가 기운 채 멈췄고, 그중 10번은 보이지 않는 울타리에 기대 있었습니다.
- Playground
- 웹게임
- 제품 개발
- 17분
learncave는 각주 번호가 출처 목록을 벗어나면 빌드를 멈춥니다: 출처 등급과 각주를 배포 전에 검사하는 방법
학습 코스 아카이브 learncave는 출처마다 A·B·C 등급을 매기고 본문 각주를 번호로 겁니다. 출처를 지우고 각주만 남겨도 Astro 빌드는 그대로 통과했습니다. 검사 스크립트를 빌드 앞에 세워 그런 각주가 배포되지 않게 막은 과정과 실제 실패 출력을 적었습니다.
- learncave
- 제품 개발
- 에이전트
- 자동화
- 10분
사진 2,000장에 갤러리가 5.6초 걸렸습니다: SQLite FTS5 CTE에 MATERIALIZED 한 단어를 붙인 기록
카드 편집 도구의 사진 갤러리가 사진이 늘수록 제곱으로 느려졌습니다. SQLite가 전문 검색 CTE를 LEFT JOIN 안으로 펼쳐서 행마다 MATCH를 다시 돌린 것이 원인이었고, AS MATERIALIZED로 2,000장 기준 5.6초가 0.04초가 됐습니다.
- SQLite
- 트러블슈팅
- 셀프호스팅
- 제품 개발
- 시행착오
- 20분
보스전이 320초를 넘긴 이유는 밸런스가 아니었습니다: Tidebreaker에 에이전트용 window.__game 훅을 심어 찾은 한 줄 버그
6웨이브 아레나 슈터 Tidebreaker에 에이전트가 읽는 window.__game 훅을 심고 봇에게 직접 플레이를 맡긴 기록입니다. 800개 엔티티 스트레스 수치와, 밸런스 탓으로 보였던 보스전 루프가 레벨업 뒤 연사를 끄는 한 줄 때문이었다는 것을 적었습니다.
- Tidebreaker
- 웹게임
- 에이전트
- 트러블슈팅
- 10분
Cloudflare를 거친 게임 소켓 핑이 279ms였습니다: 소켓만 DNS 전용 호스트로 빼서 8ms로 줄인 기록
웹 메카 슈팅 RAYFRAME을 배포한 날, Cloudflare 프록시를 거친 경기 핑이 279ms로 나왔습니다. 한국에서 보낸 요청이 미국 데이터센터를 거쳐 춘천 서버로 돌아오는 경로를 확인하고, 게임 소켓만 DNS 전용 호스트로 빼서 8ms로 줄인 과정과 그 대가를 적었습니다.
- RAYFRAME
- 셀프호스팅
- 웹게임
- 트러블슈팅
- 10분
예측한 산탄이 서버와 20~40u씩 어긋났습니다: 매치 난수를 투사체 id 시드로 바꾼 기록
웹 메카 슈팅 RAYFRAME을 온라인으로 붙인 날, 내가 쏜 산탄이 서버 사본과 20~40u씩 벌어졌습니다. 퍼짐을 매치 난수 대신 투사체 id에서 뽑게 바꾼 과정과, 그 한 줄이 밸런스 표와 결정론 해시까지 흔든 이야기입니다.
- RAYFRAME
- 웹게임
- 트러블슈팅
- 제품 개발
- 시행착오
- 11분
오래된 탭 하나가 새 일정을 지울 수 있었습니다: 전체 덮어쓰기 저장을 항목 단위 API와 409로 바꾼 기록
Plan Wall은 편집할 때마다 목록 전체를 PUT으로 올렸고, 서버는 업로드에 없는 행을 지웠습니다. updated_at 비교와 409 응답으로 저장 경로를 다시 짠 과정입니다.
- Plan Wall
- 제품 개발
- API
- 셀프호스팅
- 6분
File System Access API는 절대 경로를 주지 않습니다: 프로젝트 식별자를 다시 설계한 기록
로컬 폴더를 직접 읽는 개인 프로젝트 Workbench를 만들다가, 브라우저가 디렉터리 핸들의 실제 경로를 알려주지 않는다는 사실을 구현 단계에서 뒤늦게 확인하고 식별자 설계를 다시 짠 기록입니다.
- 제품 개발
- 트러블슈팅
- 시행착오
- 8분
틱톡 썸네일이 이틀 뒤 전부 깨졌습니다: CDN 서명 만료와 서버 프록시로 고친 기록
개인 프로젝트 Reelpool에서 틱톡 썸네일이 수집 이틀 뒤 전부 403이 되는 문제를 겪고, CDN 서명 만료 구조를 확인한 뒤 서버 프록시로 바이트를 캐싱해 고친 기록입니다.
- Reelpool
- 트러블슈팅
- API
- 제품 개발
- 8분
드로우콜 2857개를 218개로 줄인 밤: three.js InstancedMesh와 거울 변환 함정
제가 만든 3D 웹게임 EBB & GRAB에서 정적 프롭을 InstancedMesh로 병합해 드로우콜을 2857개에서 218개로 줄인 기록입니다. 그 과정에서 마주친 거울 변환 함정도 같이 정리했습니다.
- EBB & GRAB
- 웹게임
- 트러블슈팅
- 제품 개발
- 8분
no-cache를 걸었는데 4시간 캐시가 됩니다: Cloudflare Browser Cache TTL
three.js로 만든 웹게임을 nginx로 배포하다가 옛 코드가 캐시된 채 새 에셋을 404로 찾는 문제를 겪었습니다. no-cache 헤더를 걸어도 안 됐고, 원인은 Cloudflare의 기본 Browser Cache TTL 4시간이었습니다.
- EBB & GRAB
- 웹게임
- 셀프호스팅
- 트러블슈팅
- 14분
글쓰기 규칙은 문서가 아니라 게이트여야 합니다
오픈소스 휴머나이저 스킬 두 개와 제 글쓰기 지침을 비교해 보려다, 정작 제 블로그 21편에서 금지 규칙 위반 122건을 찾은 기록.
- 제품 개발
- AI
- 글쓰기
- 시행착오
- 11분
Coolify 사용법: 서버 한 대에 apex와 서브도메인 6개를 올린 Cloudflare 구성
Coolify 사용법으로 서버 한 대에 루트 도메인과 서브도메인 서비스를 올렸습니다. Cloudflare 전역 리다이렉트가 ads.txt까지 301로 넘기던 문제, SSL 모드 불일치, 헬스체크 경로를 실제 장애 순서대로 정리했습니다.
- 셀프호스팅
- Docker
- 제품 개발
- 트러블슈팅
- 18분
Poki와 CrazyGames: 웹게임 포털 6곳의 수익 배분, 독점 조항, 용량 제한을 비교했습니다
Poki는 직접 유입 수익 100%를 주는 대신 7년 독점을 요구하고, CrazyGames는 독점 없이 2주 테스트 뒤 수익을 나눕니다. 웹게임 포털 6곳의 공식 문서를 읽고 수익 배분과 기술 요건을 표로 정리했습니다.
- 웹게임
- 수익화
- 제품 개발
- 인디
- 21분
애드센스 서브도메인: 따로 심사하지 않고 루트 도메인 승인을 따라갑니다
애드센스는 서브도메인을 따로 승인하지 않습니다. 루트 도메인이 승인되면 서브도메인은 광고 코드만 넣으면 됩니다. "가치가 별로 없는 콘텐츠" 반려 3번과 공식 문서로 확인한 판정 기준을 정리했습니다.
- 애드센스
- SEO
- 셀프호스팅
- 트러블슈팅
- 경험담
- 11분
Whisper 자막 생성: yt-dlp와 whisper.cpp로 영상에 한글 자막을 자동으로 입힌 파이프라인
Whisper 자막 생성부터 번역, burn-in까지 영상 URL 하나로 도는 파이프라인입니다. 자막 싱크, 폰트, 줄바꿈에서 넘어졌던 지점과 고친 방법을 적었습니다.
- 자동화
- 영상
- ffmpeg
- 10분
Claude Code 토큰 절약 방법: 탐색 위임과 출력 압축으로 컨텍스트를 아낀 다섯 가지 습관
Claude Code 토큰 절약 방법으로 몇 달 동안 남긴 습관 다섯 가지입니다. 탐색은 서브에이전트에 맡기고, 출력 길이를 규칙 파일로 줄이고, CLI 출력은 걸러서 넘기고, 긴 파일은 필요한 부분만 읽습니다.
- AI
- 제품 개발
- 생산성
- 14분
옵시디언 AI 자동화: raw 폴더에 던지면 분류·요약·백링크까지 붙는 개인 위키 파이프라인
옵시디언 AI 자동화로 정리를 제가 하지 않는 개인 위키를 만든 기록입니다. raw 폴더에 자료를 던지면 야간 배치가 분류하고 요약하고 백링크를 넣습니다.
- Obsidian
- 자동화
- AI
- 10분
유튜브 API 할당량 초과: search.list를 아끼고 하루 10,000유닛으로 트렌드 서비스를 굴린 방법
유튜브 API 할당량 초과를 피하려면 100유닛짜리 search.list를 아끼고 1유닛 배치 조회와 DB 풀로 바꾸면 됩니다. Trending Finder를 하루 10,000유닛 안에서 운영하며 정한 원칙을 정리했습니다.
- 영상 도구
- Trending Finder
- API
- 11분
쇼츠 타이틀 자동 합성: ffmpeg 오버레이와 쇼츠 탭 3:4 크롭 검사를 스크립트 하나로 묶은 기록
쇼츠 타이틀을 편집본 위에 자동으로 합성하고, 쇼츠 탭 3:4 크롭에서 타이틀이 보이는지 검사하는 것까지 스크립트 하나로 끝낸 기록입니다.
- 영상 도구
- ffmpeg
- 자동화
- 10분
Next.js를 Coolify로 셀프호스팅한 기록
Vercel 대신 Coolify + Docker standalone 빌드로 직접 배포하며 헬스체크 프로브 실패를 잡은 과정.
- 셀프호스팅
- Docker
- 제품 개발
- 9분
Next.js 블로그 만들기: CMS 없이 마크다운 파일과 Shiki 코드 하이라이트로 정적 빌드한 기록
Next.js 블로그 만들기를 CMS 없이 .md 파일과 git만으로 한 기록입니다. unified 파이프라인에 rehype-pretty-code(Shiki)를 붙이고 빌드 타임에 전부 구웠습니다.
- Next.js
- 블로그
- 제품 개발
- 14분
macOS LaunchAgent plist 예제: LaunchDaemon과의 차이와 cron 대신 쓰는 기준
실제로 쓰는 macOS LaunchAgent plist 예제와 launchctl bootstrap 명령을 정리했습니다. RunAtLoad와 StartInterval 기준, LaunchDaemon 차이, PATH의 command not found 해결법을 담았습니다.
- Loupecast
- macOS
- 자동화
- 제품 개발
- 14분
n8n 셀프호스팅 방법: Coolify 서버에서 직접 운영하며 겪은 문제
n8n 셀프호스팅 방법으로 오라클 Arm 서버에서 월 0원으로 돌립니다(제 계정 기준). 설치 순서, 프록시 뒤에 꼭 넣을 WEBHOOK_URL과 타임존, 실제 워크플로우 3개, 이전 때 credential이 끊긴 경험을 정리했습니다.
- 셀프호스팅
- 자동화
- n8n
- 15분
Uptime Kuma 설치: Coolify에 Docker 컨테이너로 올려 모니터 11개와 알림을 붙인 기록
Uptime Kuma 설치는 Coolify에 Docker 컨테이너 하나를 올리는 것으로 끝났고, 시간을 쓴 곳은 /health 설계와 알림 설정이었습니다. Docker HEALTHCHECK와 외부 모니터의 역할을 나누고 같은 서버 감시의 한계까지 적었습니다.
- 셀프호스팅
- 모니터링
- 제품 개발
- 9분
오픈소스 기여 후기: AI와 페어로 첫 PR을 올려 하루 만에 머지된 과정
오픈소스 기여 후기입니다. 매일 쓰던 터미널 앱의 작은 불편을 AI와 페어로 고쳐 첫 PR을 하루 만에 머지했고, 머지 후 한 시간 만에 후속 수정도 올렸습니다.
- Loupecast
- 오픈소스
- 제품 개발
- AI 코딩
- Claude Code
- macOS
- 경험담
- 6분
쇼츠 제목 위치: 쇼츠 탭 3:4 카드에서 타이틀이 잘리는 걸 보고 AI 편집을 버린 테스트
쇼츠 제목 위치를 정하다 쇼츠 탭 카드가 3:4라 위아래가 잘린다는 걸 확인했습니다. AI 자동 클립 합성을 버리고 사용자 편집본에 타이틀만 얹는 쪽으로 바꾼 실험 기록입니다.
- 영상 도구
- 쇼츠
- 영상 편집
- AI 코딩
- 시행착오
- 6분
쇼츠는 절차가 아니라 팀이었다
쇼츠 제작을 절차가 아니라 11개 역할 팀으로 쪼갠 이야기. 질문의 체인이 파이프라인이다.
- 영상 도구
- 쇼츠
- 에이전트
- 콘텐츠
- 파이프라인
- 9분
Slack에서 누가 나를 부르면 「OO님~」이 울리게 만든 이야기
Slack 멘션이 오면 「OO님~」 커스텀 음성이 울리게 만든 자동화. Hammerspoon을 버리고 LaunchAgent로 옮긴 이유.
- Slack
- macOS
- 자동화
- TTS
- 트러블슈팅
- 7분
카피바라 게임: 설치 없이 브라우저에서 WASD로 하는 서바이벌 미니게임을 오후에 만든 기록
카피바라 게임을 설치 없이 브라우저에서 바로 하는 서바이벌 미니게임으로 오후 한나절에 만들었습니다. 생산성 툴 사이에 잠깐 쉬어 가는 칸을 넣은 이유와 범위를 적었습니다.
- Capybara
- 제품 개발
- 놀이
- 인디
- 9분
TrendScore로 떡상 영상을 고르는 법
감으로 고르던 유튜브 아이템을 Outlier·VPD·Engagement 숫자로 바꿔본 기록. TrendScore가 하는 일과 쓰는 순서.
- Trending Finder
- 영상 도구
- 제품
- 9분
주간 계획표 앱 Plan Wall: 리스트가 아니라 이번 주가 한 벽에 보이게 만든 이유
주간 계획표 앱 Plan Wall을 만든 이유입니다. 할일 앱은 많은데 이번 주 병목은 안 보여서, 주간 보드에 할일을 펼치고 드래그로 날짜를 옮기게 설계했습니다.
- Plan Wall
- 제품 개발
- 제품
- 인디