From faf3805960ef046410ddf925f4be6e859f2021ce Mon Sep 17 00:00:00 2001 From: 6d486f49 Date: Wed, 9 Sep 2026 13:22:50 -0400 Subject: [PATCH] Resume update --- .idea/.idea.Resume/.idea/.gitignore | 13 - .idea/.idea.Resume/.idea/encodings.xml | 4 - .idea/.idea.Resume/.idea/vcs.xml | 2 +- .../.idea/projectSettingsUpdater.xml | 8 - .idea/.idea.Website/.idea/workspace.xml | 63 --- Website.slnx => Resume.slnx | 1 - Website.Client/Program.cs | 5 - Website.Client/Website.Client.csproj | 16 - Website.Client/_Imports.razor | 9 - .../wwwroot/appsettings.Development.json | 8 - Website.Client/wwwroot/appsettings.json | 8 - Website/Components/Pages/Home.razor | 23 +- Website/Components/Routes.razor | 2 +- Website/Components/_Imports.razor | 1 - Website/Data/Overview.cs | 2 +- Website/Data/WorkExperience.cs | 8 +- Website/Program.cs | 3 +- Website/Website.csproj | 2 +- resume_html/index.html | 157 -------- resume_html/style.css | 373 ------------------ 20 files changed, 24 insertions(+), 684 deletions(-) delete mode 100644 .idea/.idea.Resume/.idea/.gitignore delete mode 100644 .idea/.idea.Resume/.idea/encodings.xml delete mode 100644 .idea/.idea.Website/.idea/projectSettingsUpdater.xml delete mode 100644 .idea/.idea.Website/.idea/workspace.xml rename Website.slnx => Resume.slnx (53%) delete mode 100644 Website.Client/Program.cs delete mode 100644 Website.Client/Website.Client.csproj delete mode 100644 Website.Client/_Imports.razor delete mode 100644 Website.Client/wwwroot/appsettings.Development.json delete mode 100644 Website.Client/wwwroot/appsettings.json delete mode 100644 resume_html/index.html delete mode 100644 resume_html/style.css diff --git a/.idea/.idea.Resume/.idea/.gitignore b/.idea/.idea.Resume/.idea/.gitignore deleted file mode 100644 index 9f8aa89..0000000 --- a/.idea/.idea.Resume/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/.idea.Resume.iml -/contentModel.xml -/modules.xml -/projectSettingsUpdater.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.idea.Resume/.idea/encodings.xml b/.idea/.idea.Resume/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/.idea/.idea.Resume/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/.idea.Resume/.idea/vcs.xml b/.idea/.idea.Resume/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/.idea.Resume/.idea/vcs.xml +++ b/.idea/.idea.Resume/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/.idea.Website/.idea/projectSettingsUpdater.xml b/.idea/.idea.Website/.idea/projectSettingsUpdater.xml deleted file mode 100644 index ef20cb0..0000000 --- a/.idea/.idea.Website/.idea/projectSettingsUpdater.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/.idea.Website/.idea/workspace.xml b/.idea/.idea.Website/.idea/workspace.xml deleted file mode 100644 index d70bdd7..0000000 --- a/.idea/.idea.Website/.idea/workspace.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - { - "keyToString": { - "settings.editor.selected.configurable": "preferences.lookFeel" - } -} - - - - - - - - - \ No newline at end of file diff --git a/Website.slnx b/Resume.slnx similarity index 53% rename from Website.slnx rename to Resume.slnx index 3e6e749..1fcdb40 100644 --- a/Website.slnx +++ b/Resume.slnx @@ -1,4 +1,3 @@ - diff --git a/Website.Client/Program.cs b/Website.Client/Program.cs deleted file mode 100644 index 519269f..0000000 --- a/Website.Client/Program.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; - -var builder = WebAssemblyHostBuilder.CreateDefault(args); - -await builder.Build().RunAsync(); diff --git a/Website.Client/Website.Client.csproj b/Website.Client/Website.Client.csproj deleted file mode 100644 index b89c4e9..0000000 --- a/Website.Client/Website.Client.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net10.0 - enable - enable - true - Default - true - - - - - - - diff --git a/Website.Client/_Imports.razor b/Website.Client/_Imports.razor deleted file mode 100644 index 4dc66eb..0000000 --- a/Website.Client/_Imports.razor +++ /dev/null @@ -1,9 +0,0 @@ -@using System.Net.Http -@using System.Net.Http.Json -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using static Microsoft.AspNetCore.Components.Web.RenderMode -@using Microsoft.AspNetCore.Components.Web.Virtualization -@using Microsoft.JSInterop -@using Website.Client diff --git a/Website.Client/wwwroot/appsettings.Development.json b/Website.Client/wwwroot/appsettings.Development.json deleted file mode 100644 index 0c208ae..0000000 --- a/Website.Client/wwwroot/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/Website.Client/wwwroot/appsettings.json b/Website.Client/wwwroot/appsettings.json deleted file mode 100644 index 0c208ae..0000000 --- a/Website.Client/wwwroot/appsettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/Website/Components/Pages/Home.razor b/Website/Components/Pages/Home.razor index 1043da8..fbbf6c3 100644 --- a/Website/Components/Pages/Home.razor +++ b/Website/Components/Pages/Home.razor @@ -38,18 +38,21 @@
@foreach (var experience in WorkExperience.Get().Experiences) { -
@experience.Role
-
@experience.Location
-
@experience.DateRange
- + } }
diff --git a/Website/Components/Routes.razor b/Website/Components/Routes.razor index 1e8a229..105855d 100644 --- a/Website/Components/Routes.razor +++ b/Website/Components/Routes.razor @@ -1,4 +1,4 @@ - + diff --git a/Website/Components/_Imports.razor b/Website/Components/_Imports.razor index 7b76ecb..e05c470 100644 --- a/Website/Components/_Imports.razor +++ b/Website/Components/_Imports.razor @@ -7,6 +7,5 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using Website -@using Website.Client @using Website.Components @using Website.Components.Layout diff --git a/Website/Data/Overview.cs b/Website/Data/Overview.cs index f611672..1a3be90 100644 --- a/Website/Data/Overview.cs +++ b/Website/Data/Overview.cs @@ -13,7 +13,7 @@ public static class Overview IsVisible = true, Order = 1, Description = - "Software Developer with a focus on the .NET tech stack.", + "In the industry since 2012, while playing a pivotal role in all aspects of the software stack, from prototype to release, and improving applications with patches based on customer feedback and data in production.", LastModified = new DateTime(2025, 9, 8) } ] diff --git a/Website/Data/WorkExperience.cs b/Website/Data/WorkExperience.cs index e430ba3..6fc41ed 100644 --- a/Website/Data/WorkExperience.cs +++ b/Website/Data/WorkExperience.cs @@ -63,6 +63,7 @@ public static class WorkExperience Role = "Fullstack Blazor Developer", Location = "Personal Projects, on various interests", DateRange = "2021, 2026", + IsVisible = false, Points = [ new Point @@ -87,15 +88,16 @@ public static class WorkExperience }, new Experience { - Role = "Angular Web Developer", + Role = "Angular Website Developer", Location = "CleanCode, Software consultancy on various projects", DateRange = "2020 - 2021", + IsVisible = true, Points = [ new Point { Description = - "Came to the conclusion that I wanted to focus my career in .NET, and left the company to pursue Blazor research and C# opportunities. Unfortunately, Blazor development work is not as popular as one would hope.", + "Came to the conclusion that I wanted to focus my career in .NET, and left the company to pursue Blazor research and C# opportunities. Unfortunately, Blazor development work is not popular.", IsVisible = true } ] @@ -200,6 +202,8 @@ public static class WorkExperience public string Location { get; set; } public string DateRange { get; set; } + public bool IsVisible { get; set; } = true; + public List Points { get; set; } } diff --git a/Website/Program.cs b/Website/Program.cs index d996817..a8de88e 100644 --- a/Website/Program.cs +++ b/Website/Program.cs @@ -27,7 +27,6 @@ app.UseAntiforgery(); app.MapStaticAssets(); app.MapRazorComponents() .AddInteractiveServerRenderMode() - .AddInteractiveWebAssemblyRenderMode() - .AddAdditionalAssemblies(typeof(Website.Client._Imports).Assembly); + .AddInteractiveWebAssemblyRenderMode(); app.Run(); diff --git a/Website/Website.csproj b/Website/Website.csproj index 692d435..ca6bd16 100644 --- a/Website/Website.csproj +++ b/Website/Website.csproj @@ -5,10 +5,10 @@ enable enable true + Website - diff --git a/resume_html/index.html b/resume_html/index.html deleted file mode 100644 index 97e9de7..0000000 --- a/resume_html/index.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Jon McCaffrey - .NET Developer - - - -
- - -
-
-

