diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..6572f2d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Questions and beta feedback + url: https://github.com/LXBStudioLLC/envoy/discussions + about: Ask questions, share test results, or say hello in Discussions. diff --git a/.gitignore b/.gitignore index d730407..91e5d93 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,6 @@ logs/ Thumbs.db .DS_Store desktop.ini + +# === Test output === +TestResults/ diff --git a/AGENTS.md b/AGENTS.md index 9ae7ca0..e87442f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,7 @@ Envoy is a **.NET 8 WPF Windows desktop app** with two pillars: 2. **Full-Auto is scoped to company-owned and ATS-hosted career sites.** Aggregators (LinkedIn, Indeed, Glassdoor, ZipRecruiter, Monster, Dice, etc.) are **Copilot-only by product choice** — a site classifier enforces this **in code**, not just in docs. (Rationale: a block from a company that wasn't going to hire you costs nothing; aggregators are where a block actually hurts the user, so we don't full-auto them.) 3. **On a hard block, hand off — don't fight it.** When a site presents a CAPTCHA, bot-check, or rate-limit, Envoy surfaces it to the user and logs it; it does **not** attempt to defeat the control. **No CAPTCHA-solving, and no techniques whose purpose is to defeat a site's bot-detection.** Full-Auto fails gracefully and yields to the human rather than escalating. 4. **Data layers read public data and don't bypass authentication.** Ghost detection and job discovery use public ATS JSON APIs, key-gated search APIs (e.g. Brave Search), public government datasets, and the posting already in front of the user. **No scraping behind a login.** -5. Ghost detection outputs **RISK SCORE + CONFIDENCE + EVIDENCE** — an assessment with reasons, defaulting to neutral, **not** a bare "FAKE"/"GHOST" label on a named company. (Retained as the product's differentiator and its defamation cover; change deliberately, not by accident. Precision-vs-recall is a tunable default, not a hard rule.) +5. Ghost detection outputs **RISK SCORE + CONFIDENCE + EVIDENCE** — an assessment with reasons, defaulting to neutral, **not** a bare "FAKE"/"GHOST" label on a named company. (Retained as the product's differentiator and its fairness posture toward named companies; change deliberately, not by accident. Precision-vs-recall is a tunable default, not a hard rule.) 6. **.NET 8**, nullable enabled, file-scoped namespaces, match existing patterns. Do **NOT** blanket-add `ConfigureAwait(false)` — `Envoy.Core` is consumed in-process by the WPF UI. 7. Work on a `feature/` branch created off `main`. Do **NOT** push directly to `main`. Do **NOT** force-push. diff --git a/CHANGELOG.md b/CHANGELOG.md index 3245353..0383e64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All notable changes to Envoy are documented in this file. Format is based on [Ke ### Fixed - Ollama settings crash. Model-list bindings to read-only properties threw when the LLM settings view rendered (`Run.Text` binds two-way by default); all such bindings are now `OneWay`. -- A full code-review pass fixed 53 verified bugs. Highlights: resume PDFs now include the contact header (name, email, phone) that was being omitted; the LinkedIn template matches URLs again; Google Gemini returns its model list; the safety gate no longer crashes on unusual LLM output; settings and DPAPI key-save failures surface in the UI instead of failing silently; the browser bridge disposes cleanly and serializes its sends; and a captive `DbContext` (unbounded growth, concurrent-access crash) was replaced with a per-operation context factory. Also: cancellation is honored in job discovery, Greenhouse posting dates feed the age signals correctly, keyword-density matching no longer counts "java" inside "javascript", plus a batch of null guards, culture-invariant casing (Turkish-locale safe), and resource-leak fixes. +- A full code-review pass fixed 53 verified bugs. Highlights: resume PDFs now include the contact header (name, email, phone) that was being omitted; the LinkedIn template matches URLs again; Google Gemini returns its model list; the safety gate no longer crashes on unusual LLM output; settings and DPAPI key-save failures surface in the UI instead of failing silently; the browser bridge disposes cleanly and serializes its sends; and a captive `DbContext` (unbounded growth, concurrent-access crash) was replaced with a per-operation context factory. Also: cancellation is honored in job discovery, Greenhouse posting dates feed the age and repost signals correctly, keyword-density matching no longer counts "java" inside "javascript", plus a batch of null guards, culture-invariant casing (Turkish-locale safe), and resource-leak fixes. ### Added - The application, its window, the installer, and the shortcuts now carry the Envoy ghost icon. diff --git a/CLAUDE.md b/CLAUDE.md index 022dc97..141014e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,7 +15,7 @@ Envoy is a **.NET 8 WPF Windows desktop app** with two pillars: 2. **Full-Auto is scoped to company-owned and ATS-hosted career sites.** Aggregators (LinkedIn, Indeed, Glassdoor, ZipRecruiter, Monster, Dice, etc.) are **Copilot-only by product choice**, enforced **in code** via a site classifier — not just documented. 3. **On a hard block, hand off — don't fight it.** CAPTCHA, bot-check, or rate-limit → surface to the user and log it. **No CAPTCHA-solving, and no techniques whose purpose is to defeat a site's bot-detection.** Full-Auto fails gracefully and yields to the human. 4. **Data layers read public data and don't bypass authentication.** Ghost detection and job discovery use public ATS JSON APIs, key-gated search APIs (e.g. Brave Search), public government datasets, and the posting in front of the user. **No scraping behind a login.** -5. Ghost detection outputs **RISK SCORE + CONFIDENCE + EVIDENCE** — an assessment with reasons, defaulting to neutral, not a bare "FAKE"/"GHOST" label on a named company. (Kept as the differentiator and defamation cover; precision-vs-recall is a tunable default, not a hard rule.) +5. Ghost detection outputs **RISK SCORE + CONFIDENCE + EVIDENCE** — an assessment with reasons, defaulting to neutral, not a bare "FAKE"/"GHOST" label on a named company. (Kept as the differentiator and the fairness posture toward named companies; precision-vs-recall is a tunable default, not a hard rule.) 6. **.NET 8**, nullable enabled, file-scoped namespaces, match existing patterns. Do **NOT** blanket-add `ConfigureAwait(false)`. 7. Work on a `feature/` branch created off `main`. Do **NOT** push directly to `main`. Do **NOT** force-push. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dc50437..3ff1915 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,8 @@ Thanks for thinking about a contribution. Envoy is a Windows-only WPF desktop app built mainly around ghost-job detection: scoring how likely a job posting is a waste of an applicant's time, with transparent evidence. The resume-tailoring and form-fill flow is a human-gated copilot. +Envoy is in early beta. Running it on a real machine and reporting what breaks is worth as much as code right now, and both get credited the same way (see [Credit](#credit)). + ## The best way to help: write a ghost signal (and hand it to your agent) Ghost detection is built on a signal framework (`src/Envoy.GhostDetection/`). Each signal is an `IGhostSignal` that looks at a `JobPosting` and returns a `SignalResult`, or `null` for no opinion. Signals run in parallel, and `GhostScorer` combines them into a risk band (Neutral, Elevated, or High) with human-readable evidence. @@ -75,7 +77,6 @@ docs/ ADAPTIVE_PARSER.md adaptive parser scoring, fingerprints, relocation TEMPLATE_AUTHORING.md walk-through for adding new job-board templates SETUP.md user-facing install and first-launch - internal/ internal design notes (not user-facing) ``` ## Branch and commit conventions @@ -108,6 +109,10 @@ If your change adds a new job-board template, include: - File-scoped namespaces everywhere. It matches the existing code and the rule in `.editorconfig`. - Static frozen brushes live in `src/Envoy.UI/Theme.cs`. Don't redeclare `Color.FromRgb(...)` literals per view. Pull from `Theme` with `using static Envoy.UI.Theme;`. +## Credit + +Everyone who helps gets credited. Merged PRs appear in the contributor graph and get a line in the notes of the release they ship in. Bug reports, test sessions, and template captures that lead to a change are credited by name in those same notes. If you would rather not be named, say so in your issue or PR and it stays out. + ## License Envoy is licensed under [AGPLv3](LICENSE). By opening a PR you agree your contribution ships under the same license. AGPL doesn't allow network use without source disclosure, so if you fork Envoy into a hosted service, you have to publish your changes. diff --git a/README.md b/README.md index d42ab8b..c7e1e20 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@

