This commit is contained in:
2026-05-05 18:32:33 +02:00
parent deffa3f0db
commit 74051f89ad
17 changed files with 493 additions and 2971 deletions

View File

@@ -1,195 +0,0 @@
(() => {
const introMessage =
"Witaj, jestem twoim wirtualnym agentem Krzak.org, w czym mogę Ci pomóc?";
const baseReplies = [
"Niestety, nie umiem jeszcze tego zrobić",
"Nie jestem pewien o co Ci chodzi",
];
const offerFrom = [
"pedałów",
"pajaca",
"noży",
"gwoździ",
"przypraw",
"słoika",
"słoików",
"tabletek",
"spreju",
"narzędzi",
"samolotu",
"ostrzałki",
"szafki",
"pojemnika",
"pojemników",
"ładowarki",
"ładowarek",
"wieszaków",
"wieszaka",
"półki",
"półek",
"ryby",
"migdałów",
"baterii",
"kościanych guzików",
"mieszadła",
"kleju",
];
const offerTo = [
"gwoździ",
"roweru",
"krojenia cebuli",
"pedałów",
"latania",
"łatania",
"podatków",
"sprzątania",
"wyrywania zębów",
"zmywarki",
"śmieci",
"krojenia chleba",
"krojenia ogórków",
"krojenia pomidorów",
"krojenia cebuli",
"krojenia ogórków",
"krojenia pomidorów",
"jedzenia",
"picia",
"kuchni",
"książek",
"ryb",
"migdałów",
"komputera",
"internetu",
"koszul",
"butów",
];
const chatRoot = document.createElement("div");
chatRoot.className = "ai-chat";
chatRoot.innerHTML = `
<button class="ai-chat__fab" type="button" aria-expanded="false" aria-controls="ai-chat-panel">AI chat</button>
<section class="ai-chat__panel" id="ai-chat-panel" aria-hidden="true">
<header class="ai-chat__header">
<strong>Agent Krzak.org</strong>
<button class="ai-chat__close" type="button" aria-label="Close chat">x</button>
</header>
<div class="ai-chat__messages"></div>
<form class="ai-chat__form">
<input class="ai-chat__input" type="text" placeholder="Napisz wiadomość..." autocomplete="off" />
<button class="ai-chat__send" type="submit">Wyslij</button>
</form>
</section>
`;
document.body.appendChild(chatRoot);
const fab = chatRoot.querySelector(".ai-chat__fab");
const panel = chatRoot.querySelector(".ai-chat__panel");
const closeBtn = chatRoot.querySelector(".ai-chat__close");
const messages = chatRoot.querySelector(".ai-chat__messages");
const form = chatRoot.querySelector(".ai-chat__form");
const input = chatRoot.querySelector(".ai-chat__input");
const sendBtn = chatRoot.querySelector(".ai-chat__send");
const backToTop = document.getElementById("back-to-top");
const viewport = window.visualViewport;
function addMessage(text, fromUser) {
const bubble = document.createElement("p");
bubble.className = fromUser
? "ai-chat__bubble ai-chat__bubble--user"
: "ai-chat__bubble";
bubble.textContent = text;
messages.appendChild(bubble);
messages.scrollTop = messages.scrollHeight;
}
function openChat() {
panel.classList.add("is-open");
panel.setAttribute("aria-hidden", "false");
fab.setAttribute("aria-expanded", "true");
if (!messages.hasChildNodes()) {
addMessage(introMessage, false);
}
input.focus();
syncKeyboardOffset();
}
function closeChat() {
panel.classList.remove("is-open");
panel.setAttribute("aria-hidden", "true");
fab.setAttribute("aria-expanded", "false");
syncKeyboardOffset();
}
function randomItem(items) {
return items[Math.floor(Math.random() * items.length)];
}
function buildReply() {
return `${randomItem(baseReplies)}, ale mogę Ci zaoferować kupno ${randomItem(offerFrom)} do ${randomItem(offerTo)}.`;
}
function syncChatPosition() {
if (!backToTop) {
chatRoot.classList.remove("ai-chat--raised");
return;
}
chatRoot.classList.toggle(
"ai-chat--raised",
backToTop.classList.contains("visible"),
);
}
function syncKeyboardOffset() {
if (!viewport) {
chatRoot.style.setProperty("--ai-chat-keyboard-offset", "0px");
return;
}
const offset = Math.max(
0,
Math.round(window.innerHeight - viewport.height - viewport.offsetTop),
);
chatRoot.style.setProperty("--ai-chat-keyboard-offset", `${offset}px`);
}
fab.addEventListener("click", () => {
if (panel.classList.contains("is-open")) {
closeChat();
return;
}
openChat();
});
closeBtn.addEventListener("click", closeChat);
sendBtn.addEventListener("pointerdown", (event) => {
// Keep focus on the input so mobile keyboards stay open after sending.
event.preventDefault();
});
form.addEventListener("submit", (event) => {
event.preventDefault();
const text = input.value.trim();
if (!text) {
return;
}
addMessage(text, true);
addMessage(buildReply(), false);
input.value = "";
input.focus({ preventScroll: true });
});
if (backToTop) {
const observer = new MutationObserver(syncChatPosition);
observer.observe(backToTop, {
attributes: true,
attributeFilter: ["class"],
});
window.addEventListener("resize", syncChatPosition);
}
if (viewport) {
viewport.addEventListener("resize", syncKeyboardOffset);
viewport.addEventListener("scroll", syncKeyboardOffset);
}
window.addEventListener("resize", syncKeyboardOffset);
syncChatPosition();
syncKeyboardOffset();
})();

View File

