한 번 그려 두고 여러 번 내보내기
요청은 R2에 저장된 SVG를 돌려줄 뿐이고, ETag가 있어서 반복 요청도 가볍습니다. GitHub를 부르는 것은 처음 방문할 때와 하루 한 번 다시 그릴 때이며, README가 보일 때마다 부르지는 않습니다.
GitHub 기여 기록을 수채화 식물로 바꿔 주는 작은 서비스입니다. 1년의 하루하루가 잎이 되고, 그날 활동이 많을수록 잎의 초록이 짙어집니다. 프로필 README에 이미지 한 줄만 붙이면 그림이 알아서 최신으로 유지됩니다.

기여 그래프는 초록 네모가 늘어선 표입니다. 보고 있으면 즐거운 것으로 만들고 싶어서, GitLeaf는 1년을 식물로 그립니다. 하루가 작은 잎 한 장이고 활동이 많을수록 색이 짙어지며, 가지 끝에는 한 주를 나타내는 큰 잎이 달립니다. 아직 오지 않은 날은 옅은 윤곽만 있고, 그림 아래에는 그해의 기여 수가 적힙니다.
프로필 README에 두려고 만들었습니다. 사용자 이름이 들어간 이미지 한 줄만 붙이면 되고, 가입도 GitHub Actions 설정도 필요 없습니다. 이미지를 처음 요청받을 때 기여 기록을 읽어 식물을 그리고 저장해 두며, 이후에는 같은 URL 그대로 하루에 한 번 다시 그립니다. README는 바뀌지 않고 커밋도 만들어지지 않습니다.
잎은 AI 이미지 도구로 만든 수채화 잎 8종을 각각 5단계 농도로 만든 것입니다. 네 줄기를 따라 배치하고 하루에 한 장씩 채우는 것이 코드가 하는 일입니다. 그림 전체가 SVG 파일 하나라서 스크립트와 외부 요청이 막힌 README에서도 평범한 이미지로 보입니다.




요청은 R2에 저장된 SVG를 돌려줄 뿐이고, ETag가 있어서 반복 요청도 가볍습니다. GitHub를 부르는 것은 처음 방문할 때와 하루 한 번 다시 그릴 때이며, README가 보일 때마다 부르지는 않습니다.
GitHub 호출이 실패하거나 불완전한 데이터가 와도 이전 그림을 그대로 두고, 재시도는 1시간에서 최대 하루까지 간격을 늘립니다. D1의 임대(lease)로 동시에 들어온 두 요청이 같은 정원을 두 번 그리는 일도 막습니다.
Cron은 10분마다 깨어나 갱신할 때가 된 정원을 최대 4개 처리합니다. 정원마다 하루 한 번, 00:20 UTC 이후입니다. 일이 작게 유지되고, 사용자가 늘 때의 한계는 README에 적어 두었습니다.
공개된 그림을 GitHub의 새 응답과 비교하는 스크립트가 있습니다. 날짜별 건수와 농도, 주별 잎, 아직 오지 않은 날, 합계까지 확인합니다. 테스트 20개는 GitHub에 접속하지 않고 돌아가며, 윤년과 연말 몰림, 장애 상황까지 다룹니다.
건수는 커밋만이 아니라 GitHub 기여 전체입니다. 비공개 활동은 서비스의 GitHub 토큰이 볼 수 있는 범위만 반영됩니다. 실린 그림은 제 계정의 것입니다.