BunnyCDN-DE1-1047
tcp/443
BunnyCDN-DE1-1048
tcp/443 tcp/80
BunnyCDN-DE1-874
tcp/443 tcp/80
Open service 2400:52e0:1e00::1047:1:443 · stage.fetgen.pics
2026-01-27 19:04
HTTP/1.1 302 Found Date: Tue, 27 Jan 2026 19:04:45 GMT Content-Type: text/html Content-Length: 0 Connection: close Server: BunnyCDN-DE1-1047 CDN-PullZone: 5056360 CDN-RequestCountryCode: DE Cache-Control: no-store Location: /login?next=%2F cdn-bess-version: 1.35.5 CDN-ProxyVer: 1.43 CDN-RequestPullSuccess: True CDN-RequestPullCode: 302 CDN-CachedAt: 01/27/2026 19:04:45 CDN-EdgeStorageId: 1048 Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp Cross-Origin-Resource-Policy: same-origin Strict-Transport-Security: max-age=63072000; includeSubDomains; preload X-Content-Type-Options: nosniff Referrer-Policy: strict-origin-when-cross-origin Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=() CDN-RequestId: ba3494f93949768f1a96eb6557736304 CDN-Cache: MISS CDN-Status: 302 CDN-RequestTime: 0
Open service 2400:52e0:1e00::1048:1:80 · fetgen.pics
2026-01-26 13:02
HTTP/1.1 301 Moved Permanently Date: Mon, 26 Jan 2026 13:02:18 GMT Content-Type: text/html Content-Length: 166 Connection: close Server: BunnyCDN-DE1-1048 CDN-PullZone: 5071379 CDN-RequestCountryCode: CA Location: https://fetgen.pics/ CDN-RequestId: 82e842fc985268b65c4db840f5a0f653 Referrer-Policy: strict-origin-when-cross-origin Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=() Strict-Transport-Security: max-age=63072000; includeSubDomains; preload Cross-Origin-Embedder-Policy: require-corp Cross-Origin-Resource-Policy: same-origin Cross-Origin-Opener-Policy: same-origin X-Content-Type-Options: nosniff CDN-RequestTime: 0 Page title: 301 Moved Permanently <html> <head><title>301 Moved Permanently</title></head> <body> <center><h1>301 Moved Permanently</h1></center> <hr><center>openresty</center> </body> </html>
Open service 138.199.37.232:443 · fetgen.pics
2026-01-26 13:02
HTTP/1.1 200 OK
Date: Mon, 26 Jan 2026 13:02:17 GMT
Content-Type: text/html
Content-Length: 6474
Connection: close
Vary: Accept-Encoding
Server: BunnyCDN-DE1-874
CDN-PullZone: 5071379
CDN-RequestCountryCode: DE
Cache-Control: public, max-age=2592000
Last-Modified: Sun, 04 Jan 2026 23:35:22 GMT
x-amz-request-id: HCFF00690058DE7304
CDN-ProxyVer: 1.43
CDN-RequestPullSuccess: True
CDN-RequestPullCode: 206
CDN-CachedAt: 01/10/2026 16:40:07
CDN-EdgeStorageId: 752
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Resource-Policy: same-origin
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
CDN-RequestId: 25ba8f94df6ab484e2af2d92350fa9b8
CDN-Cache: HIT
CDN-Status: 200
CDN-RequestTime: 0
Accept-Ranges: bytes
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="/" />
<style>
:root {
--font-stack: 'Inter', 'Noto Sans', sans-serif;
--bg-color: #050505;
--text-color: #050505;
}
body {
margin: 0;
background: var(--bg-color);
color: var(--text-color);
height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-family: var(--font-stack);
overflow: hidden;
}
h1 {
font-weight: 700;
font-size: 8rem;
margin: 0;
letter-spacing: -0.04em;
line-height: 1;
}
@media (max-width: 600px) {
h1 { font-size: 4rem; }
}
</style>
<!-- 1. LOAD SHARED LOGIC SYNCHRONOUSLY -->
<script src="./config/loader.js"></script>
<!-- 2. SECURE CONFIG LOADER (Uses globals from ./config/loader.js) -->
<script>
(async () => {
// Use constants/functions from ./config/loader.js
const SALT = window.SALT || 'h3cr8';
const getID = window.getID;
const extractHostname = window.extractHostname;
if (!getID || !extractHostname) {
console.error("Critical: ./config/loader.js failed to load.");
return;
}
//const url = "https://app.example.com/index.html"; // Example with BRAND NAME
const url = window.location.href;
const hostname = extractHostname(url);
// Helper: Inject DOM Elements
const inject = (tag, attr = {}, parent = document.head) => {
const el = document.createElement(tag);
for (const k in attr) el.setAttribute(k, attr[k]);
parent.appendChild(el);
return el;
};
// Helper: Wait for DOM to be ready
const ready = () => new Promise(r => document.readyState !== 'loading' ? r() : document.addEventListener('DOMContentLoaded', r));
// --- CASCADING LOOKUP ---
let config = null;
// Generate hierarchy candidates: e.g. ["sub.domain.com", "domain.com", "com", ""]
const candidates = [];
if (hostname) {
const labels = hostname.split('.');
for (let i = 0; i < labels.length; i++) {
candidates.push(labels.slice(i).join('.'));
}
}
// Fallback: The empty string evaluates to the root hash (gtmu080g3r2e4eqoix3c6r1dw)
candidates.push("");
for (const domain of candidates) {
try {
const hash = await getID(domain, SALT);
// Import config. The config file itself MUST resolve its own asset paths.
config = (await import(`./config/${hash}/config.js`)).default;
if (config) {
console.log(`Config loaded for '${domain}' (${hash})`);
break;
}
} catch (e) {
// alert(domain);
// Config not found for this level, continue cascading up
}
}
// --- APPLY ---
if (config) {
// 1. Expose Config Globally for UI Components (OmniBar, etc.)
window.CONFIG = config;
// 2. Set Meta Title (Browser Tab)
// Priority: metaTitle -> title
document.title = config.metaTitle || config.title;
// 3. Set Theme Color
document.documentElement.style.setProperty('--bg-app', config.color);
if (config.manifest) inject('link', { rel: 'manifest', href: config.manifest });
if (config.color) inject('meta', { name: 'theme-color', content: config.color });
// --- DYNAMIC SVG ICON GENERATION ---
// UPDATED LOGIC: Prioritize explicit Initials over inherited Icons.
// This fixes the issue where spread syntax (...primary) causes specific configs
// to inherit the fallback icon even when they defined 'initials'.
const hasExplicitInitials = (typeof config.initials === 'string');
if (hasExplicitInitials) {
// 1. Explicit Initials (User wanted this)
const initials = config.initials;
const svgString = `
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
<circle cx="5
Open service 2400:52e0:1e00::1048:1:443 · fetgen.pics
2026-01-26 13:02
HTTP/1.1 200 OK
Date: Mon, 26 Jan 2026 13:02:17 GMT
Content-Type: text/html
Content-Length: 6474
Connection: close
Vary: Accept-Encoding
Server: BunnyCDN-DE1-1048
CDN-PullZone: 5071379
CDN-RequestCountryCode: DE
Cache-Control: public, max-age=2592000
Last-Modified: Sun, 04 Jan 2026 23:35:22 GMT
x-amz-request-id: HCFF00690058DE7304
CDN-ProxyVer: 1.43
CDN-RequestPullSuccess: True
CDN-RequestPullCode: 206
CDN-CachedAt: 01/10/2026 16:40:07
CDN-EdgeStorageId: 752
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Resource-Policy: same-origin
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
CDN-RequestId: 3aed980ad98e246c7fc3cd4a49d041ac
CDN-Cache: HIT
CDN-Status: 200
CDN-RequestTime: 0
Accept-Ranges: bytes
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="/" />
<style>
:root {
--font-stack: 'Inter', 'Noto Sans', sans-serif;
--bg-color: #050505;
--text-color: #050505;
}
body {
margin: 0;
background: var(--bg-color);
color: var(--text-color);
height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-family: var(--font-stack);
overflow: hidden;
}
h1 {
font-weight: 700;
font-size: 8rem;
margin: 0;
letter-spacing: -0.04em;
line-height: 1;
}
@media (max-width: 600px) {
h1 { font-size: 4rem; }
}
</style>
<!-- 1. LOAD SHARED LOGIC SYNCHRONOUSLY -->
<script src="./config/loader.js"></script>
<!-- 2. SECURE CONFIG LOADER (Uses globals from ./config/loader.js) -->
<script>
(async () => {
// Use constants/functions from ./config/loader.js
const SALT = window.SALT || 'h3cr8';
const getID = window.getID;
const extractHostname = window.extractHostname;
if (!getID || !extractHostname) {
console.error("Critical: ./config/loader.js failed to load.");
return;
}
//const url = "https://app.example.com/index.html"; // Example with BRAND NAME
const url = window.location.href;
const hostname = extractHostname(url);
// Helper: Inject DOM Elements
const inject = (tag, attr = {}, parent = document.head) => {
const el = document.createElement(tag);
for (const k in attr) el.setAttribute(k, attr[k]);
parent.appendChild(el);
return el;
};
// Helper: Wait for DOM to be ready
const ready = () => new Promise(r => document.readyState !== 'loading' ? r() : document.addEventListener('DOMContentLoaded', r));
// --- CASCADING LOOKUP ---
let config = null;
// Generate hierarchy candidates: e.g. ["sub.domain.com", "domain.com", "com", ""]
const candidates = [];
if (hostname) {
const labels = hostname.split('.');
for (let i = 0; i < labels.length; i++) {
candidates.push(labels.slice(i).join('.'));
}
}
// Fallback: The empty string evaluates to the root hash (gtmu080g3r2e4eqoix3c6r1dw)
candidates.push("");
for (const domain of candidates) {
try {
const hash = await getID(domain, SALT);
// Import config. The config file itself MUST resolve its own asset paths.
config = (await import(`./config/${hash}/config.js`)).default;
if (config) {
console.log(`Config loaded for '${domain}' (${hash})`);
break;
}
} catch (e) {
// alert(domain);
// Config not found for this level, continue cascading up
}
}
// --- APPLY ---
if (config) {
// 1. Expose Config Globally for UI Components (OmniBar, etc.)
window.CONFIG = config;
// 2. Set Meta Title (Browser Tab)
// Priority: metaTitle -> title
document.title = config.metaTitle || config.title;
// 3. Set Theme Color
document.documentElement.style.setProperty('--bg-app', config.color);
if (config.manifest) inject('link', { rel: 'manifest', href: config.manifest });
if (config.color) inject('meta', { name: 'theme-color', content: config.color });
// --- DYNAMIC SVG ICON GENERATION ---
// UPDATED LOGIC: Prioritize explicit Initials over inherited Icons.
// This fixes the issue where spread syntax (...primary) causes specific configs
// to inherit the fallback icon even when they defined 'initials'.
const hasExplicitInitials = (typeof config.initials === 'string');
if (hasExplicitInitials) {
// 1. Explicit Initials (User wanted this)
const initials = config.initials;
const svgString = `
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
<circle cx="5
Open service 138.199.37.232:80 · fetgen.pics
2026-01-26 13:02
HTTP/1.1 301 Moved Permanently Date: Mon, 26 Jan 2026 13:02:17 GMT Content-Type: text/html Content-Length: 166 Connection: close Server: BunnyCDN-DE1-874 CDN-PullZone: 5071379 CDN-RequestCountryCode: DE Location: https://fetgen.pics/ CDN-RequestId: fcd03bb30b04ee7b238b18e358b9a5cf Referrer-Policy: strict-origin-when-cross-origin Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=() Strict-Transport-Security: max-age=63072000; includeSubDomains; preload Cross-Origin-Embedder-Policy: require-corp Cross-Origin-Resource-Policy: same-origin Cross-Origin-Opener-Policy: same-origin X-Content-Type-Options: nosniff CDN-RequestTime: 0 Page title: 301 Moved Permanently <html> <head><title>301 Moved Permanently</title></head> <body> <center><h1>301 Moved Permanently</h1></center> <hr><center>openresty</center> </body> </html>