@@ -1,31 +0,0 @@
(function () {
const backToTopButton = document.getElementById("back-to-top");
if (backToTopButton) {
function toggleBackToTop() {
if (window.pageYOffset > 300) {
backToTopButton.classList.add("visible");
} else {
backToTopButton.classList.remove("visible");
}
}
backToTopButton.addEventListener("click", function () {
window.scrollTo({
top: 0,
behavior: "smooth",
});
});
window.addEventListener("scroll", toggleBackToTop);
toggleBackToTop();
}
const listItems = document.querySelectorAll("li");
listItems.forEach((item, index) => {
if (!item.style.animationDelay) {
item.style.animationDelay = `${0.1 + index * 0.05}s`;
}
});
})();

View File

@@ -1,202 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<title>Krzak.org - Recommended Applications</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="/favicons/favicon.svg" />
<link
rel="icon"
type="image/png"
sizes="16x16"
href="/favicons/favicon-16x16.png"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="/favicons/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="48x48"
href="/favicons/favicon-48x48.png"
/>
<link
rel="icon"
type="image/png"
sizes="96x96"
href="/favicons/favicon-96x96.png"
/>
<link
rel="icon"
type="image/png"
sizes="192x192"
href="/favicons/favicon-192x192.png"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="/favicons/favicon-180x180.png"
/>
<link rel="shortcut icon" href="/favicons/favicon.ico" />
<!-- PWA -->
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#2a1a5e" />
<link rel="stylesheet" href="/styles.css" />
</head>
<body>
<div class="container fade-in">
<h1 class="slide-down">
<span class="icon">
<img src="/icon.svg" alt="krzak.org" />
</span>
Recommended Apps
</h1>
<p class="slide-down" style="animation-delay: 0.5s">
If you know of better applications, let me know!
</p>
<div class="slide-up" style="animation-delay: 1s">
<h2>Fediverse</h2>
<div class="app-gallery">
<!-- Aria -->
<a
href="https://github.com/poppingmoon/aria/"
target="_blank"
class="app-card highlighted"
>
<img
src="https://raw.githubusercontent.com/poppingmoon/aria/main/assets/icons/aria.png"
alt="Aria icon"
class="app-icon"
/>
<div>
<h4>Aria</h4>
<p>Better integration with Misskey/Sharkey.</p>
</div>
</a>
</div>
</div>
<div class="slide-up" style="animation-delay: 1.5s">
<h2>Matrix</h2>
<div class="app-gallery">
<a
href="https://element.io/download"
target="_blank"
class="app-card highlighted"
>
<img
src="https://element.io/assets-32bb636196f91ed59d7a49190e26b42c/5ef25c0d30ee3108da4c25e9/5f365d3197194f8c73b00112_logo-mark-primary.svg"
alt="Element icon"
class="app-icon"
/>
<div>
<h4>Element</h4>
<p>Desktop only.</p>
</div>
</a>
<a
href="https://schildi.chat/next/"
target="_blank"
class="app-card highlighted"
>
<img
src="https://schildi.chat/img/icon-next.svg"
alt="SchildiNext icon"
class="app-icon"
/>
<div>
<h4>SchildiNext</h4>
<p>Mobile only.</p>
</div>
</a>
</div>
</div>
<div class="slide-up" style="animation-delay: 2s">
<h2>Music</h2>
<div class="app-gallery">
<!-- Finamp -->
<a
href="https://github.com/jmshrv/finamp"
target="_blank"
class="app-card highlighted"
>
<img
src="https://raw.githubusercontent.com/jmshrv/finamp/54a1a24b8b501423a0c4b3a58e5748583d99a7f8/assets/icon/icon_foreground.svg"
alt="Finamp icon"
class="app-icon"
/>
<div>
<h4>Finamp</h4>
<p>
Cross-platform client, just make sure to
download the beta to have the lyrics working
</p>
</div>
</a>
</div>
</div>
<br />
<ul>
<li class="slide-up" style="animation-delay: 2.5s">
<a href="/">
<strong>Back</strong>
</a>
</li>
</ul>
<div class="librecounter fade-in" style="animation-delay: 3s">
<span class="librecounter-text">
Indexed by
<a
href="https://librecounter.org/referer/show"
target="_blank"
>LibreCounter</a
>
</span>
<a href="https://librecounter.org/referer/show" target="_blank">
<img
src="https://librecounter.org/counter.svg"
referrerpolicy="unsafe-url"
alt="LibreCounter"
/>
</a>
</div>
</div>
<!-- Back to top button -->
<button
id="back-to-top"
class="back-to-top"
aria-label="Back to top"
title="Back to top"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="18 15 12 9 6 15"></polyline>
</svg>
</button>
<script src="/refresh.js"></script>
<script src="/animations.js"></script>
<script src="/ai-chat.js"></script>
</body>
</html>

View File

@@ -84,12 +84,6 @@
<span>Safespace ULtd.</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.15s">
<a href="https://fluxer.gg/UzaWKyPN" class="discord-link">
<strong>Fluxer</strong>
<span>fluxer.gg/UzaWKyPN</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.2s">
<a
href="https://discord.gg/CY3Zr6baD7"
@@ -99,38 +93,12 @@
<span>discord.gg/CY3Zr6baD7</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.25s">
<li class="slide-up" style="animation-delay: 0.15s">
<a href="/">
<strong>Back</strong>
</a>
</li>
</ul>
<!-- Back to top button -->
<button
id="back-to-top"
class="back-to-top"
aria-label="Back to top"
title="Back to top"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="18 15 12 9 6 15"></polyline>
</svg>
</button>
<script src="/refresh.js"></script>
<script src="/animations.js"></script>
<script src="/ai-chat.js"></script>
</div>
</body>
</html>

View File

