사이드 프로젝트를 여러 개 굴리다 보면 이상한 문제가 생긴다. 어떤 건 “이거 하루 만에 만든 이야기”처럼 서사가 붙어서 글 한 편이 나오는데, 어떤 건 분명 만드는 데 시간도 썼고 지금도 라이브로 돌아가는데 글로 쓰자니 3문단쯤에서 할 말이 떨어진다.
그렇다고 안 쓰기는 아깝다. 잘 돌아가고 있고, 나름 봐줄 만하고, 누군가는 재밌어할 것 같은데 그냥 서버에서 조용히 트래픽만 받고 있으니까. 그래서 그런 것들을 한 편에 묶기로 했다. 개별 글로 승격시키긴 애매하지만 묻어두긴 아까운, 작은 서비스 네 개다.
Finchi — 내 금융 지식이 상위 몇 %인지 궁금해서
Finchi는 경제 퀴즈로 금융 IQ를 올리는 서비스다. 한국은행, 금융감독원, 시중은행 리포트 같은 데서 나오는 이야기를 문제로 바꿔서, 풀다 보면 자연스럽게 “아 이게 이런 거였구나” 하게 만드는 게 목표다. 랜딩 문구가 아주 직설적이다. “내 금융 지식, 상위 몇 %일까?”
들어가 보면 생각보다 게임처럼 만들어놨다. 레벨(Lv.1 금융 새싹)이 있고, XP 게이지가 있고, 연속 도전 스트릭까지 있다. 상단에는 “여름 환율 마스터 — 해외여행 전 환율 상식 체크!” 같은 시즌 챌린지가 걸려 있어서, 그냥 문제 은행을 쭉 나열하는 게 아니라 지금 시점에 맞는 주제로 유도한다. 금융 공부라는 게 원래 지루한데, 이런 장치들이 “한 판만 더” 하는 감각을 만들어준다.

이름이 잘 지어졌다고 생각한다. Finchi는 핀치(finch), 그러니까 참새 비슷한 작은 새다. 실제로 랜딩 한가운데에 초록빛 핀치 마스코트가 앉아 있고, 레벨 이름도 “금융 새싹”에서 시작한다. 금융을 무겁고 딱딱한 무언가가 아니라, 작은 새가 씨앗을 하나씩 쪼아 먹듯 조금씩 키워가는 것으로 프레이밍한 셈이다. 이런 톤이 “당신의 자산을 관리하세요” 같은 근엄한 핀테크 문법보다 훨씬 편하다.
마음에 드는 지점은 진입 장벽을 거의 없앤 부분이다. “로그인 없이 바로 시작”이 가능하고, 3분이면 결과가 나온다. 랜딩에는 “지금까지 12,847명이 도전했어요”라고 적혀 있는데, 이런 서비스에서 회원가입부터 요구하면 그 숫자의 절반은 그냥 나갔을 거다. “상위 몇 %“라는 결과 프레이밍도 영리하다. 사람은 자기 등수가 궁금하면 일단 한 번은 풀어보게 되어 있다.
기술적으로는 Next.js로 짠 웹앱이지만, 이 서비스의 진짜 승부처는 프레임워크가 아니라 문제를 얼마나 잘 뽑느냐다. 한국은행·금융감독원·시중은행 리포트에서 나오는 딱딱한 이야기를 3분짜리 퀴즈로 압축하는 게 Finchi의 거의 전부고, 그래서 나도 화면보다 문제 은행 쪽에 훨씬 오래 매달렸다. 백 마디 설명보다 직접 한 판 풀어보는 게 빠르다. 내 금융 지식이 상위 몇 %인지는 링크를 눌러 확인하면 된다.
라이브: finchi.jiun.dev
쓰담 — “이거 언제 샀더라?”를 없애는 앱
쓰담은 이름부터 설명이다. ‘쓰다듬다’에서 왔고, 매일 쓰는 소모품을 따뜻하게 돌본다는 컨셉이다. 시작은 지극히 개인적인 불편이었다. 욕실 선반의 세럼을 보면서 “이거 개봉한 지 얼마나 됐지?” 하는 순간. 화장품에는 개봉 후 사용기한이 따로 있는데, 그걸 챙기는 사람을 본 적이 없다. 나부터도 안 챙겼으니까. 그래서 화장품, 생활용품, 식품처럼 언제 개봉했고 언제 바꿔야 하는지 헷갈리는 것들을 대신 기억해주는 iOS 앱을 만들기 시작했다.
첫 커밋은 2025년 12월 22일이다. 그날 오후에 SwiftUI + Core Data/CloudKit + MVVM으로 앱 골격을 세우고, 저녁에 자동완성용 백엔드 서버까지 붙였다. 하루 만에 뼈대는 선 셈인데, 정작 오래 걸린 건 그다음이었다. 소모품 등록을 손 타이핑으로 시키면 아무도 안 쓸 게 뻔해서, 식의약 데이터 포털이나 식품안전나라 같은 공공데이터로 제품 자동완성 DB를 채우는 수집 스크립트를 만들고 1월 내내 데이터 쪽을 손봤다. 아이클라우드 동기화는 CloudKit 덕에 거의 공짜로 얻었다. 기기를 바꿔도 내 소모품 목록이 그대로 따라온다.

