Strength Training Tracker
An open-source strength training tracker: log sets and reps on your phone, see how each lift moves, and start every session from your own numbers.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗futsal with chat — 풋살 용병 모집부터 참가 신청, 실시간 채팅까지 한 곳에서
용병을 구하는 경기 주최자와 참여하려는 사용자가 바로 대화할 수 있는 풋살 용병 매칭 서비스입니다. 기존 용병 모집 방식에서는 주최자와 소통할 창구가 부족하다는 문제에서 출발했습니다. 모집글, 참가 신청, 1:1 실시간 채팅을 하나의 흐름으로 연결했습니다.
배포 https://chatfutsal.vercel.app · 버전 0.1.0
jsonwebtoken)을 발급해 기존 유저 시스템과 통합N자리 남음 / 마감임박 / 마감 배지closed 처리closed로 갱신
applicantIds)onSnapshot 기반 1:1 실시간 채팅| 구분 | 사용 기술 |
|---|---|
| Framework | Next.js 16 (App Router), React 19 |
| Language | TypeScript |
| Styling | Tailwind CSS 4, shadcn/ui (Radix UI), lucide-react |
| Backend (BaaS) | Firebase Authentication, Cloud Firestore |
| Server | Next.js API Route, jsonwebtoken (Firebase Custom Token 서명) |
| 외부 API | Kakao Login (OAuth), Kakao Maps JavaScript API / Places |
| Test | Vitest |
| Deploy | Vercel |
| 경로 | 설명 |
|---|---|
/ | 모집글 목록 (검색 · 날짜 · 지역 · 레벨 필터) |
/recruit/[postId] | 모집글 상세 · 지도 · 참가 신청 |
/recruit/[postId]/edit | 모집글 수정 |
/create | 모집글 작성 |
/chat | 채팅방 목록 |
/chat/[roomId] | 채팅방 |
/notifications | 알림 목록 |
/mypage | 마이페이지 |
/mypage/recruits | 내가 작성한 모집글 |
/mypage/applications | 내가 신청한 모집 |
/users/[userId] | 사용자 프로필 |
/login, /signup | 로그인 · 회원가입 |
/auth/kakao/callback | 카카오 로그인 콜백 |
src/
├── app/ # 페이지 (App Router)
│ └── api/auth/kakao/ # 카카오 로그인 → Firebase Custom Token 발급
├── components/ # UI 컴포넌트 (Header, SubHeader, RecruitCard, ChatRoom, KakaoMapSearch 등)
│ └── ui/styles.ts # 공통 버튼 · 입력 필드 스타일
├── hooks/ # 실시간 구독 훅 (useRecruitPosts, useMessage, useNotifications 등)
├── lib/
│ ├── firebase/ # Firebase 클라이언트 초기화 · 에러 메시지 처리
│ ├── firebase-admin.ts # Firebase Custom Token 생성 (서버 전용)
│ ├── services/ # Firestore 쓰기 로직 (recruit, application, chat, notification)
│ └── utils/ # 날짜 포맷 · 만료 판별 유틸 (단위 테스트 포함)
└── types/ # 공통 타입 정의
읽기는 hooks에서 onSnapshot으로 실시간 구독하고, 쓰기는 services에 모아 역할을 분리했습니다.
firestore/
├── users/{userId} # 사용자 정보 (provider: email | kakao)
├── recruitPosts/{postId} # 모집글 (status, needCount, acceptedCount, applicantIds, locationCoord)
├── applications/{applicationId} # 참가 신청 (status: pending | accepted | rejected)
├── notifications/{notificationId} # 알림 (recipientId, type, isRead, link)
└── chatRooms/{roomId} # 채팅방 (participants, lastMessage)
└── messages/{messageId} # 메시지 (readBy로 읽음 처리)
KOE320(인가 코드 없음)으로 실패useRef로 막으려 했지만 재마운트 시 ref가 초기화되어 효과가 없었다.Set에 기록해 같은 코드는 한 번만 교환하도록 했다.FUNCTION_INVOCATION_FAILEDfirebase-admin이 의존하는 jose v5가 ESM 전용 패키지라, 서버리스 함수 런타임에서 require()로 불러오다 ERR_REQUIRE_ESM이 발생했다. serverExternalPackages 설정으로도 해결되지 않았다.firebase-admin을 제거하고 jsonwebtoken으로 직접 서명했다. 의존성 크기도 함께 줄었다.onSnapshot 리스너는 종료되고 재시도하지 않는다.permission-denied)는 "데이터 없음"과 구분해 로그인 안내 화면을 보여준다.git clone https://github.com/oldwater0224/chatfutsal.git
cd chatfutsal
npm install
npm run dev
프로젝트 루트에 .env.local을 만들고 아래 값을 채워야 합니다.
# Firebase (Client)
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
# Firebase 서비스 계정 (Server, 카카오 로그인 Custom Token 서명용)
FIREBASE_ADMIN_CLIENT_EMAIL=
FIREBASE_ADMIN_PRIVATE_KEY=
# Kakao
NEXT_PUBLIC_KAKAO_MAP_JS_KEY=
NEXT_PUBLIC_KAKAO_REST_API_KEY=
NEXT_PUBLIC_KAKAO_REDIRECT_URI=
KAKAO_CLIENT_SECRET=
테스트 실행
npm test
카카오맵과 카카오 로그인을 사용하려면 Kakao Developers에 사이트 도메인(
http://localhost:3000등)과 Redirect URI를 등록해야 합니다.