License: AGPL-3.0 Latest release + Status: early beta Platform: Windows 10/11 x64 Signed installer Built with .NET 8 @@ -23,6 +24,7 @@

Download · + Help wanted · How it works · Find Jobs · Apply Copilot · @@ -48,6 +50,17 @@ You tailor the resume, fill out the same fields again, hit submit, and never hea --- +## Early beta: testers and contributors wanted + +Envoy is in early beta. It works end to end and every release is signed, but so far it has run on a small number of machines against a limited slice of real postings. That is the gap you can close. + +- **Test it.** Install it, run your real searches, and open an issue for anything that looks wrong: a real job flagged as risky, an obvious ghost scored OK, a crash, a screen that confused you. A five-minute report genuinely moves the project. +- **Contribute.** Five starter issues are open, graded easy to moderate, including two self-contained ghost signals and a new job-board source. [CONTRIBUTING.md](CONTRIBUTING.md) has the step-by-step, including how to hand a signal spec to a coding agent. + +Everyone who helps gets credited. Merged PRs are listed in the notes of the release they ship in, and so are the people whose bug reports and test sessions led to a fix. If you would rather not be named, say so in your issue or PR. + +--- + ## Download [Grab the latest release](https://github.com/LXBStudioLLC/envoy/releases/latest) for Windows 10/11, 64-bit. @@ -84,7 +97,7 @@ Four signals run in the app today, all unit-tested: | Duplicate JD | Weak | Local (cross-company text match within a batch) | | Scam Pattern | Deterministic | Local regex (off-platform redirects, upfront fee or PII asks, crypto and gift-card payment, check and overpayment fraud) | -A fifth signal, Repost Frequency, is written and tested but stays off until Envoy remembers listings across sessions, which this build doesn't do yet. So it never fires today. +A fifth signal, Repost Frequency, watches for listings that get re-posted to look new. Its stronger path needs listing history across sessions, which this build doesn't keep yet, but a timestamp fallback can already fire when a posting's own dates show it was bumped long after it first went up. Each signal says whether it needs the network. That lets Envoy score a whole list locally in the Find Jobs view and save the network calls for when you open a single posting. @@ -232,7 +245,7 @@ Hit a bug or a bad flag? [Open an issue](https://github.com/LXBStudioLLC/envoy/i - [x] Ghost-detection signal framework, wired into the app - [x] Four active signals: ATS cross-check, posting age, duplicate JD, scam pattern -- [ ] Repost frequency signal (written and tested; off until listing history persists across sessions) +- [ ] Repost frequency signal, full history-backed detection (the timestamp fallback ships today; the stronger path needs listing history across sessions) - [x] Job search over public ATS feeds plus optional Brave Search, every posting scored - [ ] More signals: hiring freeze ([#5](https://github.com/LXBStudioLLC/envoy/issues/5)), PERM filings ([#1](https://github.com/LXBStudioLLC/envoy/issues/1)) - [x] Windows zip and signed installer diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index 341c224..d1521cb 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -9,7 +9,6 @@ packages are listed separately and are **not** distributed with the app. | Package | Version | License | |---|---|---| | HandyControl | 3.5.1 | MIT | -| Microsoft.EntityFrameworkCore.Design | 8.0.0 | MIT | | Microsoft.EntityFrameworkCore.Sqlite | 8.0.0 | MIT | | Microsoft.Extensions.DependencyInjection | 8.0.1 | MIT | | Microsoft.Extensions.Hosting | 8.0.1 | MIT | @@ -25,10 +24,11 @@ packages are listed separately and are **not** distributed with the app. **QuestPDF note:** QuestPDF is dual-licensed. The free **Community** license covers organizations with under US $1M annual gross revenue and open-source projects; larger organizations require a paid license. Anyone forking Envoy -should confirm their own eligibility — see https://www.questpdf.com/license/ . +should confirm their own eligibility; see https://www.questpdf.com/license/ . -### Test-only packages (NOT shipped with the application) +### Build-time and test-only packages (NOT shipped with the application) +Microsoft.EntityFrameworkCore.Design 8.0.0 (MIT, build-time only), xunit 2.6.6 (Apache-2.0), xunit.runner.visualstudio 2.5.6 (Apache-2.0 / MIT), Moq 4.20.70 (BSD-3-Clause), Microsoft.NET.Test.Sdk 17.8.0 (MIT). @@ -38,9 +38,9 @@ Envoy embeds the following fonts, each licensed under the SIL Open Font License, Version 1.1 (full text below). Per-font copies also live in `src/Envoy.UI/Fonts/`. -- **JetBrains Mono** — Copyright 2020 The JetBrains Mono Project Authors +- **JetBrains Mono**, Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono) -- **Orbitron** — Copyright 2018 The Orbitron Project Authors +- **Orbitron**, Copyright 2018 The Orbitron Project Authors (https://github.com/theleagueof/orbitron), with Reserved Font Name: "Orbitron" --- diff --git a/assets/README.md b/assets/README.md index 30f4bd4..6f50800 100644 --- a/assets/README.md +++ b/assets/README.md @@ -10,12 +10,12 @@ Real brand assets (generated in the app's dark theme; swap for designer versions | `banner.png` | Wordmark at the top of the README | 1280 by 360 | | `social-preview.png` | Link-share card. Upload it in GitHub Settings, then General, then Social preview | 1280 by 640 | -Placeholders (replace with real screenshots at the same paths; the README picks them up with no markdown change): +Screenshots (real app captures, staged with fictional demo data so no real company or personal detail appears next to a risk band): -| File | Used for | Size | +| File | Shows | Size | |---|---|---| -| `ghost-score.png` | Ghost Risk panel: band, confidence, evidence lines (the important one) | about 1640 by 920, shown at 820px | -| `find-jobs.png` | Find Jobs results with a risk band on each posting | about 1640 by 920 | -| `apply-copilot.png` | Apply view paused at the Confirm or Cancel gate | about 1640 by 920 | +| `ghost-score.png` | Ghost Risk panel: band, score, evidence lines | 1600 by 820, shown at 820px | +| `find-jobs.png` | Find Jobs results with a risk band on each posting | 1600 by 1260 | +| `apply-copilot.png` | Apply view paused at the Confirm or Cancel gate | 1600 by 950 | -Tips: keep one app theme, keep personal details out of frame (use a sample resume), and compress the PNGs before committing. A short GIF of dropping a resume, tailoring it, and reviewing before submit works well too. +If you retake them: keep one app theme, use fictional data only (no real companies beside a risk band, no personal details), and compress the PNGs before committing. A short GIF of dropping a resume, tailoring it, and reviewing before submit works well too. diff --git a/docs/SETUP.md b/docs/SETUP.md index af6cf8d..ca3d5e6 100644 --- a/docs/SETUP.md +++ b/docs/SETUP.md @@ -2,21 +2,21 @@ ## Requirements -- **Windows 10/11 (64-bit).** Envoy is a WPF desktop application — macOS/Linux are not supported at v1. +- **Windows 10/11 (64-bit).** Envoy is a WPF desktop application; macOS/Linux are not supported at v1. - [Ollama](https://ollama.com) installed and running (only required if you want to use a local model; you can run Envoy with a cloud provider instead). - Google Chrome or Microsoft Edge installed. ## Installation ### Inno Setup installer (recommended) -1. Download `Envoy-v1.0.0-setup.exe` from [Releases](../../releases). +1. Download `Envoy--setup.exe` from [Releases](../../releases). 2. Run the installer. 3. Launch Envoy from the Start Menu or desktop shortcut. ### ZIP package -1. Download `Envoy-v1.0.0-win-x64.zip` from [Releases](../../releases). +1. Download `Envoy--win-x64.zip` from [Releases](../../releases). 2. Extract anywhere (e.g. `C:\Tools\Envoy\`). -3. Double-click `Envoy.exe` (or `Envoy.UI.exe`, depending on the build). +3. Double-click `Envoy.exe`. ### PowerShell installer From inside the extracted ZIP, run: @@ -43,13 +43,13 @@ This copies the app to `%LOCALAPPDATA%\Envoy`, adds desktop + Start Menu shortcu ## Chrome Remote Debugging -For the stealth browser to work, Chrome must be launched with: +For the apply copilot's browser bridge to work, Chrome must be launched with: ``` --remote-debugging-port=9222 ``` -Envoy will handle this automatically — it relaunches Chrome with the right flag if a debug session isn't already running. +Envoy handles this automatically and relaunches Chrome with the right flag if a debug session isn't already running. ## Troubleshooting @@ -67,4 +67,4 @@ Envoy will handle this automatically — it relaunches Chrome with the right fla - Ensure your GPU drivers are up to date. **"Cloud API key not accepted after I copied my settings to another PC"** -- API keys are encrypted with Windows DPAPI under the `CurrentUser` scope — they cannot be decrypted by a different Windows user account or on a different machine. Re-enter the key on the new machine. +- API keys are encrypted with Windows DPAPI under the `CurrentUser` scope, so they cannot be decrypted by a different Windows user account or on a different machine. Re-enter the key on the new machine. diff --git a/docs/UI_LIBRARY_RESEARCH.md b/docs/UI_LIBRARY_RESEARCH.md deleted file mode 100644 index ef65a84..0000000 --- a/docs/UI_LIBRARY_RESEARCH.md +++ /dev/null @@ -1,610 +0,0 @@ -# Envoy UI Library Research: Cyberpunk Visual Polish - -## 1. MaterialDesignInXAML (MaterialDesignThemes) - -**NuGet:** `MaterialDesignThemes` | **Version:** 5.3.2 (released 2026-05-01) | **Target:** net8.0-windows7.0 + net462 | **Stars:** 16.1k -**Depends on:** MaterialDesignColors (>=5.3.2), Microsoft.Xaml.Behaviors.Wpf (>=1.1.77) - -### Customizability -- **Highly customizable.** Uses `BundledTheme` markup extension with `BaseTheme` (Light/Dark/Inherit), `PrimaryColor`, `SecondaryColor` parameters. You can override the entire palette at runtime. -- Color system uses named swatches. You can set `PrimaryColor="Cyan"` as a starting point then override individual brushes. -- You can also use `` and then layer your `CyberpunkTheme.xaml` **after** it in `MergedDictionaries` to override specific brushes. -- Material Design 3 variant is available (`MaterialDesign3.Defaults.xaml`). - -### Animations, Transitions, Effects -- **Ripple effects** on buttons/inputs (Material Design signature) -- **Transitions:** `Transitioner` and `TransitioningContent` controls for slide/fade/wipe between views -- **DialogHost:** Built-in modal dialog system with backdrop blur -- **Snackbar:** Toast notifications -- **Card:** Elevated card container with shadows -- **Clock:** Analog/digital clock control -- **ColorZone:** Regions with distinct color treatment (primary/secondary/accent) -- All controls have entrance animations, hover state transitions built in - -### Selective Use -- **Yes, you can use selectively.** Include `MaterialDesignThemes` in MergedDictionaries, then override colors with your `CyberpunkTheme.xaml` loaded **last** (last wins in WPF resource resolution). -- You can use just `Transitioner`/`DialogHost`/`Snackbar` without applying Material styles globally (use `x:Key` styles instead of default styles). -- **Risk:** If you include the default theme globally, ALL controls get Material styles unless you explicitly override. This will fight your cyberpunk aesthetic. - -### Verdict for Envoy -- **Pros:** Mature, actively maintained (release 2 days ago), great transition/animation system, DialogHost is excellent -- **Cons:** Material Design aesthetic fundamentally conflicts with cyberpunk. Overriding every color is a lot of work. Ripple effects feel "mobile Material", not "cyberpunk terminal". -- **Best selective use:** Just `Transitioner`, `DialogHost`, `Snackbar` — skip the rest of the styling. - ---- - -## 2. HandyControl - -**NuGet:** `HandyControl` | **Version:** 3.5.1 (stable, 2024-03-05) / 3.6.0-rc3 (pre-release, 2025-09-28) | **Target:** net8.0 + net5-8 + netcoreapp3+ + net40-481 | **Stars:** 7k -**Dependencies:** None (zero!) - -### Custom Theming / Dark Themes -- Has built-in dark theme via `SkinDark.xaml`: - ```xml - - - ``` -- Color resources can be overridden by defining same-key brushes after loading HandyControl dictionaries. -- The theming istoken-based, so you can swap `PrimaryColor`, `SecondaryColor`, etc. at runtime. - -### Unique Visual Features (highly relevant to cyberpunk) -- **GlowWindow** — Window with neon-like border glow around the entire window frame (!!!) -- **BlurWindow** — Acrylic/blur background window -- **GradientStart/GradientEnd color resources** — Built-in gradient theming -- **TransitioningContentControl** — Animated content transitions (slide, fade) -- **Effects** — Built-in visual effects including shadow, glow -- **Growl** — Toast notification system -- **Card** — Elevated card container -- **Dialog** — Modal dialogs -- **Drawer** — Slide-in panels -- **Loading** — Loading spinners (circular) -- **CircleProgressBar** — Circular progress indicators -- **OutlineText** — Text with outline/stroke effect -- **AnimationPath** — Animated path rendering -- **GeometryAnimation** — Animated geometry transitions -- **FloatingBlock** — Floating notification blocks -- **RunningBlock** — Marquee/scrolling text -- **GooeyEffect** — Morphing blob effect -- **SideMenu** — Navigation sidebar -- **StepBar** — Step/wizard progress indicator -- **Badge, Tag, Shield** — Labeling controls -- **DateTimePicker, SearchBar, PinBox** — Input controls -- **WaveProgressBar** — Wave-fill progress bar -- **FlipClock** — Flip-style clock display - -### Can it coexist with CyberpunkTheme.xaml? -- **Yes.** Load HandyControl's `SkinDark.xaml` + `Theme.xaml` first, then load `CyberpunkTheme.xaml` last. Your brushes will override HandyControl's. -- The `GlowWindow`, `BlurWindow`, `TransitioningContentControl`, `Growl`, `Dialog`, `OutlineText`, `Loading` spinner are all usable without adopting HandyControl's visual style on every control. -- **Important:** HandyControl's zero-dependency design means it's lightweight. - -### Verdict for Envoy -- **Pros:** `GlowWindow` is *exactly* what a cyberpunk app needs. `OutlineText` is perfect for neon headings. `TransitioningContentControl` for view switching. `Growl` for toast notifications. All with zero extra dependencies. -- **Cons:** Last stable release was March 2024 (2 years old). RC version available. Less maintained than MaterialDesign. Chinese-centric community/docs. -- **Best use:** `GlowWindow`, `OutlineText`, `TransitioningContentControl`, `Growl`, `CircleProgressBar`, `Loading` — cherry-pick controls, override all colors. - ---- - -## 3. AdonisUI - -**NuGet:** `AdonisUI` + `AdonisUI.ClassicTheme` | **Version:** 1.17.1 (2021-09-05) | **Target:** net5.0-windows7.0 + netcoreapp3.1 + net45+ | **Stars:** ~1.5k -**Dependencies:** `System.Drawing.Common` (>=4.6.0) - -### Dark Theme -- Has a well-crafted dark theme that actually looks good: - ```xml - - - ``` -- The dark theme uses proper contrast ratios and subtle elevation differences. - -### Custom Accent Colors -- Yes, supports custom accent colors via resource overrides. Define your own accent brush after loading AdonisUI dictionaries. -- Has `AccentColor`, `AccentHighlightColor`, etc. resource keys. - -### What It Adds Beyond Styling -- **Cursor six-line toggle** validation UI -- **ScrollViewer** improvements with smooth scrolling -- **Window** chrome customization (custom title bars) -- **FadeIn/FadeOut** animations on select controls -- **DialogHost** equivalent -- **Very lightweight** — minimal footprint, just better-looking defaults -- Does NOT add a massive control library. It's mainly a theme system. - -### Verdict for Envoy -- **Pros:** Lightweight, clean dark theme, minimal footprint -- **Cons:** Last release was 2021 (nearly 5 years ago!). No development activity. Very few controls. No glow effects, no transitions, no animation system. Doesn't add much beyond basic styling that you've already done yourself. -- **Verdict:** Skip. It doesn't offer enough beyond what you've already built, and it's unmaintained. - ---- - -## 4. Pure XAML/Code-Behind Visual Effects (No Packages) - -### 4a. Glow Effects — DropShadowEffect on Borders - -```xml - - - - - - - - - - -``` - -For **inner glow**, use an overlappingGrid approach: - -```xml - - - - - - - - - - -``` - -### 4b. Panel Entrance Animation (Fade + Slide) - -```xml - - - - - - - - - - - - - - - - - - -``` - -Apply to panels: -```xml - - - - - - -``` - -```csharp -// In code-behind on Loaded -var sb = (Storyboard)FindResource("SlideInFromRight"); -sb.Begin(CardPanel); -``` - -### 4c. Button Hover Glow Pulse - -```xml - -``` - -### 4d. Neon Pulsing Border Glow - -```xml - - - - - - - -``` - -Apply to any border: -```xml - - - -``` - -### 4e. Progress Bar Shimmer - -```xml - -``` - -For a shimmer animation on the progress indicator: -```xml - - - -``` - -Simpler shimmer approach (animated gradient overlay): -```xml - - - - - - - - - - - - -``` -Animate the gradient offsets in code-behind or with a `DoubleAnimation` on `GradientStop.Offset`. - -### 4f. Scanline / CRT Overlay - -```xml - - - - - - - - - - - - - - - - - - - -``` - -For a more dramatic CRT effect, add a vignette overlay too: -```xml - - - - - - - - - -``` - -### 4g. Glitch Text Effect (Flicker on Headings) - -```xml - -``` - -For a horizontal glitch-offset version, you'd need code-behind with a `DispatcherTimer`: -```csharp -private DispatcherTimer _glitchTimer; -private Random _rng = new(); - -private void StartGlitch(TextBlock target) -{ - _glitchTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(3000) }; - _glitchTimer.Tick += (s, e) => - { - if (_rng.NextDouble() < 0.3) // 30% chance per tick - { - var transform = new TranslateTransform { X = _rng.Next(-3, 4) }; - target.RenderTransform = transform; - target.Foreground = new SolidColorBrush(_rng.NextDouble() < 0.5 ? Colors.Cyan : Colors.Magenta); - - Task.Delay(80).ContinueWith(_ => Dispatcher.Invoke(() => - { - target.RenderTransform = new TranslateTransform(); - target.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00F0FF")); - })); - } - }; - _glitchTimer.Start(); -} -``` - -### 4h. View Transition (Content Swap with Animation) - -```csharp -// In MainWindow.xaml.cs -private async Task TransitionContent(UserControl newView) -{ - var oldContent = ContentArea.Children.OfType().FirstOrDefault(); - if (oldContent != null) - { - var fadeOut = new DoubleAnimation(1, 0, TimeSpan.FromMilliseconds(150)); - fadeOut.Completed += async (_, _) => - { - ContentArea.Children.Clear(); - newView.Opacity = 0; - newView.RenderTransform = new TranslateTransform(30, 0); - ContentArea.Children.Add(newView); - - var fadeIn = new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(200)); - var slideIn = new DoubleAnimation(30, 0, TimeSpan.FromMilliseconds(200)); - slideIn.EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut }; - - newView.BeginAnimation(FrameworkElement.OpacityProperty, fadeIn); - ((TranslateTransform)newView.RenderTransform).BeginAnimation(TranslateTransform.XProperty, slideIn); - }; - oldContent.BeginAnimation(FrameworkElement.OpacityProperty, fadeOut); - } - else - { - newView.RenderTransform = new TranslateTransform(0, 0); - ContentArea.Children.Add(newView); - } -} -``` - -### 4i. Neon Loading Spinner - -```xml - - - - - - - - - - - - - - - - - -``` - -### 4j. Neon Typing Cursor (caret for text inputs) - -```xml - -``` - ---- - -## 5. Font Options - -### Recommended Cyberpunk Fonts - -| Font | Type | Open Source | Best For | Cyberpunk Rating | -|------|------|------------|----------|------------------| -| **JetBrains Mono** | Monospace | Yes (Apache 2.0) | Body text, code, inputs | ★★★★★ | -| **Fira Code** | Monospace | Yes (OFL) | Body text, ligatures | ★★★★☆ | -| **Cascadia Code** | Monospace | Yes (OFL) | Body text, terminals | ★★★★☆ | -| **Space Mono** | Monospace | Yes (OFL) | Body text, labels | ★★★★☆ | -| **Share Tech Mono** | Monospace | Yes (OFL) | Headings, accents | ★★★★☆ | -| **Orbitron** | Display | Yes (OFL) | Headings, titles, logo | ★★★★★ | - -### Recommended Combination -- **Headings:** `Orbitron` (geometric, futuristic, very cyberpunk) -- **Body/UI text:** `JetBrains Mono` (excellent readability, ligatures, modern tech feel) -- **Fallthrough:** `Consolas` (already in use, safe system font) - -### How to Embed Fonts in WPF - -1. Add `.ttf` or `.otf` files to your project (e.g., `Fonts/Orbitron-Regular.ttf`, `Fonts/JetBrainsMono-Regular.ttf`) -2. Set Build Action to **Resource** (not EmbeddedResource) -3. Reference in XAML: - -```xml - -pack://application:,,,/Fonts/#Orbitron -pack://application:,,,/Fonts/#JetBrains Mono - - - -``` - -**Note:** The font family name after `#` must match the **internal font name**, not the filename. Open the `.ttf` in Windows Font Viewer to see the correct name. - -Download sources: -- Orbitron: https://fonts.google.com/specimen/Orbitron -- JetBrains Mono: https://www.jetbrains.com/lp/mono/ -- Fira Code: https://github.com/tonsky/FiraCode -- Cascadia Code: https://github.com/microsoft/cascadia-code -- Space Mono: https://fonts.google.com/specimen/Space+Mono -- Share Tech Mono: https://fonts.google.com/specimen/Share+Tech+Mono - ---- - -## 6. Recommendation - -### Evaluation Matrix - -| Factor | MaterialDesign (A) | HandyControl (B) | Pure Custom (C) | Hybrid (D) | -|--------|--------------------|--------------------|-----------------|-----------| -| Visual match to cyberpunk | Low (fighting MD aesthetic) | Medium (GlowWindow fits) | High (full control) | High | -| Effort to implement | High (override everything) | Medium | Very High | Medium | -| Risk to existing code | Medium (global style override) | Low-Medium | None | Low | -| Animation/transition support | High (Transitioner) | Medium (TransitioningContent) | Low (hand-roll all) | High | -| Glow/neon effects | None built-in | High (GlowWindow!) | Manual | High | -| Long-term maintenance | High (active, 16k stars) | Low (last stable 2024) | N/A (yours) | Mixed | -| Dependency count | 2 (MD + Behaviors) | 0 | 0 | 0-2 | - -### **Recommended: Option D (Hybrid) — HandyControl controls + Pure custom effects** - -Specifically: - -1. **Install HandyControl** for: `GlowWindow`, `TransitioningContentControl`, `Growl` (toast), `OutlineText`, `CircleProgressBar`, `Loading` spinner. These give you immediate visual impact with near-zero effort. - -2. **Keep your `CyberpunkTheme.xaml`** as the authoritative style dictionary. Load HandyControl first, then CyberpunkTheme overrides on top. - -3. **Add pure XAML effects** from Section 4 above: - - `DropShadowEffect` glow on all card borders - - Neon pulse animation on the window border and active nav item - - Scanline overlay on the main grid - - Glitch text effect on the "ENVOY" title - - Fade+slide transitions for content area view switching - - Button hover glow pulse - -4. **Embed Orbitron + JetBrains Mono** fonts for the heading/body combination. - -5. **Do NOT install MaterialDesignInXAML.** Its aesthetic fundamentally conflicts with cyberpunk, and you'd spend more time overriding its styles than building your own. - -6. **Do NOT install AdonisUI.** It's unmaintained and doesn't add anything beyond basic theming you already have. - -### Implementation Priority - -| Priority | Effect | Effort | Impact | -|----------|--------|--------|--------| -| P0 | DropShadowEffect neon glow on cards | 5 min | Huge | -| P0 | GlowWindow (HandyControl) | 15 min | Huge | -| P0 | Orbitron + JetBrains Mono fonts | 20 min | Huge | -| P1 | Button hover glow pulse | 15 min | Medium | -| P1 | Scanline overlay | 10 min | Medium | -| P1 | View transition animation | 30 min | High | -| P2 | Glitch text on title | 20 min | Medium | -| P2 | Loading spinner (neon) | 15 min | Medium | -| P2 | Growl notifications (HandyControl) | 20 min | Medium | -| P3 | Progress bar shimmer | 20 min | Low | -| P3 | CRT vignette overlay | 10 min | Low | - -### Minimal App.xaml Integration - -```xml - - - - - - - - - - - -``` - -### MainWindow Update for GlowWindow - -```xml - - - #00F0FF - ... - -``` - -This gives you an animated glowing border around the entire window frame — the single highest-impact visual change you can make. \ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 740cf36..0000000 --- a/docs/index.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - Envoy — Your Local Job Application Agent - - - -

-

Envoy

-

Your local, sovereign job application agent. No cloud. No subscriptions. No data leakage. Just you, your machine, and the job market.

- Download for Windows -
- -
-

Built for Privacy. Engineered for Speed.

-
-
-

Local AI Only

-

Runs entirely on your hardware using Ollama. Your resume and job data never leave your machine.

-
-
-

Stealth Browser

-

Connects to your real Chrome via CDP. No bundled browser, no detection, no bot flags.

-
-
-

Auto-Tailoring

-

Every resume is rewritten per job description. Keywords matched, facts preserved, one page guaranteed.

-
-
-

Safety First

-

Multi-layer guardrails detect hallucinations and inconsistencies. Falls back to Safe Mode automatically.

-
-
-

Human Behavior

-

Bezier curve mouse paths, randomized typing, natural scroll. You look like a human because you are one.

-
-
-

Open Source

-

AGPLv3. Community templates for every major job board. Transparent, auditable, yours.

-
-
-
- - - -