From d93aca923b8f7fcdd8b335ead81d443c71a55f79 Mon Sep 17 00:00:00 2001 From: superschnups Date: Fri, 4 Sep 2026 00:33:04 +0200 Subject: [PATCH] Auto-backup: 2026-09-04 00:33 --- admin-projects.js | 354 +++++++++++++++++++++++++++ content/.DS_Store | Bin 6148 -> 6148 bytes content/posts/protocol-top.md | 4 +- layouts/index.html | 12 +- public/.DS_Store | Bin 8196 -> 8196 bytes public/css/style.css | 40 +++ public/index.html | 16 +- public/js/ascii-shimmer.js | 22 +- public/js/script.js | 93 ++++++- public/posts/protocol-top/index.html | 12 +- static/.DS_Store | Bin 6148 -> 6148 bytes static/css/style.css | 40 +++ static/js/ascii-shimmer.js | 22 +- static/js/script.js | 93 ++++++- 14 files changed, 656 insertions(+), 52 deletions(-) create mode 100644 admin-projects.js diff --git a/admin-projects.js b/admin-projects.js new file mode 100644 index 0000000..50ece40 --- /dev/null +++ b/admin-projects.js @@ -0,0 +1,354 @@ +const http = require('http'); +const fs = require('fs'); +const path = require('path'); + +const POSTS_DIR = path.join(__dirname, 'content/posts'); +const PORT = 3002; +const STATUS_CLASSES = ['stable', 'corrupted', 'experimental']; + +function esc(s) { + return String(s).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +} + +function slugify(title) { + return String(title) + .toLowerCase() + .replace(/[äöü]/g, m => ({ ä: 'ae', ö: 'oe', ü: 'ue' }[m])) + .replace(/ß/g, 'ss') + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') || 'projekt'; +} + +function uniqueSlug(base) { + let slug = base; + let i = 2; + while (fs.existsSync(path.join(POSTS_DIR, slug + '.md'))) { + slug = base + '-' + i; + i++; + } + return slug; +} + +// ── FRONTMATTER PARSEN / SCHREIBEN ────────────────────────────── +function parsePost(filename) { + const raw = fs.readFileSync(path.join(POSTS_DIR, filename), 'utf8'); + const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/); + const fm = { title: '', date: '', status_class: 'stable', status_label: '', thumb: '' }; + let body = raw; + if (match) { + const fmBlock = match[1]; + body = match[2].replace(/^\n+/, ''); + fmBlock.split('\n').forEach(line => { + const idx = line.indexOf(':'); + if (idx === -1) return; + const key = line.slice(0, idx).trim(); + let val = line.slice(idx + 1).trim(); + val = val.replace(/^['"]|['"]$/g, ''); + if (key in fm) fm[key] = val; + }); + } + return { filename, ...fm, body }; +} + +function serializePost(entry) { + const q = v => `'${String(v).replace(/'/g, "''")}'`; + return `--- +title: ${q(entry.title)} +date: ${entry.date} +status_class: ${q(entry.status_class)} +status_label: ${q(entry.status_label)} +thumb: ${q(entry.thumb)} +--- + +${entry.body.trim()} +`; +} + +function readAllPosts() { + return fs.readdirSync(POSTS_DIR) + .filter(f => f.endsWith('.md')) + .map(parsePost) + .sort((a, b) => (a.date < b.date ? 1 : -1)); +} + +// ── HTML ───────────────────────────────────────────────────────── +function html(posts) { + const statusOptions = STATUS_CLASSES.map(c => ``).join(''); + const rows = posts.map(p => ` + + ${esc(p.title)} + ${esc(p.date)} + ${esc(p.status_label)} + ${esc(p.filename)} + + + + + `).join(''); + + const json = JSON.stringify(posts).replace(/ + + + + +PROJEKT-ARCHIV // ADMIN + + + + +

PROJEKT-ARCHIV

+

// LOKALES ADMIN-PANEL · localhost:${PORT} · schreibt content/posts/*.md

+ +
+

+ NEUES PROJEKT

+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ +
+
+

PROJEKTE

