TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
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.
ProductivityTypeScript · CSSGitHub @JoeDunnoHowToCodeOnlineOwner 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
A resume webpage that you can share with link instead of document.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
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 importRead the full 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.
| 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.