Update Amazon role to past, fix Steam Deck scrolling, remove cut2 portrait
Changes
@@@ -25,9 +25,10 @@<span class="hero__rotator" aria-live="polite"><i class="fa-solid fa-chart-line"></i> Data Analyst</span></p><p class="hero__lead">-- Systems architect and data analyst with a decade of shipping — from-- SOX-compliance tooling and autonomous AI agents at Amazon to a-- 15-microservice open-source creator platform, engineered solo.++ Data analyst and systems architect with 10+ years of shipping — from++ SOX-compliance tooling and autonomous AI agents at Amazon ICQA to a++ solo-built 15-microservice open-source creator platform.++ Open to new roles.</p><div class="hero__cta"><a href="/#work" class="btn btn--primary"><i class="fa-solid fa-eye"></i> View Work</a>@@@ -52,7 +53,6 @@<div class="hero__portrait-frame"><div class="hero__portrait-placeholder" role="img" aria-label="Portrait of Alex Frison"><img src="/assets/img/alex-cut1.png" alt="Alex Frison" class="hero__portrait-img hero__portrait-img--a" id="portrait-a">-- <img src="/assets/img/alex-cut2.png" alt="Alex Frison" class="hero__portrait-img hero__portrait-img--b" id="portrait-b" aria-hidden="true" loading="lazy"></div></div></div>@@@ -162,7 +162,6 @@transition: opacity 0.8s ease;}.hero__portrait-img--a { opacity: 1; }-- .hero__portrait-img--b { opacity: 0; }@media (prefers-reduced-motion: reduce) {.hero__portrait-img { transition: none; }}@@@ -277,19 +276,7 @@}, { passive: true });}-- // Portrait crossfader — both images already in DOM so no load blink-- const imgA = document.getElementById("portrait-a") as HTMLImageElement | null;-- const imgB = document.getElementById("portrait-b") as HTMLImageElement | null;-- if (imgA && imgB && !window.matchMedia("(prefers-reduced-motion: reduce)").matches) {-- let aActive = true;-- setInterval(() => {-- aActive = !aActive;-- imgA.style.opacity = aActive ? "1" : "0";-- imgB.style.opacity = aActive ? "0" : "1";-- imgA.setAttribute("aria-hidden", aActive ? "false" : "true");-- imgB.setAttribute("aria-hidden", aActive ? "true" : "false");-- }, 15000);-- }++// tsparticles light rain/snowconst ps = document.createElement("script");@@@ -28,7 +28,9 @@ const tech = [letter-spacing: 0.04em;}.marquee__track span { white-space: nowrap; }-- .marquee:hover .marquee__track { animation-play-state: paused; }++ @media (hover: hover) {++ .marquee:hover .marquee__track { animation-play-state: paused; }++ }@keyframes scroll {from { transform: translateX(0); }to { transform: translateX(-50%); }@@@ -121,7 +121,10 @@ const featured = all.sort((a, b) => a.data.order - b.data.order);spaceBetween: 18,centeredSlides: false,loop: true,-- autoplay: { delay: 5000, disableOnInteraction: false, pauseOnMouseEnter: true },++ grabCursor: true,++ simulateTouch: true,++ touchStartPreventDefault: false,++ autoplay: { delay: 5000, disableOnInteraction: false, pauseOnMouseEnter: false },pagination: { el: ".swiper-pagination", clickable: true },navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev" },keyboard: { enabled: true },@@@ -2,7 +2,7 @@"company": "Amazon","role": "Data Analyst — ICQA","start": "2024",-- "end": "Present",++ "end": "2025","location": "PAE2 · Arlington, WA","bullets": ["Own SOX-compliance IRDR (Inventory Discrepancy Research Report) workflows — hand-researched 1,000+ inventory mismatches and built the data systems that support Sarbanes-Oxley audit requirements.",@@@ -2,7 +2,7 @@"company": "Hobo Network · OpenVibe","role": "Founder · Systems Architect · Principal Engineer","start": "2022",-- "end": "Present",++ "end": "2025","bullets": ["Sole architect and engineer on OpenVibe — a 15-microservice open-source platform kernel: distributed event bus, OIDC/OAuth2 identity provider, capability contract registry, media object store, live-streaming ingest and restream, real-time chat, billing ledger, AI/search backbone, and realtime infrastructure. Self-hosted alternative to Twitch + YouTube + Patreon + Discord. 16 phases documented; 11+ fully implemented with cutover runbook and migration tooling complete.","Built and operated HoboStreamer from scratch — a full live-streaming platform with WebRTC SFU, HLS, multi-destination RTMP restream (OBS → Twitch/YouTube/Kick simultaneously), auto-recorded VODs, clip detection, real-time chat with custom emotes, voice channels, stream analytics, comprehensive moderation tools, and an integrated browser game for viewers. Fully open source.",@@@ -50,11 +50,7 @@ const pageUrl = canonical ?? new URL(Astro.url.pathname, Astro.site).toString();"telephone": "+14253673997","image": "https://alexfrison.net/assets/img/alex-cut1.png","jobTitle": "Data Analyst · Software Engineer",-- "description": "Seattle-area data analyst and full-stack software engineer with 10+ years shipping web platforms, autonomous analytics agents, and creator infrastructure. Currently open to new roles.",-- "worksFor": {-- "@type": "Organization",-- "name": "Amazon"-- },++ "description": "Seattle-area data analyst and full-stack software engineer with 10+ years shipping web platforms, autonomous analytics agents, and creator infrastructure. Open to new roles.","knowsAbout": ["Data Analysis", "SQL", "Python", "TypeScript", "Node.js","Machine Learning", "Autonomous Agents", "Streaming Platforms",@@@ -38,8 +38,8 @@ import ContactBlock from "../components/ContactBlock.astro";<li><strong><i class="fa-solid fa-location-dot"></i> Based</strong>Seattle / Arlington, WA</li><li><strong><i class="fa-solid fa-briefcase"></i> Open to</strong>Hybrid · Remote · On-site PNW</li><li><strong><i class="fa-solid fa-building-columns"></i> Founder</strong>GameServerStats, LLC</li>-- <li><strong><i class="fa-solid fa-laptop-code"></i> Currently</strong>Amazon Data Analyst (ICQA)</li>-- <li><strong><i class="fa-solid fa-hammer"></i> Building</strong>OpenVibe — open-source creator platform</li>++ <li><strong><i class="fa-solid fa-laptop-code"></i> Last role</strong>Amazon · Data Analyst (ICQA)</li>++ <li><strong><i class="fa-solid fa-magnifying-glass"></i> Seeking</strong>Analyst · Engineer · Builder roles</li></ul></aside></div>
@@ -25,9 +25,10 @@
@@ -25,9 +25,10 @@
<span class="hero__rotator" aria-live="polite"><i class="fa-solid fa-chart-line"></i> Data Analyst</span>
<span class="hero__rotator" aria-live="polite"><i class="fa-solid fa-chart-line"></i> Data Analyst</span>
</p>
</p>
<p class="hero__lead">
<p class="hero__lead">
- Systems architect and data analyst with a decade of shipping — from
- SOX-compliance tooling and autonomous AI agents at Amazon to a
- 15-microservice open-source creator platform, engineered solo.
+ Data analyst and systems architect with 10+ years of shipping — from
+ SOX-compliance tooling and autonomous AI agents at Amazon ICQA to a
+ solo-built 15-microservice open-source creator platform.
+ Open to new roles.
</p>
</p>
<div class="hero__cta">
<div class="hero__cta">
<a href="/#work" class="btn btn--primary"><i class="fa-solid fa-eye"></i> View Work</a>
<a href="/#work" class="btn btn--primary"><i class="fa-solid fa-eye"></i> View Work</a>
@@ -52,7 +53,6 @@
@@ -52,7 +53,6 @@
<div class="hero__portrait-frame">
<div class="hero__portrait-frame">
<div class="hero__portrait-placeholder" role="img" aria-label="Portrait of Alex Frison">
<div class="hero__portrait-placeholder" role="img" aria-label="Portrait of Alex Frison">
<img src="/assets/img/alex-cut1.png" alt="Alex Frison" class="hero__portrait-img hero__portrait-img--a" id="portrait-a">
<img src="/assets/img/alex-cut1.png" alt="Alex Frison" class="hero__portrait-img hero__portrait-img--a" id="portrait-a">
- <img src="/assets/img/alex-cut2.png" alt="Alex Frison" class="hero__portrait-img hero__portrait-img--b" id="portrait-b" aria-hidden="true" loading="lazy">
</div>
</div>
</div>
</div>
</div>
</div>
@@ -162,7 +162,6 @@
@@ -162,7 +162,6 @@
transition: opacity 0.8s ease;
transition: opacity 0.8s ease;
}
}
.hero__portrait-img--a { opacity: 1; }
.hero__portrait-img--a { opacity: 1; }
- .hero__portrait-img--b { opacity: 0; }
@media (prefers-reduced-motion: reduce) {
@media (prefers-reduced-motion: reduce) {
.hero__portrait-img { transition: none; }
.hero__portrait-img { transition: none; }
}
}
@@ -277,19 +276,7 @@
@@ -277,19 +276,7 @@
}, { passive: true });
}, { passive: true });
}
}
- // Portrait crossfader — both images already in DOM so no load blink
- const imgA = document.getElementById("portrait-a") as HTMLImageElement | null;
- const imgB = document.getElementById("portrait-b") as HTMLImageElement | null;
- if (imgA && imgB && !window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
- let aActive = true;
- setInterval(() => {
- aActive = !aActive;
- imgA.style.opacity = aActive ? "1" : "0";
- imgB.style.opacity = aActive ? "0" : "1";
- imgA.setAttribute("aria-hidden", aActive ? "false" : "true");
- imgB.setAttribute("aria-hidden", aActive ? "true" : "false");
- }, 15000);
- }
+
// tsparticles light rain/snow
// tsparticles light rain/snow
const ps = document.createElement("script");
const ps = document.createElement("script");
@@ -28,7 +28,9 @@ const tech = [
@@ -28,7 +28,9 @@ const tech = [
letter-spacing: 0.04em;
letter-spacing: 0.04em;
}
}
.marquee__track span { white-space: nowrap; }
.marquee__track span { white-space: nowrap; }
- .marquee:hover .marquee__track { animation-play-state: paused; }
+ @media (hover: hover) {
+ .marquee:hover .marquee__track { animation-play-state: paused; }
+ }
@keyframes scroll {
@keyframes scroll {
from { transform: translateX(0); }
from { transform: translateX(0); }
to { transform: translateX(-50%); }
to { transform: translateX(-50%); }
@@ -121,7 +121,10 @@ const featured = all.sort((a, b) => a.data.order - b.data.order);
@@ -121,7 +121,10 @@ const featured = all.sort((a, b) => a.data.order - b.data.order);
spaceBetween: 18,
spaceBetween: 18,
centeredSlides: false,
centeredSlides: false,
loop: true,
loop: true,
- autoplay: { delay: 5000, disableOnInteraction: false, pauseOnMouseEnter: true },
+ grabCursor: true,
+ simulateTouch: true,
+ touchStartPreventDefault: false,
+ autoplay: { delay: 5000, disableOnInteraction: false, pauseOnMouseEnter: false },
pagination: { el: ".swiper-pagination", clickable: true },
pagination: { el: ".swiper-pagination", clickable: true },
navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev" },
navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev" },
keyboard: { enabled: true },
keyboard: { enabled: true },
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"company": "Amazon",
"company": "Amazon",
"role": "Data Analyst — ICQA",
"role": "Data Analyst — ICQA",
"start": "2024",
"start": "2024",
- "end": "Present",
+ "end": "2025",
"location": "PAE2 · Arlington, WA",
"location": "PAE2 · Arlington, WA",
"bullets": [
"bullets": [
"Own SOX-compliance IRDR (Inventory Discrepancy Research Report) workflows — hand-researched 1,000+ inventory mismatches and built the data systems that support Sarbanes-Oxley audit requirements.",
"Own SOX-compliance IRDR (Inventory Discrepancy Research Report) workflows — hand-researched 1,000+ inventory mismatches and built the data systems that support Sarbanes-Oxley audit requirements.",
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"company": "Hobo Network · OpenVibe",
"company": "Hobo Network · OpenVibe",
"role": "Founder · Systems Architect · Principal Engineer",
"role": "Founder · Systems Architect · Principal Engineer",
"start": "2022",
"start": "2022",
- "end": "Present",
+ "end": "2025",
"bullets": [
"bullets": [
"Sole architect and engineer on OpenVibe — a 15-microservice open-source platform kernel: distributed event bus, OIDC/OAuth2 identity provider, capability contract registry, media object store, live-streaming ingest and restream, real-time chat, billing ledger, AI/search backbone, and realtime infrastructure. Self-hosted alternative to Twitch + YouTube + Patreon + Discord. 16 phases documented; 11+ fully implemented with cutover runbook and migration tooling complete.",
"Sole architect and engineer on OpenVibe — a 15-microservice open-source platform kernel: distributed event bus, OIDC/OAuth2 identity provider, capability contract registry, media object store, live-streaming ingest and restream, real-time chat, billing ledger, AI/search backbone, and realtime infrastructure. Self-hosted alternative to Twitch + YouTube + Patreon + Discord. 16 phases documented; 11+ fully implemented with cutover runbook and migration tooling complete.",
"Built and operated HoboStreamer from scratch — a full live-streaming platform with WebRTC SFU, HLS, multi-destination RTMP restream (OBS → Twitch/YouTube/Kick simultaneously), auto-recorded VODs, clip detection, real-time chat with custom emotes, voice channels, stream analytics, comprehensive moderation tools, and an integrated browser game for viewers. Fully open source.",
"Built and operated HoboStreamer from scratch — a full live-streaming platform with WebRTC SFU, HLS, multi-destination RTMP restream (OBS → Twitch/YouTube/Kick simultaneously), auto-recorded VODs, clip detection, real-time chat with custom emotes, voice channels, stream analytics, comprehensive moderation tools, and an integrated browser game for viewers. Fully open source.",
@@ -50,11 +50,7 @@ const pageUrl = canonical ?? new URL(Astro.url.pathname, Astro.site).toString();
@@ -50,11 +50,7 @@ const pageUrl = canonical ?? new URL(Astro.url.pathname, Astro.site).toString();
"telephone": "+14253673997",
"telephone": "+14253673997",
"image": "https://alexfrison.net/assets/img/alex-cut1.png",
"image": "https://alexfrison.net/assets/img/alex-cut1.png",
"jobTitle": "Data Analyst · Software Engineer",
"jobTitle": "Data Analyst · Software Engineer",
- "description": "Seattle-area data analyst and full-stack software engineer with 10+ years shipping web platforms, autonomous analytics agents, and creator infrastructure. Currently open to new roles.",
- "worksFor": {
- "@type": "Organization",
- "name": "Amazon"
- },
+ "description": "Seattle-area data analyst and full-stack software engineer with 10+ years shipping web platforms, autonomous analytics agents, and creator infrastructure. Open to new roles.",
"knowsAbout": [
"knowsAbout": [
"Data Analysis", "SQL", "Python", "TypeScript", "Node.js",
"Data Analysis", "SQL", "Python", "TypeScript", "Node.js",
"Machine Learning", "Autonomous Agents", "Streaming Platforms",
"Machine Learning", "Autonomous Agents", "Streaming Platforms",
@@ -38,8 +38,8 @@ import ContactBlock from "../components/ContactBlock.astro";
@@ -38,8 +38,8 @@ import ContactBlock from "../components/ContactBlock.astro";
<li><strong><i class="fa-solid fa-location-dot"></i> Based</strong>Seattle / Arlington, WA</li>
<li><strong><i class="fa-solid fa-location-dot"></i> Based</strong>Seattle / Arlington, WA</li>
<li><strong><i class="fa-solid fa-briefcase"></i> Open to</strong>Hybrid · Remote · On-site PNW</li>
<li><strong><i class="fa-solid fa-briefcase"></i> Open to</strong>Hybrid · Remote · On-site PNW</li>
<li><strong><i class="fa-solid fa-building-columns"></i> Founder</strong>GameServerStats, LLC</li>
<li><strong><i class="fa-solid fa-building-columns"></i> Founder</strong>GameServerStats, LLC</li>
- <li><strong><i class="fa-solid fa-laptop-code"></i> Currently</strong>Amazon Data Analyst (ICQA)</li>
- <li><strong><i class="fa-solid fa-hammer"></i> Building</strong>OpenVibe — open-source creator platform</li>
+ <li><strong><i class="fa-solid fa-laptop-code"></i> Last role</strong>Amazon · Data Analyst (ICQA)</li>
+ <li><strong><i class="fa-solid fa-magnifying-glass"></i> Seeking</strong>Analyst · Engineer · Builder roles</li>
</ul>
</ul>
</aside>
</aside>
</div>
</div>