@@ -15,40 +15,30 @@
</span>
Krzak.org
</h1>
<p class="slide-down">Contact:</p>
<ul>
<li class="slide-up" style="animation-delay: 0.05s">
<a href="https://matrix.to/#/@admin:krzak.org">
<a href="https://matrix.to/#/@n0va:krzak.org">
<strong>Matrix</strong>
<span>@admin:krzak.org</span>
<span>@n0va:krzak.org</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.1s">
<a href="https://fedi.krzak.org/@krzak">
<a href="https://fedi.krzak.org/@n0va">
<strong>Fediverse</strong>
<span>@krzak@fedi.krzak.org</span>
<span>@n0va@fedi.krzak.org</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.15s">
<a href="mailto:admin@krzak.org">
<a href="mailto:n0va@krzak.org">
<strong>Mail</strong>
<span>admin@krzak.org</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.2s">
<a href="">
<strong>Discord</strong>
<span>n0va_bot</span>
<span>n0va@krzak.org</span>
</a>
</li>
</ul>
<br />
<p class="fade-in" style="animation-delay: 0.25s">Support:</p>
<ul>
<li class="slide-up" style="animation-delay: 0.3s">
<a href="https://liberapay.com/krzak">
<strong>Support Krzak.org</strong>
<span>Liberapay</span>
<li class="slide-up support-row" style="animation-delay: 0.3s">
<a href="https://liberapay.com/krzak" class="button">
Support Krzak.org
</a>
</li>
</ul>
@@ -62,7 +52,13 @@
</ul>
<div class="librecounter fade-in" style="animation-delay: 0.4s">
<span class="librecounter-text">
<img
src="https://librecounter.org/counter.svg"
referrerpolicy="unsafe-url"
width="0"
alt=""
/>
<span class="counter">
Indexed by
<a
href="https://librecounter.org/referer/show"
@@ -70,40 +66,7 @@
>LibreCounter</a
>
</span>
<a href="https://librecounter.org/referer/show" target="_blank">
<img
src="https://librecounter.org/counter.svg"
referrerpolicy="unsafe-url"
alt="LibreCounter"
/>
</a>
</div>
</div>
<!-- Back to top button -->
<button
id="back-to-top"
class="back-to-top"
aria-label="Back to top"
title="Back to top"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="18 15 12 9 6 15"></polyline>
</svg>
</button>
<script src="/refresh.js"></script>
<script src="/animations.js"></script>
<script src="/ai-chat.js"></script>
</body>
</html>

28
dc.html
View File

@@ -1,28 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<title>Community | Krzak.org</title>
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=/community/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/styles.css" />
</head>
<body>
<div class="container fade-in">
<h1 class="slide-down">
<span class="icon">
<img src="/icon.svg" alt="krzak.org" />
</span>
Krzak.org
</h1>
<p class="slide-down">Redirecting to the community page...</p>
<p class="fade-in" style="animation-delay: 0.1s">
If you are not redirected automatically, open
<a href="/community/">/community/</a>.
</p>
<script src="/refresh.js"></script>
<script src="/animations.js"></script>
<script src="/ai-chat.js"></script>
</div>
</body>
</html>

View File

@@ -1,130 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<title>Community | Krzak.org</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Favicons -->
<link rel="icon" type="image/svg+xml" href="/favicons/favicon.svg" />
<link
rel="icon"
type="image/png"
sizes="16x16"
href="/favicons/favicon-16x16.png"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="/favicons/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="48x48"
href="/favicons/favicon-48x48.png"
/>
<link
rel="icon"
type="image/png"
sizes="96x96"
href="/favicons/favicon-96x96.png"
/>
<link
rel="icon"
type="image/png"
sizes="192x192"
href="/favicons/favicon-192x192.png"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="/favicons/favicon-180x180.png"
/>
<link rel="shortcut icon" href="/favicons/favicon.ico" />
<!-- Android Chrome -->
<link
rel="icon"
type="image/png"
sizes="192x192"
href="/favicons/favicon-192x192.png"
/>
<link
rel="icon"
type="image/png"
sizes="512x512"
href="/favicons/favicon-512x512.png"
/>
<!-- PWA -->
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#2a1a5e" />
<link rel="stylesheet" href="/styles.css" />
</head>
<body>
<div class="container fade-in">
<h1 class="slide-down">
<span class="icon">
<img src="/icon.svg" alt="krzak.org" />
</span>
Krzak.org
</h1>
<p class="slide-down">Join the community on Discord or Matrix</p>
<ul>
<li class="slide-up" style="animation-delay: 0.1s">
<a
href="https://matrix.to/#/!FQlmqHwYODiSahGeim:krzak.org?via=krzak.org"
class="matrix-link"
>
<strong>chat.krzak.org (Matrix)</strong>
<span>#krzak.org</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.15s">
<a
href="https://discord.gg/CY3Zr6baD7"
class="discord-link"
>
<strong>Discord</strong>
<span>discord.gg/CY3Zr6baD7</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.2s">
<a href="/">
<strong>Back</strong>
</a>
</li>
</ul>
<!-- Back to top button -->
<button
id="back-to-top"
class="back-to-top"
aria-label="Back to top"
title="Back to top"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="18 15 12 9 6 15"></polyline>
</svg>
</button>
<script src="/refresh.js"></script>
<script src="/animations.js"></script>
<script src="/ai-chat.js"></script>
</div>
</body>
</html>

View File

