DeepSeek Harness Remote
DeepSeek Harness Remote: DeepSeek Harness 실행 PC와 모바일·PC를 안전하게 연결해 어디서나 작업 이어받기
이력서를 업로드하면 전문 포트폴리오 사이트가 생성되고, 프로필 조회 알림을 받을 수 있습니다
Upload your CV and we turn it into a professional portfolio website. Build your online presence and know when someone views your profile.
생산성TypeScript · CSSGitHub @ecotronicseneterprise온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기An AI-powered platform that helps professionals organize their experience, showcase projects, and build a credible online presence.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗AI-powered portfolio builder that publishes instantly at slug.liveportfolio.site
Turn your CV or raw experience into a live, professional portfolio in 5 minutes.
slug.liveportfolio.siteslug.liveportfolio.site)sent_flows JSONB — each email sent exactly once/api/analytics/latest-visit endpoint every 30 seconds while the tab is visible, pauses in the background and refreshes on return. Only the latest view's country and time are returned; clicks do not count as visits. This replaces dashboard Realtime pop-ups and does not require changing RLS or enabling browser access to analytics rows. Free/Basic do not receive visitor details.seo_title and seo_description per portfoliosupabaseAdmin (service role) server-side only — never in client bundleBrowser
↓
Caddy (port 80/443, auto-SSL) — 46.225.186.103
↓
Next.js app (port 3001)
↓
Supabase / OpenAI / Paystack / Resend
Subdomain routing — middleware.ts reads the Host header on every request:
liveportfolio.site → main app (landing, form, dashboard, API)liveportfolio.site/slug → rewrites to /portfolio/[slug] (short links)slug.liveportfolio.site → rewrites to /portfolio/[slug]/
├── middleware.ts ← routing brain — do not break
├── app/
│ ├── page.tsx ← landing page
│ ├── create/page.tsx ← 4-step form
│ ├── preview/[portfolioId]/page.tsx ← preview + payment
│ ├── portfolio/[slug]/page.tsx ← public portfolio renderer
│ ├── dashboard/page.tsx ← user dashboard (analytics, editing)
│ ├── blog/ ← SEO blog articles
│ └── api/
│ ├── generate/route.ts ← form data → AI → portfolio JSON
│ ├── parse-cv/route.ts ← PDF → structured JSON
│ ├── update/route.ts ← dashboard edits (no AI)
│ ├── paystack-webhook/route.ts ← payment confirmation + plan upgrade
│ ├── subscribe/route.ts ← capture non-paying user email
│ ├── check-slug/route.ts ← real-time slug availability
│ ├── analytics/route.ts ← view count (batch flush)
│ ├── analytics/event/route.ts ← click event tracking
│ ├── analytics/summary/route.ts ← dashboard analytics data
│ ├── score/route.ts ← AI career score (7-day cache)
│ ├── unsubscribe/route.ts ← one-click unsubscribe
│ ├── cron/drip/route.ts ← email drip cron (CRON_SECRET protected)
│ ├── admin/metrics/route.ts ← daily health-check data
│ ├── user-plan/route.ts ← plan status check
│ ├── delete-account/route.ts ← GDPR account deletion
│ └── health/route.ts ← { status: 'ok' }
├── components/templates/
│ ├── Minimal.tsx ← editorial minimalism (white, teal accent)
│ └── Bold.tsx ← dark engineering showcase (navy, blue accent)
├── lib/
│ ├── supabase.ts ← client + admin instances
│ ├── prompts.ts ← AI system prompt + banned word list
│ ├── ipinfo.ts ← IPinfo Lite enrichment (company, country)
│ ├── email-drip.ts ← all email templates (Flow A, B, C)
│ └── schema.sql ← Supabase table definitions
├── scripts/
│ └── health-check.sh ← daily VPS health email
└── ecosystem.config.js ← PM2 config (port 3001)
| Table | Purpose |
|---|---|
users | Auth + plan (unpublished / pro) + slug |
portfolios | Portfolio content (JSONB), health score, SEO fields, view count |
payments | Payment records (Paystack reference, idempotency) |
subscriptions | Recurring subscription tracking (basic / pro plan + expires_at) |
analytics_events | Per-view and per-click events (ip_hash, company, country, referrer) |
career_scores | AI career score cache (7-day TTL per portfolio) |
email_subscribers | Drip email list + sent_flows JSONB deduplication |
| Route | Method | Purpose |
|---|---|---|
/api/generate | POST | AI portfolio generation (1 per user lifetime) |
/api/parse-cv | POST | PDF → structured JSON |
/api/update | PATCH | Dashboard content edits (no AI) |
/api/paystack-webhook | POST | Payment confirmation, plan upgrade |
/api/subscribe | POST | Capture non-paying user email |
/api/check-slug | GET | Slug availability check |
/api/analytics | POST | View count batch flush |
/api/analytics/event | POST | Click event tracking |
/api/analytics/summary | GET | Dashboard analytics (ownership-checked) |
/api/score | GET | AI career score (7-day cache) |
/api/unsubscribe | GET | One-click unsubscribe |
/api/cron/drip | GET | Email drip runner (CRON_SECRET header) |
/api/admin/metrics | GET | Health check metrics (ADMIN_METRICS_SECRET) |
/api/user-plan | GET | Current plan status |
/api/delete-account | POST | GDPR account deletion |
/api/health | GET | { status: 'ok' } |
git clone https://github.com/cliffordnwanna/liveportfolio
cd liveportfolio
npm install
cp .env.local.example .env.local
# fill in your keys
npm run dev
NEXT_PUBLIC_ROOT_DOMAIN=liveportfolio.site
NEXT_PUBLIC_APP_URL=https://liveportfolio.site
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY= # server-side only
OPENAI_API_KEY=
NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY=
PAYSTACK_SECRET_KEY= # server-side only
NEXT_PUBLIC_USD_TO_NGN_RATE=1400
RESEND_API_KEY=
ADMIN_METRICS_SECRET= # protects /api/admin/metrics
CRON_SECRET= # protects /api/cron/drip
IPINFO_TOKEN= # IPinfo Lite — 50k lookups/month free
Push to main → GitHub Actions:
npm install on VPS (ARM64 native binaries)VPS: 46.225.186.103 · App port: 3001 · PM2 process: liveportfolio
See docs/VPS_Security_Runbook.md for security monitoring.
/api/generate checks DB before calling OpenAI. Never remove this check.supabaseAdmin is server-side only — never import in client components or pages.header_up Host {host} in Caddyfile. Without it, subdomain routing breaks./api/update — no AI, no cost. Never call /api/generate for edits.| Plan | Price | Key features |
|---|---|---|
| Launch | $9 one-time | Live portfolio, both templates, watermark removed |
| Professional | $19 one-time | Everything + custom domain |
Target: $300/month = ~16 Professional sales/month.
Owner: Clifford Nwanna / Ecotronics Enterprise, Lagos Nigeria
Domain: liveportfolio.site (Namecheap, active until May 2027)