cloudflare
tcp/443 tcp/80 tcp/8443
The following URL (usually /.git/config) is publicly accessible and is leaking source code and repository configuration.
Severity: medium
Fingerprint: 2580fa947178c88602b1737db148c044baa2727ab8135b5bbc521bbb6fb9bcc0
[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [remote "origin"] url = https://github.com/LachlanM05/website.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main vscode-merge-base = origin/main
The following URL (usually /.git/config) is publicly accessible and is leaking source code and repository configuration.
Severity: medium
Fingerprint: 2580fa947178c88602b1737db148c044baa2727ab8135b5bbc521bbb6fb9bcc0
[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [remote "origin"] url = https://github.com/LachlanM05/website.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main vscode-merge-base = origin/main
The following URL (usually /.git/config) is publicly accessible and is leaking source code and repository configuration.
Severity: medium
Fingerprint: 2580fa947178c88602b1737db148c044baa2727ab8135b5bbc521bbb6fb9bcc0
[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [remote "origin"] url = https://github.com/LachlanM05/website.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main vscode-merge-base = origin/main
Open service 172.67.176.65:443 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 200 OK
Date: Sat, 10 Jan 2026 10:05:35 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Last-Modified: Mon, 05 Jan 2026 19:05:02 GMT
Accept-Ranges: bytes
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2Fdy77JGTacniaIVl2ORAdlt%2BS2%2F5nCjsY60fVsoxmDOLV3m3nUqYjej4siv6lbWmTChEALHCUR0ui6iwN1NbBSujemx3XIWnDTEtsnV5"}]}
cf-cache-status: DYNAMIC
CF-RAY: 9bbb5b58499a409c-SIN
alt-svc: h3=":443"; ma=86400
Page title: LachlanM05's Website
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>LachlanM05's Website</title>
<meta name="description" content="LachlanM05, wishes to be just a little guy. if you read this you're cute." />
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico" />
<link rel="manifest" href="/assets/site.manifest" />
<meta name="colour-scheme" content="dark light" />
<link rel="stylesheet" href="/assets/style.css" />
<!--
Confused on this following script? It's a UTM tracker.
It tracks what referred you here and sends it to my API.
For example, if you came from my steam profile, it'd have:
?utm_source=steamcommunity.com
Which sends back that you came from my steam(or other steam profile).
Then you will also see something appended to it like:
&utm_campaign=steamprofile_abtme
Which further identifies where you came from.
So a full utm url might look like:
https://lachlanm05.com/?utm_source=steamcommunity&utm_campaign=steamprofile_abtme
And the whole purpose of such is to find out where people are coming from.
As I can see where in the world people are coming from based on IP's, but not anything else.
-->
<script>
(function () {
// run asap, but safe
function getCookie(n) {
return document.cookie.split('; ').reduce((r, v) => {
const p = v.split('=');
return p[0] === n ? decodeURIComponent(p[1]) : r
}, null);
}
function setCookie(n, v, days) {
const d = new Date();
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
document.cookie = n + "=" + encodeURIComponent(v)
+ ";expires=" + d.toUTCString() + ";path=/;SameSite=Lax";
}
// check UTM params immediat
var url = new URL(window.location.href);
var params = url.searchParams;
var keys = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
var hasUTM = false;
var payload = {};
keys.forEach(k => {
if (params.has(k)) {
hasUTM = true;
payload[k] = params.get(k);
}
});
if (!hasUTM) return;
// prevent duping on auto refresh / SPA nav
if (getCookie("lm_reftrack_sent") === "1") return;
payload.full_url = window.location.href;
payload.landing_path = window.location.pathname + window.location.search;
// send immediatialy using keepalive so it works even if user quick leaves
try {
fetch("https://lachlanm05.com/api/reftrack", {
method: "POST",
headers: { "Content-Type": "application/json" },
keepalive: true,
body: JSON.stringify(payload)
}).finally(function () {
setCookie("lm_reftrack_sent", "1", 1);
});
} catch (e) {
setCookie("lm_reftrack_sent", "1", 1);
}
})();
</script>
</head>
<body>
<!-- splash screen -->
<div id="splash-screen">
<div class="splash-content">
<h1>welcome on in, internet stranger.</h1>
<p>click anywhere to continue</p>
<footer>
© <span id="splash-year">2025</span> Lachlan •
<span class="love">i love you.</span>
</footer>
</div>
</div>
<!-- birthday audio preload -->
<!--
if you are reading this, you are probably quite the curious one, right?
i don't mind :), poke around, in-fact, i encourage it.
wanna change what seasonal effect is on? use the following:
setFakeDate("YYYY-MM-DDTHH:mm:ss")
where, YYYY is the year, MM is the month (01-12), and DD is the day.
T is the separator between the date and time. HH is the hour (00-23), mm is the minute, and ss is the seconds.
for example, to set the date to the date of writing, you would use:
setFakeDate("2025-11-04T20:46:23")
and to clear,
clearFakeDate()
the current events are as follows:
Jan 1st, fireworks (guaranteed bur
Open service 104.21.31.115:80 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 301 Moved Permanently
Date: Sat, 10 Jan 2026 10:05:35 GMT
Content-Type: text/html; charset=iso-8859-1
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Location: https://lachlanm05.com/
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=TEFg5j%2BxK1MC2D28pSFVRtyUmAHRmmPpv3cwudJZawUvYTqJP5o5N2S6%2Fso%2BgVD4XsT4ctLm3FU3P8gQgFlWSLFI90clIbSAnCZCxf5Q"}]}
cf-cache-status: DYNAMIC
CF-RAY: 9bbb5b577b223e65-SIN
alt-svc: h3=":443"; ma=86400
Page title: 301 Moved Permanently
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://lachlanm05.com/">here</a>.</p>
</body></html>
Open service 172.67.176.65:80 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 301 Moved Permanently
Date: Sat, 10 Jan 2026 10:05:35 GMT
Content-Type: text/html; charset=iso-8859-1
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Location: https://lachlanm05.com/
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vqRQZ2On4WmmiPqk7TQrtnQCINR%2FxEJDnxebhWcOdkKh7cVY2heMuzMyZMtmQ95uSbTrg1LZxRq%2FD1l41BXRaFTju7gH6A%2BCpcfP6o1a"}]}
cf-cache-status: DYNAMIC
CF-RAY: 9bbb5b58ce895383-YYZ
alt-svc: h3=":443"; ma=86400
Page title: 301 Moved Permanently
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://lachlanm05.com/">here</a>.</p>
</body></html>
Open service 2606:4700:3033::6815:1f73:8443 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 522 <none> Date: Sat, 10 Jan 2026 10:05:55 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9bbb5b5c5bebd89e-BOM alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:3036::ac43:b041:8443 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 522 <none> Date: Sat, 10 Jan 2026 10:05:55 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9bbb5b5c3bc77d14-EWR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 104.21.31.115:8443 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 522 <none> Date: Sat, 10 Jan 2026 10:05:55 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9bbb5b5c4ab06567-AMS alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 172.67.176.65:8443 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 522 <none> Date: Sat, 10 Jan 2026 10:05:55 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9bbb5b5c1ae0299a-YYZ alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:3036::ac43:b041:80 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 301 Moved Permanently
Date: Sat, 10 Jan 2026 10:05:36 GMT
Content-Type: text/html; charset=iso-8859-1
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Location: https://lachlanm05.com/
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=aqeM0Xjw7UDmSPW6RKFwc6TQaForw%2FRUpJ9Qgq%2FFb14yigg8WBTs9MkCPBhTEbpoX9XisDjs42f4q%2B2XehhAZJyayigMVjdwHVA7gbL3v4b0wPWjGphjzdgl"}]}
cf-cache-status: DYNAMIC
CF-RAY: 9bbb5b5a0e9e8e2c-FRA
alt-svc: h3=":443"; ma=86400
Page title: 301 Moved Permanently
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://lachlanm05.com/">here</a>.</p>
</body></html>
Open service 2606:4700:3033::6815:1f73:443 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 200 OK
Date: Sat, 10 Jan 2026 10:05:35 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Last-Modified: Mon, 05 Jan 2026 19:05:02 GMT
Accept-Ranges: bytes
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=g88TWgHGUPCfpE5p7X0yVYhLwEUGuedE3hn9AXNjkuqxid1y5addCxJFUJUENprZKiNY37j7UKWtYhNIYh%2FwNyXbDsfYbPSBTWpRI8ZFJldXtwrFN5Pu4w%3D%3D"}]}
cf-cache-status: DYNAMIC
CF-RAY: 9bbb5b5a09c0a20e-YYZ
alt-svc: h3=":443"; ma=86400
Page title: LachlanM05's Website
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>LachlanM05's Website</title>
<meta name="description" content="LachlanM05, wishes to be just a little guy. if you read this you're cute." />
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico" />
<link rel="manifest" href="/assets/site.manifest" />
<meta name="colour-scheme" content="dark light" />
<link rel="stylesheet" href="/assets/style.css" />
<!--
Confused on this following script? It's a UTM tracker.
It tracks what referred you here and sends it to my API.
For example, if you came from my steam profile, it'd have:
?utm_source=steamcommunity.com
Which sends back that you came from my steam(or other steam profile).
Then you will also see something appended to it like:
&utm_campaign=steamprofile_abtme
Which further identifies where you came from.
So a full utm url might look like:
https://lachlanm05.com/?utm_source=steamcommunity&utm_campaign=steamprofile_abtme
And the whole purpose of such is to find out where people are coming from.
As I can see where in the world people are coming from based on IP's, but not anything else.
-->
<script>
(function () {
// run asap, but safe
function getCookie(n) {
return document.cookie.split('; ').reduce((r, v) => {
const p = v.split('=');
return p[0] === n ? decodeURIComponent(p[1]) : r
}, null);
}
function setCookie(n, v, days) {
const d = new Date();
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
document.cookie = n + "=" + encodeURIComponent(v)
+ ";expires=" + d.toUTCString() + ";path=/;SameSite=Lax";
}
// check UTM params immediat
var url = new URL(window.location.href);
var params = url.searchParams;
var keys = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
var hasUTM = false;
var payload = {};
keys.forEach(k => {
if (params.has(k)) {
hasUTM = true;
payload[k] = params.get(k);
}
});
if (!hasUTM) return;
// prevent duping on auto refresh / SPA nav
if (getCookie("lm_reftrack_sent") === "1") return;
payload.full_url = window.location.href;
payload.landing_path = window.location.pathname + window.location.search;
// send immediatialy using keepalive so it works even if user quick leaves
try {
fetch("https://lachlanm05.com/api/reftrack", {
method: "POST",
headers: { "Content-Type": "application/json" },
keepalive: true,
body: JSON.stringify(payload)
}).finally(function () {
setCookie("lm_reftrack_sent", "1", 1);
});
} catch (e) {
setCookie("lm_reftrack_sent", "1", 1);
}
})();
</script>
</head>
<body>
<!-- splash screen -->
<div id="splash-screen">
<div class="splash-content">
<h1>welcome on in, internet stranger.</h1>
<p>click anywhere to continue</p>
<footer>
© <span id="splash-year">2025</span> Lachlan •
<span class="love">i love you.</span>
</footer>
</div>
</div>
<!-- birthday audio preload -->
<!--
if you are reading this, you are probably quite the curious one, right?
i don't mind :), poke around, in-fact, i encourage it.
wanna change what seasonal effect is on? use the following:
setFakeDate("YYYY-MM-DDTHH:mm:ss")
where, YYYY is the year, MM is the month (01-12), and DD is the day.
T is the separator between the date and time. HH is the hour (00-23), mm is the minute, and ss is the seconds.
for example, to set the date to the date of writing, you would use:
setFakeDate("2025-11-04T20:46:23")
and to clear,
clearFakeDate()
the current events are as follows:
Jan 1st, fireworks (guaranteed bur
Open service 2606:4700:3036::ac43:b041:443 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 200 OK
Date: Sat, 10 Jan 2026 10:05:36 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Last-Modified: Mon, 05 Jan 2026 19:05:02 GMT
Accept-Ranges: bytes
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=K0jym1v%2BtiuGoebC33f6nlW9noJg9d%2BDHjKKnCR%2BgcaOiZ87aHReqZRA0dHS0uu%2Fw4E77qYiWLT7DUJwmTzC7uCS0tWhmGT65g476tHuXw6lAiaOZmKH4Q%3D%3D"}]}
cf-cache-status: DYNAMIC
CF-RAY: 9bbb5b5b9854496e-LHR
alt-svc: h3=":443"; ma=86400
Page title: LachlanM05's Website
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>LachlanM05's Website</title>
<meta name="description" content="LachlanM05, wishes to be just a little guy. if you read this you're cute." />
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico" />
<link rel="manifest" href="/assets/site.manifest" />
<meta name="colour-scheme" content="dark light" />
<link rel="stylesheet" href="/assets/style.css" />
<!--
Confused on this following script? It's a UTM tracker.
It tracks what referred you here and sends it to my API.
For example, if you came from my steam profile, it'd have:
?utm_source=steamcommunity.com
Which sends back that you came from my steam(or other steam profile).
Then you will also see something appended to it like:
&utm_campaign=steamprofile_abtme
Which further identifies where you came from.
So a full utm url might look like:
https://lachlanm05.com/?utm_source=steamcommunity&utm_campaign=steamprofile_abtme
And the whole purpose of such is to find out where people are coming from.
As I can see where in the world people are coming from based on IP's, but not anything else.
-->
<script>
(function () {
// run asap, but safe
function getCookie(n) {
return document.cookie.split('; ').reduce((r, v) => {
const p = v.split('=');
return p[0] === n ? decodeURIComponent(p[1]) : r
}, null);
}
function setCookie(n, v, days) {
const d = new Date();
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
document.cookie = n + "=" + encodeURIComponent(v)
+ ";expires=" + d.toUTCString() + ";path=/;SameSite=Lax";
}
// check UTM params immediat
var url = new URL(window.location.href);
var params = url.searchParams;
var keys = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
var hasUTM = false;
var payload = {};
keys.forEach(k => {
if (params.has(k)) {
hasUTM = true;
payload[k] = params.get(k);
}
});
if (!hasUTM) return;
// prevent duping on auto refresh / SPA nav
if (getCookie("lm_reftrack_sent") === "1") return;
payload.full_url = window.location.href;
payload.landing_path = window.location.pathname + window.location.search;
// send immediatialy using keepalive so it works even if user quick leaves
try {
fetch("https://lachlanm05.com/api/reftrack", {
method: "POST",
headers: { "Content-Type": "application/json" },
keepalive: true,
body: JSON.stringify(payload)
}).finally(function () {
setCookie("lm_reftrack_sent", "1", 1);
});
} catch (e) {
setCookie("lm_reftrack_sent", "1", 1);
}
})();
</script>
</head>
<body>
<!-- splash screen -->
<div id="splash-screen">
<div class="splash-content">
<h1>welcome on in, internet stranger.</h1>
<p>click anywhere to continue</p>
<footer>
© <span id="splash-year">2025</span> Lachlan •
<span class="love">i love you.</span>
</footer>
</div>
</div>
<!-- birthday audio preload -->
<!--
if you are reading this, you are probably quite the curious one, right?
i don't mind :), poke around, in-fact, i encourage it.
wanna change what seasonal effect is on? use the following:
setFakeDate("YYYY-MM-DDTHH:mm:ss")
where, YYYY is the year, MM is the month (01-12), and DD is the day.
T is the separator between the date and time. HH is the hour (00-23), mm is the minute, and ss is the seconds.
for example, to set the date to the date of writing, you would use:
setFakeDate("2025-11-04T20:46:23")
and to clear,
clearFakeDate()
the current events are as follows:
Jan 1st, fireworks (guaranteed bur
Open service 2606:4700:3033::6815:1f73:80 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 301 Moved Permanently
Date: Sat, 10 Jan 2026 10:05:36 GMT
Content-Type: text/html; charset=iso-8859-1
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Location: https://lachlanm05.com/
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=%2FOlBbvA5Z0G3yWOr%2BwZbCkB%2FYk6C8gYfSDXGTy0jf1sC1YgHfzPMO%2FWdjlV4kYstBdh5mCbKBcrReCb%2Fhp5cyFEt4yy6oKnTmjIe03NfAuo4qVv6%2Fb8MHA%3D%3D"}]}
cf-cache-status: DYNAMIC
CF-RAY: 9bbb5b597ec6ed06-LHR
alt-svc: h3=":443"; ma=86400
Page title: 301 Moved Permanently
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://lachlanm05.com/">here</a>.</p>
</body></html>
Open service 104.21.31.115:443 · lachlanm05.com
2026-01-10 10:05
HTTP/1.1 200 OK
Date: Sat, 10 Jan 2026 10:05:36 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
Last-Modified: Mon, 05 Jan 2026 19:05:02 GMT
Accept-Ranges: bytes
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=8EAzgAV1TdZsGvJh9HwLzN7lcMJTEz1QlfaZqcKdY4gHK3FaouMClZ%2FlWi9nZpCsTJJkx%2BUpQhMVhsqGkY1lKem8yu87uegjnZhMY2GK"}]}
cf-cache-status: DYNAMIC
CF-RAY: 9bbb5b5b0bb1e282-FRA
alt-svc: h3=":443"; ma=86400
Page title: LachlanM05's Website
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>LachlanM05's Website</title>
<meta name="description" content="LachlanM05, wishes to be just a little guy. if you read this you're cute." />
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico" />
<link rel="manifest" href="/assets/site.manifest" />
<meta name="colour-scheme" content="dark light" />
<link rel="stylesheet" href="/assets/style.css" />
<!--
Confused on this following script? It's a UTM tracker.
It tracks what referred you here and sends it to my API.
For example, if you came from my steam profile, it'd have:
?utm_source=steamcommunity.com
Which sends back that you came from my steam(or other steam profile).
Then you will also see something appended to it like:
&utm_campaign=steamprofile_abtme
Which further identifies where you came from.
So a full utm url might look like:
https://lachlanm05.com/?utm_source=steamcommunity&utm_campaign=steamprofile_abtme
And the whole purpose of such is to find out where people are coming from.
As I can see where in the world people are coming from based on IP's, but not anything else.
-->
<script>
(function () {
// run asap, but safe
function getCookie(n) {
return document.cookie.split('; ').reduce((r, v) => {
const p = v.split('=');
return p[0] === n ? decodeURIComponent(p[1]) : r
}, null);
}
function setCookie(n, v, days) {
const d = new Date();
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
document.cookie = n + "=" + encodeURIComponent(v)
+ ";expires=" + d.toUTCString() + ";path=/;SameSite=Lax";
}
// check UTM params immediat
var url = new URL(window.location.href);
var params = url.searchParams;
var keys = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
var hasUTM = false;
var payload = {};
keys.forEach(k => {
if (params.has(k)) {
hasUTM = true;
payload[k] = params.get(k);
}
});
if (!hasUTM) return;
// prevent duping on auto refresh / SPA nav
if (getCookie("lm_reftrack_sent") === "1") return;
payload.full_url = window.location.href;
payload.landing_path = window.location.pathname + window.location.search;
// send immediatialy using keepalive so it works even if user quick leaves
try {
fetch("https://lachlanm05.com/api/reftrack", {
method: "POST",
headers: { "Content-Type": "application/json" },
keepalive: true,
body: JSON.stringify(payload)
}).finally(function () {
setCookie("lm_reftrack_sent", "1", 1);
});
} catch (e) {
setCookie("lm_reftrack_sent", "1", 1);
}
})();
</script>
</head>
<body>
<!-- splash screen -->
<div id="splash-screen">
<div class="splash-content">
<h1>welcome on in, internet stranger.</h1>
<p>click anywhere to continue</p>
<footer>
© <span id="splash-year">2025</span> Lachlan •
<span class="love">i love you.</span>
</footer>
</div>
</div>
<!-- birthday audio preload -->
<!--
if you are reading this, you are probably quite the curious one, right?
i don't mind :), poke around, in-fact, i encourage it.
wanna change what seasonal effect is on? use the following:
setFakeDate("YYYY-MM-DDTHH:mm:ss")
where, YYYY is the year, MM is the month (01-12), and DD is the day.
T is the separator between the date and time. HH is the hour (00-23), mm is the minute, and ss is the seconds.
for example, to set the date to the date of writing, you would use:
setFakeDate("2025-11-04T20:46:23")
and to clear,
clearFakeDate()
the current events are as follows:
Jan 1st, fireworks (guaranteed bur