@@ -69,122 +69,117 @@
</head>
<body>
<div class="container fade-in">
<h1 class="slide-down">
<span class="icon">
<div class="container homepage">
<header class="hero">
<div class="band">
<span class="icon mark">
<img src="/icon.svg" alt="krzak.org" />
</span>
Krzak.org
</h1>
<p class="slide-down">Hi, welcome to krzak.org</p>
<ul>
<li class="slide-up" style="animation-delay: 0.05s">
<a href="https://search.krzak.org" class="search-link">
<strong>Search</strong>
<span>OmniSearch</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.1s">
<a href="https://fedi.krzak.org" class="sharkey-link">
<strong>Fediverse</strong>
<span>Sharkey</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.15s">
<a href="https://mail.krzak.org">
<strong>Mail</strong>
<span>Mailu</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.2s">
<a href="https://music.krzak.org" class="music-link">
<strong>Music</strong>
<span>Jellyfin</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.25s">
<a href="https://kreatyw.krzak.org" class="kreatyw-link">
<strong>
<img
src="https://kreatyw.krzak.org/ui/icon.png"
width="32"
height="32"
/>
Kreatyw
</strong>
<span>AI Powered™</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.3s">
<a href="/applications.html" class="applications-link">
<strong>Recommended applications</strong>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.35s">
<a href="/community/" class="matrix-link">
<strong>Community (Discord + Matrix)</strong>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.4s">
<a href="https://chat.krzak.org" class="matrix-link">
<strong>Chat</strong>
<span>chat.krzak.org</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.45s">
<a href="https://mu.krzak.org">
<strong>Music Upload</strong>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.5s">
<a href="https://git.krzak.org">
<div class="copy">
<h1>Krzak.org</h1>
<p class="lead">Hi, welcome to krzak.org</p>
</div>
</div>
</header>
<section class="box">
<h2>Main services</h2>
<ul class="links">
<li>
<a href="https://git.krzak.org" class="link main">
<strong>Git</strong>
<span>Gitea</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.55s">
<a href="https://liberapay.com/krzak" class="support-link">
<strong>Support</strong>
<span>Liberapay</span>
<li>
<a href="https://chat.krzak.org" class="link main">
<strong>Chat</strong>
<span>chat.krzak.org</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.6s">
<a href="https://rss.krzak.org">
<strong>RSS</strong>
<span>Miniflux</span>
<li>
<a href="https://fedi.krzak.org" class="link">
<strong>Fediverse</strong>
<span>Sharkey</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.65s">
<a href="https://paste.krzak.org">
<li>
<a href="https://music.krzak.org" class="link">
<strong>Music</strong>
<span>Jellyfin</span>
</a>
</li>
</ul>
</section>
<section class="box">
<h2>Tools</h2>
<ul class="links">
<li>
<a href="https://mail.krzak.org" class="link">
<strong>Mail</strong>
<span>Mailu</span>
</a>
</li>
<li>
<a href="https://mu.krzak.org" class="link">
<strong>Music Upload</strong>
<span>mu.krzak.org</span>
</a>
</li>
<li>
<a href="https://paste.krzak.org" class="link">
<strong>Paste</strong>
<span>Opengist</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.7s">
<a href="https://share.krzak.org">
<strong>Share</strong>
<span>FilePizza</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.75s">
<a href="https://link.krzak.org">
<li>
<a href="https://link.krzak.org" class="link">
<strong>Link Shortener</strong>
<span>Shlink</span>
</a>
</li>
<li class="slide-up" style="animation-delay: 0.8s">
<a href="/contact.html">
</ul>
</section>
<section class="box">
<h2>Pages</h2>
<ul class="links">
<li>
<a href="/community/" class="link">
<strong>Community</strong>
<span>Discord + Matrix</span>
</a>
</li>
<li>
<a href="/contact.html" class="link">
<strong>Contact</strong>
<span>Ways to reach me</span>
</a>
</li>
</ul>
<p class="fade-in" style="animation-delay: 0.85s">
</section>
<section class="foot">
<p>
If you want an account on any of these, want to suggest
something new or get a subdomain, just message me
</p>
<div class="support">
<a href="https://liberapay.com/krzak" class="button">
Support Krzak.org
</a>
</div>
</section>
<div class="librecounter fade-in" style="animation-delay: 0.9s">
<span class="librecounter-text">
<div class="librecounter">
<img
src="https://librecounter.org/counter.svg"
referrerpolicy="unsafe-url"
width="0"
alt=""
/>
<span class="counter">
Indexed by
<a
href="https://librecounter.org/referer/show"
@@ -192,40 +187,7 @@
>LibreCounter</a
>
</span>
<a href="https://librecounter.org/referer/show" target="_blank">
<img
src="https://librecounter.org/counter.svg"
referrerpolicy="unsafe-url"
alt="LibreCounter"
/>
</a>
</div>
</div>
<!-- Back to top button -->
<button
id="back-to-top"
class="back-to-top"
aria-label="Back to top"
title="Back to top"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="18 15 12 9 6 15"></polyline>
</svg>
</button>
<script src="/refresh.js"></script>
<script src="/animations.js"></script>
<script src="/ai-chat.js"></script>
</body>
</html>

View File

