Kamra PMS
Kamra는 오픈소스 AI 기반 호텔 PMS로 프런트 데스크·예약·하우스키핑·청구·GST를 지원하고 역할별 원터치 데모 로그인 제공
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
구직자가 채용공고, 오퍼 안내, 근로계약서에 적힌 주요 근로조건을 항목별로 확인하는 웹앱입니다. 문서의 기재 상태와 원문 근거만 보여 주며, 법률 위반 여부·기업 신뢰도·향후 조건 변경 가능성은 판단하지 않습니다. Node.js 20 이상이 필요합니다. AI 분석은 Google Gemini API 무료 등급(gemini-3.5-flash-lite)을 사용하며, 유료 모델로 자동 전환하지 않습니다. • 키 발급: Google AI Studio에서 결제 수단을 연결하지 않은 프로젝트로 발급하면 무료 등급으로만 동작합니다. 결제(billing)를 켜면 유료 요금이 적용될 수 있으니 켜지 마세요. • GEMINI_API_KEY가 없으면 데모로 바뀌지 않고, 분석 요청에 "AI 분석이 아직 설정되지 않았어요" 오류를 안내합니다. • 데모 모드는 DEMO_MODE=true를 명시했을 때만 켜집니다. 데모 결과는 헤더 배지와 결과 화면 안내로 AI 결과와 구분됩니다. • 무료 사용량 한도(HTTP 429)에 도달하면 "AI 무료 사용량 한도에 도달했어요"를 안내합니다.README 전문 보기 ↗
입사 전, 근로조건부터 일단 확인하세요. 채용공고, 오퍼 문자·메일, 근로계약서 중 자료 한 건으로 적힌 근로조건과 원문 근거, '지금 확인할 내용'을 정리하고, 지원·입사 건별 기록으로 남겨 새 안내가 오면 이어서 확인하는 웹앱입니다(PRD v3.1). 문서에 적힌 사실과 원문 근거만 보여 주며, 법률 위반 여부·계약의 효력·기업의 신뢰도·입사 적합성은 판단하지 않습니다.
#/new, POST /api/analyze + includeCriteria): 문서 유형(채용공고·오퍼·합격 안내·근로계약서)을 고르고 텍스트를 붙여넣거나 사진·PDF를 올립니다(사진·PDF는 S03에서 추출 텍스트를 확인·수정한 수정본만 분석). 두 번째 문서를 요구하지 않습니다.#/records/:id): 지금 확인할 내용(최대 3건 + 접힌 추가 확인) → 주요 근로조건(자료별 값·원문) → 등록된 안내 자료(등록일) → 필요할 때 하기(새 안내 추가·질문 복사·기록 삭제).#/records/:id/add): 같은 기록에 자료를 덧붙입니다. 이전 자료의 텍스트·분석·원문은 바꾸지 않고, 항목마다 같은 내용으로 안내됐어요 / 서로 다른 안내가 있어요 / 이번 안내에 새롭게 적혔어요 / 이번 안내에서는 확인되지 않아요 / 서로 비교하기 어려워요 / 분석 확인 불가를 보여 줍니다(public/relate.js, AI 재호출 없음).#/records/:id/item/:no): 자료별 세부 기준·원문, 관계 이유, 질문, 내가 기록한 답변(선택 메모, 작성·수정·삭제).#/records): 기록 목록·삭제·저장 범위 안내. 기록은 브라우저 IndexedDB에만 저장합니다(public/store.js, 저장 후 다시 읽어 확인한 뒤에만 '저장했어요'; 실패하면 '저장되지 않았어요'와 다시 저장).POST /api/compare(2문서 비교 API)는 남아 있지만 화면에서는 쓰지 않습니다. 비교 규칙은 public/compare-core.js로 옮겨 브라우저(기록의 자료 간 관계)와 서버가 함께 씁니다.문서별 추출·근거 검증·기재 상태 판정은 점검 기준 v2.2(10개 주제, 32개 세부기준)를 따릅니다.
판정 기준의 단일 원천은 동결 기준표 design-handoff/spec/04_점검기준표_v2.2_동결원문.md입니다.
Node.js 20 이상이 필요합니다. AI 분석은 Google Gemini API 무료 등급(gemini-3.5-flash-lite)을 사용하며, 유료 모델로 자동 전환하지 않습니다.
npm install
# GEMINI_API_KEY 는 서버 환경변수로만 등록합니다 (코드·채팅·브라우저에 넣지 않음).
npm start # 실제 AI 분석, http://localhost:3000
npm run demo # DEMO_MODE=true — 키워드 규칙 데모 (AI 아님)
GEMINI_API_KEY가 없으면 데모로 바뀌지 않고, 분석 요청에 "AI 분석이 아직 설정되지 않았어요" 오류를 안내합니다.DEMO_MODE=true를 명시했을 때만 켜집니다. 데모 결과는 헤더 배지와 결과 화면 안내로 AI 결과와 구분됩니다.public/ocr-prep.js): 작은 칸마다 바탕 밝기를 구해 바탕이 비슷한 영역별로 '흰 바탕 위 검은 글자'로 맞춥니다. 색 배너·버튼의 흰 글자, 다크 모드 화면, 일부만 어두운 배너, 회색 칩·표 머리글을 모두 같은 방식으로 처리합니다(이전에는 어두운 가로줄 전체만 반전해 중간 밝기 배너 글자를 놓치고, 일부만 어두운 배너는 줄 전체가 망가졌습니다). 글자 크기를 재서 작은 글자(저해상도·메신저로 받은 캡처)는 키우고, 표 테두리·버튼 외곽선 같은 긴 직선과 가장자리 잔상을 지우고, 흰 여백을 둡니다.public/ocr-layout.js): 정리된 이미지에서 행(가로 빈 띠)과 칸(넓은 세로 빈 곳)을 찾아, 인식된 단어를 위치대로 칸에 넣고 '항목명 + 값의 첫 줄', 값의 나머지 줄 순서로 다시 엮습니다. 표의 아이콘 칸(한글이 없거나 아이콘 크기에 확신이 낮은 칸)은 빼고, 행 가운데의 아이콘은 새 항목의 시작으로 봐서 좌우 2열 목록(복리후생 등)을 한 줄에 하나씩 나눕니다. Tesseract가 두 줄짜리 값 가운데의 항목명을 위아래로 잘라 읽거나(예: '근무시간' → '근' + '=e') 아이콘과 붙여 읽는 문제가 있어, 칸이 여러 개인 행은 칸마다 따로 다시 읽고 전체 인식보다 확실하거나 칸을 더 많이 덮는 결과를 고릅니다(전체 OCR만 / 배치만 / 배치+칸별 OCR 비교는 docs/ocr-accuracy-report.md).2O27·202712.31처럼 숫자 사이에 글자가 섞이거나 날짜·시간에 없는 형태의 숫자, 한글 문서에서 신뢰도 낮게 영문으로 읽힌 단어 예: '스낵바' → Addl)와 '일부만 읽힘'(이미지에서 찾은 글자 줄 수보다 읽힌 줄이 크게 적음)을 판단해, 이미지 목록과 안내 문구로 원본과 비교할 곳을 알려 줍니다. 값은 인식한 그대로 보여 주고 고치지 않습니다.node scripts/ocr-bench.mjs (가상 채용공고 이미지 17장 test/fixtures/ocr-bench/(생성: scripts/make-ocr-bench-fixtures.mjs)과 실제 서비스에서 오류가 난 오퍼 안내문 캡처 2장 test/fixtures/ocr-real/(이름은 [이름]으로 가려진 이미지, 정답은 원본을 보고 옮겨 적음)). 수정 전후 비교 결과는 docs/ocr-accuracy-report.md에 있습니다.public/compare-core.js, src/compare.js는 재수출)여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗
public/vendor/public/vendor/npm run vendornode_modulespublic/