diff --git a/.gitignore b/.gitignore index fd29395..a9e2b5e 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,9 @@ config/user.yaml.working # Claude context files — kept out of version control CLAUDE.md +.superpowers/ +pytest-output.txt +docs/superpowers/ data/email_score.jsonl data/email_label_queue.jsonl diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..b947077 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..4294d37 --- /dev/null +++ b/web/index.html @@ -0,0 +1,20 @@ + + +
+ + + +Job not found.
+No cover letter yet. Generate one with AI or paste your own.
+Approved jobs ready for applications
+Approve listings in Job Review, then come back here to write applications.
+Select a job to open the workspace
+No digest emails queued.
+When you mark an email as 📰 Digest, it appears here.
+Discover → Review → Apply
++ You have + {{ store.counts?.pending ?? 0 }} pending + and + {{ store.counts?.approved ?? 0 }} approved + listings. +
+Upload a CSV with a url column.
⚠️ These actions are destructive and cannot be undone.
+No job description available.
+No email history for this job.
+No cover letter generated yet.
+Notes are saved locally — they won't sync between devices.
+No phone screens yet.
Move an applied job here when a recruiter reaches out.
Phone screen going well?
Move it here when you've got a real interview scheduled.
This is where offers land.
You've got this. 🙌
Nothing to review right now. Run discovery to find new listings.
+No {{ activeTab }} jobs.
+Select a job to open the survey assistant.
+Paste (Ctrl+V), drag & drop, or upload a screenshot
+ +Exports your config files (and optionally the job database) as a zip archive.
+ +{{ backupError }}
+Upload a backup zip to restore your configuration. Existing files will be overwritten.
+ +Restored {{ store.restoreResult.restored.length }} files.
+Skipped: {{ store.restoreResult.skipped.join(', ') }}
+{{ store.restoreError }}
+ +Override the effective tier for UI testing. Does not affect licensing.
+Required for model downloads and fine-tune uploads.
+✓ Token stored securely
++ {{ hfTestResult.ok ? `✓ Logged in as ${hfTestResult.username}` : '✗ ' + hfTestResult.error }} +
+Export labeled emails as JSONL for classifier training.
+Exported {{ exportResult.count }} labeled emails.
+Upload .md or .txt cover letter files to build your training dataset.
+ +{{ uploadResult.file_count }} file(s) uploaded.
+Extract job description + cover letter pairs for training.
+{{ pairsCount }} pairs extracted so far.
+{{ extractError }}
+{{ pairsCount }} training pairs available.
+ + + + + + + + +Run locally with Unsloth + Ollama:
+make finetune+
✓ alex-cover-writer model is ready in Ollama.
+Model not yet registered. Run make finetune first.
+ Cloud quota remaining: {{ quotaRemaining }} jobs +
++ Manage your subscription at circuitforge.tech/account +
+Enter your license key to unlock paid features.
+{{ activateError }}
+Your identity and preferences used for cover letters, research, and interview prep.
+{{ store.saveError }}
++ Industries you care about. When a job matches, the cover letter includes your personal alignment note. +
+ +{{ store.saveError }}
++ Companies you can't name. They appear as "previous employer (NDA)" in research briefs when match score is low. +
+ + + ++ Optional sections added to company briefs — for your personal decision-making only. + These details are never included in applications. +
+ +Peregrine is fully local by default — no data leaves your machine unless you opt in.
+ +You have cloud LLM backends enabled. Your job descriptions and cover letter content will be sent to those providers' APIs. Peregrine never logs this content, but the providers' own data policies apply.
+No resume found. Choose how to get started:
+Upload a PDF, DOCX, or ODT and we'll extract your info automatically.
+ +{{ uploadError }}
+Start with a blank form and fill in your details.
+ +Walk through the onboarding wizard to set up your profile step by step.
+Optional. Used only for your personal tracking.
+ +{{ store.saveError }}
+This filter runs at scrape time — listings that don't match are excluded before they count against per-board quotas.
+{{ store.saveError }}
+This tab is only available in self-hosted mode.
+ + + + +Drag to reorder. Higher position = higher priority in the fallback chain.
+ +{{ store.saveError }}
+Port-based status. Start/Stop via Docker Compose.
+{{ svc.note }}
+{{ store.serviceErrors[svc.name] }}
+Used for email sync in the Interviews pipeline.
+{{ store.emailError }}
+Upgrade to {{ integration.tier_required }} to use this integration.
+{{ store.filePathsError }}
+Restart required for changes to take effect.
+{{ store.deployError }}
+