AC POST 개발로그 · 1화
개인 신문 AC POST를 첫날 Vercel에 올렸다: 커밋 6개, 가장 먼저 고친 건 날짜
여러 사이트를 도는 아침이 지겨워서 개인 신문을 만들었다. 4월 21일 첫 배포 날에만 커밋이 여섯 개였다. 제일 먼저 부딪친 건 기사가 아니라 날짜였다.
AC POST는 밤사이 나온 뉴스와 논문, 오픈소스 저장소를 모아 매일 아침 한 부의 신문으로 내는 개인 신문이다. 이 연재는 그 신문이 어떻게 만들어졌고, 어떻게 헤르메스의 카드뉴스 재료가 됐는지의 기록이다. 근거는 저장소 커밋 73개와 운영 문서다.
한 장에 정리된 아침
아침마다 여러 사이트와 피드를 돌며 같은 소식을 몇 번씩 보는 게 지쳤다. 신문처럼 누가 대신 모으고 골라 한 장에 정리해 주면 좋겠다고 생각했다. 그렇게 골라 둔 뉴스가 그대로 카드뉴스와 글의 재료가 되기를 바랐다.
처음 설계는 “신문 모양의 개인 일간지”였다. Next.js 14와 TypeScript, Tailwind CSS로 1면, 호(edition), 섹션, 관리자 화면의 틀을 만들고, 기사와 호는 Supabase에 저장했다. 수집기가 기사를 모으고, 순위를 매기고, 지면을 짜서 한 호로 발행하는 구조다.
첫날 커밋 여섯 개
4월 21일 오후에 첫 버전을 Vercel에 올렸다. 그날에만 커밋이 여섯 개였다. 올리자마자 무료 요금제의 크론 제한에 걸려 수집과 발행 크론을 하나로 합쳤고, 운영 환경에서 Supabase 주소를 잘못 읽는 오류를 고쳤다. 환경변수가 비었을 때 빈 화면 대신 원인을 보여 주는 진단 화면도 그날 넣었다.
다음 날은 커밋이 여덟 개였다. 수집과 발행 시각을 한국 시간 아침 7시와 8시로 옮기고, 기사를 다시 분류해 호를 새로 찍는 재발행 경로를 만들었다. 오늘의 책은 고른 책 목록을 먼저 넣어 두고, 최근에 소개한 책은 다시 뽑지 않게 했다. 4월 23일에는 수집기를 동시에 돌리게 바꾸고, 발행한 호가 화면에 늦게 반영되던 캐시를 껐다.
신문의 첫 문제는 날짜였다
사흘 동안 가장 많이 고친 건 기사가 아니라 날짜였다. 서버의 크론은 세계 표준시로 돌고, 신문은 한국의 아침에 바뀐다. 오늘 호에 어떤 기사가 들어가는지를 정하는 마감선이 한 번 어긋나면, 어제 기사가 오늘 호에 섞이거나 오늘 기사가 통째로 빠졌다.
그래서 규칙을 못 박았다. 호의 날짜는 한국 시간 새벽 6시에 바뀐다. 새벽 0시부터 5시 59분 사이에 모은 기사는 전날 호에 들어간다. 시간 계산은 한국 시간 도구 하나로만 한다. 4월 30일에는 바이오와 과학 섹션을 더하면서, 호에는 그날 나온 기사만 싣고 같은 날 기사를 순위에서 앞세웠다.
헤르메스가 읽기 시작했다
5월 중순부터 AC POST에는 사람 말고 다른 독자가 생겼다. 5월 16일, 헤르메스가 AC POST의 AI 리서치 섹션에 올라온 논문을 가져가 카드뉴스로 만들기 시작했다. 그 이야기는 카드뉴스 개발로그에 따로 썼다.
사흘 뒤인 5월 19일에는 커밋 하나로 1,217줄이 들어갔다. 수집기 여덟 개를 손보고, 번역한 문장을 한 번 더 다듬는 단계를 처음 붙였다. Gemini가 옮긴 제목과 요약을 집의 맥에서 도는 한국어 모델 카나나가 윤문하는 단계다. 기본값은 꺼 둔 선택 기능이었지만, 신문이 집의 맥에 있는 모델을 처음 불러 쓸 자리를 만든 날이다.
배운 것
모으는 코드보다 경계를 정하는 코드가 먼저였다. 어느 시각에 호가 바뀌는지, 어떤 기사가 오늘 것인지가 정해지지 않으면 순위도 지면도 의미가 없었다. 그리고 크론을 남의 서버에 맡기면 그 서버의 요금제가 신문의 일정을 정했다. 한편 문장을 다듬는 모델은 집의 맥에 있었다. 2화에서는 그 둘 사이의 거리를 없애려고 신문사를 통째로 집으로 옮긴다.