@@ -1,19 +0,0 @@
{
"name": "Krzak.org",
"short_name": "Krzak",
"icons": [
{
"src": "/favicons/favicon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/favicons/favicon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#2a1a5e",
"background_color": "#2a1a5e",
"display": "standalone"
}

654
mc.html
View File

@@ -1,654 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<title>Krzak.org - Minecraft</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/styles.css" />
<style>
.server-status-widget {
background: var(--link-bg);
border-radius: 16px;
padding: 24px;
border: 1px solid var(--container-border);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.3);
margin: 24px 0;
transition: all 0.3s ease;
}
.server-status-widget:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px 0 rgba(0, 0, 0, 0.4);
border-color: var(--link-hover-border);
}
.status-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
flex-wrap: wrap;
gap: 12px;
}
.status-title {
display: flex;
align-items: center;
gap: 12px;
font-size: 1.3rem;
font-weight: 600;
color: var(--accent-color);
}
.status-indicator {
width: 16px;
height: 16px;
border-radius: 50%;
animation: pulse 2s ease-in-out infinite;
}
.status-indicator.online {
background-color: #4ade80;
box-shadow: 0 0 12px #4ade80;
}
.status-indicator.offline {
background-color: #f87171;
box-shadow: 0 0 12px #f87171;
animation: none;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.7;
transform: scale(1.1);
}
}
.status-info {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
margin-bottom: 16px;
animation: fadeSlideUp 0.5s ease-out forwards 0.2s;
}
@keyframes fadeSlideUp {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.info-card {
background: rgba(255, 255, 255, 0.03);
border-radius: 12px;
padding: 16px;
border: 1px solid var(--container-border);
transition: all 0.2s ease;
}
.info-card:hover {
transform: scale(1.02);
background: rgba(255, 255, 255, 0.08);
border-color: var(--accent-color);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
.info-card.copyable {
cursor: pointer;
}
.info-label {
font-size: 0.85rem;
color: var(--text-muted);
margin-bottom: 6px;
font-weight: 500;
}
.info-value {
font-size: 1.3rem;
color: var(--text-color);
font-weight: 600;
word-break: break-all;
}
.server-motd {
background: rgba(0, 0, 0, 0.2);
border-radius: 12px;
padding: 16px;
border: 1px solid var(--container-border);
font-family: "Courier New", monospace;
color: var(--text-color);
font-size: 0.95rem;
line-height: 1.6;
white-space: pre-wrap;
word-break: break-word;
animation: fadeSlideUp 0.5s ease-out forwards 0.4s;
transition: all 0.2s ease;
}
.server-motd:hover {
border-color: var(--accent-color);
}
.last-updated {
font-size: 0.8rem;
color: var(--text-muted);
text-align: right;
margin-top: 12px;
animation: fadeIn 0.5s ease-out forwards 0.6s;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 0.8;
}
}
.loading {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
color: var(--text-muted);
padding: 20px;
}
.spinner {
width: 20px;
height: 20px;
border: 3px solid rgba(255, 255, 255, 0.1);
border-top-color: var(--accent-color);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.error-message {
color: #f87171;
text-align: center;
padding: 20px;
background: rgba(248, 113, 113, 0.1);
border-radius: 12px;
border: 1px solid rgba(248, 113, 113, 0.3);
}
.players-list {
margin-top: 8px;
font-size: 0.9rem;
color: var(--text-muted);
line-height: 1.5;
}
.fingerprint-widget {
background: var(--link-bg);
border-radius: 16px;
padding: 24px;
border: 1px solid var(--container-border);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.3);
margin: 24px 0;
transition: all 0.3s ease;
}
.fingerprint-widget:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px 0 rgba(0, 0, 0, 0.4);
border-color: var(--link-hover-border);
}
/* Copy button styles */
.info-value-wrapper {
display: flex;
align-items: center;
gap: 12px;
justify-content: space-between;
}
.copy-button {
background: rgba(255, 255, 255, 0.05);
border: 1px solid var(--container-border);
border-radius: 8px;
padding: 8px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
flex-shrink: 0;
}
.copy-button:hover {
background: rgba(255, 255, 255, 0.1);
border-color: var(--accent-color);
transform: scale(1.05);
}
.copy-button.copied {
background: rgba(74, 222, 128, 0.2);
border-color: rgba(74, 222, 128, 0.5);
}
.copy-icon {
width: 18px;
height: 18px;
color: var(--text-color);
flex-shrink: 0;
}
/* Resourcepack widget styles */
.resourcepack-widget {
background: var(--link-bg);
border-radius: 16px;
padding: 0;
border: 1px solid var(--container-border);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.3);
margin: 24px 0;
transition: all 0.3s ease;
overflow: hidden;
}
.resourcepack-widget:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px 0 rgba(0, 0, 0, 0.4);
border-color: var(--link-hover-border);
}
.resourcepack-link {
display: flex;
align-items: center;
gap: 16px;
padding: 20px 24px;
text-decoration: none;
color: var(--text-color);
transition: all 0.2s ease;
}
.resourcepack-link:hover {
background: rgba(255, 255, 255, 0.05);
}
.resourcepack-icon {
width: 32px;
height: 32px;
color: var(--accent-color);
flex-shrink: 0;
}
.resourcepack-link div {
flex: 1;
}
.resourcepack-link strong {
display: block;
font-size: 1.1rem;
margin-bottom: 4px;
}
.resourcepack-desc {
font-size: 0.9rem;
color: var(--text-muted);
}
.download-icon {
width: 24px;
height: 24px;
color: var(--text-muted);
flex-shrink: 0;
}
/* Disable card hover for copy cards */
#fingerprintCard {
cursor: default !important;
}
#fingerprintCard:hover {
transform: none !important;
}
</style>
</head>
<body>
<div class="container fade-in">
<h1 class="slide-down">
<span class="icon">
<img src="/icon.svg" alt="krzak.org" />
</span>
Krzak.org - Minecraft
</h1>
<div
class="server-status-widget slide-up"
style="animation-delay: 0.1s"
id="statusWidget"
>
<div class="loading">
<div class="spinner"></div>
<span>Loading server status...</span>
</div>
</div>
<div class="slide-up" style="animation-delay: 0.2s">
<h3>Instrukcja</h3>
<ol>
<li>Zainstalujcie fabric 1.21.10</li>
<li>Zainstalujcie moda AutoModpack</li>
<li>
Dołączcie na krzak.org i, kiedy o to zapyta, wklejcie
tekst z pliku automodpack_fingerprint.txt
</li>
</ol>
<h3>Polecam też dodać nasz resourcepack</h3>
<h3>
Do skinów polecam ely.by jak ktoś nie ma premium (nie musi)
</h3>
</div>
<div
class="fingerprint-widget slide-up"
style="animation-delay: 0.3s"
id="fingerprintWidget"
>
<div class="info-card" id="fingerprintCard">
<div class="info-label">AutoModpack Fingerprint</div>
<div class="info-value-wrapper">
<div class="info-value" id="fingerprintValue">
3b180a41fe913487c1c86ad79c6dc085d01a272ac2da556f4bf7379ee3a535f8
</div>
<button
class="copy-button"
data-copy-target="fingerprintValue"
title="Copy to clipboard"
>
<svg
class="copy-icon"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<rect
x="9"
y="9"
width="13"
height="13"
rx="2"
ry="2"
></rect>
<path
d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"
></path>
</svg>
</button>
</div>
</div>
</div>
<div
class="resourcepack-widget slide-up"
style="animation-delay: 0.35s"
>
<a href="/mc/pack.zip" class="resourcepack-link">
<svg
class="resourcepack-icon"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path
d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"
></path>
<polyline
points="3.27 6.96 12 12.01 20.73 6.96"
></polyline>
<line x1="12" y1="22.08" x2="12" y2="12"></line>
</svg>
<div>
<strong>Download Resource Pack</strong>
<span class="resourcepack-desc"
>Custom vanillatweaks setup</span
>
</div>
<svg
class="download-icon"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path
d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"
></path>
<polyline points="7 10 12 15 17 10"></polyline>
<line x1="12" y1="15" x2="12" y2="3"></line>
</svg>
</a>
</div>
<ul>
<li class="slide-up" style="animation-delay: 0.4s">
<a href="/">
<strong>Back</strong>
</a>
</li>
</ul>
<div class="librecounter fade-in" style="animation-delay: 0.75s">
<span class="librecounter-text">
Indexed by
<a
href="https://librecounter.org/referer/show"
target="_blank"
>LibreCounter</a
>
</span>
<a href="https://librecounter.org/referer/show" target="_blank">
<img
src="https://librecounter.org/counter.svg"
referrerpolicy="unsafe-url"
alt="LibreCounter"
/>
</a>
</div>
</div>
<!-- Back to top button -->
<button
id="back-to-top"
class="back-to-top"
aria-label="Back to top"
title="Back to top"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="18 15 12 9 6 15"></polyline>
</svg>
</button>
<script src="/refresh.js"></script>
<script src="/animations.js"></script>
<script src="/ai-chat.js"></script>
<script>
// Configuration
const SERVER_ADDRESS = "krzak.org";
const FINGERPRINT =
"3b180a41fe913487c1c86ad79c6dc085d01a272ac2da556f4bf7379ee3a535f8";
const REFRESH_INTERVAL = 30000;
// Single event listener for all copy buttons (event delegation)
document.addEventListener("click", function (e) {
const copyButton = e.target.closest(".copy-button");
if (!copyButton) return;
const target = copyButton.dataset.copyTarget;
const textToCopy =
target === "serverAddress" ? SERVER_ADDRESS : FINGERPRINT;
navigator.clipboard
.writeText(textToCopy)
.then(() => {
// Show success feedback
const originalHTML = copyButton.innerHTML;
copyButton.innerHTML =
'<svg class="copy-icon" viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"></polyline></svg>';
copyButton.classList.add("copied");
setTimeout(() => {
copyButton.innerHTML = originalHTML;
copyButton.classList.remove("copied");
}, 2000);
})
.catch((err) => console.error("Failed to copy:", err));
});
// Server status functions
async function fetchServerStatus() {
try {
const response = await fetch(
`https://api.mcsrvstat.us/3/${SERVER_ADDRESS}`,
);
return await response.json();
} catch (error) {
console.error("Error fetching server status:", error);
return null;
}
}
function formatMOTD(motd) {
if (!motd) return "No MOTD available";
if (typeof motd === "object" && motd.clean) {
return Array.isArray(motd.clean)
? motd.clean.join("\n")
: motd.clean;
}
return Array.isArray(motd) ? motd.join("\n") : motd;
}
function renderStatus(data) {
const widget = document.getElementById("statusWidget");
if (!data || !data.online) {
widget.innerHTML = `
<div class="status-header">
<div class="status-title">
<div class="status-indicator offline"></div>
Server Status
</div>
</div>
<div class="error-message">
Server is currently offline or unreachable
</div>
<div class="last-updated">
Last checked: ${new Date().toLocaleTimeString()}
</div>
`;
return;
}
const playersOnline = data.players?.online || 0;
const playersMax = data.players?.max || 0;
const version = data.version || "Unknown";
const motd = formatMOTD(data.motd);
const playersList = data.players?.list || [];
widget.innerHTML = `
<div class="status-header">
<div class="status-title">
<div class="status-indicator online"></div>
Server Status
</div>
</div>
<div class="status-info">
<div class="info-card">
<div class="info-label">Players Online</div>
<div class="info-value">${playersOnline} / ${playersMax}</div>
${
playersList.length > 0
? `
<div class="players-list">
${playersList.slice(0, 10).join(", ")}${playersList.length > 10 ? "..." : ""}
</div>
`
: ""
}
</div>
<div class="info-card">
<div class="info-label">Version</div>
<div class="info-value" style="font-size: 1.1rem;">${version}</div>
</div>
<div class="info-card" id="serverAddressCard">
<div class="info-label">Server Address</div>
<div class="info-value-wrapper">
<div class="info-value" style="font-size: 1rem;">${SERVER_ADDRESS}</div>
<button class="copy-button" data-copy-target="serverAddress" title="Copy to clipboard">
<svg class="copy-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
</svg>
</button>
</div>
</div>
${
motd
? `
<div class="info-card">
<div class="info-label">MOTD</div>
<div style="font-family: 'Courier New', monospace; font-size: 0.9rem; line-height: 1.4; color: var(--text-color); white-space: pre-wrap;">${motd}</div>
</div>
`
: ""
}
</div>
<div class="last-updated">
Last updated: ${new Date().toLocaleTimeString()}
</div>
`;
}
async function updateStatus() {
renderStatus(await fetchServerStatus());
}
// Initial load and auto-refresh
updateStatus();
setInterval(updateStatus, REFRESH_INTERVAL);
</script>
</body>
</html>

