Help
RSS
API
Feed
Maltego
Contact
Domain > seanpaulcampbell.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2020-12-05
52.85.134.129
(
ClassC
)
2020-12-05
52.85.134.64
(
ClassC
)
2025-08-11
3.163.24.28
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: CloudFrontDate: Mon, 11 Aug 2025 04:25:31 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveLocation: https://seanpaulcampbell.com/X-Cache: Redirect from cloudfrontVia: 1.1 89b24af8db05335e68292856e0a53668.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P2X-Amz-Cf-Id: _Z1Uie6NCHmTLLexlQEf10sNm9PlaJcOZ6K0N-XPg_ijInSiTvKl2A html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>CloudFront/center>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/html;charsetUTF-8Content-Length: 47127Connection: keep-aliveDate: Sun, 10 Aug 2025 01:06:23 GMTLast-Modified: Thu, 22 May 2025 16:51:01 GMTETag: 929858b4021e7e12fbeae20544e4f2b2x-amz-server-side-encryption: AES256Cache-Control: public,max-age0,s-maxage86400,stale-while-revalidate86400Accept-Ranges: bytesServer: AmazonS3X-Cache: Hit from cloudfrontVia: 1.1 c6aabec83f5c081149a8843767dacc52.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P2X-Amz-Cf-Id: jmzBCcKL4GwLDKYLvltRMDpaPf1Dr1rcBGX8zWj47GmVNqC2XJGfoQAge: 98349 !DOCTYPE html>html langen-US> head>meta charsetutf-8>meta http-equivX-UA-Compatible contentIEedge>meta nameviewport contentwidthdevice-width, initial-scale1.0, user-scalableyes>meta namegenerator contentAstro v5.7.5>meta namerobots contentindex, follow>meta nameHandheldFriendly contentTrue>meta namemobile-web-app-capable contentyes>meta nameapple-mobile-web-app-capable contentyes>meta nameapple-mobile-web-app-status-bar-style contentdefault>meta nameformat-detection contenttelephoneno,dateno,addressno,emailno,urlno>meta nametheme-color content#e68c2c media(prefers-color-scheme: dark)>meta nametheme-color content#f59e0b media(prefers-color-scheme: light)>link relsitemap href/sitemap-index.xml>link relmanifest href/site.webmanifest>link relalternate typeapplication/rss+xml titleSean Campbells Blog hrefhttps://seanpaulcampbell.com/rss.xml>!-- Script to check and apply dark mode preference -->script> // On page load, check if dark mode should be applied function applyTheme() { const theme localStorage.getItem(theme) || (window.matchMedia((prefers-color-scheme: dark)).matches ? dark : light); document.documentElement.classList.toggle(dark, theme dark); // Save to localStorage for next time localStorage.setItem(theme, theme); } // Apply theme on page load applyTheme(); // Re-apply theme after view transitions swap to prevent flashing document.addEventListener(astro:after-swap, applyTheme); /script>!-- Generated Favicons -->link relshortcut icon href/favicon.ico typeimage/x-icon>link relicon typeimage/png sizes16x16 href/favicon-16x16.png>link relicon typeimage/png sizes32x32 href/favicon-32x32.png>link relicon typeimage/png sizes48x48 href/favicon-48x48.png>link relicon typeimage/png sizes192x192 href/favicon-192x192.png>link relapple-touch-icon sizes180x180 href/apple-touch-icon.png>!-- Android/Chrome -->link relicon typeimage/png sizes512x512 href/favicon-512x512.png>!-- Web Manifest -->link relmanifest href/site.webmanifest>meta nameastro-view-transitions-enabled contenttrue>meta nameastro-view-transitions-fallback contentanimate>script typemodule src/_astro/ClientRouter.astro_astro_type_script_index_0_lang.BZs-2RF_.js>/script>title>Sean Campbell's Blog/title>meta namedescription contentMy blog about coding, software development, and the technologies I like to use.>link relcanonical hrefhttps://seanpaulcampbell.com/>!-- Open Graph / Facebook -->meta propertyog:title contentSean Campbells Blog>meta propertyog:description contentMy blog about coding, software development, and the technologies I like to use.>meta propertyog:image contenthttps://seanpaulcampbell.com/images/default-social.jpg>meta propertyog:image:alt contentSean Campbells Blog>meta propertyog:type contentwebsite>meta propertyog:locale contenten-US>meta propertyog:site_name contentSean Campbells Blog>meta propertyog:url contenthttps://seanpaulcampbell.com/>!-- Twitter -->meta nametwitter:title contentSean Campbells Blog>meta nametwitter:description contentMy blog about coding, software development, and the technologies I like to use.>meta nametwitter:image contenthttps://seanpaulcampbell.com/images/default-social.jpg>meta nametwitter:image:alt contentSean Campbells Blog>meta nametwitter:card contentsummary_large_image>link relalternate typeapplication/rss+xml titleSean Campbells Blog hrefhttps://seanpaulcampbell.com/rss.xml>link relstylesheet href/_astro/about.B5Be0HBu.css>style>@keyframes astroFadeInOut{0%{opacity:1}to{opacity:0}}@keyframes astroFadeIn{0%{opacity:0;mix-blend-mode:plus-lighter}to{opacity:1;mix-blend-mode:plus-lighter}}@keyframes astroFadeOut{0%{opacity:1;mix-blend-mode:plus-lighter}to{opacity:0;mix-blend-mode:plus-lighter}}@keyframes astroSlideFromRight{0%{transform:translate(100%)}}@keyframes astroSlideFromLeft{0%{transform:translate(-100%)}}@keyframes astroSlideToRight{to{transform:translate(100%)}}@keyframes astroSlideToLeft{to{transform:translate(-100%)}}@media (prefers-reduced-motion){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}data-astro-transition-scope{animation:none!important}}/style>style>data-astro-transition-scopeastro-eahnefy6-1 { view-transition-name: blog-title-self-hosted-convex-aws-sst-ec2; }@layer astro { ::view-transition-old(blog-title-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-title-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-title-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-title-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-eahnefy6-1, data-astro-transition-fallbackolddata-astro-transition-scopeastro-eahnefy6-1 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-eahnefy6-1, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-eahnefy6-1 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-eahnefy6-1, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-eahnefy6-1 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-eahnefy6-1, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-eahnefy6-1 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-3y6ofevf-2 { view-transition-name: blog-description-self-hosted-convex-aws-sst-ec2; }@layer astro { ::view-transition-old(blog-description-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-description-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-description-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-description-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-3y6ofevf-2, data-astro-transition-fallbackolddata-astro-transition-scopeastro-3y6ofevf-2 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-3y6ofevf-2, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-3y6ofevf-2 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-3y6ofevf-2, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-3y6ofevf-2 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-3y6ofevf-2, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-3y6ofevf-2 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-vsovhypy-3 { view-transition-name: blog-publish-date-self-hosted-convex-aws-sst-ec2; }@layer astro { ::view-transition-old(blog-publish-date-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-publish-date-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-publish-date-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-publish-date-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-vsovhypy-3, data-astro-transition-fallbackolddata-astro-transition-scopeastro-vsovhypy-3 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-vsovhypy-3, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-vsovhypy-3 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-vsovhypy-3, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-vsovhypy-3 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-vsovhypy-3, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-vsovhypy-3 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-wwuppz7i-4 { view-transition-name: blog-tags-self-hosted-convex-aws-sst-ec2; }@layer astro { ::view-transition-old(blog-tags-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-tags-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-tags-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-tags-self-hosted-convex-aws-sst-ec2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-wwuppz7i-4, data-astro-transition-fallbackolddata-astro-transition-scopeastro-wwuppz7i-4 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-wwuppz7i-4, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-wwuppz7i-4 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-wwuppz7i-4, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-wwuppz7i-4 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-wwuppz7i-4, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-wwuppz7i-4 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-eahnefy6-5 { view-transition-name: blog-title-self-hosted-convex-aws-sst; }@layer astro { ::view-transition-old(blog-title-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-title-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-title-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-title-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-eahnefy6-5, data-astro-transition-fallbackolddata-astro-transition-scopeastro-eahnefy6-5 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-eahnefy6-5, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-eahnefy6-5 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-eahnefy6-5, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-eahnefy6-5 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-eahnefy6-5, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-eahnefy6-5 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-3y6ofevf-6 { view-transition-name: blog-description-self-hosted-convex-aws-sst; }@layer astro { ::view-transition-old(blog-description-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-description-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-description-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-description-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-3y6ofevf-6, data-astro-transition-fallbackolddata-astro-transition-scopeastro-3y6ofevf-6 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-3y6ofevf-6, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-3y6ofevf-6 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-3y6ofevf-6, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-3y6ofevf-6 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-3y6ofevf-6, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-3y6ofevf-6 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-vsovhypy-7 { view-transition-name: blog-publish-date-self-hosted-convex-aws-sst; }@layer astro { ::view-transition-old(blog-publish-date-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-publish-date-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-publish-date-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-publish-date-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-vsovhypy-7, data-astro-transition-fallbackolddata-astro-transition-scopeastro-vsovhypy-7 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-vsovhypy-7, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-vsovhypy-7 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-vsovhypy-7, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-vsovhypy-7 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-vsovhypy-7, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-vsovhypy-7 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-wwuppz7i-8 { view-transition-name: blog-tags-self-hosted-convex-aws-sst; }@layer astro { ::view-transition-old(blog-tags-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-tags-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-tags-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-tags-self-hosted-convex-aws-sst) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-wwuppz7i-8, data-astro-transition-fallbackolddata-astro-transition-scopeastro-wwuppz7i-8 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-wwuppz7i-8, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-wwuppz7i-8 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-wwuppz7i-8, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-wwuppz7i-8 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-wwuppz7i-8, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-wwuppz7i-8 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-eahnefy6-9 { view-transition-name: blog-title-opauth-react-router-part-2; }@layer astro { ::view-transition-old(blog-title-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-title-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-title-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-title-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-eahnefy6-9, data-astro-transition-fallbackolddata-astro-transition-scopeastro-eahnefy6-9 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-eahnefy6-9, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-eahnefy6-9 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-eahnefy6-9, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-eahnefy6-9 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-eahnefy6-9, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-eahnefy6-9 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-3y6ofevf-10 { view-transition-name: blog-description-opauth-react-router-part-2; }@layer astro { ::view-transition-old(blog-description-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-description-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-description-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-description-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-3y6ofevf-10, data-astro-transition-fallbackolddata-astro-transition-scopeastro-3y6ofevf-10 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-3y6ofevf-10, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-3y6ofevf-10 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-3y6ofevf-10, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-3y6ofevf-10 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-3y6ofevf-10, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-3y6ofevf-10 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-vsovhypy-11 { view-transition-name: blog-publish-date-opauth-react-router-part-2; }@layer astro { ::view-transition-old(blog-publish-date-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-publish-date-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-publish-date-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-publish-date-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-vsovhypy-11, data-astro-transition-fallbackolddata-astro-transition-scopeastro-vsovhypy-11 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-vsovhypy-11, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-vsovhypy-11 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-vsovhypy-11, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-vsovhypy-11 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-vsovhypy-11, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-vsovhypy-11 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>style>data-astro-transition-scopeastro-wwuppz7i-12 { view-transition-name: blog-tags-opauth-react-router-part-2; }@layer astro { ::view-transition-old(blog-tags-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }::view-transition-new(blog-tags-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionback::view-transition-old(blog-tags-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionback::view-transition-new(blog-tags-opauth-react-router-part-2) { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; } }data-astro-transition-fallbackold data-astro-transition-scopeastro-wwuppz7i-12, data-astro-transition-fallbackolddata-astro-transition-scopeastro-wwuppz7i-12 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transition-fallbacknew data-astro-transition-scopeastro-wwuppz7i-12, data-astro-transition-fallbacknewdata-astro-transition-scopeastro-wwuppz7i-12 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }data-astro-transitionbackdata-astro-transition-fallbackold data-astro-transition-scopeastro-wwuppz7i-12, data-astro-transitionbackdata-astro-transition-fallbackolddata-astro-transition-scopeastro-wwuppz7i-12 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeOut; }data-astro-transitionbackdata-astro-transition-fallbacknew data-astro-transition-scopeastro-wwuppz7i-12, data-astro-transitionbackdata-astro-transition-fallbacknewdata-astro-transition-scopeastro-wwuppz7i-12 { animation-duration: 180ms; animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1); animation-fill-mode: both; animation-name: astroFadeIn; }/style>/head>body classfont-serif antialiased> div classmin-h-screen flex h-fit flex-col gap-y-6 container mx-auto> header classpy-6 px-4 border-b border-border> div classflex justify-between items-center> a href/ classtext-2xl font-bold hover:text-primary transition-colors> Sean Campbell's Blog /a> div classflex items-center gap-4> nav classflex gap-6> a href/blog classfont-medium hover:text-primary transition-colors> Blog /a>a href/about classfont-medium hover:text-primary transition-colors> About /a> /nav> div classml-2> style>astro-island,astro-slot,astro-static-slot{display:contents}/style>script>(()>{var easync t>{await(await t())()};(self.Astro||(self.Astro{})).loade;window.dispatchEvent(new Event(astro:load));})();;(()>{var AObject.defineProperty;var g(i,o,a)>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):ioa;var d(i,o,a)>g(i,typeof o!symbol?o+:o,a);{let i{0:t>m(t),1:t>a(t),2:t>new RegExp(t),3:t>new Date(t),4:t>new Map(a(t)),5:t>new Set(a(t)),6:t>BigInt(t),7:t>new URL(t),8:t>new Uint8Array(t),9:t>new Uint16Array(t),10:t>new Uint32Array(t),11:t>1/0*t},ot>{letl,et;return l in i?il(e):void 0},at>t.map(o),mt>typeof t!object||tnull?t:Object.fromEntries(Object.entries(t).map((l,e)>l,o(e)));class y extends HTMLElement{constructor(){super(...arguments);d(this,Component);d(this,hydrator);d(this,hydrate,async()>{var b;if(!this.hydrator||!this.isConnected)return;let e(bthis.parentElement)null?void 0:b.closest(astro-islandssr);if(e){e.addEventListener(astro:hydrate,this.hydrate,{once:!0});return}let cthis.querySelectorAll(astro-slot),n{},hthis.querySelectorAll(templatedata-astro-template);for(let r of h){let sr.closest(this.tagName);s!null&&s.isSameNode(this)&&(nr.getAttribute(data-astro-template)||defaultr.innerHTML,r.remove())}for(let r of c){let sr.closest(this.tagName);s!null&&s.isSameNode(this)&&(nr.getAttribute(name)||defaultr.innerHTML)}let p;try{pthis.hasAttribute(props)?m(JSON.parse(this.getAttribute(props))):{}}catch(r){let sthis.getAttribute(component-url)||unknown>,vthis.getAttribute(component-export);throw v&&(s+` (export ${v})`),console.error(`hydrate Error parsing props for component ${s}`,this.getAttribute(props),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute(client)}),this.removeAttribute(ssr),this.dispatchEvent(new CustomEvent(astro:hydrate))});d(this,unmount,()>{this.isConnected||this.dispatchEvent(new CustomEvent(astro:unmount))})}disconnectedCallback(){document.removeEventListener(astro:after-swap,this.unmount),document.addEventListener(astro:after-swap,this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(await-children)||document.readyStateinteractive||document.readyStatecomplete)this.childrenConnectedCallback();else{let e()>{document.removeEventListener(DOMContentLoaded,e),c.disconnect(),this.childrenConnectedCallback()},cnew MutationObserver(()>{var n;((nthis.lastChild)null?void 0:n.nodeType)Node.COMMENT_NODE&&this.lastChild.nodeValueastro:end&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener(DOMContentLoaded,e)}}async childrenConnectedCallback(){let ethis.getAttribute(before-hydration-url);e&&await import(e),this.start()}async start(){let eJSON.parse(this.getAttribute(opts)),cthis.getAttribute(client);if(Astrocvoid 0){window.addEventListener(`astro:${c}`,()>this.start(),{once:!0});return}try{await Astroc(async()>{let nthis.getAttribute(renderer-url),h,{default:p}await Promise.all(import(this.getAttribute(component-url)),n?import(n):()>()>{}),uthis.getAttribute(component-export)||default;if(!u.includes(.))this.Componenthu;else{this.Componenth;for(let f of u.split(.))this.Componentthis.Componentf}return this.hydratorp,this.hydrate},e,this)}catch(n){console.error(`astro-island Error hydrating ${this.getAttribute(component-url)}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,observedAttributes,props),customElements.get(astro-island)||customElements.define(astro-island,y)}})();/script>astro-island uidZ2kFJyD prefixr4 component-url/_astro/ThemeToggle.3pRK_vN0.js component-exportThemeToggle renderer-url/_astro/client.DN61zz9I.js props{} ssr clientload opts{"name":"ThemeToggle","value":true} await-children>button typebutton classp-2 rounded-md transition-colors hover:bg-muted flex items-center justify-center aria-labelSwitch to dark mode>svg xmlnshttp://www.w3.org/2000/svg width20 height20 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2 stroke-linecapround stroke-linejoinround classtext-amber-500>circle cx12 cy12 r4>/circle>path dM12 2v2>/path>path dM12 20v2>/path>path dm4.93 4.93 1.41 1.41>/path>path dm17.66 17.66 1.41 1.41>/path>path dM2 12h2>/path>path dM20 12h2>/path>path dm6.34 17.66-1.41 1.41>/path>path dm19.07 4.93-1.41 1.41>/path>/svg>/button>!--astro:end-->/astro-island> /div> /div> /div> /header> main classflex-grow px-4 md:px-6 xl:px-8> div classspace-y-12 max-w-4xl mx-auto> !-- Hero section with welcome message --> header classtext-center py-12> h1 classtext-5xl font-bold mb-6>Sean Campbell's Blog/h1> p classtext-xl text-muted-foreground max-w-2xl mx-auto mb-8> My blog about coding, software development, and the technologies I like to use. /p> a href/blog classinline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-base font-semibold transition-all disabled:pointer-events-none disabled:opacity-50 &_svg:pointer-events-none &_svg:not(class*size-):size-4 shrink-0 &_svg:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3px aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground shadow-xs hover:bg-primary/90 h-9 px-4 py-2 has->svg:px-3>Explore the Blog/a> /header> !-- Recent posts section --> section> div classflex items-center justify-between mb-8> h2 classtext-3xl font-bold>Recent Posts/h2> a href/blog classtext-primary hover:underline>View all posts →/a> /div> div classgrid gap-8 md:grid-cols-3> article classborder border-border rounded-xl p-6 transition-all hover:shadow-md group flex flex-col h-full relative isolate dark:shadow-foreground/10> h3 classtext-xl font-semibold mb-3 hover:text-primary transition-colors group-hover:text-primary data-astro-transition-scopeastro-eahnefy6-1> Self-Hosted Convex on AWS with SST using EC2 /h3> a href/blog/self-hosted-convex-aws-sst-ec2> span classabsolute inset-0 z-10>/span> /a> p classtext-muted-foreground mb-4 flex-1 data-astro-transition-scopeastro-3y6ofevf-2> My round 2 guide to self-hosting Convex on AWS with SST. This time using EC2. /p> div classflex items-center gap-2 mt-auto> span classtext-sm text-muted-foreground data-astro-transition-scopeastro-vsovhypy-3> May 22, 2025 /span> span classtext-muted-foreground>•/span> span classtext-xs bg-muted text-muted-foreground px-2 py-1 rounded-full data-astro-transition-scopeastro-wwuppz7i-4> Convex /span> /div> /article>article classborder border-border rounded-xl p-6 transition-all hover:shadow-md group flex flex-col h-full relative isolate dark:shadow-foreground/10> h3 classtext-xl font-semibold mb-3 hover:text-primary transition-colors group-hover:text-primary data-astro-transition-scopeastro-eahnefy6-5> Self-Hosted Convex on AWS with SST /h3> a href/blog/self-hosted-convex-aws-sst> span classabsolute inset-0 z-10>/span> /a> p classtext-muted-foreground mb-4 flex-1 data-astro-transition-scopeastro-3y6ofevf-6> A guide to self-hosting Convex on AWS with SST /p> div classflex items-center gap-2 mt-auto> span classtext-sm text-muted-foreground data-astro-transition-scopeastro-vsovhypy-7> May 20, 2025 /span> span classtext-muted-foreground>•/span> span classtext-xs bg-muted text-muted-foreground px-2 py-1 rounded-full data-astro-transition-scopeastro-wwuppz7i-8> Convex /span> /div> /article>article classborder border-border rounded-xl p-6 transition-all hover:shadow-md group flex flex-col h-full relative isolate dark:shadow-foreground/10> h3 classtext-xl font-semibold mb-3 hover:text-primary transition-colors group-hover:text-primary data-astro-transition-scopeastro-eahnefy6-9> OpenAuth with React Router Part 2 /h3> a href/blog/opauth-react-router-part-2> span classabsolute inset-0 z-10>/span> /a> p classtext-muted-foreground mb-4 flex-1 data-astro-transition-scopeastro-3y6ofevf-10> A guide to using OpenAuth with React Router for Authentication. Setting up custom UI and an social provider. /p> div classflex items-center gap-2 mt-auto> span classtext-sm text-muted-foreground data-astro-transition-scopeastro-vsovhypy-11> May 9, 2025 /span> span classtext-muted-foreground>•/span> span classtext-xs bg-muted text-muted-foreground px-2 py-1 rounded-full data-astro-transition-scopeastro-wwuppz7i-12> OpenAuth /span> /div> /article> /div> /section> /div> /main> footer classpy-8 text-sm text-gray-500 border-t border-gray-200 dark:text-gray-400 dark:border-gray-800> div classmax-w-4xl mx-auto px-4> div classflex flex-col md:flex-row justify-between items-center gap-6> !-- Social Links --> div classflex justify-center md:justify-start gap-4> a hrefhttps://github.com/natac13 classtext-gray-400 hover:text-primary dark:text-gray-500 dark:hover:text-primary-foreground transition-colors aria-labelGitHub target_blank relnoopener noreferrer> span classsr-only>GitHub/span> svg xmlnshttp://www.w3.org/2000/svg width24 height24 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2 stroke-linecapround stroke-linejoinround classlucide lucide-github aria-hiddentrue>path dM15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4>/path>path dM9 18c-4.51 2-5-2-7-2>/path>/svg> /a>a hrefhttps://twitter.com/natac131 classtext-gray-400 hover:text-primary dark:text-gray-500 dark:hover:text-primary-foreground transition-colors aria-labelX target_blank relnoopener noreferrer> span classsr-only>X/span> svg xmlnshttp://www.w3.org/2000/svg width24 height24 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2 stroke-linecapround stroke-linejoinround classlucide lucide-twitter aria-hiddentrue>path dM22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z>/path>/svg> /a>a hrefhttps://www.linkedin.com/in/seancampbellnatac/ classtext-gray-400 hover:text-primary dark:text-gray-500 dark:hover:text-primary-foreground transition-colors aria-labelLinkedIn target_blank relnoopener noreferrer> span classsr-only>LinkedIn/span> svg xmlnshttp://www.w3.org/2000/svg width24 height24 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2 stroke-linecapround stroke-linejoinround classlucide lucide-linkedin aria-hiddentrue>path dM16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z>/path>rect width4 height12 x2 y9>/rect>circle cx4 cy4 r2>/circle>/svg> /a> /div> !-- Internal Nav Links --> nav classflex flex-wrap justify-center md:justify-end gap-x-6 gap-y-2 text-sm aria-labelFooter navigation> a href/blog classhover:text-primary transition-colors> Blog /a>a href/about classhover:text-primary transition-colors> About /a> a href/sitemap.xml classhover:text-primary transition-colors aria-labelSitemap>Sitemap/a> /nav> /div> !-- Copyright --> p classmt-8 text-center text-xs>© 2025 Sean Campbell's Blog. All rights reserved./p> /div> /footer> /div> /body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]