About Me

-

Software Developer with a focus on the .NET tech stack. Passionate about building robust backends, crafting clean APIs, and writing maintainable C# code. Experienced across the full stack with a drive to deliver quality software.

-
- -
-

Experience

- -
-
-

.NET Server Developer

- 2021 – 2026 -
-

TotalETO — Engineering to Order Solutions

-
    -
  • Wrote various API calls, unit tests to test said calls, and exact examples to show the frontend team on how to consume the GraphQL API.
  • -
  • Converted SQL stored procedures into views usable by Entity Framework to support old functionality with new web app features.
  • -
  • Moved from backend to frontend as needed to fix bugs and add features to React frontend to help the UI team with their higher workload.
  • -
  • Took part in converting legacy VB-coded app functionality to a C# .NET web development server.
  • -
  • Taken the initiative in creating a variety of onboarding internal wiki documents explaining parts of the codebase that were well-loved by the team.
  • -
  • Created an Azure DevOps pipeline to automate taking snapshots of the database schema to be aware of changes from multiple teams altering the database.
  • -
-
- -
-
-

Fullstack Blazor Developer

- 2021 -
-

Personal Projects

-
    -
  • Created igpfanreference.ca to teach players in unreleased game basic play patterns, and to experiment with Blazor, Linux self-hosting and Azure web hosting.
  • -
  • Twitch streamed live coding sessions to demonstrate developing the website, and crowd-sourced and credited players on ideas and functionality for the website.
  • -