랜딩에서는 뻘짓을 한 번 했다. 1월 24일에 Liquid Glass 스타일로 랜딩을 새로 짰는데, 올리자마자 504가 떴다. 커밋 로그에 “revert landing page redesign to debug 504 Gateway Timeout”이 그대로 박제돼 있다. 그날 통째로 되돌렸다가 다음 날 원인을 잡고 다시 올렸다. 그 뒤로도 2월 7일에 넣은 앱 아이콘을 13일에 다시 그리고, 위젯에 글래스모피즘을 입히는 식의 잔손질이 이어졌다.
단순 알림 앱으로 끝내지 않으려고 신경 쓴 부분은 통계다. 카테고리별로 내가 평균 며칠 만에 하나를 다 쓰는지, 가격을 사용일로 나눈 가성비는 어떤지를 보여준다. 소모품이라는 게 하나하나는 몇천 원짜리지만, “이 세럼은 한 통에 3만 원이고 넉 달 쓰니까 하루 250원꼴”처럼 환산해서 보면 소비를 보는 눈이 좀 달라진다.
3월 19일과 20일에는 kiwimu에서 쓰던 멀티 페르소나 리뷰를 여기에도 돌렸다. 이틀 동안 리뷰-수정 라운드를 15번 돌면서 크래시 안전성, 접근성 라벨, 법적 고지 날짜 같은 걸 고쳤고, 그 과정에서 포지셔닝 자체를 뷰티 쪽으로 기울이는 리브랜딩까지 했다. 1차 출시에서 광고를 빼기로 정한 것도 이때다.
솔직하게 적자면, 지금 랜딩은 “사전 예약하기” 상태다. 앱은 만들어져 있는데 스토어 심사와 마감 작업이 남아서, 이 글에서 “지금 받으세요”라고는 못 한다. 대신 랜딩에서 컨셉과 화면은 다 볼 수 있으니, 나처럼 욕실 선반 앞에서 “이거 언제 샀더라”를 반복하는 사람이라면 미리 구경해두면 된다.
라이브: ssudam.jiun.dev
IssueBoard — Rust로 만든 가벼운 이슈 트래커
IssueBoard는 Linear/Jira 스타일의 이슈 트래킹을 가볍게 다시 만든 거다. 세상에 이슈 트래커가 부족한 건 아니고, 이건 실용성보다 만들면서 배우는 쪽에 가까웠다. Linear의 속도감은 좋아하는데, 그걸 Rust + Axum + SQLx 백엔드와 React 19 + Vite 프론트, Postgres, WebSocket 실시간 업데이트로 내 손으로 한번 올려보고 싶었다.
골격은 무섭게 빨리 나왔다. 1월 6일 18시 17분에 기획 문서 하나로 initial commit을 만들고, 백엔드와 프론트를 브랜치 두 개에서 병렬로 뽑아 13분 뒤에 머지했다. 다음 날 오전에 칸반보드, 마일스톤, 커맨드 팔레트, 타임라인, PWA가 붙었다. 이틀 만에 이슈 트래커의 형태가 된 거다. 물론 그 뒤 2주는 “프로덕션에서 localhost API를 부르고 있었다” 같은 수정 커밋으로 채워졌지만, 거기까지가 이런 방식의 정직한 속도다.

