Bops
A team of AI bots that runs your business ops: inbox, pipeline, invoices, reports. Each one has its own computer, email and phone number, and remembers everything.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
PWA 홈 화면에 표시되는 이름은 「2청년회」 입니다 (public/manifest.webmanifest). 2청년회 가장·임원·목사를 위한 주간 운영 도구입니다. 학기 가족 구성, 주일 출석, 참여조사, 리더모임(교안·기도회·악보), 배정모자, 돌봄카드, 공지, 가장 인수인계를 한곳에서 처리합니다. 로그인 후 왼쪽(넓은 화면) 또는 위쪽(좁은 화면)에 나옵니다. 임원은 회장·부회장·총무·부총무·서기·부서기·회계·부회계입니다. 그해 직책은 목사만 앉히거나 비웁니다. 담당 가족만 있는 일반 가장은 가족·성도 명단·가장 임명·출석 QR·참여조사 생성·공지 발송·배정 관리를 할 수 없습니다. 임원이 가장을 겸임할 수 있습니다. /my-group은 예전 주소입니다. 가장은 자기 가족 돌봄카드로, 그 외에는 대시보드로 이동합니다. 예배 좌석 배치(/worship, 인쇄 /worship/{id}/print)는 코드와 시드에 남아 있습니다. 메뉴에는 없습니다.Read the full README ↗
PWA 홈 화면에 표시되는 이름은 「2청년회」 입니다 (public/manifest.webmanifest).
2청년회 가장·임원·목사를 위한 주간 운영 도구입니다. 학기 가족 구성, 주일 출석, 참여조사, 리더모임(교안·기도회·악보), 배정모자, 돌봄카드, 공지, 가장 인수인계를 한곳에서 처리합니다.
로그인 후 왼쪽(넓은 화면) 또는 위쪽(좁은 화면)에 나옵니다.
| 메뉴 | 경로 | 누가 |
|---|---|---|
| 대시보드 | /dashboard | 모두. 이번 주일 출석이 비어 있으면 바로가기, 알림 켜기, 최근 리더모임 |
| 출석 | /attendance | 모두. 가장은 자기 가족, 임원·목사는 전체 |
| 리더모임 | /meetings | 모두 |
| 돌봄카드 | 가장은 /reports/{자기 가족}, 그 외 /reports | 그 가족 가장과 목사·관리자만 방을 봄 |
| 참여조사 | /surveys | 모두. 조사 생성은 임원·목사 |
| 공지 | /announcements | 모두 열람. 작성·발송은 임원·목사 |
| 배정모자 | /hat | 모두 |
| 가족 | /groups | 임원·목사 |
| 성도 명단 | /admin/members | 임원·목사 |
| 가장·임원 관리 | /admin/handover | 임원·목사 |
| 배정 관리 | /hat/admin | 임원·목사 |
임원은 회장·부회장·총무·부총무·서기·부서기·회계·부회계입니다. 그해 직책은 목사만 앉히거나 비웁니다. 담당 가족만 있는 일반 가장은 가족·성도 명단·가장 임명·출석 QR·참여조사 생성·공지 발송·배정 관리를 할 수 없습니다. 임원이 가장을 겸임할 수 있습니다.
/my-group은 예전 주소입니다. 가장은 자기 가족 돌봄카드로, 그 외에는 대시보드로 이동합니다.
예배 좌석 배치(/worship, 인쇄 /worship/{id}/print)는 코드와 시드에 남아 있습니다. 메뉴에는 없습니다.
가족에서 미배정으로 보여 새 가족으로 옮깁니다.로컬·배포 모두 Firebase입니다. SQLite/Prisma는 쓰지 않습니다.
| 무엇 | 어디에 |
|---|---|
| 계정, 가족, 가족원, 가장 임기, 학기, 리더모임, 돌봄카드, 출석, 참여조사, 공지, 예배 좌석 | Firestore (src/lib/firebase-admin.ts, src/lib/store/*) |
| 교안, 교안 해설지, 악보 | Vercel Blob (비공개, src/lib/storage.ts) |
| 푸시 구독 | Firestore pushSubscriptions |
| 배정모자 실시간 상태 | Realtime Database (public/sorting-hat/). Firestore와 별개 |
클라이언트는 Firestore·Blob을 직접 읽지 않습니다. 서버 액션(src/app/actions.ts)과 서버 컴포넌트만 firebase-admin으로 접근하고, 권한은 NextAuth 세션으로 검사합니다. 웹 푸시(FCM)만 브라우저의 Firebase Messaging SDK와 서비스 워커를 쓰고, 토큰은 서버가 저장합니다.
로그인 사용자(목사·관리자·가장·임원)만 받을 수 있습니다. 가족원 계정은 없고, 돌봄카드는 카카오톡과 병행합니다.
같은 계정으로 브라우저와 설치형 PWA에서 각각 알림을 켜도 사용자당 최신 토큰 하나만 남습니다. 발송도 그 토큰만 쓰고, 같은 이벤트는 notification.tag로 한 번만 보이게 합니다.
| 언제 | 누구에게 | 누르면 |
|---|---|---|
| 가장이 돌봄카드를 보냄 | 구독 중인 목사·관리자 | /reports/{groupId} |
| 리더모임에서 기도회 인도 가장을 저장 | 그 담당자 | /meetings/{meetingId} |
| 매주 일요일 18:00 (서울) | 담당 가족이 있는 가장. 목사·임원은 제외 | /attendance/{sundayId} (가장은 자기 가족 화면) |
| 공지를 지금 보냄 | all 알림을 켠 로그인 사용자, leaders 담당 가족 있는 가장, 또는 users로 고른 사람 | /announcements/{id} |
기도회 인도 가장은 리더모임 상세에서 그 주 가장을 고릅니다. 출석 리마인더는 vercel.json Cron 0 9 * * 0(일요일 09:00 UTC = 18:00 KST)이 GET /api/cron/attendance-reminder를 호출합니다. Authorization: Bearer <CRON_SECRET>이 필요하고, Firestore settings/attendanceReminder의 lastRemindedSundayId로 같은 주일 중복 발송을 막습니다. 일요일이 아니거나, 이미 보냈거나, 담당 가족 가장·구독 토큰이 없으면 건너뜁니다.
Firebase 콘솔
public/sorting-hat/firebase-config.js와 같은 프로젝트면 그 웹 앱 설정을 재사용합니다.NEXT_PUBLIC_FIREBASE_VAPID_KEY.FIREBASE_PROJECT_ID와 NEXT_PUBLIC_FIREBASE_PROJECT_ID가 같아야 합니다.NEXT_PUBLIC_FIREBASE_API_KEY="..."
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN="....firebaseapp.com"
NEXT_PUBLIC_FIREBASE_PROJECT_ID="..."
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID="..."
NEXT_PUBLIC_FIREBASE_APP_ID="..."
NEXT_PUBLIC_FIREBASE_VAPID_KEY="..."
서비스 계정 키는 git에 넣지 않습니다.
iPhone에서 홈 화면에 추가
iOS에는 설치 버튼이 없습니다. Safari에서 직접 홈 화면에 넣어야 하고, 웹 푸시는 iOS 16.4 이상에서 그 앱을 열었을 때만 됩니다. Chrome이나 카카오톡 인앱 브라우저에는 이 메뉴가 없습니다.
로컬에서 출석 리마인더만 흉내 낼 때 (일요일, 에뮬레이터·Firebase Admin·CRON_SECRET 필요):
curl -sS -H "Authorization: Bearer $CRON_SECRET" \
"http://localhost:43123/api/cron/attendance-reminder"
{"status":"sent",...} 이면 발송된 것이고, 같은 주일에 다시 호출하면 already_reminded_for_sunday로 건너뜁니다. 다른 요일은 not_sunday_...입니다.
BLOB_READ_WRITE_TOKEN, Vercel에서 스토어 연결 시 주입).env.example을 복사해 .env를 만듭니다.
로컬 (에뮬레이터)
Firestore만 로컬에서 돌려도 됩니다(Storage 에뮬레이터는 이 앱의 교안·악보에 쓰이지 않습니다). 프로젝트 ID는 demo-로 시작해야 실제 Firebase에 붙지 않습니다.
npm install -g firebase-tools
macOS에서 Java가 PATH에 없으면 에뮬레이터가 시작하지 않습니다.
brew install openjdk
export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"
export JAVA_HOME="/opt/homebrew/opt/openjdk"
이 터미널은 켜 둡니다.
firebase emulators:start --only firestore --project demo-mokyang-flow
This is the beginning of the README. Read the rest at the original. Read the full README ↗