-
- -
-
-

Angular Web Developer

- 2020 – 2021 -
-

CleanCode — Software Consultancy

-
    -
  • Came to the conclusion that I wanted to focus my career in .NET, and left the company to pursue Blazor research and C# opportunities.
  • -
-
- -
-
-

Full Stack Developer

- 2015 – 2020 -
-

bitHeads — Cloud-Based Technology

-
    -
  • Worked on a portal and mobile-facing web app for a SaaS project written in React.
  • -
  • Eliminated routine project hours spent documenting by creating a Node.js tool in TypeScript that generated the API doc contents.
  • -
  • Created brainCloud's Command Line tool in Node.js and other test tools, for developers and QA to test and stress test API and server features.
  • -
  • Maintained customer success and brainCloud's unit tests, examples, and libraries in Java, ObjC, C++, C#, JS, Unity, and Unreal.
  • -
  • Wrote documentation, tutorials, and offered guidance to bring new co-workers up to speed on the BaaS environment.
  • -
  • Maintained and wrote Jenkins Pipeline in Groovy for improved test reporting and team CI.
  • -
  • Developed Test Automation for brainCloud and Nortec/Condair Help websites in Java, to reduce manual testing time spent on an agile team.
  • -
-
- -
-
-

Mobile Game Developer

- 2012 – 2015 -
-

Smoke Labs — Mobile Games Startup

-
    -
  • Developed key systems in Blokus, Mattel-branded title nominated in the Canadian Video Game Awards for "Best Game Design" and "Best Social or Casual Game."
  • -
  • Experience integrating a multitude of analytics, ad systems, and backends, including Google Analytics, Game Analytics, Flurry, Mopub, and Playhaven.
  • -
  • Spent time working with the external QA team to bridge the company's knowledge gaps between the developer and QA workflows.
  • -
  • Integrated ads, in-app purchases, analytics, and handled product releases of legacy client apps.
  • -