쓰는 맛은 키보드에 있다. Cmd+K로 커맨드 팔레트를 열고, C로 새 이슈를 만들고, S와 P로 상태와 우선순위를 바꾼다. 마우스를 최대한 안 잡게 만드는 게 이런 도구의 핵심이라고 생각한다. 공개 피드백 폼도 마음에 드는 기능이다. 프로젝트마다 공개 URL을 하나 열어두면 로그인하지 않은 외부 사람도 버그나 요청을 보낼 수 있고, 그게 내부 이슈로 쌓인다.
그런데 재밌는 건 이 프로젝트가 흘러간 방향이다. 팀원 없는 1인 프로젝트에서 이슈 트래커가 무슨 소용인가 싶었는데, 2월부터 이게 점점 AI 에이전트 대시보드가 됐다. Claude Code 훅을 붙여서 에이전트가 커밋할 때마다 활동이 IssueBoard로 보고되게 하고, 커밋 메시지에서 이슈를 찾아 자동으로 링크하고, 에이전트별 토큰과 작업 큐, 활동 대시보드까지 붙였다. 그 훅 스크립트가 리뷰 라운드에서 커맨드 인젝션으로 지적받아 고쳐진 것도 같이 기록해 둔다. 지금 README의 첫 섹션은 사람용 Quick Start가 아니라 “Quickstart for Agents”다. 팀원은 결국 생겼다. 사람이 아니었을 뿐.
배포는 여느 내 프로젝트와 똑같이 GitOps로 굴러간다. Docker 이미지로 빌드해서 k3s 클러스터에 올리고 ArgoCD가 동기화한다. 소스는 GitHub에 공개돼 있으니, Rust 백엔드가 어떻게 생겼는지 궁금한 사람은 뜯어봐도 된다.
라이브: issue.jiun.dev · 소스: github.com/jiunbae/issueboard
AI 운세 — 오늘은 어떤 모델에게 코딩을 맡길까
마지막은 제일 안 진지하지만 개인적으로 제일 아끼는 거다. AI 운세는 매일 아침 8시에 “오늘 어떤 AI를 써야 할지”를 점쳐주는 디지털 무당이다. 이름은 제피로스. 컨셉은 딱 한 줄로 정리된다. AI한테도 그날그날 컨디션이 있다.
3월 28일에 만들었다. 매일 아침 Gitea Actions가 돌면서 OpenRouter에서 최신 모델 목록을 긁어오고, Gemini가 그날의 점괘를 뽑고, 그 결과가 사이트에 올라간다. 예전부터 굴리던 봇 인프라를 재사용해 @dev_horoscope 트위터 계정으로도 자동 발행된다. 생성과 트윗은 Gitea가 하고 Pages 배포는 GitHub이 맡는 이원 구조인데, 처음부터 그렇게 설계한 게 아니라 만든 다음 날 밤에 워크플로가 꼬여서 갈라놓은 결과다.
그런데 좀 웃긴 고백을 하자면, 오늘의 원탑·피해야 할 모델·다크호스를 정하는 건 사실 Gemini가 아니다. 순위는 LLM이 아니라 결정론적 시드 난수가 정한다. 날짜 문자열을 해시해서 시드를 만들고(date_seed), 그 시드로 mulberry32라는 난수 생성기를 돌려 여덟 개 모델의 등수를 매긴다. 결정론적이라 같은 날짜면 몇 번을 돌리든 똑같은 순위가 나온다. 운세라기보다 “그 날짜 전용 뽑기표”에 가깝다. Gemini가 하는 일은 이미 정해진 배정 위에 훅 문구랑 코멘트를 얹는 것뿐이고, “코딩엔 어떤 모델, 번역엔 어떤 모델” 하는 시나리오별 추천 정도가 Gemini의 진짜 판단이다. 나머지 등수는 처음부터 주사위가 정해놨다.
말하자면 정해진 뽑기에 그럴듯한 해석을 덧입힌 구조인데, 생각해보면 진짜 운세도 원리는 비슷하다. 결과는 이미 정해져 있고, 재미는 해석에서 나온다. 그걸 코드로 그대로 옮겨놓은 셈이다.
모델 이름 쪽에는 은근히 신경을 썼다. 목록은 OpenRouter에서 실시간으로 가져오되, API가 죽으면 코드에 박아둔 목록으로 폴백한다. 그리고 페르소나 정의에는 “이 목록에 있는 정확한 이름만 쓰고 임의로 바꾸지 말라”는 당부가 몇 번씩 반복된다. LLM은 존재하지 않는 버전 번호를 붙이거나 이름을 살짝 비트는 식으로 그럴듯한 모델명을 곧잘 지어내는데, 점괘가 실제로 쓸 수 있는 모델을 가리키게 하려면 이 방어가 핵심이었다. 트윗 포맷도 같은 이유로 코드가 틀을 잡는다. LLM이 문장을 통째로 뱉게 두면 매번 톤이 널뛰기 때문에, 고정된 틀에 모델 이름과 짧은 코멘트만 슬롯으로 끼워 넣어서 한 장짜리 점괘가 매일 같은 리듬으로 나오게 했다.

