// Supernormal Minecraft — landing page (dark mode only) // Layout: fixed header + footer, scrolling middle (sidebar + main) inside wood frame. // Sections flow: about → how to join → mini timeline preview (click-through to timeline.html). // Production config. anchorWallClock + anchorVersion are placeholders — the // real values are fetched from /status.json at mount (regenerated by // refresh-status.sh on every timeline upgrade). Other fields are static. const SITE_CONFIG = { tagline: "Minecraft as it was intended", serverAddress: "mc.supernormalsolutions.com", accentColor: "#8FB05A", wordmarkLine1: "SUPERNORMAL", wordmarkLine2: "MINECRAFT", anchorWallClock: "2026-03-01", anchorVersion: "0.1.2_01", }; // --- mini timeline helpers --------------------------------------------- function miniRealDateFor(canonicalDateStr, anchorWallClockStr, anchorVersion) { const anchorEntry = MANIFEST.find(m => m.v === anchorVersion) || MANIFEST[0]; const canonicalAnchor = parseDate(anchorEntry.d); const canonicalTarget = parseDate(canonicalDateStr); const gap = daysBetween(canonicalAnchor, canonicalTarget); const wall = parseDate(anchorWallClockStr); const out = new Date(wall); out.setUTCDate(out.getUTCDate() + gap); return out; } function miniEraOf(v) { if (v.startsWith('0.')) return 'alpha'; if (['b1.0','b1.0_01','b1.1','b1.1_01','b1.1_02','b1.2','b1.2_01'].includes(v)) return 'early-beta'; if (['b1.3','b1.4','b1.4_01','b1.5','b1.5_01','b1.5_02'].includes(v)) return 'mid-beta'; return 'late-beta'; } function MiniTimeline({ anchorWallClock, anchorVersion, accent }) { const ALPHA_C = '#A07A4F', EARLY_BETA = '#8FB05A', MID_BETA = '#b89a54', LATE_BETA = '#c26a6a'; const eraColor = (era) => era === 'alpha' ? ALPHA_C : era === 'early-beta' ? EARLY_BETA : era === 'mid-beta' ? MID_BETA : LATE_BETA; const ink = '#EADFC4', muted = '#9A8F74', rule = '#463c28'; const enriched = MANIFEST.map(m => ({ ...m, wallDate: miniRealDateFor(m.d, anchorWallClock, anchorVersion), })); const now = new Date(); const nowUTC = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())); let liveIdx = -1; for (let i = 0; i < enriched.length; i++) { if (enriched[i].wallDate.getTime() <= nowUTC.getTime()) liveIdx = i; } const live = liveIdx >= 0 ? enriched[liveIdx] : null; const firstD = parseDate(MANIFEST[0].d); const lastD = parseDate(MANIFEST[MANIFEST.length-1].d); const totalDays = daysBetween(firstD, lastD); const W = 640; // compact rail width const xFor = (ds) => (daysBetween(firstD, parseDate(ds)) / totalDays) * W; // Era bands for mini const bands = [ { from: '2010-08-12', to: '2010-12-03', color: ALPHA_C, label: 'alpha' }, { from: '2010-12-20', to: '2011-01-14', color: EARLY_BETA, label: 'early beta' }, { from: '2011-02-22', to: '2011-04-20', color: MID_BETA, label: 'mid beta' }, { from: '2011-05-26', to: '2011-07-08', color: LATE_BETA, label: 'late beta' }, ]; // now marker const nowDayOff = (nowUTC - enriched[0].wallDate) / 86400000; const clampedNow = Math.max(0, Math.min(totalDays, nowDayOff)); const nowX = (clampedNow / totalDays) * W; const nowInRange = nowDayOff >= 0 && nowDayOff <= totalDays; return ( {/* caption row */}
THE WORLDLINE
{live ? <>live: {live.v} : <>not yet anchored}
open timeline
{/* rail */}
{/* base rail */}
{/* progress fill */} {nowX > 0 && (
)} {/* era bands under the rail */} {bands.map((b, i) => { const x1 = xFor(b.from), x2 = xFor(b.to); const w = Math.max(2, x2 - x1); return (
{b.label}
); })} {/* nodes */} {enriched.map((e, i) => { const x = xFor(e.d); const isLive = i === liveIdx; const isPast = i < liveIdx; const c = eraColor(miniEraOf(e.v)); const size = isLive ? 10 : 5; const bg = (isLive || isPast) ? c : '#0a0906'; const borderCol = (isLive || isPast) ? ink : `${c}88`; return (
); })} {/* now marker */} {nowInRange && ( <>
you are here
)}
41 versions · 331 canonical days · 1:1 scale
); } // ---------------------------------------------------------------------- function Landing() { const containerRef = React.useRef(null); const [copied, setCopied] = React.useState(false); const [tweaks, setTweaks] = React.useState(SITE_CONFIG); useCursorTrail(containerRef, { color: tweaks.accentColor }); // Pull the live anchor (current server version + wall-clock install date) // from refresh-status.sh's output. If the fetch fails (offline / local dev), // fall back to the baked-in SITE_CONFIG values. React.useEffect(() => { fetch('/status.json') .then(r => r.ok ? r.json() : null) .then(s => { if (!s || !s.anchorVersion || !s.anchorWallClock) return; setTweaks(t => ({ ...t, anchorVersion: s.anchorVersion, anchorWallClock: s.anchorWallClock, })); }) .catch(() => {}); }, []); const col = '#221d14', ink = '#EADFC4', muted = '#9A8F74'; const rule = '#463c28', link = '#9ac6ff', linkV = '#c6aaff'; const accent = tweaks.accentColor; // Compute the currently-live version from the manifest + anchor tweaks. // Same logic as MiniTimeline / timeline page so the whole site stays in sync. const { live, next } = React.useMemo(() => { const enriched = MANIFEST.map(m => ({ ...m, wallDate: miniRealDateFor(m.d, tweaks.anchorWallClock, tweaks.anchorVersion), })); const now = new Date(); const nowUTC = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())); let idx = -1; for (let i = 0; i < enriched.length; i++) { if (enriched[i].wallDate.getTime() <= nowUTC.getTime()) idx = i; } return { live: idx >= 0 ? enriched[idx] : null, next: idx + 1 < enriched.length ? enriched[idx + 1] : null, }; }, [tweaks.anchorWallClock, tweaks.anchorVersion]); const copy = () => { if (navigator.clipboard) navigator.clipboard.writeText(tweaks.serverAddress).catch(() => {}); setCopied(true); setTimeout(() => setCopied(false), 1600); }; return (
{/* FIXED HEADER — compact, single row */}
{tweaks.wordmarkLine1} {tweaks.wordmarkLine2} — {tweaks.tagline}
online · {tweaks.serverAddress}
{/* thin plank trim */}
{/* SCROLLING MIDDLE */}
{/* SIDEBAR */} {/* MAIN SCROLL */}

