A massive thank you to all the creators, developers, and artists who made the assets that power this website.
| Item | Type | Used |
|---|---|---|
- free hosting platform |
Host | / |
- real-time db & auth |
JS/DB | /index /guestbook |
- site statistics |
API | /index |
- anonymous image hosting |
API | /guestbook |
- public ip fetcher |
API | /index /guestbook |
- ip geolocation |
API | /index |
- dynamic country flags |
Image | /index |
- website favicon fetcher |
API | /index /guestbook |
- primary pixel font |
Font | / |
- retro header font |
Font | /index /resources /guestbook |
- retro pointers |
CSS | / |
- scalable vector icons |
CSS | / |
- brick-style layout |
CSS | /resources |
marked.js to parse markdown into HTML, and then immediately runs it through DOMPurify to strip out any malicious scripts before rendering it to the page securely.const parsedMd = marked.parse(entry.message, { breaks: true });
const safeMessage = DOMPurify.sanitize(parsedMd);
<canvas> element and squishes it down to a tiny JPEG before uploading it to Catbox.moe to save bandwidth.canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, width, height);
canvas.toBlob((blob) => {
uploadToCatbox(blob, 'compressed_' + file.name);
}, 'image/jpeg', 0.85);
CryptoJS to generate an MD5 hash of your email locally in your browser. only the hash is sent to the database to fetch your gravatar, keeping the original email completely secret!const email = gravatarEmailInput.value.trim();
const hash = CryptoJS.MD5(email.toLowerCase()).toString();
finalAvatar = `https://www.gravatar.com/avatar/${hash}?d=identicon`;
getHours() and getMonth() to figure out the time of day and current season. it then attaches classes like .time-sunset or .theme-halloween to the body to instantly swap out CSS root variables (like colors) across the whole site!const date = new Date(); const hour = date.getHours(); let timeClass = 'time-night'; if (hour >= 6 && hour < 12) timeClass = 'time-morning'; else if (hour >= 12 && hour < 17) timeClass = 'time-afternoon'; else if (hour >= 17 && hour < 20) timeClass = 'time-sunset'; document.body.classList.add(timeClass);
linear-gradient background is animated horizontally across a pseudo-element over the button..site-pill.special-glow-pill::after {
content: ''; position: absolute; inset: 0;
background: linear-gradient(110deg, transparent 20%, rgba(255, 255, 255, 0.4) 35%, rgba(255, 255, 255, 0.8) 45%, rgba(255, 255, 255, 0.4) 55%, transparent 70%);
background-size: 250% 100%;
animation: mc-enchant 3s infinite linear;
}
@keyframes mc-enchant {
0% { background-position: 200% 0; }
100% { background-position: -100% 0; }
}
async function hashIP(ip) {
const msgUint8 = new TextEncoder().encode(ip + "_digitality_salt");
const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);
return Array.from(new Uint8Array(hashBuffer))
.map(b => b.toString(16).padStart(2, '0')).join('');
}
<span> elements and assigns random CSS custom variables (--tx, --ty, --rot) for the trajectory. A simple CSS @keyframes handles the actual movement using a translate transform.el.style.setProperty('--tx', `${Math.cos(angle) * distance}px`);
@keyframes click-burst-anim {
0% { opacity: 1; transform: translate(-50%, -50%) scale(1) rotate(0deg); }
100% { opacity: 0; transform: translate(calc(-50% + var(--tx)), calc(-50% + var(--ty))) scale(0.4) rotate(var(--rot)); }
}
::before pseudo-element fixed over the viewport with pointer-events: none. the lines are drawn using a repeating-linear-gradient, and an infinite @keyframes animation translates it downwards to simulate a screen refresh.Web Audio API. it connects the html media element to an AnalyserNode, extracting live frequency data. a requestAnimationFrame loop then calculates the frequencies and draws the glowing bars onto an HTML5 <canvas>.onSnapshot() method. instead of constantly pinging the server (polling), the browser holds an open websocket connection, and Firebase instantly pushes new messages to the screen as soon as they are added.column-count: 2 property to create the uneven brick-laying effect. the terminal panels themselves use break-inside: avoid so they cleanly stack without being sliced in half across two columns.Thanks for actually scrolling all the way down here to read the credits and code dumps lol.
I originally just built this place to dump my stuff, practice coding, and pretend the old internet isn't dead. If you're building your own site right now, keep at it and take whatever inspiration you want. If you're just here inspecting element to see how things work under the hood... you're cool.
Also, if you notice some of my code is obfuscated, it's mainly just to stop people from blindly copy-pasting entire scripts without actually learning anything. But if you genuinely want to know how I built a specific feature or need help, literally just hit me up and ask! I'm always happy to explain stuff. Just no spamm plsS!!
Have a good one, PEACE ✌🏻🥀