Synaplan
기업을 위한 오픈소스 AI 플랫폼
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
팀 점심·저녁 모임의 참석 여부 · 선호 식당 · 선호 메뉴를 PIN 4자리로 보호된 투표 카드로 간편하게 취합하는 웹앱입니다. 식사 모임 외에 일반 투표(워크숍 날짜, 기념품 등)도 같은 흐름으로 만들 수 있습니다.README 전문 보기 ↗
팀 점심·저녁 모임의 참석 여부 · 선호 식당 · 선호 메뉴를 PIN 4자리로 보호된 투표 카드로 간편하게 취합하는 웹앱입니다. 식사 모임 외에 일반 투표(워크숍 날짜, 기념품 등)도 같은 흐름으로 만들 수 있습니다.
| 구분 | 내용 |
|---|---|
| 카드 목록 | 진행 중 카드는 크고 어두운 카드로 상단 배치, 마감된 카드는 작은 목록으로 하단 배치 (최신순) |
| 팀 섹션 | 상단 팀 탭(전체/회계세무부 …) 선택 시 해당 팀 카드만 표시, 선택은 기기에 기억되고 ?team= 링크로 공유 가능 |
| PIN 보호 | 카드마다 "PIN 보호" 배지 표시, PIN 입력 후에만 질문·결과 열람/응답 가능. IP당 10분 5회, 투표당 1시간 30회 오답 시 차단. PIN은 서버 비밀키로 HMAC 해시 저장 |
| 참여 흐름 | PIN → 이름(명단이 있으면 탭 선택) → 참석 여부 → 식당 → (메뉴) → 요청사항(선택) → 완료 애니메이션 → 실시간 결과 |
| 2단계 투표 | ① 참석 + 식당 후보 투표 → 관리자가 식당 확정 → ② 확정된 식당의 메뉴로 2차 투표. 기존 응답자 카드에 '2차 참여' 표시, 들어오면 메뉴 질문으로 바로 이동 |
| 식당 방식 | 후보 투표 / 전체 중에서(지역 식당 전체가 후보, 참여자가 검색해서 1인당 최대 1·2·3·5곳 선택, 많이 고른 순 표시·표 없는 식당은 결과에서 접힘) / 이미 정함(장소 카드로 자동 안내, 질문 없음) / 묻지 않음 중 선택 |
| 지역 구분 | 상단에서 지역 선택(기기에 기억, ?site=dangjin 링크 공유). 투표·팀·식당 목록이 지역별로 분리. 누구나 새 지역 추가 가능 (아래 '지역' 참고) |
| 팀 목록 | 한국동서발전 홈페이지 조직도 기준 부서명을 기본 지역(울산·당진)별로 미리 등록(lib/teams.ts). 투표 만들 때 검색(초성 가능)·전체 목록에서 고르고, 없으면 직접 입력. 띄어쓰기만 다른 이름은 같은 팀으로 합침 |
| 식당 공용 목록 | 법인카드 사용 상위 88곳(울산 44·당진 44)과 이후 요청으로 추가한 식당(docs/places-data.md)을 네이버 정보(주소·전화·메뉴·가격)로 미리 등록. 이름·메뉴·초성(예: ㅁㄱㅎ) 검색, 이 사이트에서 많이 고른 순 정렬(동률이면 초기 법인카드 사용 건수 참고, 숫자는 표시 안 함), 드롭다운에서 탭해 선택 |
| 재사용·수정 | 선택한 식당은 '편집'으로 바로 수정(공용 목록에 저장), 없는 식당은 검색어로 즉시 추가. 이미 만든 투표는 당시 정보를 스냅샷으로 보관해 영향 없음 |
| 메뉴 자동 제안 | 식당을 고르면 그 식당 메뉴·가격이 탭 한 번으로 선택지가 됨 (1차 확정 후 2차 메뉴 투표에서도 동일) |
| 참여자 화면 미리보기 | 만드는 화면 하단에 참여자가 거치게 될 단계를 타임라인으로 표시 |
| 참여 대상 명단 | 참여자는 이름을 탭해서 선택(오타·동명 혼선 방지), 결과에서 미응답자 확인 |
| 명단 보관함 | 명단을 제목(예: 회계세무부) + PIN으로 저장해 재사용. 목록에는 제목만 보이고, 이름은 PIN 입력 시에만 불러옴 |
| 진행 단계 표시 | 카드·결과·링크 미리보기에 현재 단계(예: 식당 투표 ✓ → 메뉴 선택 중 → 마감) 표시 |
| 응답 단계 이동 | 참여 화면 상단의 단계 이동줄(이름·참석·식당·메뉴·요청사항)에서 지난 단계를 탭하면 그 화면으로 돌아가 수정 |
| 명의 표시 | 화면 상단에 '관리자로 보는 중' / 'OOO님으로 응답 중' / '관리자 · OOO님 대신 입력 중' 표시 |
| 관리자 PIN | 만들 때 참여 PIN과 별도로 설정. 다른 폰·카톡 내 브라우저에서도 결과 화면 하단 '관리자 모드로 전환'으로 관리·대리 입력 가능 |
| 메뉴 받기 | 후보 투표 → 식당 확정 후 '메뉴 투표 열기'(확정 식당 메뉴 자동 채움) / 이미 정한 식당 → '메뉴도 받기'(식당 메뉴 자동 채움) / 묻지 않음 → 직접 입력. 메뉴는 개인 주문이라 확정 없이 '주문 집계'로 표시 |
| 누락 안내 | 버튼을 비활성으로 막지 않고, 누르면 입력·선택해야 할 첫 칸으로 이동해 빨간 테두리로 강조 |
| 생성자 대리 입력 | 투표를 만든 사람은 누구의 응답이든 대신 입력·수정 가능(미응답자 이름 탭 → 바로 입력). 결과에 '(대리)' 표시, 본인은 이후 자기 기기에서 수정 가능 |
| 결과 확정 | 선택형 질문은 관리자가 '결과 확정' 가능 (식당·날짜 등). 결과 복사 텍스트에도 반영 |
| 예약 인원 | 참석 확정 인원과 미정 포함 최대 인원을 바로 표시 |
| 스마트 분기 | '불참' 선택 시 식당·메뉴 질문 자동 생략. 단일 선택은 탭하면 자동으로 다음 단계 |
| 응답 수정 | 같은 이름으로 다시 응답하면 기존 응답을 불러와 수정 |
| 결과 | 참석/미정/불참 인원, 항목별 득표 막대와 투표자 이름, 1위 강조, 10초마다 자동 갱신 |
| 결과 복사 | 메신저(카카오톡 등)에 붙여넣기 좋은 텍스트 요약 복사 |
| 공유 | /p/<id> 공유 링크 (링크 미리보기에는 제목·팀만 노출), 모바일은 기본 공유 시트 사용 |
| 관리자 | 만든 기기에 관리 권한 자동 저장(왕관 표시) → 지금 마감 / 다시 열기 / 삭제. 다른 기기용 "관리 링크" 제공 |
| 자동 마감 | 식사 모임은 모임 시작 시각에 자동 마감 (또는 마감 시각 직접 지정) |
| 트래픽 | GoatCounter(무료, 쿠키 없음) 페이지뷰 + 이벤트(투표 생성·응답 완료·PIN 해제·결과 복사) |
식당 초기 데이터의 출처·판정 기준·확인이 필요한 항목은 docs/places-data.md에 정리돼 있습니다.
| 구분 | 내용 |
|---|---|
| 기본 지역 | 울산·당진 (lib/places.ts의 BUILTIN_REGIONS). 부서 목록(lib/teams.ts)과 초기 식당(lib/places-seed.ts) 포함, 이름 변경·숨김 불가 |
| 지역 추가 | 누구나 홈 상단 지역 줄 오른쪽 끝 버튼에서 추가. 띄어쓰기·대소문자만 다른 이름은 기존 지역으로 이동. IP당 1시간 5개 |
| 노출 | 새 지역은 첫 투표가 생기기 전까지 만든 기기와 ?site= 링크로만 보임 (빈 지역이 모두의 화면을 채우지 않도록) |
| 상단 표시 | 지역이 늘어나도 앞의 2곳 + 지금 고른 지역 + +N 버튼으로 고정. 나머지와 추가는 +N 목록 시트에서 |
| 순서 | 지금은 기본 지역(울산 → 당진) 다음 추가된 순. 투표 수 순으로 바꾸려면 sortRegions 한 곳만 수정 |
| 정리 | 사이트 관리 → 지역: 추가된 지역의 이름 바꾸기, 숨기기(새 투표 불가, 기존 투표 링크는 열림), 합치기(투표·명단·식당 이동, 예전 링크도 합친 지역으로) |
| 식당 목록 | 홈 상단 '식당'에서 지역별 식당을 투표 없이 보고 검색(초성)·정렬(많이 고른 순/이름순), 누구나 추가·수정. 삭제는 사이트 관리자만 |
GitHub Pages(저장소 설정 한 번으로 켜는 방식)는 정적 파일만 호스팅하므로 투표 저장·PIN 검증 같은 서버 기능을 쓸 수 없습니다. 대신 Vercel은 최초 1회만 연결해 두면, 이후에는 main 브랜치에 반영(merge/push)될 때마다 자동으로 재배포됩니다.
ewp-rsvp 저장소 Import → Deploy (설정 변경 불필요)KV_REST_API_URL, KV_REST_API_TOKEN 환경변수가 자동으로 추가됩니다.ewp-rsvp가 기본값). 다른 GoatCounter 계정을 쓰려면 Vercel Settings → Environment Variables에 NEXT_PUBLIC_GOATCOUNTER_CODE=<코드>를 넣고 재배포AUTH_SECRET = 임의의 긴 문자열 (미설정 시 Redis에 자동 생성·보관)
MASTER_KEY = 8자 이상 비밀 문구. 설정하면 홈 하단 '이용 안내' 맨 아래에 '사이트 관리'가 생기고, 로그인하면 모든 투표를 PIN 없이 열어 마감·삭제, 저장된 명단 열기·수정·삭제, 공용 식당 삭제, 추가된 지역 정리를 할 수 있어요 (이 창에서 2시간 유지)이후 운영: 코드 변경이
main에 머지되면 Vercel이 자동 배포합니다. PR을 열면 미리보기(Preview) URL도 자동 생성됩니다.
| 항목 | 조치 |
|---|---|
| 수집 최소화 | 이름과 응답만 수집 (전화·이메일·계정 없음) |
| 열람 범위 | 이름·응답·명단은 PIN 인증 후에만 조회. 공개 목록은 제목·팀명·일시·응답 수만 |
| 보관 기간 | 투표·응답은 삭제하기 전까지 계속 보관 (생성자·사이트 관리자가 삭제). 예전 90일 자동 삭제 설정은 첫 목록 조회 때 한 번 해제 |
| 기기 저장 | 명단(실명)은 브라우저에 저장하지 않음 (예전 버전 저장분도 자동 정리) |
| 공유 문구 | '응답 요청' 공유 메시지에는 미응답자 실명 대신 인원수만 |
| 로그·통계 | 레이트리밋용 IP는 해시로만 최대 1시간 보관. GoatCounter는 쿠키 미사용, 응답 내용 미전송 |
| 삭제 | 생성자가 개별 응답 초기화·투표 삭제 가능. 앱 하단 '이용 안내 · 개인정보'에 고지 |
| 항목 | 저장 위치 | 공개 저장소에 노출되나? |
|---|---|---|
| 소스 코드 | GitHub | 노출됨 (보안이 코드 비밀에 의존하지 않도록 설계) |
| 투표·응답·명단 데이터 | Upstash Redis | 노출 안 됨 (저장소에 데이터 없음) |
| PIN | Redis에 HMAC-SHA256(비밀키, salt+PIN) 해시로만 저장 | 노출 안 됨 (원문 PIN 미저장) |
DB 접속 토큰·AUTH_SECRET | Vercel 환경변수 | 노출 안 됨 (.env*는 .gitignore로 커밋 차단) |
x-forwarded-for를 덮어써 IP 위조를 차단합니다.npm install
npm run dev # http://localhost:3000 (환경변수 없으면 데모 모드)