-
-
-
-
- - diff --git a/resume_html/style.css b/resume_html/style.css deleted file mode 100644 index 402d394..0000000 --- a/resume_html/style.css +++ /dev/null @@ -1,373 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; - background: #e8ecf1; - color: #2d3436; - line-height: 1.5; -} - -.container { - display: flex; - max-width: 1100px; - margin: 40px auto; - background: #fff; - border-radius: 12px; - box-shadow: 0 8px 40px rgba(0,0,0,0.12); - overflow: hidden; -} - -/* Sidebar */ -.sidebar { - width: 300px; - min-width: 300px; - background: #1a1d23; - color: #e0e0e0; - padding: 36px 28px; -} - -.profile { - text-align: center; - margin-bottom: 28px; -} - -.avatar { - width: 72px; - height: 72px; - border-radius: 50%; - background: linear-gradient(135deg, #6c5ce7, #512da8); - color: #fff; - font-size: 26px; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - margin: 0 auto 14px; -} - -.profile h1 { - font-size: 20px; - color: #fff; - margin-bottom: 4px; -} - -.tagline { - color: #a29bfe; - font-size: 13px; - font-weight: 600; - letter-spacing: 0.5px; -} - -.info-section { - margin-bottom: 24px; -} - -.info-section h2 { - font-size: 12px; - text-transform: uppercase; - letter-spacing: 1.5px; - color: #a29bfe; - border-bottom: 1px solid #2d2d35; - padding-bottom: 6px; - margin-bottom: 12px; -} - -.contact-list { - list-style: none; -} - -.contact-list li { - display: flex; - flex-direction: column; - margin-bottom: 8px; - font-size: 12px; -} - -.contact-list .label { - color: #888; - font-size: 10px; - text-transform: uppercase; - letter-spacing: 0.5px; - margin-bottom: 1px; -} - -.skill-group { - margin-bottom: 16px; -} - -.skill-group h3 { - font-size: 11px; - text-transform: uppercase; - letter-spacing: 0.8px; - color: #a29bfe; - margin-bottom: 6px; -} - -.skill-list { - list-style: none; - display: flex; - flex-wrap: wrap; - gap: 5px; -} - -.skill-list li { - background: #2d2d35; - color: #ccc; - padding: 3px 9px; - border-radius: 4px; - font-size: 11px; -} - -.skill-list li:first-child { - background: #6c5ce7; - color: #fff; - font-weight: 600; -} - -/* Main content */ -.main { - flex: 1; - padding: 36px 40px; -} - -.overview { - margin-bottom: 32px; -} - -.overview h2 { - font-size: 12px; - text-transform: uppercase; - letter-spacing: 1.5px; - color: #6c5ce7; - margin-bottom: 8px; -} - -.overview p { - font-size: 14px; - color: #555; -} - -.overview strong { - color: #512da8; -} - -/* Experience */ -.experience-section h2 { - font-size: 12px; - text-transform: uppercase; - letter-spacing: 1.5px; - color: #6c5ce7; - margin-bottom: 18px; -} - -.experience { - margin-bottom: 24px; - padding-left: 14px; - border-left: 3px solid #e0e0e0; - page-break-inside: avoid; -} - -.experience:last-child { - margin-bottom: 0; -} - -.exp-header { - display: flex; - justify-content: space-between; - align-items: baseline; - flex-wrap: wrap; - gap: 6px; -} - -.exp-header h3 { - font-size: 15px; - color: #1a1d23; -} - -.exp-date { - font-size: 12px; - color: #888; - white-space: nowrap; -} - -.exp-location { - font-size: 12px; - color: #6c5ce7; - margin-bottom: 8px; - font-weight: 500; -} - -.experience ul { - list-style: none; -} - -.experience ul li { - position: relative; - padding-left: 16px; - margin-bottom: 5px; - font-size: 13px; - color: #444; -} - -.experience ul li::before { - content: "–"; - position: absolute; - left: 1px; - color: #6c5ce7; -} - -.experience ul li strong { - color: #512da8; -} - -@media (max-width: 768px) { - .container { - flex-direction: column; - margin: 16px; - } - - .sidebar { - width: 100%; - min-width: unset; - } - - .main { - padding: 24px 20px; - } -} - -@media print { - body { - background: #fff; - color: #000; - font-size: 11px; - line-height: 1.35; - } - - .container { - flex-direction: row; - max-width: 100%; - margin: 0; - border-radius: 0; - box-shadow: none; - } - - .sidebar { - width: 260px; - min-width: 260px; - background: #fff; - color: #000; - padding: 24px 20px; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; - } - - .sidebar h2 { - color: #512da8 !important; - border-bottom-color: #ccc !important; - } - - .profile h1 { - color: #000; - font-size: 18px; - } - - .tagline { - color: #512da8; - } - - .avatar { - width: 60px; - height: 60px; - font-size: 20px; - background: #512da8 !important; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; - } - - .contact-list .label { - color: #666; - } - - .contact-list li { - font-size: 11px; - } - - .skill-group h3 { - color: #512da8 !important; - } - - .skill-list li { - background: #ddd !important; - color: #000 !important; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; - font-size: 10px; - padding: 2px 7px; - } - - .skill-list li:first-child { - background: #512da8 !important; - color: #fff !important; - } - - .main { - padding: 24px 28px; - } - - .overview h2, - .experience-section h2 { - color: #512da8 !important; - font-size: 11px; - } - - .overview p { - color: #333; - font-size: 12px; - } - - .overview strong, - .experience ul li strong { - color: #512da8 !important; - } - - .exp-header h3 { - color: #000; - font-size: 13px; - } - - .exp-date { - color: #666; - font-size: 11px; - } - - .exp-location { - color: #512da8 !important; - font-size: 11px; - } - - .experience { - padding-left: 10px; - border-left-color: #ccc; - margin-bottom: 14px; - page-break-inside: avoid; - } - - .experience ul li { - color: #333; - font-size: 11px; - margin-bottom: 3px; - } - - .experience ul li::before { - color: #512da8 !important; - } - - .experience:last-of-type { - page-break-after: avoid; - } -}