chorock.page
소개글시리즈프로젝트
© 2026 chorock.page
← 프로젝트 목록

Project

folio.ai

GitHub 저장소를 분석해 개발자 포트폴리오를 만들어주는 AI 서비스 — 6시간 해커톤 MVP에서 시작해 계속 개발 중

작업 기간

2026.08 — 현재

프로젝트 정보

팀 구성

Codex Hackathon 12팀 — Insight 2명 · Builder 2명

담당 역할

백엔드(해커톤) · 이후 단독 확장

데모 보기GitHub

목차

맡은 일성과와 한계주요 기능문제 해결스크린샷발표 슬라이드
목차
맡은 일성과와 한계주요 기능문제 해결스크린샷발표 슬라이드

사용 기술

앱

Next.js (App Router)React 19TypeScriptTailwind CSS

백엔드·데이터

Supabase (Postgres·Storage)GitHub OAuthVercel Workflow

생성

OpenAI Responses APIstrict JSON schema

프로젝트 개요

GitHub 저장소의 코드와 활동 기록을 분석해 취업용 포트폴리오와 이력서 초안을 만들어주는 AI 서비스입니다. GitHub로 로그인해 저장소와 강조할 경험을 고르면, 저장소 분석과 AI 생성을 거쳐 케이스 스터디 형식의 포트폴리오 웹페이지가 나옵니다.

Codex Community Korea 해커톤(2026.08)에서 시작했습니다. 280명 지원자 중 100명이 선발돼 25개 팀이 꾸려졌고, 당일 아침 처음 만난 4명(기획 2·개발 2)이 랜덤으로 팀이 되어 점심 시간을 빼면 6시간이 안 되는 시간 안에 기획부터 배포·발표 자료까지 끝내는 방식이었습니다. 제출 마감 약 10초 전에 업로드를 마쳤습니다 — 그날의 기록은 해커톤 후기에 따로 적어 뒀습니다. 해커톤이 끝난 뒤에는 혼자 이어받아 계속 개발하고 있습니다.

맡은 일

  • 해커톤 당일에는 Builder 2명 중 백엔드를 맡았습니다. GitHub OAuth와 서버 세션, Supabase 스키마, 저장소 동기화, OpenAI 생성 Workflow, 생성 상태 polling API를 이날 만들었습니다.
  • 해커톤 이후의 확장은 프론트·백엔드 모두 혼자 하고 있습니다 — 다중 저장소 생성, 공개 공유 링크, A4 인쇄 기반 PDF, 생성 파이프라인 안정화까지 46커밋을 쌓았습니다.
  • 결제와 크레딧은 시연용 mock입니다. 실제 승인·지급·차감이 발생하지 않으며, 서비스 안의 공지에도 그렇게 밝혀 뒀습니다.

성과와 한계

  • folio.klr.kr에서 라이브로 운영 중이고, 해커톤 이후에도 계속 개발하고 있습니다.
  • Node.js test runner 기반 테스트를 작업마다 함께 붙여 왔습니다. 생성 계약·다중 저장소·공유 링크·오류 처리를 덮습니다.
  • 결제·크레딧은 여전히 mock입니다. 실서비스 결제는 붙이지 않았습니다.
  • 해커톤에서 우승은 하지 못했습니다. 대신 6시간짜리 MVP를 버리지 않고 실서비스 수준으로 끌어올리는 쪽을 택했습니다.
  • 에이전트만으로 MVP를 만든 것은 이번이 처음이라 많이 미숙했습니다. 에이전트를 협업에 쓰는 방식도 서툴렀고, 초반 정책을 정하는 데 시간을 꽤 썼는데 그게 효율적이었는지는 지금도 의문입니다. 같은 시간이 주어졌는데도 팀마다 결과물 퀄리티 차이가 꽤 났고, 에이전트를 잘 쓰는 방법을 다시 생각해보게 된 계기가 됐습니다.
  • 다음 단계는 차근차근 실사용자를 모아보는 것입니다.

주요 기능

  • GitHub OAuth 로그인, 저장소 조회·동기화와 다중 선택(최대 5개)
  • 지원 직무·강조 경험·자유 프롬프트를 반영한 AI 생성 — Vercel Workflow에서 비동기로 돌고, 화면은 진행 단계를 polling하며 실패한 작업은 재시도할 수 있습니다
  • 케이스 스터디 중심의 반응형 포트폴리오 결과, 공개 공유 링크, A4 낱장 미리보기와 브라우저 인쇄 기반 PDF
  • 로그인 없이 볼 수 있는 맛보기와 포트폴리오 예시 갤러리

문제 해결

생성이 영구히 막히던 경로를 없앤 일