+ ${posts.length} EINTRÄGE +
+ + + + + ${rows} +
TITELDATUMSTATUSDATEI
+
+ +
+ + + +`; +} + +// ── SERVER ─────────────────────────────────────────────────────── +const server = http.createServer((req, res) => { + const json = (status, obj) => { + res.writeHead(status, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify(obj)); + }; + const body = (cb) => { + let b = ''; + req.on('data', c => b += c); + req.on('end', () => cb(b)); + }; + + if (req.method === 'GET' && req.url === '/') { + res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); + res.end(html(readAllPosts())); + + } else if (req.method === 'POST' && req.url === '/save') { + body(b => { + try { + const { isNew, entry } = JSON.parse(b); + if (!entry.title || !entry.status_label) throw new Error('Titel und Status-Label sind Pflicht'); + + let filename = entry.filename; + if (isNew) { + filename = uniqueSlug(slugify(filename || entry.title)) + '.md'; + } else if (!filename.endsWith('.md')) { + filename += '.md'; + } + + fs.writeFileSync(path.join(POSTS_DIR, filename), serializePost({ ...entry, filename }), 'utf8'); + json(200, { ok: true, filename }); + } catch (e) { + json(400, { ok: false, error: e.message }); + } + }); + + } else if (req.method === 'POST' && req.url === '/delete') { + body(b => { + try { + const { filename } = JSON.parse(b); + const target = path.join(POSTS_DIR, filename); + if (!target.startsWith(POSTS_DIR) || !filename.endsWith('.md')) { + throw new Error('Ungültiger Dateiname'); + } + fs.unlinkSync(target); + json(200, { ok: true }); + } catch (e) { + json(400, { ok: false, error: e.message }); + } + }); + + } else { + res.writeHead(404); res.end('Not found'); + } +}); + +server.listen(PORT, '127.0.0.1', () => { + console.log(`\n PROJEKT-ARCHIV ADMIN → http://localhost:${PORT}\n`); +}); diff --git a/content/.DS_Store b/content/.DS_Store index da901716f0b0c9fb9ba2cb5fd54a4e661b031fca..94fe6d1d7fcf863b11791b442ef8250fc8aacc14 100644 GIT binary patch delta 120 zcmZoMXffDufGJrxgMop8m7#zkpP`tcgrPV$-^C>2}5yizKcszPJR+ll;e!U`B(qzx)7~Pb7l? diff --git a/content/posts/protocol-top.md b/content/posts/protocol-top.md index 8ce009d..e93f9bc 100644 --- a/content/posts/protocol-top.md +++ b/content/posts/protocol-top.md @@ -1,8 +1,8 @@ --- -title: '> top' +title: '> topha' date: 2026-03-18 status_class: 'stable' -status_label: 'PROTOKOLL #002' +status_label: 'PROTOKOLL #0099' thumb: '/img/hp_muti_steampunk_01.png' --- diff --git a/layouts/index.html b/layouts/index.html index 69aed88..4b18eb3 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -7,8 +7,6 @@ data-ascii-shimmer data-text="KILABOR" data-cell="10" - data-color="#ff4500" - data-dim-color="rgba(212,175,55,0.35)" style="max-width: 900px; margin: 0 auto 10px; width: 100%;">
@@ -73,13 +71,13 @@
-
- // SYSTEM_LOG_FEED - [ ORAKEL ] +
+ // SYSTEM_LOG_FEED + [ ORAKEL ]
-
+
-
+
sascha@ki-labor:~$
diff --git a/public/.DS_Store b/public/.DS_Store index c690a4c26e74b2000ff5408b4f977216fceccced..cf3b9012593b400293720c7ba99ac1c90c30a85a 100644 GIT binary patch delta 33 pcmZp1XmQx^M3CwCl*!Ko-!o;sn|xi!kEwxS@n}C4iNwV delta 33 pcmZp1XmQx^M3Cv%rOD3(-!nztntWZzkEwuR@o5w4jBLd diff --git a/public/css/style.css b/public/css/style.css index 627d537..b5d7fdd 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -26,6 +26,15 @@ body { overflow-x: hidden; } +/* Kein Browser-Default fuer Links (sonst Blau/Lila + Unterstrichen, siehe .portfolio-link) */ +a { + color: inherit; + text-decoration: none; +} +a:hover { + color: var(--accent-orange); +} + body.home-page { background: linear-gradient(rgba(0, 0, 0, 0.9), rgba(0, 0, 0, 0.9)), url('/img/grid.png') repeat; } @@ -224,6 +233,22 @@ footer { 50% { opacity: 0.3; } } +/* ORAKEL-LINK: rot, fett, pulsierender Rahmen */ +.oracle-link { + color: #f00; + font-weight: bold; + border: 1px solid #f00; + animation: oraclePulse 1.6s ease-in-out infinite; +} +.oracle-link:hover { + color: #fff; + background: rgba(255, 0, 0, 0.15); +} +@keyframes oraclePulse { + 0%, 100% { border-color: rgba(255, 0, 0, 0.35); box-shadow: 0 0 0 rgba(255, 0, 0, 0); } + 50% { border-color: #f00; box-shadow: 0 0 10px rgba(255, 0, 0, 0.7); } +} + /* --- INTERAKTIVE MODI --- */ /* 1. KI-KERNEL (Matrix Style) */ @@ -583,6 +608,21 @@ body.mode-ghost .prompt { .log-entry.ok { color: #0f0; } .log-entry.warn { color: #ff0; } +.log-entry.hack-skull { + display: block; + text-align: center; + font-size: 4rem; + line-height: 1.4; + color: #f00; + text-shadow: 0 0 25px rgba(255, 0, 0, 0.8); +} + +#system-log.hacked-bg { + background: #1a0000 !important; + border-color: #f00 !important; + transition: background-color 1.4s ease, border-color 1.4s ease, height 0.4s ease; +} + .terminal-input-line { display: flex; border-top: 1px solid #111; diff --git a/public/index.html b/public/index.html index 1b55949..216eb6a 100644 --- a/public/index.html +++ b/public/index.html @@ -28,8 +28,6 @@ data-ascii-shimmer data-text="KILABOR" data-cell="10" - data-color="#ff4500" - data-dim-color="rgba(212,175,55,0.35)" style="max-width: 900px; margin: 0 auto 10px; width: 100%;">
@@ -242,13 +240,13 @@
-
- // SYSTEM_LOG_FEED - [ ORAKEL ] +
+ // SYSTEM_LOG_FEED + [ ORAKEL ]
-
+
-
+
sascha@ki-labor:~$
@@ -278,13 +276,13 @@
- PROTOKOLL #002 + PROTOKOLL #0099
Preview -

> top

+

> topha

STATUS: PROZESS-ÜBERWACHUNG

diff --git a/public/js/ascii-shimmer.js b/public/js/ascii-shimmer.js index 5b9f630..123265a 100644 --- a/public/js/ascii-shimmer.js +++ b/public/js/ascii-shimmer.js @@ -5,9 +5,12 @@ function initAsciiShimmer(container) { var text = container.dataset.text || 'KILABOR'; var cell = parseInt(container.dataset.cell || '10', 10); - var primaryColor = container.dataset.color || '#ff4500'; - var dimColor = container.dataset.dimColor || 'rgba(212,175,55,0.35)'; var intervalMs = parseInt(container.dataset.interval || '140', 10); + // Farbwelle: pro Buchstabe ein eigener Hue-Versatz, der Startpunkt + // wandert über die Zeit weiter -> Farbe laeuft Buchstabe fuer Buchstabe durch. + var hueSpeed = parseFloat(container.dataset.hueSpeed || '2.5'); + var frame = 0; + var cols = 0; var denseChars = ['$', '@', '%', '#', '&', '8', '0']; var edgeChars = ['+', 'x', '-', '=', ':', '.', 'o']; @@ -49,8 +52,9 @@ mctx.fillText(text, width / 2, height / 2); var imgData = mctx.getImageData(0, 0, width, height).data; - var cols = Math.floor(width / cell); + cols = Math.floor(width / cell); var rows = Math.floor(height / cell); + var colsPerLetter = cols / text.length; mask = []; for (var ry = 0; ry < rows; ry++) { @@ -60,7 +64,8 @@ var idx = (py * width + px) * 4; var alpha = imgData[idx + 3] / 255; if (alpha > 0.15) { - mask.push({ x: rx, y: ry, alpha: alpha }); + var letterIndex = Math.min(text.length - 1, Math.floor(rx / colsPerLetter)); + mask.push({ x: rx, y: ry, alpha: alpha, letter: letterIndex }); } } } @@ -72,12 +77,19 @@ ctx.textBaseline = 'middle'; ctx.textAlign = 'center'; + frame++; + var hueBase = (frame * hueSpeed) % 360; + var hueStep = 360 / text.length; + for (var i = 0; i < mask.length; i++) { var c = mask[i]; var isDense = c.alpha > 0.7; var set = isDense ? denseChars : edgeChars; var char = set[(Math.random() * set.length) | 0]; - ctx.fillStyle = isDense ? primaryColor : dimColor; + var hue = (hueBase + c.letter * hueStep) % 360; + ctx.fillStyle = isDense + ? 'hsl(' + hue + ', 90%, 55%)' + : 'hsla(' + hue + ', 90%, 55%, 0.4)'; ctx.fillText(char, c.x * cell + cell / 2, c.y * cell + cell / 2); } } diff --git a/public/js/script.js b/public/js/script.js index ae572b8..56c3ba3 100644 --- a/public/js/script.js +++ b/public/js/script.js @@ -155,12 +155,19 @@ }); } + function randHex() { + return Math.random().toString(16).substring(2, 15); + } + function log(msg, cls = '') { if (!logOutput) return; const entry = document.createElement('div'); entry.className = 'log-entry ' + cls; entry.innerHTML = msg; logOutput.prepend(entry); + // Neuesten Eintrag immer sichtbar halten (sonst bleibt die Ansicht + // nach schnellen Log-Bursts wie "hack" an alter Scroll-Position stehen). + logOutput.scrollTop = 0; } function handleCommand(raw) { @@ -168,6 +175,16 @@ const cmd = parts[0].toLowerCase(); const args = parts.slice(1).join(' '); + // Nach einem "hack" hinterlassenes Rot/vergroessertes Terminal bei + // jedem neuen Befehl (ausser erneutem hack) wieder normalisieren. + if (cmd !== 'hack') { + const normalTerminal = document.getElementById('system-log'); + if (normalTerminal && normalTerminal.classList.contains('hacked-bg')) { + normalTerminal.classList.remove('hacked-bg'); + normalTerminal.style.height = ''; + } + } + log('sascha@ki-labor:~$ ' + raw + ''); switch(cmd) { @@ -199,15 +216,57 @@ case 'trace': document.querySelector('[data-mode="trace"]')?.click(); break; case 'flux': document.querySelector('[data-mode="overdrive"]')?.click(); break; case 'hack': - log('>> INITIATING NEURAL HACK...', 'warn'); - let hIdx = 0; - const hInt = setInterval(() => { - log(Math.random().toString(16).substring(2, 15), 'ghost'); - if (hIdx++ > 15) { - clearInterval(hInt); - log('>> ACCESS GRANTED.', 'ok'); - } - }, 100); + const hackTargets = ['NASA.GOV', 'PENTAGON.MIL', 'AREA51.GOV', 'CIA.GOV', 'FBI.GOV']; + const hackTarget = hackTargets[Math.floor(Math.random() * hackTargets.length)]; + const hackIp = Array.from({ length: 4 }, () => Math.floor(Math.random() * 256)).join('.'); + const hackFiles = ['AREA51_BBQ_REZEPTE.pdf', 'MONDLANDUNG_MASTERTAPES.mp4', 'ALIEN_KONTAKT_CHATVERLAUF.txt', 'ROSWELL_URLAUBSFOTOS.zip', 'GEHEIME_KAFFEEKASSE.xlsx', 'ECHTE_GEBURTSTAGSPARTY_PLANUNG.docx', 'BEREICH_51_WLAN_PASSWORT.txt'].sort(() => Math.random() - 0.5).slice(0, 3); + const hackScript = [ + { t: '>> INITIATING NEURAL HACK...', c: 'warn', d: 0 }, + { t: '>> ZIEL ANVISIERT: ' + hackTarget + ' [' + hackIp + ']', c: 'info', d: 650 }, + { t: randHex(), c: 'ghost', d: 320 }, + { t: randHex(), c: 'ghost', d: 160 }, + { t: randHex(), c: 'ghost', d: 160 }, + { t: '>> FIREWALL WIRD UMGANGEN... [FEHLGESCHLAGEN]', c: 'error', d: 800 }, + { t: '>> WECHSLE ZU BRUTE-FORCE-MODUL...', c: 'warn', d: 650 }, + { t: randHex(), c: 'ghost', d: 240 }, + { t: randHex(), c: 'ghost', d: 160 }, + { t: randHex(), c: 'ghost', d: 160 }, + { t: randHex(), c: 'ghost', d: 160 }, + { t: '>> FIREWALL UMGANGEN. (Standard-Passwort war "password123".)', c: 'ok', d: 800 }, + { t: '>> INJIZIERE PAYLOAD IN MAINFRAME...', c: 'info', d: 650 }, + { t: '[■□□□□□□□□□] 10%', c: '', d: 240 }, + { t: '[■■■□□□□□□□] 30%', c: '', d: 240 }, + { t: '[■■■■■□□□□□] 50%', c: '', d: 240 }, + { t: '[■■■■■■■□□□] 70%', c: '', d: 240 }, + { t: '[■■■■■■■■■□] 90%', c: '', d: 240 }, + { t: '[■■■■■■■■■■] 100%', c: 'ok', d: 320 }, + { t: '>> LADE GEHEIME DATEIEN HERUNTER...', c: 'warn', d: 650 }, + { t: ' ↳ ' + hackFiles[0], c: 'ghost', d: 320 }, + { t: ' ↳ ' + hackFiles[1], c: 'ghost', d: 320 }, + { t: ' ↳ ' + hackFiles[2], c: 'ghost', d: 320 }, + { t: '>> SPUREN WERDEN VERWISCHT...', c: 'info', d: 650 }, + { t: '>> ACCESS GRANTED. WILLKOMMEN, OVERLORD.', c: 'crit', d: 800 }, + { t: '>> (Alles nur Fiktion. Keine echten Server wurden gehackt. Wahrscheinlich.)', c: '', d: 650 } + ]; + + const hackTerminal = document.getElementById('system-log'); + if (hackTerminal) { + hackTerminal.classList.remove('hacked-bg'); + hackTerminal.style.height = (hackTerminal.offsetHeight + 100) + 'px'; + } + + let hackCum = 0; + hackScript.forEach(step => { + hackCum += step.d; + setTimeout(() => log(step.t, step.c), hackCum); + }); + + // Nach der Sequenz: Terminal leeren, Totenkopf zeigen, Hintergrund rot einfaerben + setTimeout(() => { + if (logOutput) logOutput.innerHTML = ''; + log('☠', 'hack-skull'); + if (hackTerminal) hackTerminal.classList.add('hacked-bg'); + }, hackCum + 700); break; case 'deep-scan': log('>> INITIALIZING DEEP SYSTEM SCAN...', 'info'); @@ -223,6 +282,22 @@ log('SYSTEM ONLINE SEIT: 01.01.1974', 'info'); log('LAUFZEIT: ' + years + ' JAHRE (STABILITÄT: FRAGLICH)', 'ok'); break; + case 'top': + log('PROZESS-MONITOR:', 'info'); + log('PID CPU% MEM% PROZESS'); + log('1337 ' + (60 + Math.floor(Math.random() * 40)) + '% ' + (30 + Math.floor(Math.random() * 50)) + '% ANARCHIE.exe', 'warn'); + log('0001 ' + (5 + Math.floor(Math.random() * 20)) + '% ' + (10 + Math.floor(Math.random() * 30)) + '% KAFFEE_DAEMON'); + log('4269 ' + (1 + Math.floor(Math.random() * 10)) + '% ' + (5 + Math.floor(Math.random() * 15)) + '% PROKRASTINATION.sys'); + log('0666 ' + (80 + Math.floor(Math.random() * 20)) + '% ' + (70 + Math.floor(Math.random() * 30)) + '% GEMINI_NEURAL_LINK', 'error'); + log('9999 0% 0% SCHLAF.exe (SEIT TAGEN INAKTIV)'); + break; + case 'weather': + const conditions = ['CHAOS mit Aussicht auf mehr CHAOS', 'Vereinzelte Panik-Schauer', 'Digitaler Nebel, Sicht: 0m', 'Sonnig, aber die Sonne ist auch kaputt', 'Sturmwarnung: MERGE CONFLICTS']; + const temp = -10 + Math.floor(Math.random() * 60); + log('CHAOS-WETTERBERICHT:', 'info'); + log('TEMPERATUR: ' + temp + '°C (GEFÜHLT: SCHLIMMER)'); + log('BEDINGUNG: ' + conditions[Math.floor(Math.random() * conditions.length)], 'warn'); + break; case 'fortune': generateFortune(); break; default: log('FEHLER: BEFEHL "' + cmd + '" NICHT GEFUNDEN.', 'error'); diff --git a/public/posts/protocol-top/index.html b/public/posts/protocol-top/index.html index b4a2404..fec6a81 100644 --- a/public/posts/protocol-top/index.html +++ b/public/posts/protocol-top/index.html @@ -3,7 +3,7 @@ - > top | DIGITALE ANARCHIE | KI-LABOR + > topha | DIGITALE ANARCHIE | KI-LABOR @@ -189,7 +189,7 @@

// ZENTRAL-ARCHIV · EINHEIT IDENTIFIZIERT //

⟪ -

> TOP

+

> TOPHA

⟫

STATUS: AKTIV

@@ -240,7 +240,7 @@ VERTRAULICH
-
AKTE: > TOP
+
AKTE: > TOPHA
STATUS: KLASSIFIZIERT @@ -365,7 +365,7 @@
PROTOKOLL NR. 1974-Ø
-

> TOP

+

> TOPHA

ALIAS:

@@ -382,7 +382,7 @@
DESIGNATION:
- > top + > topha
@@ -723,7 +723,7 @@