본문으로 건너뛰기
전체 프로젝트
운영 중 · 누구나 사용 가능

GitLeaf

GitHub 기여 기록을 수채화 식물로 바꿔 주는 작은 서비스입니다. 1년의 하루하루가 잎이 되고, 그날 활동이 많을수록 잎의 초록이 짙어집니다. 프로필 README에 이미지 한 줄만 붙이면 그림이 알아서 최신으로 유지됩니다.

1년치 기여 기록으로 그린 식물과 그 잎을 확대한 모습
종류
GitHub README용 이미지 서비스
기간
2026년 10월
운영 환경
Cloudflare Workers + D1 + R2

소개

기여 그래프는 초록 네모가 늘어선 표입니다. 보고 있으면 즐거운 것으로 만들고 싶어서, GitLeaf는 1년을 식물로 그립니다. 하루가 작은 잎 한 장이고 활동이 많을수록 색이 짙어지며, 가지 끝에는 한 주를 나타내는 큰 잎이 달립니다. 아직 오지 않은 날은 옅은 윤곽만 있고, 그림 아래에는 그해의 기여 수가 적힙니다.

프로필 README에 두려고 만들었습니다. 사용자 이름이 들어간 이미지 한 줄만 붙이면 되고, 가입도 GitHub Actions 설정도 필요 없습니다. 이미지를 처음 요청받을 때 기여 기록을 읽어 식물을 그리고 저장해 두며, 이후에는 같은 URL 그대로 하루에 한 번 다시 그립니다. README는 바뀌지 않고 커밋도 만들어지지 않습니다.

잎은 AI 이미지 도구로 만든 수채화 잎 8종을 각각 5단계 농도로 만든 것입니다. 네 줄기를 따라 배치하고 하루에 한 장씩 채우는 것이 코드가 하는 일입니다. 그림 전체가 SVG 파일 하나라서 스크립트와 외부 요청이 막힌 README에서도 평범한 이미지로 보입니다.

주요 기능

하루에 잎 한 장
잎의 농도는 GitHub의 기여 단계를 따라, 조용한 날은 옅은 윤곽에서 활발한 날은 짙은 초록까지 달라집니다. 주마다 그 주의 평균을 나타내는 큰 잎도 달립니다.
한 줄이면 끝
사용자 이름이 들어간 이미지 한 줄을 README에 붙입니다. 계정은 필요 없고 첫 요청에서 그림이 나타납니다.
매일 다시 그리기
같은 URL에 최신 활동이 반영되어서 README를 고칠 일이 없습니다. 해가 바뀌면 새 식물이 자라고, ?year=로 2008년까지 원하는 해를 고정할 수 있습니다.
살랑이는 바람
?motion=breeze를 붙이면 가지들이 저마다의 속도로 천천히 흔들립니다. CSS만으로 움직이며, 기기에서 움직임 줄이기를 켜면 멈춥니다.
같은 GitHub 활동으로 그린 멈춘 그림과, 살랑이는 바람이 더해진 그림
같은 계정의 2024년, 2025년, 2026년. 활동이 많을수록 잎이 늘고 색도 짙어진다
동작 방식. README가 Cloudflare Worker에 이미지를 요청하면 R2에 저장된 SVG가 돌아오고, 매일 도는 Cron이 GitHub를 읽어 다시 그리며, D1이 일정을 관리한다
README에 붙이는 한 줄 코드와 그것으로 나타나는 식물

기술 구성

서비스
TypeScript · Cloudflare Workers(Cron Triggers)
저장
완성된 SVG는 R2, 정원과 갱신 시각은 D1
그림
순수 JavaScript로 쓴 SVG · 수채화 잎 이미지 8종 × 5단계(sharp) · 바람은 CSS 애니메이션
데이터
GitHub GraphQL API(토큰은 Worker 시크릿에 보관)
품질
실제 Workers 런타임과 D1·R2에서 하는 테스트(Miniflare) · GitHub 실데이터 대조 · GitHub Actions

개발 노트

한 번 그려 두고 여러 번 내보내기

요청은 R2에 저장된 SVG를 돌려줄 뿐이고, ETag가 있어서 반복 요청도 가볍습니다. GitHub를 부르는 것은 처음 방문할 때와 하루 한 번 다시 그릴 때이며, README가 보일 때마다 부르지는 않습니다.

실패해도 식물은 지우지 않기

GitHub 호출이 실패하거나 불완전한 데이터가 와도 이전 그림을 그대로 두고, 재시도는 1시간에서 최대 하루까지 간격을 늘립니다. D1의 임대(lease)로 동시에 들어온 두 요청이 같은 정원을 두 번 그리는 일도 막습니다.

작은 배치로 다시 그리기

Cron은 10분마다 깨어나 갱신할 때가 된 정원을 최대 4개 처리합니다. 정원마다 하루 한 번, 00:20 UTC 이후입니다. 일이 작게 유지되고, 사용자가 늘 때의 한계는 README에 적어 두었습니다.

GitHub 실데이터와 대조

공개된 그림을 GitHub의 새 응답과 비교하는 스크립트가 있습니다. 날짜별 건수와 농도, 주별 잎, 아직 오지 않은 날, 합계까지 확인합니다. 테스트 20개는 GitHub에 접속하지 않고 돌아가며, 윤년과 연말 몰림, 장애 상황까지 다룹니다.

건수는 커밋만이 아니라 GitHub 기여 전체입니다. 비공개 활동은 서비스의 GitHub 토큰이 볼 수 있는 범위만 반영됩니다. 실린 그림은 제 계정의 것입니다.