작업 행을 넣은 뒤 저장소 연결 삽입이 실패하면 보상 없이 예외만 던지고 있었습니다. 활성 작업은 사용자당 하나만 허용되는데, 남겨진 대기 행이 그 사용자의 다음 생성을 영원히 막았습니다. 재시도는 실패 상태에서만 가능해서 스스로 풀 방법도 없었습니다. 삽입이 실패하면 방금 넣은 행을 되돌리도록 고쳤습니다.

프로세스가 중간에 죽는 경우까지는 보상으로 못 막습니다. 그래서 오래 진척이 없는 작업을 실패로 돌리는 청소를 넣었는데, 문제는 실행 위치였습니다 — 무료 플랜의 크론은 하루 한 번뿐이라 리퍼로 쓸 수 없었습니다. 대신 막힌 사용자가 반드시 지나가는 두 지점, 생성 요청 진입부와 진행 화면이 2초마다 두드리는 조회에서 청소를 돌렸습니다. 서버 어디에도 외부 호출 시간 제한이 없던 것도 이때 함께 고쳤습니다 — 매달린 작업 하나가 다음 시도까지 막는 구조였기 때문입니다.

실패가 전부 같은 문장으로 뭉개지던 문제

생성이 실패하면 원인이 무엇이든 "잠시 후 다시 시도해주세요" 한 문장이었습니다. GitHub 호출 한도에 걸린 사람과 연동이 끊긴 사람이 같은 화면을 보고, 둘 다 즉시 재시도를 눌러 같은 실패를 반복했습니다. 에러를 원인별로 분류해 사유를 보여주고, 다시 해도 결과가 같을 실패는 그 자리에서 끝내게 했습니다. 진행 화면 폴링도 한 번만 실패하면 즉시 멈춰서 네트워크가 잠깐 끊기면 멀쩡한 작업이 실패한 것처럼 보였는데, 세 번까지 간격을 늘려 기다리게 했습니다.

이 결함들이 오래 남아 있던 이유가 핵심입니다 — 목 백엔드가 한 번도 실패하지 않아서, 실패 경로는 로컬에서 실행될 일이 없었습니다. 그래서 목에 실패를 주입하는 스위치를 만들어, 이제 실패 화면도 로컬에서 개발하고 확인할 수 있습니다.

남의 커밋이 지원자의 성과로 서술될 뻔한 문제

커밋과 PR을 저자 구분 없이 생성 근거로 넘기고 있었습니다. 팀 저장소라면 팀원의 작업이 지원자의 성과로 서술될 수 있는 구조입니다 — 포트폴리오 생성 서비스가 가장 해서는 안 되는 실수입니다. 응답에 이미 들어 있던 저자 정보로 본인 작업과 팀 작업을 나눠 담고, 팀 작업은 맥락으로만 쓰라는 지침을 더했습니다. 추가 API 호출은 없습니다.

같은 이유로 근거에 없는 기술이 결과에 섞이면 걸러냅니다. 프롬프트로 금지해도 모델은 그럴듯한 이름을 덧붙이는데, 면접에서 설명하지 못할 한 줄이 남는 쪽이 더 큰 손해이기 때문입니다. 무엇을 걸렀는지는 로그로 남겨 프롬프트를 고칠 근거로 씁니다.

스크린샷

대시보드 — 최근 작업과 공지

포트폴리오 예시 갤러리

생성 결과 — 저장소 근거 기반 케이스 스터디

발표 슬라이드

해커톤 제출 자료입니다. 기획·시장 조사 슬라이드는 Insight 팀원들이 만들었고, 저는 Builder로 제품 화면 쪽을 맡았습니다.

표지 — 취업의 문턱을 간단한 클릭으로 넘다

Vision & Mission — 증가하는 구직자 수, 줄어드는 신입채용

Vision & Mission — 자료는 남아있지만 포트폴리오에는 담기지 않는 경험

Persona — 프로젝트는 했는데 포트폴리오 작성이 막막한 개발자

Problem & Solution — 저장소 선택 · 커밋/PR 분석 · 템플릿 제공

Product/Service — 레포지토리만 선택하세요, 경험은 저희가 정리할게요

1. 선택해요 — 연동된 GitHub 저장소에서 원하는 것만 고르기

2. 보충해요 — 지원 직무와 강조하고 싶은 경험을 프롬프트로

3. 만들어요 — 저장소 분석부터 화면 완성까지 진행 단계 표시

4. 확인해요 — 완성된 포트폴리오와 PDF 이력서 내려받기

시연 영상 안내

Competitive Landscape — 국내 IT 기업 맞춤형 포트폴리오 생성

Market Size — 국내 IT 개발자를 시작으로 세계 시장까지