尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
달력 기반 식단 + AI 건강 분석 과 친구 피드까지 한곳에 두는 웹앱. 한 기기·한 브라우저에서는 내 프로필 하나로 기록하지만, 친구를 맞추면 서로의 식단을 피드에서 볼 수 있습니다. Galaxy S24 같은 모바일에 최적화되어 있고, 노트북 브라우저에서도 잘 작동합니다. GitHub Pages로 100% 무료 호스팅됩니다.檢視完整 README ↗
달력 기반 식단 + AI 건강 분석 과 친구 피드까지 한곳에 두는 웹앱. 한 기기·한 브라우저에서는 내 프로필 하나로 기록하지만, 친구를 맞추면 서로의 식단을 피드에서 볼 수 있습니다. Galaxy S24 같은 모바일에 최적화되어 있고, 노트북 브라우저에서도 잘 작동합니다. GitHub Pages로 100% 무료 호스팅됩니다.
Cmd/Ctrl+Enter 로 빠르게 보내기), 식단 소유자는 본인 게시물에 달린 모든 댓글을 모더레이션 차원에서 삭제할 수 있습니다. 식단을 삭제하면 좋아요·댓글도 함께 정리됩니다.brand-* 와 surface-* 색을 CSS 변수로 바꾸고 :root[data-theme="..."] 별로 정의해, 같은 클래스가 테마에 따라 다른 색이 되도록 했습니다.)npm install
npm run dev
브라우저에서 http://localhost:5173 접속.
기본 모델은 gemini-3.5-flash-lite (무료 티어에서 상대적으로 한도 여유). Google 정책에 따라 수치는 변동됩니다. 모델 선택 UI는 단순화를 위해 제공하지 않습니다.
이미 .github/workflows/deploy.yml 이 있어서, 저장소만 만들고 푸시 + Pages 소스 한 번 지정하면 됩니다.
GitHub에서 새 저장소를 만듭니다. 예: 조직 muklog 에 muklog.github.io 이름 저장소면 https://muklog.github.io/ 에 바로 배포됩니다. (그 외 프로젝트 저장소면 https://<owner>.github.io/<repo>/)
반드시 먼저: GitHub 웹에서 해당 저장소 → Settings → Pages → Build and deployment → Source 를 GitHub Actions 로 바꿉니다.
(이걸 하지 않으면 GitHub에 “Pages 사이트”가 없어서, 예전 워크플로의 configure-pages 단계가 404로 실패할 수 있습니다. 지금 워크플로에서는 해당 단계를 제거했지만, 실제 사이트 배포를 위해 이 설정은 여전히 필수입니다.)
원격 저장소 연결 후 main 브랜치로 푸시합니다. (PowerShell에서 npm 대신 npm.cmd를 쓰는 환경이면 그대로 두고, 아래는 Git만 해당합니다.)
git branch -M main
git remote add origin https://github.com/muklog/muklog.github.io.git
git add .
git commit -m "chore: GitHub Pages 배포용 푸시"
git push -u origin main
이미 다른 주소로 origin이 연결돼 있으면 git remote set-url origin https://github.com/muklog/muklog.github.io.git 로 바꾸면 됩니다.
아직 git init을 안 했다면 프로젝트 폴더에서 한 번만 git init 후 커밋·푸시하면 됩니다.
Actions 탭을 열어 “Deploy to GitHub Pages” 워크플로가 초록색으로 끝났는지 확인합니다.
처음 한 번 “Approve and deploy” / 환경(github-pages) 승인을 요구하면 승인합니다.
같은 Settings → Pages 에서 Visit site 또는 표시된 URL로 접속합니다.
배포 반영까지 1~3분 걸릴 수 있습니다.
이후에는 main에 푸시할 때마다 같은 워크플로가 빌드 후 자동 배포합니다.
배포 URL 형태: 일반 저장소는 https://<USER>.github.io/<REPO_NAME>/, 조직/계정의 muklog.github.io 특수 저장소면 https://muklog.github.io/ (루트 / 로 빌드됩니다.)
base 를 자동 설정합니다.
/<REPO_NAME>/<USER>.github.io 저장소 → /HashRouter + 404.html fallback 으로 새로고침해도 안전합니다.호스트만 muklog.github.io 로 바꿔도 Firestore·로그인 데이터는 그대로입니다. 아래만 Firebase Console 에서 한 번씩 해 주세요.
muklog.github.io 입력 후 저장GitHub Actions 빌드는 새 저장소(muklog/muklog.github.io)에도 예전과 동일한 이름의 Repository secrets 가 필요합니다. (Variables 탭이 아니라 Secrets 입니다.)
각 항목 옆 연필(Update) 으로 열어 Firebase에 나온 값만 다시 붙여 넣고 Update secret 을 누르세요. GitHub는 저장 후 값을 다시 보여 주지 않습니다 — 비었는지는 배포 워크플로 로그의 「Firebase Secrets 채워졌는지 확인」 단계 경고로 확인합니다.
| Secret 이름 | Firebase 웹 앱 firebaseConfig |
|---|---|
VITE_FIREBASE_API_KEY | apiKey |
VITE_FIREBASE_AUTH_DOMAIN | authDomain |
VITE_FIREBASE_PROJECT_ID | projectId |
VITE_FIREBASE_APP_ID | appId |
VITE_FIREBASE_MESSAGING_SENDER_ID | messagingSenderId |
VITE_FIREBASE_STORAGE_BUCKET | storageBucket (선택, 넣는 것 권장) |
클라우드 로그인을 쓰려면 위 표에서 맨 위 네 개는 반드시 채워야 합니다.
값 위치: Firebase Console → 프로젝트 설정(톱니바퀴) → 일반 → 내 앱에서 웹 앱 선택 → Firebase SDK snippet 의 구성 객체.
등록 후 Actions 에서 워크플로를 Re-run workflow 하세요.
public/CNAME 파일에 도메인을 한 줄로 적고, 워크플로우 환경변수에서 VITE_BASE_PATH=/ 로 설정하세요.
Gmail(Firebase Auth) 기반의 단방향 팔로우 모델입니다. 인스타그램과 동일한 의미로 "내가 신청 = 상대 기록을 보고 싶어요" 입니다.
한 방향당 하나의 share 문서가 만들어집니다. 맞팔이면 두 개의 share. 어느 한쪽이 share 를 끊으면 그 방향만 즉시 차단되고 반대 방향은 영향이 없습니다.
친구 기능은 firestore.rules 의 새로운 규칙을 요구합니다. 처음 배포하거나 규칙을 바꾼 뒤에는 아래 명령을 실행하세요.
npm run deploy:firestore-rules
규칙 요약:
users/{uid}/meals|health — 본인은 전체, 친구는 shares/{ownerUid}_{viewerUid} 문서에 본인이 viewer 로 있고 해당 scope 가 true 일 때만 read.publicProfiles/{uid} — 로그인 사용자 모두 read, 본인만 write.followRequests/{id} — 보낸 사람 또는 toEmail == auth.token.email 만 read/update/delete.shares/{ownerUid}_{viewerUid} — 당사자(owner/viewer) 모두 read 가능, owner 만 create/update, 양쪽 모두 delete 가능.friendships/{fid} — 레거시. 신규 코드는 더 이상 사용하지 않으며 read/delete 만 허용됩니다. 기존 사용자는 한 번 다시 팔로우 신청을 주고받으면 됩니다.users/{ownerUid}/meals/{mealId}/likes/{viewerUid} — owner 또는 calendar viewer 만 read. 본인 좋아요만 create/delete (문서 id 가 본인 uid 인지 강제).users/{ownerUid}/meals/{mealId}/comments/{cid} — owner 또는 calendar viewer 만 read/create. update 는 작성자만, delete 는 작성자 또는 식단 소유자.친구의 달력을 열 때 월 단위 범위로 식사 기록을 쿼리합니다.
collection: users/{uid}/meals
where: date >= $start && date <= $end
date 단일 필드 인덱스를 만들어 주세요. (다른 where 절을 추가하지 않는 한 복합 인덱스는 필요 없습니다.)| 영역 | 사용 기술 |
|---|---|
| 프레임워크 | React 18 + TypeScript + Vite |
| 라우팅 | react-router-dom (HashRouter) |
| 스타일 | Tailwind CSS, Pretendard 폰트 |
| 데이터 저장 | IndexedDB (Dexie.js) — 사진은 Blob 으로 저장 |
| AI | Google Gemini API (@google/generative-ai), 클라이언트 직접 호출 |
| PWA | vite-plugin-pwa |
| 호스팅 | GitHub Pages + GitHub Actions |
src/
├── components/ # Calendar, BottomNav, PhotoUpload, HealthRecordCard, MealCard 등
├── pages/ # Home, Day(식사), Health, Settings, Onboarding, Friends, FriendProfile, FriendDay, Invite
├── lib/
│ ├── db.ts # Dexie 스키마 + getSettings/patchSettings
│ ├── ai.ts # Gemini 식단/건강 분석
│ ├── image.ts # 이미지 압축, 썸네일, blob URL 캐시
│ ├── friends.ts # publicProfiles / followRequests / shares CRUD·구독
│ └── utils.ts # 날짜, 점수, 색상 유틸
├── types.ts # User, Meal, HealthRecord, MealSlot, Share, FollowRequest 등
├── App.tsx # 라우터 + 온보딩 가드
├── main.tsx
└── index.css # Tailwind + 공용 컴포넌트 클래스
users/{uid}/...) 에 자동 동기화돼, 같은 Google 계정으로 다른 기기에 로그인하면 기록이 이어집니다. 사진은 무료 플랜을 위해 압축 JPEG(Base64) 형태로 Firestore 문서에 직접 저장됩니다.users/{uid}/config/private 에만 저장되어 본인만 읽을 수 있습니다(Firestore 규칙). AI 분석을 요청할 때만 Google 서버로 전송됩니다.MIT