...
This commit is contained in:
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user