This commit is contained in:
2026-06-08 12:21:03 -04:00
parent a0fbc80bff
commit 1c8d16e07f
32 changed files with 528 additions and 764 deletions
+156
View File
@@ -0,0 +1,156 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Jon McCaffrey - .NET Developer</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="sidebar">
<div class="profile">
<div class="avatar">JM</div>
<h1>Jon McCaffrey</h1>
<p class="tagline">.NET Developer</p>
</div>
<div class="info-section">
<ul class="contact-list">
<li><span class="label">Location</span><span>Ottawa, ON</span></li>
<li><span class="label">Email</span><span>jonmcc0723@gmail.com</span></li>
<li><span class="label">Phone</span><span>613-277-8353</span></li>
<li><span class="label">Experience</span><span>14 years in tech, 3 in education</span></li>
<li><span class="label">Education</span><span>Game Development (2012)</span></li>
<li><span class="label">Rate</span><span>$50 / hr</span></li>
</ul>
</div>
<div class="info-section skills-section">
<h2>Skills</h2>
<div class="skill-group">
<h3>.NET Ecosystem</h3>
<ul class="skill-list">
<li>C# / .NET</li>
<li>Blazor</li>
<li>Entity Framework</li>
<li>ASP.NET Core</li>
<li>REST APIs / GraphQL</li>
<li>SQL / SQL Server</li>
</ul>
</div>
<div class="skill-group">
<h3>Frontend & Web</h3>
<ul class="skill-list">
<li>HTML / CSS</li>
<li>JavaScript / TypeScript</li>
<li>React</li>
<li>Angular</li>
</ul>
</div>
<div class="skill-group">
<h3>DevOps & Tools</h3>
<ul class="skill-list">
<li>Azure / AWS</li>
<li>Azure Pipelines / Jenkins</li>
<li>Git</li>
<li>Jira / Azure DevOps</li>
<li>Unit Testing / Test Automation</li>
<li>CI/CD</li>
</ul>
</div>
<div class="skill-group">
<h3>Other</h3>
<ul class="skill-list">
<li>Agile / Scrum</li>
<li>Documentation & Training</li>
<li>Customer Support & Debugging</li>
<li>Self-Hosting (Ubuntu Server)</li>
<li>Google Analytics / 3rd Party APIs</li>
</ul>
</div>
</div>
</div>
<div class="main">
<div class="overview">
<h2>About Me</h2>
<p>Software Developer with a focus on the <strong>.NET tech stack</strong>. 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.</p>
</div>
<div class="experience-section">
<h2>Experience</h2>
<div class="experience">
<div class="exp-header">
<h3>.NET Server Developer</h3>
<span class="exp-date">2021 2026</span>
</div>
<p class="exp-location">TotalETO — Engineering to Order Solutions</p>
<ul>
<li>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.</li>
<li>Converted SQL stored procedures into views usable by Entity Framework to support old functionality with new web app features.</li>
<li>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.</li>
<li>Took part in converting legacy VB-coded app functionality to a <strong>C# .NET web development server</strong>.</li>
<li>Taken the initiative in creating a variety of onboarding internal wiki documents explaining parts of the codebase that were well-loved by the team.</li>
</ul>
</div>
<div class="experience">
<div class="exp-header">
<h3>Fullstack Blazor Developer</h3>
<span class="exp-date">2021</span>
</div>
<p class="exp-location">Personal Projects</p>
<ul>
<li>Created igpfanreference.ca to teach players in unreleased game basic play patterns, and to experiment with <strong>Blazor</strong>, Linux self-hosting and Azure web hosting.</li>
<li>Twitch streamed live coding sessions to demonstrate developing the website, and crowd-sourced and credited players on ideas and functionality for the website.</li>
</ul>
</div>
<div class="experience">
<div class="exp-header">
<h3>Angular Web Developer</h3>
<span class="exp-date">2020 2021</span>
</div>
<p class="exp-location">CleanCode — Software Consultancy</p>
<ul>
<li>Came to the conclusion that I wanted to focus my career in <strong>.NET</strong>, and left the company to pursue Blazor research and C# opportunities.</li>
</ul>
</div>
<div class="experience">
<div class="exp-header">
<h3>Full Stack Developer</h3>
<span class="exp-date">2015 2020</span>
</div>
<p class="exp-location">bitHeads — Cloud-Based Technology</p>
<ul>
<li>Worked on a portal and mobile-facing web app for a SaaS project written in React.</li>
<li>Eliminated routine project hours spent documenting by creating a Node.js tool in TypeScript that generated the API doc contents.</li>
<li>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.</li>
<li>Maintained customer success and brainCloud's unit tests, examples, and libraries in <strong>Java, ObjC, C++, C#, JS, Unity, and Unreal</strong>.</li>
<li>Wrote documentation, tutorials, and offered guidance to bring new co-workers up to speed on the BaaS environment.</li>
<li>Maintained and wrote Jenkins Pipeline in Groovy for improved test reporting and team CI.</li>
<li>Developed Test Automation for brainCloud and Nortec/Condair Help websites in Java, to reduce manual testing time spent on an agile team.</li>
</ul>
</div>
<div class="experience">
<div class="exp-header">
<h3>Mobile Game Developer</h3>
<span class="exp-date">2012 2015</span>
</div>
<p class="exp-location">Smoke Labs — Mobile Games Startup</p>
<ul>
<li>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."</li>
<li>Experience integrating a multitude of analytics, ad systems, and backends, including Google Analytics, Game Analytics, Flurry, Mopub, and Playhaven.</li>
<li>Spent time working with the external QA team to bridge the company's knowledge gaps between the developer and QA workflows.</li>
<li>Integrated ads, in-app purchases, analytics, and handled product releases of legacy client apps.</li>
</ul>
</div>
</div>
</div>
</div>
</body>
</html>
+240
View File
@@ -0,0 +1,240 @@
* {
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.6;
}
.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: 40px 28px;
}
.profile {
text-align: center;
margin-bottom: 32px;
}
.avatar {
width: 80px;
height: 80px;
border-radius: 50%;
background: linear-gradient(135deg, #6c5ce7, #512da8);
color: #fff;
font-size: 28px;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 16px;
}
.profile h1 {
font-size: 22px;
color: #fff;
margin-bottom: 4px;
}
.tagline {
color: #a29bfe;
font-size: 14px;
font-weight: 600;
letter-spacing: 0.5px;
}
.info-section {
margin-bottom: 28px;
}
.info-section h2 {
font-size: 13px;
text-transform: uppercase;
letter-spacing: 1.5px;
color: #a29bfe;
border-bottom: 1px solid #2d2d35;
padding-bottom: 8px;
margin-bottom: 14px;
}
.contact-list {
list-style: none;
}
.contact-list li {
display: flex;
flex-direction: column;
margin-bottom: 10px;
font-size: 13px;
}
.contact-list .label {
color: #888;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 2px;
}
.skill-group {
margin-bottom: 18px;
}
.skill-group h3 {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.8px;
color: #a29bfe;
margin-bottom: 8px;
}
.skill-list {
list-style: none;
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.skill-list li {
background: #2d2d35;
color: #ccc;
padding: 4px 10px;
border-radius: 4px;
font-size: 12px;
}
.skill-list li:first-child {
background: #6c5ce7;
color: #fff;
font-weight: 600;
}
/* Main content */
.main {
flex: 1;
padding: 40px 44px;
}
.overview {
margin-bottom: 36px;
}
.overview h2 {
font-size: 13px;
text-transform: uppercase;
letter-spacing: 1.5px;
color: #6c5ce7;
margin-bottom: 10px;
}
.overview p {
font-size: 15px;
color: #555;
}
.overview strong {
color: #512da8;
}
/* Experience */
.experience-section h2 {
font-size: 13px;
text-transform: uppercase;
letter-spacing: 1.5px;
color: #6c5ce7;
margin-bottom: 20px;
}
.experience {
margin-bottom: 28px;
padding-left: 16px;
border-left: 3px solid #e0e0e0;
}
.experience:last-child {
margin-bottom: 0;
}
.exp-header {
display: flex;
justify-content: space-between;
align-items: baseline;
flex-wrap: wrap;
gap: 8px;
}
.exp-header h3 {
font-size: 17px;
color: #1a1d23;
}
.exp-date {
font-size: 13px;
color: #888;
white-space: nowrap;
}
.exp-location {
font-size: 13px;
color: #6c5ce7;
margin-bottom: 10px;
font-weight: 500;
}
.experience ul {
list-style: none;
}
.experience ul li {
position: relative;
padding-left: 18px;
margin-bottom: 6px;
font-size: 14px;
color: #444;
}
.experience ul li::before {
content: "";
position: absolute;
left: 2px;
color: #6c5ce7;
}
.experience ul li strong {
color: #512da8;
}
@media (max-width: 768px) {
.container {
flex-direction: column;
margin: 20px;
}
.sidebar {
width: 100%;
min-width: unset;
}
.main {
padding: 28px 24px;
}
}