project

브리핑 LLM · 매일의 LLM 뉴스 브리핑 앱

브리핑 LLM · 매일의 LLM 뉴스 브리핑 앱 대표 이미지
SKILLS
Expo
React Native
TypeScript
Next.js
Supabase
Claude API
Zod
TanStack Query
Zustand
NativeWind
SwiftUI WidgetKit
TOOLS
Claude Code
EAS Build · Submit · Update
Vercel
App Store Connect
GitHub
진행기간
2026.06.16 - 2026.08.12
개발인원
1명 (개발자 1명)
역할
기획
설계
개발
배포·운영
기여도
5/5
카테고리
iOS App
브리핑 LLM · 매일의 LLM 뉴스 브리핑 앱 화면브리핑 LLM · 매일의 LLM 뉴스 브리핑 앱 화면

작품 설명

매일 아침 LLM 업데이트·연구·커뮤니티·산업 소식을 웹에서 수집해 하루치 "호"로 묶어 보여 주는 앱입니다. 항목마다 요약, 핵심 포인트, 지금 해 볼 일, 그리고 1차 출처 링크를 붙입니다. 수집·작성 파이프라인(Claude API), 인제스트·조회 API(Next.js + Supabase), 리더 앱(Expo)까지 혼자 기획·개발했고, iOS 앱스토어에 출시해 운영하고 있습니다. 같은 코드로 웹과 안드로이드 위젯도 지원하며, 웹(daily-newx.project-hh.com)에서도 앱과 같은 내용을 볼 수 있습니다.

기획 의도

LLM 소식은 하루에도 수십 개씩 쏟아지지만, 대부분 2차 가공된 요약이라 원문이 무엇인지, 실제로 바뀐 게 뭔지 확인하기 어렵습니다. 그래서 "출처 없는 항목은 저장하지 않는다"를 데이터 규칙으로 두고, 모델명·버전·수치는 1차 출처에서 확인된 것만 싣도록 했습니다. 독자는 특정 직군이 아닌 일반 대중으로 잡았습니다. 전문 용어를 풀어 쓰고, 읽고 끝나지 않도록 실제로 해 볼 수 있는 행동이 있을 때만 "지금 할 일"을 붙입니다. 뉴스가 적은 날은 억지로 채우지 않습니다.

출시 성과

혼자 기획·개발해 출시한 앱이 앱스토어 잡지 및 신문 카테고리 차트 41위에 올랐습니다.

출시 성과

시스템 구성

수집·작성 파이프라인

∙

Supabase Cron(pg_cron + pg_net)이 매일 아침 Vercel 라우트를 호출하고, Claude API가 web_search로 여러 번 검색해 브리핑 JSON을 생성

∙

처음엔 Supabase Edge Function으로 만들었으나 요청 유휴 타임아웃이 150초로 고정돼 완주하지 못해(504), 실행 시간을 늘릴 수 있는 Vercel Function으로 이전

∙

생성 결과는 직접 DB에 쓰지 않고 기존 인제스트 API를 그대로 호출 — 검증·푸시 발송 로직을 한 곳에만 둠

인제스트·조회 API (Next.js App Router)

∙

app → lib → services → types 단방향 레이어, 요청 본문은 전부 Zod로 파싱

∙

호는 발행일, 항목은 (발행일, 출처 URL) 기준 멱등 upsert라 같은 날 재실행해도 중복이 쌓이지 않음

∙

출처 URL은 DB에서 NOT NULL + http(s) 체크 제약으로 강제

리더 앱 (Expo + React Native Web)

∙

오늘의 호, 기사 상세, 카테고리·주제·주체별 타임라인, 지난 호 아카이브, 내 도구 업데이트 화면

∙

기사마다 등장 주체(entities)와 태그를 저장해, 같은 회사·모델 이야기를 날짜순으로 이어 보는 타임라인 제공

∙

일간호를 스와이프 카드 덱으로 넘겨 보는 기본 뷰, 발행 시점 푸시 알림, 웹 공유 미리보기(OG)

홈·잠금화면 위젯

∙

iOS는 SwiftUI WidgetKit 확장, 안드로이드는 react-native-android-widget으로 오늘의 헤드라인 표시, 탭하면 해당 기사로 딥링크

∙

위젯 폴링 비용을 줄이려고 /api/today에 CDN 캐시 30분 + ETag(304) 조건부 응답 적용

비용 문제와 해결

회당 $14까지 나온 생성 비용

∙

초기 실행분이 회당 $11.78, $14.41로 청구된 것을 확인 — 웹 검색 결과가 대화에 계속 쌓여 20만 토큰을 넘었고, 캐싱 없이 전액 정가로 청구되고 있었음

∙

시스템 프롬프트와 누적 대화에 프롬프트 캐싱 적용, 검색 결과를 걸러서 넣는 web_search 버전으로 교체, 검색 횟수 상한 30 → 20, 누적 토큰 하드 컷오프 추가

검색과 작성을 다른 모델로 분리

∙

검색은 Haiku 에이전트가 맡아 원본 결과(제목·URL·스니펫)를 중간 캐시 API에 저장하고, 작성은 Sonnet 에이전트가 그 캐시를 읽어 브리핑을 쓰는 2단계 파이프라인으로 분리

∙

오늘 호가 이미 발행됐으면 두 단계 모두 중단하는 가드로 중복 발행과 중복 과금을 막음

앱스토어 출시와 배포 자동화

출시

∙

EAS Build로 iOS 빌드, EAS Submit으로 App Store Connect 자동 제출 — 비대화형 제출이 실패하던 문제는 eas.json에 앱 ID를 명시해 해결

∙

심사용 개인정보 처리방침·지원 페이지, 앱스토어 스크린샷, iPad 지원 추가 후 v1.0.0 출시, 이후 v1.0.1 업데이트

∙

위젯 확장 타깃명을 ASCII로 바꾸고 EAS에 appExtensions를 선언해 위젯 포함 빌드 서명 문제 해결

JS 변경은 재심사 없이 배포

∙

`yarn ship` 한 번으로 커밋·푸시(웹·API 자동 배포)와 EAS Update OTA를 함께 실행 — 네이티브 변경이 없으면 리빌드·재심사 없이 설치된 앱에 반영

∙

runtimeVersion을 앱 버전에 묶어, 네이티브가 바뀐 빌드에 맞지 않는 JS 업데이트가 내려가지 않도록 함