about the server

Hi. This is a private server for a dozen or so friends that boots every Alpha and Beta server jar from 0.1.2_01 (Aug 12, 2010) to b1.7.3 (Jul 8, 2011), on a 1:1 real-world calendar. The server upgrades itself at exactly the same cadence Mojang shipped the originals, so we’re walking through eleven months of early Minecraft history in real time.

No mods, no plugins — just the original jars, unmodified, running the protocol they shipped with. Clients have to match the current server version exactly (see the sidebar for what’s live right now). Expect hurt animations to arrive late, the Nether to open a few weeks in, PvP to not exist until a1.2.3, pistons not to land until summer, and the occasional 12-minute-long hotfix jar. When the worldline reaches b1.7.3, that’s it — the Adventure Update is a different game.

how to join

Four steps. The server is Tailscale-only and runs historical Beta jars, so the vanilla launcher won’t work.

  1. 01

    join the tailnet

    Install Tailscale, accept the invite I sent you, and sign in. You should see mjr-server in your machine list.
  2. 02

    install betacraft

    The official launcher can’t boot Alpha/Beta jars. Grab Betacraft for your OS and run it.
  3. 03

    sign in & pick the live version

    In Betacraft, click the profile icon and sign in with the Microsoft account tied to your Minecraft profile. Select the client version listed in the sidebar — it must match the server exactly.
  4. 04

    connect

    Multiplayer → Add Server, paste the address below, save, and join. You should spawn in.
    {tweaks.serverAddress}
    {/* inline live-version row */}
    server {live ? {live.v} : pre-launch} · client {live ? {live.c} : } {next && ( <> · next {next.v} — {(() => { const now = new Date(); const nowUTC = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())); const du = Math.round((next.wallDate - nowUTC) / 86400000); if (du <= 0) return 'due now'; if (du === 1) return 'tomorrow'; return `in ${du} days`; })()} )}
won’t connect? check the Tailscale tray icon is green and that tailscale ping mjr-server works. if Tailscale’s fine, you’ve almost certainly got the wrong Beta version selected in Betacraft.

the worldline

The server walks a 1:1 real-world calendar through every Alpha and Beta release from 0.1.2_01 (Aug 12, 2010) to b1.7.3 (Jul 8, 2011).

{/* FIXED FOOTER — plank trim over solid panel */}
server ip: {tweaks.serverAddress}
supernormal minecraft 2026 · a private server
); } const root = ReactDOM.createRoot(document.getElementById('root')); root.render();