Binary file not shown.

BIN
n.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

View File

@@ -1,72 +0,0 @@
(function () {
const SSE_PORT = 8765;
const RECONNECT_DELAY = 5000; // milliseconds
let eventSource = null;
let reconnectTimer = null;
function reloadStylesheets() {
// Force reload all stylesheets
const links = document.querySelectorAll('link[rel="stylesheet"]');
links.forEach((link) => {
const href = link.href.split("?")[0];
link.href = href + "?t=" + new Date().getTime();
});
}
function connect() {
if (reconnectTimer) {
clearTimeout(reconnectTimer);
reconnectTimer = null;
}
if (eventSource) {
eventSource.close();
}
const url = `${window.location.protocol}//${window.location.hostname}:${SSE_PORT}/events`;
eventSource = new EventSource(url);
eventSource.onmessage = function (event) {
try {
const data = JSON.parse(event.data);
if (data.type === "reload") {
console.log("Repository updated, reloading page...");
// First reload stylesheets
reloadStylesheets();
// Then hard reload the page after a brief delay
setTimeout(() => {
window.location.reload(true);
}, 100);
}
} catch (e) {
console.error("Error parsing SSE message:", e);
}
};
eventSource.onerror = function (error) {
console.log("SSE connection error, will reconnect...");
eventSource.close();
// Attempt to reconnect
reconnectTimer = setTimeout(connect, RECONNECT_DELAY);
};
eventSource.onopen = function () {
console.log("Connected to auto-refresh service");
};
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", connect);
} else {
connect();
}
window.addEventListener("beforeunload", function () {
if (eventSource) {
eventSource.close();
}
});
})();