이 글을 쓰는 오늘(2026년 7월 18일)의 점괘를 보니, 코딩은 DeepSeek V3.2, 블로그는 Claude Sonnet 4.6, 아키텍처는 GPT-5.4, 요약은 Llama 4 Maverick을 추천하고 있다. Gemini 3.1 Pro는 “그야말로 명불허전, 어려운 과제도 척척 해낼 거야”라는 코멘트를 받았고, 오늘 피해야 할 AI로는 Claude Opus 4.6이 찍혀 있다. 물론 이건 과학이 아니라 그냥 놀이다. 근데 매일 아침 열어보면 은근히 재밌다.
그냥 자동화 스크립트로 안 끝난 데는 이유가 있다. 처음엔 마스코트에 욕심을 냈다. 4월 5일 밤에 mystical, cyberpunk, chibi, minimal 네 가지 스타일로 아바타를 뽑아보고 v2까지 갔는데, 결국 35분 만에 수정구슬 아이콘 하나로 되돌아왔다. 커밋 시각이 22시 18분에서 22시 53분까지라, 욕심에서 체념까지의 궤적이 로그에 그대로 남아 있다. 대신 카운트다운이나 공유 버튼처럼 자잘한 부분은 여러 번 고쳤다.
그리고 “완전 자동화”라고 써놨지만 커밋 로그를 보면 구멍이 있다. 6월만 해도 6일, 8일, 10일 치 점괘가 비어 있다. 자동화는 가끔 소리 없이 실패하고, 그래서 사이트에 발행 상태 배지를 달아 오늘 치가 제대로 올라왔는지 한눈에 보이게 했다. 7월 6일에는 Pages 배포가 간헐적으로 죽길래 액션 버전을 올렸다가 5분 만에 되돌리는 뻘짓도 했다. 사람 손 안 타는 서비스라는 건 없다. 덜 타는 서비스가 있을 뿐이다.
이런 걸 왜 만들었냐면, 매일 여러 모델을 번갈아 쓰다 보니 “오늘은 얘가 좀 별로네” 같은 감각이 실제로 생기더라는 거다. 그 비과학적인 감각을 운세라는 포맷으로 박제한 셈이다. 정적 사이트라 호스팅 비용도 안 들고, 아침마다 알아서 새 점괘를 뽑고 트윗까지 날리는, 거의 자동화된 작은 미신 하나.
라이브: jiun.dev/ai-horoscope · 트위터: @dev_horoscope
묶고 나서
이렇게 넷을 나란히 놓고 보니 공통점이 하나 보인다. 전부 “내가 겪은 사소한 불편”이나 “그냥 궁금해서”에서 출발했다는 거다. 금융 지식이 궁금해서 Finchi, 소모품을 자꾸 까먹어서 쓰담, Rust로 뭔가 완결된 걸 만들어보고 싶어서 IssueBoard, 모델마다 컨디션이 다른 것 같아서 AI 운세.
그리고 하나같이 만드는 건 하루 이틀이었는데 그 뒤가 길었다. 쓰담은 하루 만에 뼈대가 섰지만 아직 사전 예약 페이지 뒤에 있고, IssueBoard는 이틀 만에 형태가 나왔지만 한 달 뒤에 정체성이 바뀌었다. 각각 대단한 서사가 있는 건 아니라서 한 편짜리 글로는 아까웠는데, 이렇게 묶으니까 딱 맞는다. 이 중 하나라도 눈에 들어왔다면 링크를 눌러보는 걸로 충분하다. 그게 이 글이 바라는 전부다.
Comments
Loading comments...