TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
몇 분만에 깔끔한 이력서를 만들고, AI가 PDF·이미지에서 가져와 실시간 링크로 공유, 원클릭 PDF 내보내기
Build a polished resume in minutes and share it as a live link that stays up to date, with AI import from PDF or image and one-click PDF export.
생산성TypeScript · CSSGitHub @JoeDunnoHowToCode온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A resume webpage that you can share with link instead of document.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Your AI-Powered Professional Presence — Build stunning, shareable resumes in minutes.
PresenceCV is a modern, AI-powered online resume builder built with React, TypeScript, and Firebase. It features a rich editing experience with drag-and-drop sections, real-time sharing, PDF export, multi-language (i18n) support, and Gemini AI–powered resume importing.
• Node.js 18+
• A Firebase project with Authentication (Google provider) and Firestore Database enabled
• (Optional) A Gemini API key for AI resume importREADME 전문 보기 ↗Your AI-Powered Professional Presence — Build stunning, shareable resumes in minutes.
PresenceCV is a modern, AI-powered online resume builder built with React, TypeScript, and Firebase. It features a rich editing experience with drag-and-drop sections, real-time sharing, PDF export, multi-language (i18n) support, and Gemini AI–powered resume importing.
| Feature | Description |
|---|---|
| AI Resume Import | Upload a PDF, JPG, or PNG and Gemini AI extracts structured data automatically |
| Live Share Links | Generate a URL that updates in real-time as you edit |
| Snapshot Links | Capture a point-in-time version of your resume to share |
| PDF Export | Clean, A4-optimized print layout with auto-scaling |
| Multi-Profile | Create and manage multiple resume versions for different opportunities |
| Multi-Language (i18n) | Seamless internationalization with English and Traditional Chinese UI switching |
| XSS & URL Sanitization | DOMPurify-powered sanitization preventing javascript: XSS script execution |
| Rate Limiting & Security | Upstash Redis API rate limiter and Firebase App Check bot protection |
| Theme Accent Colors | 6 preset accent colors + custom hex color picker |
| Photo Upload | Upload and crop a profile photo with an in-browser cropper |
| Drag & Drop | Reorder sections and items with smooth drag-and-drop |
| Warm Glassmorphic UI | Premium warm cream-tone aesthetic with glassmorphic cards and animated smoke background |
git clone <your-repo-url>
cd PresenceCV
npm install
cp .env.example .env
Edit .env and fill in your values:
# ------------------------------------------------------------------------------
# 1. Firebase Client Configuration (Required for Frontend)
# ------------------------------------------------------------------------------
VITE_FIREBASE_API_KEY=your_api_key
VITE_FIREBASE_AUTH_DOMAIN=your_project_id.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=your_project_id
VITE_FIREBASE_STORAGE_BUCKET=your_project_id.appspot.com
VITE_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
VITE_FIREBASE_APP_ID=your_app_id
VITE_FIREBASE_DATABASE_ID= # Optional: Non-default Firestore DB ID
# ------------------------------------------------------------------------------
# 2. AI Features Configuration (Required for AI Resume Import)
# ------------------------------------------------------------------------------
GEMINI_API_KEY=your_gemini_api_key
# ------------------------------------------------------------------------------
# 3. Security & Admin Configuration (Required for Serverless Admin SDK)
# ------------------------------------------------------------------------------
FIREBASE_SERVICE_ACCOUNT_KEY= # Stringified JSON of your Firebase Admin Service Account Key
# ------------------------------------------------------------------------------
# 4. Serverless API Rate Limiting (Optional but Recommended)
# ------------------------------------------------------------------------------
UPSTASH_REDIS_REST_URL=your_upstash_redis_url
UPSTASH_REDIS_REST_TOKEN=your_upstash_redis_token
# ------------------------------------------------------------------------------
# 5. Firebase App Check & Security (Optional)
# ------------------------------------------------------------------------------
# Optional: Google reCAPTCHA v3 Site Key for App Check. Safely bypassed if omitted.
VITE_RECAPTCHA_SITE_KEY=your_recaptcha_site_key
Note: Frontend-accessible variables must be prefixed with
VITE_(Vite requirement). Server-side credentials (GEMINI_API_KEY,FIREBASE_SERVICE_ACCOUNT_KEY,UPSTASH_*) do NOT need the prefix and remain hidden from client bundles.
npm run dev
Open http://localhost:3000 — this starts an Express server with Vite middleware for hot module replacement.
npm run build
npm start
To run unit, integration, and security rules tests:
# Run tests once (Vitest)
npm run test
# Run tests in watch mode
npm run test:watch
# Run Firestore security rules tests (requires a Java JRE for the emulator)
npm run test:rules
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript 5.8, TailwindCSS 4 |
| UI & i18n Libraries | lucide-react, Motion (Framer Motion), @hello-pangea/dnd, react-easy-crop, i18next, i18next-browser-languagedetector, DOMPurify |
| Routing | react-router-dom v7 |
| Build | Vite 6 |
| Dev Server | Express 4 + Vite middleware |
| AI | Google Gemini (@google/genai) |
| Backend & Security | Firebase Authentication (Google OAuth), Firestore, Firebase App Check (reCAPTCHA v3), Upstash Redis Rate Limiter |
| Testing | Vitest, React Testing Library, jsdom, @firebase/rules-unit-testing |
| Deployment | Vercel (SPA + Serverless Functions) |
PresenceCV/
├── index.html # SPA entry point
├── server.ts # Express dev server + API proxy
├── vite.config.ts # Vite configuration
├── vitest.config.ts # Vitest configuration
├── tsconfig.json # TypeScript configuration
├── firebase.json # Firebase config
├── firestore.rules # Firestore security rules
├── vercel.json # Vercel deployment config
├── .env.example # Environment variables template
├── package.json # Dependencies and scripts
│
├── api/
│ └── parse-resume.ts # Vercel serverless functions (AI parser)
│
├── public/
│ └── favicon.png # Monogram CV logo & favicon
│
├── tests/ # Vitest unit & security rules tests
│ ├── EditorPage.test.tsx
│ ├── ImportResumeModal.test.tsx
│ ├── LanguageSwitcher.test.tsx
│ ├── ViewerPage.test.tsx
│ ├── api.parse-resume.test.ts
│ ├── firestore.rules.test.ts
│ ├── htmlSanitizer.test.ts
│ ├── performance.test.tsx
│ ├── rateLimiter.test.ts
│ ├── useResume.test.ts
│ └── utils.test.ts
│
└── src/
├── main.tsx # React DOM entry
├── App.tsx # Root component (routing + auth)
├── setupTests.ts # Vitest setup (jest-dom, whatwg-fetch)
├── types.ts # Shared TypeScript interfaces
├── constants.ts # Application constants
├── index.css # Global styles + print layout
│
├── components/ # Reusable UI components (Editor, Viewer, Modal, i18n)
├── contexts/ # React context providers (AuthContext)
├── data/ # Static resume templates
├── hooks/ # Custom hooks (useResume — core state mgmt)
├── i18n/ # Internationalization config and translations
├── lib/ # Firebase init, error handling, App Check
├── pages/ # Route-level page components (Editor, Viewer, Share)
└── utils/ # Sanitization (DOMPurify), RateLimiter, Exporters
/api/parse-resume abusejavascript: schemes in URLsownerUid verificationadmins Firestore collection where the Document ID is exactly the user's Firebase UID.VITE_FIREBASE_* variablesGEMINI_API_KEY (for server-side AI parsing)FIREBASE_SERVICE_ACCOUNT_KEY (for server-side token verification)UPSTASH_REDIS_REST_URL & UPSTASH_REDIS_REST_TOKEN (optional rate limiter)VITE_RECAPTCHA_SITE_KEY (optional App Check)api/ for serverless functionsvercel.json SPA rewrite handles client-side routingcontentEditable fields may behave differently across browsersApache-2.0 — see the license header in source files.