Lattice
A workspace for your research.
AI 문서 관리 플랫폼 – 문서 자동 요약·Q&A, N+1 쿼리 최적화(101회→2회)
Translation pending
ProductivityTypeScript · PythonGitHub @ZestoperOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
AI 기반 문서 관리 플랫폼. 문서 업로드, Gmail 연동, AI 요약·브리핑, 실시간 채팅을 하나의 서비스에서 제공합니다. 문서 관리 • PDF, DOCX, TXT 파일 업로드 및 텍스트 추출 • 업로드 즉시 LLM 기반 AI 자동 요약 생성 • 폴더·태그로 문서 분류, 드래그 앤 드롭으로 이동 • 전문 검색 (제목·본문·태그) • 휴지통 — 30일 후 자동 영구 삭제 Gmail 연동 • Google OAuth 2.0 인증으로 Gmail 계정 연결 • 이메일을 문서로 변환 + AI 요약 자동 생성 • Premium 플랜: 2분마다 자동 동기화, 발신자 필터·스팸 관리 • Gmail 휴지통 이동 / 받은편지함 복원 AI 기능 • 문서 요약: 업로드 시 LLaMA 3로 3~4문장 요약 • 문서 Q&A: 문서 본문을 컨텍스트로 자연어 질의응답 (Standard 이상) • AI 일간 브리핑: 오늘 추가된 문서 전체를 분석해 핵심 요약 + 할 일 추천 (Premium) • 폴더 브리핑: 특정 폴더의 문서를 선택해 즉시 브리핑 생성Read the full README ↗
AI 기반 문서 관리 플랫폼. 문서 업로드, Gmail 연동, AI 요약·브리핑, 실시간 채팅을 하나의 서비스에서 제공합니다.
https://github.com/user-attachments/assets/dd162714-f86d-4e3a-a5b9-10f5ddbdd893
서비스: https://neatly-wheat.vercel.app
백엔드는 Render 무료 플랜이라 처음 접속 시 서버가 깨어나는 데 최대 1분 정도 걸립니다.
| 기능 | Neatly | Notion | Evernote | Google Drive |
|---|---|---|---|---|
| 문서 관리·폴더·태그 | O | O | O | O |
| 파일 업로드 (PDF·DOCX) | O | O | O | O |
| AI 자동 요약 | O | 유료 | X | X |
| AI 문서 Q&A | O | 유료 | X | X |
| AI 일간 브리핑 | O | X | X | X |
| Gmail 연동 및 이메일 자동 문서화 | O | X | X | X |
| 이메일 자동 동기화 | O | X | X | X |
| 실시간 채팅 | O | X | X | X |
Gmail 이메일을 자동으로 문서로 변환하고 AI가 요약·브리핑까지 생성하는 점이 기존 서비스와의 핵심 차별점입니다.
| 구분 | 사용 기술 |
|---|---|
| Frontend | React 18, TypeScript, Vite, React Router v6 |
| Backend | FastAPI, SQLAlchemy, PostgreSQL (Supabase) |
| AI | Groq API (gpt-oss-120b / gpt-oss-20b) · 장애·한도 초과 시 Cerebras 자동 전환 |
| 인증 | JWT, Google OAuth 2.0 |
| 실시간 | WebSocket |
| 스케줄러 | APScheduler (보조 동기화 · 매일 04:00 Gmail 감시 갱신) · GitHub Actions (매일 03:53 서버 깨우기) |
| 배포 | Vercel (Frontend) · Render (Backend) · Supabase (DB) |
| 파일 파싱 | pdfplumber, python-docx |
my-app/ # React 프론트엔드 (Vite)
src/
pages/ # 각 페이지 컴포넌트
components/ # 공통 컴포넌트 (Sidebar, Layout, ChatModal 등)
api/ # Axios 기반 API 클라이언트
context/ # Toast, Refresh 전역 상태
backend/ # FastAPI 백엔드
routers/
auth.py # 로그인·회원가입·JWT
documents.py # 문서 CRUD + AI 요약
gmail.py # Gmail API 연동
gmail_push.py # Gmail Pub/Sub 실시간 수신 (watch 등록 · 푸시 처리)
calendar.py # 메일에서 추출한 일정
email_sync.py # 이메일 자동 동기화
briefing.py # AI 브리핑 생성
ai.py # 문서 Q&A
chat.py # WebSocket 채팅
search.py # 전문 검색
friends.py # 친구 관계
scheduler.py # 주기적 백그라운드 작업
models.py # DB 스키마 (SQLAlchemy)
gmail_utils.py # Gmail 자격증명 공통 유틸
.github/workflows/daily-wake.yml # 매일 03:53 KST 서버를 깨워 04:00 Gmail 감시 갱신이 돌게 함
cd backend
pip install -r requirements.txt
.env 파일 생성:
DATABASE_URL=postgresql://user:password@localhost:5432/neatly
SECRET_KEY=your-secret-key
GROQ_API_KEY=your-groq-api-key
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
GOOGLE_REDIRECT_URI=http://localhost:8000/auth/gmail/callback
FRONTEND_URL=http://localhost:5173
BACKEND_URL=http://localhost:8000
python create_tables.py # DB 테이블 생성
uvicorn main:app --reload
cd my-app
npm install
.env 파일 생성:
VITE_API_BASE_URL=http://localhost:8000
npm run dev
| 기능 | FREE | STANDARD | PREMIUM |
|---|---|---|---|
| 문서 업로드 (하루 3개) | O | O | O |
| 문서 업로드 (무제한) | O | O | |
| AI 문서 Q&A | O | O | |
| Gmail 연동·변환 | O | O | |
| AI 일간 브리핑 | O | ||
| Gmail 자동 동기화 | O | ||
| 발신자 필터 | O |
서버 실행 후 http://localhost:8000/docs 에서 Swagger UI로 확인할 수 있습니다.
| 문제 | 원인 | 해결 |
|---|---|---|
| Google OAuth "Missing code verifier" 오류 | 최신 google-auth-oauthlib이 PKCE를 자동 추가하는데, 서버사이드 리다이렉트 흐름에서 code_verifier를 요청 사이에 유지할 수 없음 | google-auth-oauthlib 대신 requests_oauthlib.OAuth2Session을 직접 사용해 PKCE 없이 인가 코드 흐름 처리 |
| Gmail 연결 후 1시간이 지나면 동기화가 silently 실패 | OAuth 콜백에서 expires_at을 DB에 저장하지 않아 creds.expiry = None → creds.expired 가 항상 False → 토큰 갱신 건너뜀 → Gmail API 401 → except 절이 0 반환 | 콜백에서 token["expires_at"]을 gmail_token_expiry에 저장, refresh_if_expired()에 expiry is None 조건 추가 |
| LLaMA 출력에 베트남어 자모·박스 문자 혼입 | Groq API가 간헐적으로 비정상 유니코드 출력 | _sanitize_ai_output() 후처리 함수 추가 — unicodedata.category()로 제어문자 필터링, 허용 문자셋 정규식 적용 |
| iOS Safari에서 앱 전체 흰 화면 | window.Notification 미지원 환경에서 Notification API 접근 시 런타임 오류 | typeof Notification !== 'undefined' 가드 추가, 최상단 ErrorBoundary로 치명적 오류 catch |
| WebSocket 재연결 시 메시지 중복 수신 | 네트워크 끊김 후 재연결 시 같은 사용자의 연결이 두 개 이상 유지됨 | ConnectionManager.connect()에서 동일 user_id의 기존 연결을 close() 후 교체 |
| 문서 목록 API에서 N+1 쿼리 발생 | 문서마다 태그 SELECT가 개별 실행 (문서 100개 = 쿼리 101회) | docs_with_tags_batch()로 전체 문서 ID를 IN 쿼리 1회로 태그 일괄 조회 후 메모리 매핑 (쿼리 수 N+1 → 2) |
| MySQL → PostgreSQL 마이그레이션 충돌 | CHAR(36) 타입 비교 불일치, Enum 타입명 미지정으로 PostgreSQL 충돌 | String(36)으로 교체, Enum 선언에 name= 파라미터 명시 |
| Vercel 배포 후 직접 URL 접근 시 404 | SPA 라우팅 미설정 | vercel.json에 모든 경로를 index.html로 rewrite 설정 추가 |
| 일주일 동안 메일이 없으면 실시간 수신이 끊김 | Gmail 감시(watch)는 7일 뒤 만료되고 갱신은 서버가 깨어 있을 때만 실행 · Render 무료 서버는 요청이 없으면 잠듦 | GitHub Actions가 매일 03:53에 서버를 깨워 10분간 유지 → 04:00 갱신 작업이 매일 실행 |