View File

@@ -1,27 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://krzak.org/</loc>
<lastmod>2025-11-19</lastmod>
<lastmod>2026-05-05</lastmod>
</url>
<url>
<loc>https://krzak.org/applications.html</loc>
<lastmod>2025-11-19</lastmod>
<lastmod>2026-05-05</lastmod>
</url>
<url>
<loc>https://krzak.org/contact.html</loc>
<lastmod>2025-11-19</lastmod>
<lastmod>2026-05-05</lastmod>
</url>
<url>
<loc>https://krzak.org/community/</loc>
<lastmod>2026-02-19</lastmod>
</url>
<url>
<loc>https://krzak.org/discord.html</loc>
<lastmod>2026-02-19</lastmod>
<lastmod>2026-05-05</lastmod>
</url>
<url>
<loc>https://krzak.org/mc.html</loc>
<lastmod>2025-11-19</lastmod>
<lastmod>2026-05-05</lastmod>
</url>
</urlset>

1299
styles.css

File diff suppressed because it is too large Load Diff

View File

@@ -1,437 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Krzak.org - Portal</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
/* Base Styles */
body {
background-color: #1a0f3e;
color: #ffe8d6;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
margin: 0;
padding: 0;
/* Scanline effect */
background-image:
linear-gradient(
rgba(18, 16, 16, 0) 50%,
rgba(0, 0, 0, 0.25) 50%
),
linear-gradient(
90deg,
rgba(255, 0, 0, 0.06),
rgba(0, 255, 0, 0.02),
rgba(0, 0, 255, 0.06)
);
background-size:
100% 2px,
3px 100%;
}
/* Layout Container */
.main-table {
width: 800px;
background-color: #2a1a5e;
border: 2px solid #f4a261;
border-right: 4px solid #c47e45;
border-bottom: 4px solid #c47e45;
}
/* Links */
a {
color: #f4a261;
text-decoration: none;
font-weight: bold;
}
a:hover {
color: #ffffff;
text-decoration: underline;
background-color: #8b4789;
cursor: help;
}
/* Sidebar Styling */
.sidebar {
background-color: #1f1345;
padding: 10px;
border-right: 1px solid #f4a261;
vertical-align: top;
}
.nav-header {
color: #dda15e;
font-family: "Courier New", Courier, monospace;
font-weight: bold;
border-bottom: 1px dashed #dda15e;
margin-bottom: 5px;
margin-top: 15px;
display: block;
}
.nav-link {
display: block;
padding: 4px;
border-left: 3px solid transparent;
}
.nav-link:hover {
border-left: 3px solid #f4a261;
background-color: #2a1a5e;
}
/* Main Content Styling */
.content {
padding: 20px;
vertical-align: top;
}
h1 {
font-family: "Courier New", Courier, monospace;
color: #f4a261;
font-size: 24px;
margin-top: 0;
text-shadow: 2px 2px #000000;
}
/* The "Window" Box style for sections */
.retro-box {
border: 2px ridge #8b4789;
background-color: #251752;
padding: 10px;
margin-bottom: 15px;
}
.marquee-container {
border: 1px inset #f4a261;
background: #000000;
color: #00ff00;
font-family: monospace;
padding: 2px;
margin-bottom: 15px;
}
/* Pixelated dividers */
hr {
border: 0;
border-bottom: 1px dashed #f4a261;
height: 1px;
}
/* Footer */
.footer {
font-size: 10px;
color: #dda15e;
text-align: center;
padding-top: 20px;
}
</style>
</head>
<body>
<br />
<center>
<!-- Main Layout Table -->
<table class="main-table" cellpadding="0" cellspacing="0">
<tr>
<!-- SIDEBAR (Left Column) -->
<td width="200" class="sidebar">
<center>
<img
src="/icon.svg"
width="80"
height="80"
alt="Krzak Logo"
style="
border: 2px solid #f4a261;
margin-bottom: 10px;
"
/>
<br />
<font size="1">est. 2024</font>
</center>
<span class="nav-header">:: MAIN ::</span>
<a href="/" class="nav-link">[ Home ]</a>
<a href="/contact" class="nav-link">[ Contact ]</a>
<a href="/applications" class="nav-link">[ Apps ]</a>
<span class="nav-header">:: SERVICES ::</span>
<a href="https://fedi.krzak.org" class="nav-link"
>Fediverse</a
>
<a href="https://git.krzak.org" class="nav-link"
>Git Repo</a
>
<a href="https://music.krzak.org" class="nav-link"
>Music</a
>
<a href="https://rss.krzak.org" class="nav-link">RSS</a>
<span class="nav-header">:: GAME ::</span>
<a href="/mc" class="nav-link">Minecraft</a>
<br /><br />
<center>
<div
style="
border: 1px inset #8b4789;
background: #000;
padding: 4px;
font-family: monospace;
font-size: 10px;
"
>
SERVER STATUS<br />
<font id="mc-status-text" color="#ffff00"
>CHECKING...</font
><br />
<span id="mc-players"></span>
</div>
</center>
</td>
<!-- CONTENT (Right Column) -->
<td class="content">
<!-- Header -->
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td><h1>Welcome to Krzak.org</h1></td>
<td align="right">
<font size="1" color="#dda15e"
>Logged in as: Guest</font
>
</td>
</tr>
</table>
<!-- Marquee -->
<div class="marquee-container">
<marquee
id="system-marquee"
scrollamount="4"
scrolldelay="100"
>
++ WELCOME TO THE NETWORK ++ UPDATES: MINECRAFT
SERVER 1.21.10 LIVE ++ CHECK OUT THE NEW APPS
SECTION ++
</marquee>
</div>
<p>
Hi, welcome to krzak.org. This is my personal corner
of the interwebs.
<br />
Use the navigation on the left to explore my
services.
</p>
<!-- "Latest News" Box -->
<div class="retro-box">
<b>:: LATEST NEWS ::</b>
<ul>
<li>
Added
<a href="/applications"
>Recommended Applications</a
>
page.
</li>
<li>
Updated Minecraft server to Fabric 1.21.10.
</li>
<li>Fixed RSS feed integration.</li>
</ul>
</div>
<!-- Services Grid (Nested Table) -->
<b>:: QUICK LINKS ::</b>
<table width="100%" border="0" cellpadding="5">
<tr>
<td width="33%" align="center">
<a href="https://paste.krzak.org">
<div
style="
border: 1px solid #f4a261;
padding: 5px;
margin: 2px;
"
>
<b>PASTE</b><br />
<font size="1">Opengist</font>
</div>
</a>
</td>
<td width="33%" align="center">
<a href="https://share.krzak.org">
<div
style="
border: 1px solid #f4a261;
padding: 5px;
margin: 2px;
"
>
<b>SHARE</b><br />
<font size="1">FilePizza</font>
</div>
</a>
</td>
<td width="33%" align="center">
<a href="https://link.krzak.org">
<div
style="
border: 1px solid #f4a261;
padding: 5px;
margin: 2px;
"
>
<b>LINK</b><br />
<font size="1">Shlink</font>
</div>
</a>
</td>
</tr>
</table>
<br />
<p>
If you want an account on any of these, want to
suggest something new or get a subdomain, just
<a href="mailto:admin@krzak.org">message me</a>.
</p>
<hr />
<div class="footer">
<!-- Hidden Counter Image to increment stats -->
<img
src="https://librecounter.org/counter.svg"
referrerpolicy="unsafe-url"
width="0"
height="0"
alt=""
style="display: none"
/>
Total Visitors:
<b><span id="visitor-count">...</span></b
><br />
Indexed by
<a
href="https://librecounter.org/referer/show"
target="_blank"
>LibreCounter</a
>
<br />
&copy; 2024 Krzak.org | <a href="#">Top of Page</a>
<br /><br />
<!-- Fake Buttons for aesthetic -->
<img
src="https://imgs.search.brave.com/a80w-button-placeholder"
width="88"
height="31"
style="
background: #8b4789;
border: 1px solid #000;
"
alt="HTML4"
/>
<img
src="https://imgs.search.brave.com/a80w-button-placeholder"
width="88"
height="31"
style="
background: #f4a261;
border: 1px solid #000;
"
alt="CSS"
/>
</div>
</td>
</tr>
</table>
</center>
<!-- Legacy JavaScript for Functionality -->
<script type="text/javascript">
// Helper for cross-browser JSON fetching (IE7+ compatible logic)
function fetchJSON(url, callback) {
var proxyUrl = `https://cors.krzak.org/get?url=${encodeURIComponent(url)}`;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
try {
var data = JSON.parse(xhr.responseText);
// Handle double-encoded JSON in the contents field
var contents =
typeof data.contents === "string"
? JSON.parse(data.contents)
: data.contents;
callback(contents);
} catch (e) {
console.error("JSON Parse Error:", e);
}
} else {
console.error(
"Request failed with status:",
xhr.status,
);
}
}
};
xhr.open("GET", proxyUrl, true);
xhr.setRequestHeader("Accept", "application/json");
xhr.send();
}
// 1. Fetch Visitor Count
fetchJSON(
"https://librecounter.org/krzak.org/siteStats",
function (data) {
var countEl = document.getElementById("visitor-count");
if (countEl && data && data.total) {
countEl.innerHTML = data.total;
}
},
);
// 2. Fetch Minecraft Server Status
fetchJSON("https://api.mcsrvstat.us/3/krzak.org", function (data) {
var statusText = document.getElementById("mc-status-text");
var playersEl = document.getElementById("mc-players");
var marquee = document.getElementById("system-marquee");
if (data.online) {
if (statusText) {
statusText.innerHTML = "ONLINE";
statusText.color = "#00ff00"; // Green
}
if (playersEl) {
playersEl.innerHTML =
"[" +
data.players.online +
"/" +
data.players.max +
"] Players";
}
// Update marquee with dynamic info
if (marquee) {
marquee.innerHTML =
"++ SERVER ONLINE: " +
data.players.online +
" PLAYERS CONNECTED ++ VERSION: " +
data.version +
" ++ WELCOME TO KRZAK.ORG ++";
}
} else {
if (statusText) {
statusText.innerHTML = "OFFLINE";
statusText.color = "#ff0000"; // Red
}
if (playersEl) {
playersEl.innerHTML = "";
}
}
});
</script>
</body>
</html>