잠시만요, 달이 떠오르면 글도 환해질 거예요.
mkdir feedlantern && cd $_
curl -fLO https://raw.githubusercontent.com/Jaaayden/feedlantern/main/docker-compose.yml
curl -fLO https://raw.githubusercontent.com/Jaaayden/feedlantern/main/seccomp_profile.json
docker compose up -d --wait
docker compose logs --tail=50 feedlantern
모든 것은 PolitePaul에서 온 이메일 한 통으로 시작됐다.
시작하며
이메일에 따르면 2026년 8월 29일부터 무료 계정은 활성 피드를 최대 3개까지 지원하고, 무료 피드의 업데이트 간격은 1.5시간으로 조정된다. 한도를 초과한 피드는 삭제되지는 않지만 동결되며, 다른 피드의 자리를 비우거나 요금제를 업그레이드해야 다시 업데이트된다.
PolitePaul 같은 서비스는 자체 RSS가 없거나 RSSHub에 해당 라우트가 없거나 기존 라우트가 작동하지 않는 웹페이지에 유용하다. 이런 페이지가 아주 많지는 않지만, 피드 수가 3개로 제한되면 활용도가 크게 떨어진다. 당시 계정에는 구독이 이미 13개 있었고, 그중에는 업데이트가 뜸한 페이지도 여럿이었다. 매일 업데이트되는 페이지도 자리 하나를 차지하고 몇 주, 심지어 몇 달에 한 번 업데이트되는 페이지도 똑같이 자리 하나를 차지한다. 실제 업데이트 횟수에 따라 구독 한도가 배정되는 것은 아니다.
당시 월간 요금제는 피드 20개가 월 5.54달러, 50개가 월 11.77달러였다. 장기간 쌓인 구독을 생각하면 20개로는 여전히 부족하고, 50개를 선택하면 고정 지출이 커진다. PolitePaul이 웹페이지 수집과 저장, 유지 관리 비용을 부담해야 하니 무료 한도를 조정하는 건 이해할 수 있지만, 내 용도에는 비용이 너무 높았다.
이후 비슷한 서비스를 더 찾아봤지만 대부분 가격이 만만치 않았고, 쓸 만한 오픈소스 대안도 찾지 못했다.
그러다 직접 만들어 보면 어떨까 생각했다. 막 GPT-6 astra가 출시됐고 Codex 덕분에 코딩이 훨씬 쉬워졌으며, 서버와 도메인도 이미 갖춰져 있었다.
요구 사항
먼저 필요한 기능부터 정리했다.
웹페이지를 RSS로 만드는 기본 과정은 복잡하지 않다. 페이지를 불러오고, 글 목록을 찾아 제목과 링크를 추출한 뒤, 정기적으로 새로 고쳐 표준 RSS로 내보내면 된다. 서버와 도메인은 이미 있었고 개발 도구만으로도 이런 앱을 만들 수 있었기에 프로젝트 이름을 FeedLantern(피드 랜턴)으로 정했다.
FeedLantern은 개인이 직접 호스팅해 사용하는 것을 목표로 한다. 외부에 서비스를 제공하는 것이 목적이 아니며, 유료 요금제도 없고 외부 AI 서비스를 연결할 필요도 없다. 사용량이나 요청 빈도가 높으면 IP가 차단될 수 있으므로, 자신의 필요에 맞게 직접 배포하는 것을 권장한다.
개발과 테스트에는 Codex와 GPT-6 astra를 활용했고, 평소 웹페이지를 수집할 때는 로컬 규칙과 브라우저 서비스를 사용한다.
자동 인식과 쿠키 지원
이 부분에서 FeedLantern은 PolitePaul보다 한 걸음 더 나아갔다.
구독을 만들 때 Chromium이 백그라운드에서 실제 웹페이지를 불러와 동적 콘텐츠가 나타날 때까지 기다린 다음, 렌더링된 DOM에서 반복되는 글이나 카드 구조를 찾는다. 이어서 제목, 링크, 이미지, 요약, 날짜를 찾아 예시와 신뢰도를 보여준다.
조건에 맞는 목록이 여러 개라면 후보를 보여주고 사용자가 선택할 수 있다. 결과가 정확하지 않을 때는 시각적 편집기로 돌아가 필드를 다시 지정하거나 규칙을 수정하면 된다.
웹페이지를 많이 추가해야 할 때도 요소를 하나씩 클릭할 필요 없이 거의 한 번의 클릭으로 끝난다.
로그인해야 콘텐츠가 제대로 표시되는 페이지도 있어 사용자 지정 쿠키 기능도 제공한다. 쿠키 문자열과 OpenCookie JSON을 지원하며, 인증 정보는 로컬에 암호화해 저장하므로 로그나 일반 조회 응답에 기록되지 않는다. 자동 인식에는 외부 모델이 필요 없고, 브라우저 수집과 규칙 추출도 서버에서 계속 실행할 수 있다.
사용성에서 유지 관리성까지
처음 웹페이지를 인식하는 기능뿐 아니라 오래 쓰려면 구독 관리도 필요하다. FeedLantern은 목록 보기와 카드 보기, URL 일괄 추가, RSS 주소 일괄 복사, 일시 중지, 재개, 새로 고침, 삭제를 지원한다. 암호화 백업과 설정 가져오기, 서버 간 복원도 가능하다.
구독 목록 이름은 RSS 채널 이름과 동일하게 유지된다. 이름을 바꿔도 구독 주소, 키, 기록, 새로 고침 일정은 변경되지 않는다. 관리자 한 명만 로그인할 수 있으며, 공개 가입이나 다중 사용자·요금제 체계는 두지 않았다.
간편한 배포 방법
Docker Compose는 서버 내부의 4321 포트에만 바인딩하고, 외부 접속은 Nginx가 처리한다. 기본으로 latest 이미지를 사용하며, main 브랜치가 모든 CI 검증을 통과하면 이미지가 자동으로 업데이트된다. 새 디렉터리를 만든 뒤 파일 두 개를 내려받으면 바로 실행할 수 있다.
그다음 http://127.0.0.1:4321에 접속해 최초 관리자 설정을 완료한다. 도메인을 사용하는 경우 저장소의 http://127.0.0.1:4321를 사이트 설정에 넣고 도메인과 기존 인증서 경로를 바꾼 뒤 요청을 Nginx 설정 템플릿로 전달하면 된다.http://127.0.0.1:4321로 전달하면 된다. 자세한 설정과 백업, 문제 해결 방법은 저장소의 doc 디렉터리에서 확인할 수 있다.
마치며
개인적인 필요에서 출발한 프로젝트지만, RSS를 많이 이용한다면 분명 유용할 것이다. 유료 서비스들 가운데 사실상 유일한 오픈소스 대안인 듯하다.
FeedLantern은 현재 v0.2.2를 공개했으며 MIT 라이선스로 오픈소스 배포 중이다. 프로젝트 코드와 배포 파일은 GitHub 저장소에서 확인할 수 있다. 도움이 되길 바란다.