Light/dark theme system: CSS vars, ThemeToggle, anti-flash, Apple-clean light surfaces

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
vyakymenko 2026-04-23 10:46:03 +00:00
parent 60654253f3
commit ceb014e9b5
5 changed files with 252 additions and 60 deletions

View File

@ -1,5 +1,6 @@
'use client' 'use client'
import { useState } from 'react' import { useState } from 'react'
import ThemeToggle from './ThemeToggle'
const LINKS = [ const LINKS = [
{ href: '#manifesto', label: 'Why Fibe' }, { href: '#manifesto', label: 'Why Fibe' },
@ -43,6 +44,7 @@ export default function Nav() {
{/* Desktop CTA */} {/* Desktop CTA */}
<div className="hidden md:flex items-center gap-3"> <div className="hidden md:flex items-center gap-3">
<ThemeToggle />
<a href="https://next.fibe.live/login" <a href="https://next.fibe.live/login"
className="text-sm transition-colors" className="text-sm transition-colors"
style={{color:'rgba(161,161,170,0.7)'}}> style={{color:'rgba(161,161,170,0.7)'}}>
@ -57,6 +59,7 @@ export default function Nav() {
{/* Mobile: CTA + hamburger */} {/* Mobile: CTA + hamburger */}
<div className="flex md:hidden items-center gap-2"> <div className="flex md:hidden items-center gap-2">
<ThemeToggle />
<a href="https://next.fibe.live/register" <a href="https://next.fibe.live/register"
className="text-xs font-semibold px-3 py-1.5 rounded-lg" className="text-xs font-semibold px-3 py-1.5 rounded-lg"
style={{background:'linear-gradient(135deg, #8b5cf6, #a78bfa)'}}> style={{background:'linear-gradient(135deg, #8b5cf6, #a78bfa)'}}>

View File

@ -0,0 +1,58 @@
'use client'
import { useEffect, useState } from 'react'
export default function ThemeToggle() {
const [dark, setDark] = useState(true)
useEffect(() => {
// Read from localStorage (set by anti-flash script in layout)
const saved = localStorage.getItem('fibe-theme')
setDark(saved !== 'light')
}, [])
const toggle = () => {
const next = !dark
setDark(next)
if (next) {
document.documentElement.removeAttribute('data-theme')
localStorage.setItem('fibe-theme', 'dark')
} else {
document.documentElement.setAttribute('data-theme', 'light')
localStorage.setItem('fibe-theme', 'light')
}
}
return (
<button
onClick={toggle}
aria-label={dark ? 'Switch to light mode' : 'Switch to dark mode'}
title={dark ? 'Light mode' : 'Dark mode'}
className="w-8 h-8 flex items-center justify-center rounded-lg transition-all hover:scale-110"
style={{
color: dark ? 'rgba(167,139,250,0.7)' : 'rgba(124,58,237,0.7)',
background: dark ? 'rgba(139,92,246,0.1)' : 'rgba(124,58,237,0.08)',
border: dark ? '1px solid rgba(139,92,246,0.2)' : '1px solid rgba(124,58,237,0.18)',
}}
>
{dark ? (
// Sun icon
<svg width="15" height="15" viewBox="0 0 15 15" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round">
<circle cx="7.5" cy="7.5" r="2.5" />
<line x1="7.5" y1="1" x2="7.5" y2="2.5" />
<line x1="7.5" y1="12.5" x2="7.5" y2="14" />
<line x1="1" y1="7.5" x2="2.5" y2="7.5" />
<line x1="12.5" y1="7.5" x2="14" y2="7.5" />
<line x1="2.93" y1="2.93" x2="3.99" y2="3.99" />
<line x1="11.01" y1="11.01" x2="12.07" y2="12.07" />
<line x1="2.93" y1="12.07" x2="3.99" y2="11.01" />
<line x1="11.01" y1="3.99" x2="12.07" y2="2.93" />
</svg>
) : (
// Moon icon
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
<path d="M12 9A6 6 0 0 1 5 2a6 6 0 1 0 7 7z" />
</svg>
)}
</button>
)
}

View File

@ -30,6 +30,47 @@
--shadow-elevated: 0 8px 30px -4px rgb(0 0 0 / 0.5), 0 4px 10px -4px rgb(0 0 0 / 0.4); --shadow-elevated: 0 8px 30px -4px rgb(0 0 0 / 0.5), 0 4px 10px -4px rgb(0 0 0 / 0.4);
--transition-spring: cubic-bezier(0.34, 1.56, 0.64, 1); --transition-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
--transition-smooth: cubic-bezier(0.4, 0, 0.2, 1); --transition-smooth: cubic-bezier(0.4, 0, 0.2, 1);
/* Semantic text scale — dark defaults */
--ft-primary: rgba(250,250,250,0.92);
--ft-muted: rgba(161,161,170,0.75);
--ft-subtle: rgba(161,161,170,0.48);
--ft-dimmed: rgba(161,161,170,0.32);
--ft-ghost: rgba(161,161,170,0.2);
--ft-white: rgba(255,255,255,0.9);
/* Section / surface */
--section-alt: rgba(139,92,246,0.025);
}
/* ─── LIGHT THEME ─── */
[data-theme="light"] {
--background: #f8f8f6;
--foreground: #18181b;
--card: #ffffff;
--card-foreground: #18181b;
--muted: #f1f0ee;
--muted-foreground: #71717a;
--accent: #f5f3ff;
--accent-foreground: #7c3aed;
--border: rgba(124, 58, 237, 0.18);
--border-subtle: rgba(124, 58, 237, 0.09);
--primary: #7c3aed;
--primary-dark: #6d28d9;
--primary-light: #8b5cf6;
--ring: #7c3aed;
--shadow-glass: 0 2px 24px 0 rgb(124 58 237 / 0.08);
--shadow-elevated: 0 2px 16px -2px rgb(0 0 0 / 0.1);
/* Text scale — light */
--ft-primary: rgba(24,24,27,0.92);
--ft-muted: rgba(39,39,42,0.68);
--ft-subtle: rgba(39,39,42,0.48);
--ft-dimmed: rgba(39,39,42,0.35);
--ft-ghost: rgba(39,39,42,0.2);
--ft-white: rgba(24,24,27,0.9);
--section-alt: rgba(124,58,237,0.03);
} }
/* Phoenix logo animation */ /* Phoenix logo animation */
@ -89,6 +130,7 @@ body {
background: var(--background); background: var(--background);
color: var(--foreground); color: var(--foreground);
min-height: 100vh; min-height: 100vh;
transition: background 0.3s ease, color 0.3s ease;
} }
/* Display font for headings */ /* Display font for headings */
@ -96,14 +138,20 @@ body {
font-family: var(--font-display); font-family: var(--font-display);
} }
/* Animated purple-indigo gradient background */ /* ─── ANIMATED GRADIENT BACKGROUND ─── */
.bg-fibe { .bg-fibe {
background: linear-gradient(135deg, #0b0916 0%, #0f0c29 25%, #1a1540 50%, #261f5a 75%, #1e1a42 100%); background: linear-gradient(135deg, #0b0916 0%, #0f0c29 25%, #1a1540 50%, #261f5a 75%, #1e1a42 100%);
background-size: 400% 400%; background-size: 400% 400%;
animation: gradientShift 18s ease infinite; animation: gradientShift 18s ease infinite;
} }
/* Subtle grid */ [data-theme="light"] .bg-fibe {
background: linear-gradient(135deg, #ffffff 0%, #fdf9ff 25%, #f5efff 50%, #fdf9ff 75%, #ffffff 100%);
background-size: 400% 400%;
animation: gradientShift 18s ease infinite;
}
/* ─── GRID OVERLAY ─── */
.grid-overlay { .grid-overlay {
background-image: background-image:
linear-gradient(rgba(139,92,246,0.04) 1px, transparent 1px), linear-gradient(rgba(139,92,246,0.04) 1px, transparent 1px),
@ -111,7 +159,13 @@ body {
background-size: 52px 52px; background-size: 52px 52px;
} }
/* Glass card */ [data-theme="light"] .grid-overlay {
background-image:
linear-gradient(rgba(124,58,237,0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(124,58,237,0.05) 1px, transparent 1px);
}
/* ─── GLASS CARDS ─── */
.glass { .glass {
background: rgba(255,255,255,0.03); background: rgba(255,255,255,0.03);
border: 1px solid var(--border); border: 1px solid var(--border);
@ -119,6 +173,14 @@ body {
-webkit-backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px);
} }
[data-theme="light"] .glass {
background: rgba(255,255,255,0.72);
border: 1px solid rgba(124,58,237,0.14);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
box-shadow: 0 1px 4px rgba(0,0,0,0.05), 0 4px 20px rgba(124,58,237,0.06);
}
.glass-strong { .glass-strong {
background: rgba(26,21,37,0.7); background: rgba(26,21,37,0.7);
border: 1px solid rgba(167,139,250,0.18); border: 1px solid rgba(167,139,250,0.18);
@ -127,7 +189,15 @@ body {
box-shadow: var(--shadow-glass); box-shadow: var(--shadow-glass);
} }
/* Glows */ [data-theme="light"] .glass-strong {
background: rgba(255,255,255,0.9);
border: 1px solid rgba(124,58,237,0.18);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
box-shadow: 0 2px 32px rgba(0,0,0,0.08), 0 0 0 1px rgba(124,58,237,0.08);
}
/* ─── GLOW ORBS ─── */
.glow-orb { .glow-orb {
position: absolute; position: absolute;
border-radius: 50%; border-radius: 50%;
@ -135,7 +205,12 @@ body {
filter: blur(1px); filter: blur(1px);
} }
/* Gradient text — display font hero */ [data-theme="light"] .glow-orb {
opacity: 0.3;
filter: blur(2px);
}
/* ─── GRADIENT TEXT ─── */
.gradient-text { .gradient-text {
background: linear-gradient(135deg, #c4b5fd 0%, #a78bfa 40%, #818cf8 80%, #93c5fd 100%); background: linear-gradient(135deg, #c4b5fd 0%, #a78bfa 40%, #818cf8 80%, #93c5fd 100%);
-webkit-background-clip: text; -webkit-background-clip: text;
@ -143,7 +218,14 @@ body {
background-clip: text; background-clip: text;
} }
/* Tags / pills */ [data-theme="light"] .gradient-text {
background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 50%, #4f46e5 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* ─── TAGS / PILLS ─── */
.tag { .tag {
background: rgba(139,92,246,0.1); background: rgba(139,92,246,0.1);
border: 1px solid rgba(139,92,246,0.2); border: 1px solid rgba(139,92,246,0.2);
@ -156,7 +238,52 @@ body {
border-radius: 999px; border-radius: 999px;
} }
/* Scrollbar */ [data-theme="light"] .tag {
background: rgba(124,58,237,0.07);
border-color: rgba(124,58,237,0.18);
color: #7c3aed;
}
/* ─── text-white override in light mode ─── */
[data-theme="light"] .text-white {
color: #18181b !important;
}
/* ─── Terminal — always dark regardless of theme ─── */
.terminal-mockup {
background: rgba(15,12,26,0.95);
}
[data-theme="light"] .terminal-mockup {
box-shadow: 0 8px 40px rgba(0,0,0,0.18), 0 0 0 1px rgba(124,58,237,0.15) !important;
}
[data-theme="light"] .terminal-mockup * {
/* Terminal internals stay dark — do NOT override */
}
/* ─── NAV border ─── */
[data-theme="light"] nav {
background: rgba(248,248,246,0.85) !important;
border-bottom-color: rgba(124,58,237,0.12) !important;
box-shadow: 0 1px 0 rgba(0,0,0,0.05);
}
/* ─── Section border dividers ─── */
[data-theme="light"] [style*="rgba(139,92,246,0.08)"] {
/* handled via CSS variable approach */
}
/* ─── Comparison table ─── */
[data-theme="light"] .comparison-row:nth-child(even) {
background: rgba(124,58,237,0.02);
}
/* ─── Pulse glow — light adaptation ─── */
[data-theme="light"] .animate-pulse-glow {
animation: none;
box-shadow: 0 4px 32px rgba(124,58,237,0.12);
}
/* ─── Scrollbar ─── */
::-webkit-scrollbar { width: 5px; } ::-webkit-scrollbar { width: 5px; }
::-webkit-scrollbar-track { background: var(--background); } ::-webkit-scrollbar-track { background: var(--background); }
::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.25); border-radius: 3px; } ::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.25); border-radius: 3px; }

View File

@ -50,6 +50,10 @@ export default function RootLayout({ children }) {
return ( return (
<html lang="en" className="dark"> <html lang="en" className="dark">
<head> <head>
{/* Anti-flash: apply saved theme before React hydrates */}
<script dangerouslySetInnerHTML={{__html:`
try{var t=localStorage.getItem('fibe-theme');if(t==='light')document.documentElement.setAttribute('data-theme','light');}catch(e){}
`}} />
<script <script
type="application/ld+json" type="application/ld+json"
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{

View File

@ -28,12 +28,12 @@ export default function Home() {
</h1> </h1>
<p className="text-xl md:text-2xl max-w-2xl mx-auto mb-5 leading-relaxed" <p className="text-xl md:text-2xl max-w-2xl mx-auto mb-5 leading-relaxed"
style={{color:'rgba(255,255,255,0.55)'}}> style={{color:'var(--ft-primary)'}}>
Describe what you want to build. Fibe and its AI Genies handle the code, Describe what you want to build. Fibe and its AI Genies handle the code,
the servers, the SSL and the deploy on <em className="not-italic" style={{color:'rgba(196,181,253,0.85)'}}>your</em> infrastructure. the servers, the SSL and the deploy on <em className="not-italic" style={{color:'rgba(196,181,253,0.85)'}}>your</em> infrastructure.
</p> </p>
<p className="text-base max-w-xl mx-auto mb-14" <p className="text-base max-w-xl mx-auto mb-14"
style={{color:'rgba(161,161,170,0.4)'}}> style={{color:'var(--ft-subtle)'}}>
Zero DevOps. Zero local setup. Zero powerful hardware. Zero DevOps. Zero local setup. Zero powerful hardware.
Any device, anywhere in the world. Any device, anywhere in the world.
</p> </p>
@ -46,13 +46,13 @@ export default function Home() {
</a> </a>
<a href="https://github.com/fibegg/sdk" <a href="https://github.com/fibegg/sdk"
className="font-medium px-8 py-3.5 rounded-xl transition-all hover:text-white text-sm glass" className="font-medium px-8 py-3.5 rounded-xl transition-all hover:text-white text-sm glass"
style={{color:'rgba(161,161,170,0.7)',borderColor:'rgba(139,92,246,0.15)'}}> style={{color:'var(--ft-muted)',borderColor:'rgba(139,92,246,0.15)'}}>
brew install fibegg/sdk/fibe brew install fibegg/sdk/fibe
</a> </a>
</div> </div>
{/* Terminal */} {/* Terminal — stays dark in both themes */}
<div className="max-w-2xl mx-auto glass-strong rounded-2xl overflow-hidden animate-pulse-glow"> <div className="terminal-mockup max-w-2xl mx-auto glass-strong rounded-2xl overflow-hidden animate-pulse-glow">
<div className="flex items-center gap-1.5 px-4 py-3" <div className="flex items-center gap-1.5 px-4 py-3"
style={{borderBottom:'1px solid rgba(139,92,246,0.12)'}}> style={{borderBottom:'1px solid rgba(139,92,246,0.12)'}}>
<span className="w-2.5 h-2.5 rounded-full" style={{background:'rgba(239,68,68,0.6)'}} /> <span className="w-2.5 h-2.5 rounded-full" style={{background:'rgba(239,68,68,0.6)'}} />
@ -61,20 +61,20 @@ export default function Home() {
<span className="ml-3 text-xs font-mono" style={{color:'rgba(139,92,246,0.5)'}}>~ fibe sdk</span> <span className="ml-3 text-xs font-mono" style={{color:'rgba(139,92,246,0.5)'}}>~ fibe sdk</span>
</div> </div>
<div className="p-6 font-mono text-sm text-left leading-8"> <div className="p-6 font-mono text-sm text-left leading-8">
<p><span style={{color:'rgba(255,255,255,0.2)'}}>$</span> <span className="text-emerald-400">brew install fibegg/sdk/fibe</span></p> <p><span style={{color:'var(--ft-ghost)'}}>$</span> <span className="text-emerald-400">brew install fibegg/sdk/fibe</span></p>
<p><span style={{color:'rgba(255,255,255,0.2)'}}>$</span> <span style={{color:'#a78bfa'}}>fibe marquees connect</span> <span style={{color:'rgba(255,255,255,0.35)'}}>--host my-vps.io</span></p> <p><span style={{color:'var(--ft-ghost)'}}>$</span> <span style={{color:'#a78bfa'}}>fibe marquees connect</span> <span style={{color:'rgba(255,255,255,0.35)'}}>--host my-vps.io</span></p>
<p style={{color:'rgba(255,255,255,0.25)'}}> <span className="text-emerald-400"></span> Marquee registered <span style={{color:'rgba(255,255,255,0.3)'}}> Traefik, SSL, Docker ready</span></p> <p style={{color:'rgba(255,255,255,0.25)'}}> <span className="text-emerald-400"></span> Marquee registered <span style={{color:'rgba(255,255,255,0.3)'}}> Traefik, SSL, Docker ready</span></p>
<p><span style={{color:'rgba(255,255,255,0.2)'}}>$</span> <span className="text-blue-400">fibe launch</span> <span style={{color:'rgba(255,255,255,0.35)'}}>--repo github.com/you/app --branch main</span></p> <p><span style={{color:'var(--ft-ghost)'}}>$</span> <span className="text-blue-400">fibe launch</span> <span style={{color:'rgba(255,255,255,0.35)'}}>--repo github.com/you/app --branch main</span></p>
<p style={{color:'rgba(255,255,255,0.25)'}}> <span className="text-emerald-400"></span> Cloning · building · routing · SSL · live</p> <p style={{color:'rgba(255,255,255,0.25)'}}> <span className="text-emerald-400"></span> Cloning · building · routing · SSL · live</p>
<p style={{color:'rgba(255,255,255,0.25)'}}> <span className="text-emerald-400"></span> <span style={{color:'rgba(196,181,253,0.9)'}}>https://app.your-domain.com</span></p> <p style={{color:'rgba(255,255,255,0.25)'}}> <span className="text-emerald-400"></span> <span style={{color:'rgba(196,181,253,0.9)'}}>https://app.your-domain.com</span></p>
<p><span style={{color:'rgba(255,255,255,0.2)'}}>$</span> <span className="text-yellow-400">git push</span> <span style={{color:'rgba(255,255,255,0.25)'}}># hot-reload. always.</span></p> <p><span style={{color:'var(--ft-ghost)'}}>$</span> <span className="text-yellow-400">git push</span> <span style={{color:'rgba(255,255,255,0.25)'}}># hot-reload. always.</span></p>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
{/* ── MANIFESTO ── */} {/* ── MANIFESTO ── */}
<section id="manifesto" className="py-20 px-6 relative" style={{borderTop:'1px solid rgba(139,92,246,0.08)',background:'rgba(139,92,246,0.025)'}}> <section id="manifesto" className="py-20 px-6 relative" style={{borderTop:'1px solid rgba(139,92,246,0.08)',background:'var(--section-alt)'}}>
<div className="max-w-5xl mx-auto"> <div className="max-w-5xl mx-auto">
<p className="text-xs font-semibold uppercase tracking-widest text-center mb-14" <p className="text-xs font-semibold uppercase tracking-widest text-center mb-14"
style={{color:'rgba(139,92,246,0.55)'}}>The old way is dead</p> style={{color:'rgba(139,92,246,0.55)'}}>The old way is dead</p>
@ -86,7 +86,7 @@ export default function Home() {
].map(({dead, alive}) => ( ].map(({dead, alive}) => (
<div key={dead}> <div key={dead}>
<p className="font-display text-2xl mb-3" <p className="font-display text-2xl mb-3"
style={{color:'rgba(161,161,170,0.25)',letterSpacing:'-0.01em',textDecoration:'line-through'}}> style={{color:'var(--ft-dimmed)',letterSpacing:'-0.01em',textDecoration:'line-through'}}>
{dead} {dead}
</p> </p>
<p className="text-sm leading-relaxed" style={{color:'rgba(196,181,253,0.65)'}}>{alive}</p> <p className="text-sm leading-relaxed" style={{color:'rgba(196,181,253,0.65)'}}>{alive}</p>
@ -113,7 +113,7 @@ export default function Home() {
<span className="tag" style={{background:'rgba(167,139,250,0.15)',borderColor:'rgba(167,139,250,0.3)',color:'#c4b5fd'}}>recommended</span> <span className="tag" style={{background:'rgba(167,139,250,0.15)',borderColor:'rgba(167,139,250,0.3)',color:'#c4b5fd'}}>recommended</span>
</div> </div>
<h3 className="font-semibold text-white mb-3 text-lg">Let Genies write the code</h3> <h3 className="font-semibold text-white mb-3 text-lg">Let Genies write the code</h3>
<p className="text-sm leading-relaxed mb-6" style={{color:'rgba(161,161,170,0.7)'}}> <p className="text-sm leading-relaxed mb-6" style={{color:'var(--ft-muted)'}}>
No coding experience? No problem. Describe your idea in plain English. No coding experience? No problem. Describe your idea in plain English.
A Genie plans it, builds it, tests it and ships it. You just review and approve. A Genie plans it, builds it, tests it and ships it. You just review and approve.
</p> </p>
@ -128,7 +128,7 @@ export default function Home() {
<div className="glass rounded-2xl p-8" style={{borderColor:'rgba(139,92,246,0.15)'}}> <div className="glass rounded-2xl p-8" style={{borderColor:'rgba(139,92,246,0.15)'}}>
<div className="text-2xl mb-4">👨💻</div> <div className="text-2xl mb-4">👨💻</div>
<h3 className="font-semibold text-white mb-3 text-lg">You write the code</h3> <h3 className="font-semibold text-white mb-3 text-lg">You write the code</h3>
<p className="text-sm leading-relaxed mb-6" style={{color:'rgba(161,161,170,0.65)'}}> <p className="text-sm leading-relaxed mb-6" style={{color:'var(--ft-muted)'}}>
Already a developer? Git push and Fibe handles the rest builds, Already a developer? Git push and Fibe handles the rest builds,
routes, SSLs, hot-reloads. Your entire stack, live in seconds, on your own infra. routes, SSLs, hot-reloads. Your entire stack, live in seconds, on your own infra.
</p> </p>
@ -163,7 +163,7 @@ export default function Home() {
<h2 className="font-display text-4xl md:text-5xl font-normal" style={{letterSpacing:'-0.02em'}}> <h2 className="font-display text-4xl md:text-5xl font-normal" style={{letterSpacing:'-0.02em'}}>
Anything that runs in Docker. Anything that runs in Docker.
</h2> </h2>
<p className="mt-4 max-w-lg mx-auto" style={{color:'rgba(161,161,170,0.6)'}}> <p className="mt-4 max-w-lg mx-auto" style={{color:'var(--ft-muted)'}}>
If it has a Dockerfile, Fibe clones it, builds it, exposes it, routes it and SSLs it. Full stop. If it has a Dockerfile, Fibe clones it, builds it, exposes it, routes it and SSLs it. Full stop.
</p> </p>
</div> </div>
@ -183,7 +183,7 @@ export default function Home() {
style={{background:glow, borderColor:'rgba(255,255,255,0.06)'}}> style={{background:glow, borderColor:'rgba(255,255,255,0.06)'}}>
<div className="text-3xl mb-3">{icon}</div> <div className="text-3xl mb-3">{icon}</div>
<h3 className="font-semibold text-sm text-white mb-1.5">{label}</h3> <h3 className="font-semibold text-sm text-white mb-1.5">{label}</h3>
<p className="text-xs leading-relaxed" style={{color:'rgba(161,161,170,0.6)'}}>{desc}</p> <p className="text-xs leading-relaxed" style={{color:'var(--ft-muted)'}}>{desc}</p>
</div> </div>
))} ))}
</div> </div>
@ -198,7 +198,7 @@ export default function Home() {
<h2 className="font-display text-4xl md:text-5xl font-normal" style={{letterSpacing:'-0.02em'}}> <h2 className="font-display text-4xl md:text-5xl font-normal" style={{letterSpacing:'-0.02em'}}>
Four steps to a live URL. Four steps to a live URL.
</h2> </h2>
<p className="mt-4" style={{color:'rgba(161,161,170,0.6)'}}> <p className="mt-4" style={{color:'var(--ft-muted)'}}>
No architecture meetings. No ops tickets. No environment parity nightmares. No architecture meetings. No ops tickets. No environment parity nightmares.
</p> </p>
</div> </div>
@ -223,7 +223,7 @@ export default function Home() {
<h3 className="font-semibold text-white">{title}</h3> <h3 className="font-semibold text-white">{title}</h3>
<span className="tag">{badge}</span> <span className="tag">{badge}</span>
</div> </div>
<p className="text-sm leading-relaxed" style={{color:'rgba(161,161,170,0.7)'}}>{desc}</p> <p className="text-sm leading-relaxed" style={{color:'var(--ft-muted)'}}>{desc}</p>
</div> </div>
</div> </div>
))} ))}
@ -241,7 +241,7 @@ export default function Home() {
<h2 className="font-display text-4xl md:text-5xl font-normal mb-4" style={{letterSpacing:'-0.02em'}}> <h2 className="font-display text-4xl md:text-5xl font-normal mb-4" style={{letterSpacing:'-0.02em'}}>
Your cloud. 5 minutes to ready. Your cloud. 5 minutes to ready.
</h2> </h2>
<p className="max-w-xl mx-auto" style={{color:'rgba(161,161,170,0.65)'}}> <p className="max-w-xl mx-auto" style={{color:'var(--ft-muted)'}}>
No prior cloud experience needed. Pick your provider, spin up a server, No prior cloud experience needed. Pick your provider, spin up a server,
connect it to Fibe. Same three steps everywhere. connect it to Fibe. Same three steps everywhere.
</p> </p>
@ -254,12 +254,12 @@ export default function Home() {
style={{color:'rgba(139,92,246,0.6)'}}> style={{color:'rgba(139,92,246,0.6)'}}>
Steps 2 &amp; 3 are identical on every provider Steps 2 &amp; 3 are identical on every provider
</p> </p>
<div className="font-mono text-xs leading-7 text-center" style={{color:'rgba(161,161,170,0.6)'}}> <div className="font-mono text-xs leading-7 text-center" style={{color:'var(--ft-muted)'}}>
<span style={{color:'rgba(255,255,255,0.2)'}}>$</span>{' '} <span style={{color:'var(--ft-ghost)'}}>$</span>{' '}
<span className="text-emerald-400">curl -fsSL https://get.docker.com | sh</span> <span className="text-emerald-400">curl -fsSL https://get.docker.com | sh</span>
{' '}<span style={{color:'rgba(255,255,255,0.2)'}}> install Docker</span> {' '}<span style={{color:'var(--ft-ghost)'}}> install Docker</span>
<br /> <br />
<span style={{color:'rgba(255,255,255,0.2)'}}>$</span>{' '} <span style={{color:'var(--ft-ghost)'}}>$</span>{' '}
<span style={{color:'#a78bfa'}}>fibe marquees connect</span>{' '} <span style={{color:'#a78bfa'}}>fibe marquees connect</span>{' '}
<span style={{color:'rgba(255,255,255,0.35)'}}>--host YOUR_IP</span> <span style={{color:'rgba(255,255,255,0.35)'}}>--host YOUR_IP</span>
{' '}<span className="text-emerald-400"> done</span> {' '}<span className="text-emerald-400"> done</span>
@ -326,7 +326,7 @@ export default function Home() {
style={{background:'rgba(139,92,246,0.2)',color:'#a78bfa'}}>1</span> style={{background:'rgba(139,92,246,0.2)',color:'#a78bfa'}}>1</span>
<span className="text-sm font-semibold text-white">{step1}</span> <span className="text-sm font-semibold text-white">{step1}</span>
</div> </div>
<p className="text-xs leading-relaxed pl-7 mb-2" style={{color:'rgba(161,161,170,0.6)'}}>{step1desc}</p> <p className="text-xs leading-relaxed pl-7 mb-2" style={{color:'var(--ft-muted)'}}>{step1desc}</p>
<a href={step1link} target="_blank" rel="noopener noreferrer" <a href={step1link} target="_blank" rel="noopener noreferrer"
className="text-xs pl-7 inline-flex items-center gap-1 transition-colors hover:opacity-80" className="text-xs pl-7 inline-flex items-center gap-1 transition-colors hover:opacity-80"
style={{color}}> style={{color}}>
@ -369,7 +369,7 @@ export default function Home() {
))} ))}
</div> </div>
<p className="text-center text-sm mt-8" style={{color:'rgba(161,161,170,0.4)'}}> <p className="text-center text-sm mt-8" style={{color:'var(--ft-subtle)'}}>
Have a different provider or bare metal server?{' '} Have a different provider or bare metal server?{' '}
<span style={{color:'rgba(167,139,250,0.6)'}}>If it runs Ubuntu + Docker, it works.</span> <span style={{color:'rgba(167,139,250,0.6)'}}>If it runs Ubuntu + Docker, it works.</span>
</p> </p>
@ -384,7 +384,7 @@ export default function Home() {
<h2 className="font-display text-4xl md:text-5xl font-normal" style={{letterSpacing:'-0.02em'}}> <h2 className="font-display text-4xl md:text-5xl font-normal" style={{letterSpacing:'-0.02em'}}>
Every layer, covered. Every layer, covered.
</h2> </h2>
<p className="mt-4" style={{color:'rgba(161,161,170,0.65)'}}>No glue code. No YAML hell. No ops team required.</p> <p className="mt-4" style={{color:'var(--ft-muted)'}}>No glue code. No YAML hell. No ops team required.</p>
</div> </div>
<div className="grid md:grid-cols-3 gap-5"> <div className="grid md:grid-cols-3 gap-5">
@ -403,7 +403,7 @@ export default function Home() {
style={{borderColor:'rgba(139,92,246,0.12)'}}> style={{borderColor:'rgba(139,92,246,0.12)'}}>
<div className="text-2xl mb-4">{icon}</div> <div className="text-2xl mb-4">{icon}</div>
<h3 className="font-semibold text-white mb-2">{title}</h3> <h3 className="font-semibold text-white mb-2">{title}</h3>
<p className="text-sm leading-relaxed mb-4" style={{color:'rgba(161,161,170,0.65)'}}>{desc}</p> <p className="text-sm leading-relaxed mb-4" style={{color:'var(--ft-muted)'}}>{desc}</p>
<div className="flex flex-wrap gap-1.5"> <div className="flex flex-wrap gap-1.5">
{tags.map(t => <span key={t} className="tag">{t}</span>)} {tags.map(t => <span key={t} className="tag">{t}</span>)}
</div> </div>
@ -425,7 +425,7 @@ export default function Home() {
<em className="gradient-text not-italic">a single line of code.</em> <em className="gradient-text not-italic">a single line of code.</em>
</h2> </h2>
<p className="text-lg max-w-2xl mx-auto mb-10 leading-relaxed" <p className="text-lg max-w-2xl mx-auto mb-10 leading-relaxed"
style={{color:'rgba(161,161,170,0.75)'}}> style={{color:'var(--ft-muted)'}}>
Genies are autonomous AI agents that live inside your Playgrounds Genies are autonomous AI agents that live inside your Playgrounds
with a real terminal, a file editor, Docker access and your full codebase. with a real terminal, a file editor, Docker access and your full codebase.
Describe the feature. They plan it, build it, test it and push it. Describe the feature. They plan it, build it, test it and push it.
@ -460,7 +460,7 @@ export default function Home() {
style={{borderColor:'rgba(139,92,246,0.15)'}}> style={{borderColor:'rgba(139,92,246,0.15)'}}>
<div className="text-2xl mb-3">{icon}</div> <div className="text-2xl mb-3">{icon}</div>
<h4 className="font-semibold text-white text-sm mb-2">{title}</h4> <h4 className="font-semibold text-white text-sm mb-2">{title}</h4>
<p className="text-xs leading-relaxed" style={{color:'rgba(161,161,170,0.6)'}}>{desc}</p> <p className="text-xs leading-relaxed" style={{color:'var(--ft-muted)'}}>{desc}</p>
</div> </div>
))} ))}
</div> </div>
@ -475,7 +475,7 @@ export default function Home() {
].map(({val, label}) => ( ].map(({val, label}) => (
<div key={label}> <div key={label}>
<div className="font-semibold text-sm gradient-text mb-0.5">{val}</div> <div className="font-semibold text-sm gradient-text mb-0.5">{val}</div>
<div className="text-xs" style={{color:'rgba(161,161,170,0.4)'}}>{label}</div> <div className="text-xs" style={{color:'var(--ft-subtle)'}}>{label}</div>
</div> </div>
))} ))}
</div> </div>
@ -493,7 +493,7 @@ export default function Home() {
Your phone is now<br /> Your phone is now<br />
<em className="gradient-text not-italic">a development machine.</em> <em className="gradient-text not-italic">a development machine.</em>
</h2> </h2>
<p className="text-lg max-w-2xl mx-auto mb-14 leading-relaxed" style={{color:'rgba(161,161,170,0.7)'}}> <p className="text-lg max-w-2xl mx-auto mb-14 leading-relaxed" style={{color:'var(--ft-muted)'}}>
The entire dev environment lives in the cloud. Your device is just a window into it. The entire dev environment lives in the cloud. Your device is just a window into it.
Open a browser, describe your idea, watch Genies build it Open a browser, describe your idea, watch Genies build it
from a Tokyo coffee shop, your couch or a $200 Chromebook. from a Tokyo coffee shop, your couch or a $200 Chromebook.
@ -511,7 +511,7 @@ export default function Home() {
style={{borderColor:'rgba(139,92,246,0.12)'}}> style={{borderColor:'rgba(139,92,246,0.12)'}}>
<div className="text-3xl mb-3">{icon}</div> <div className="text-3xl mb-3">{icon}</div>
<h3 className="font-semibold text-white text-sm mb-2">{label}</h3> <h3 className="font-semibold text-white text-sm mb-2">{label}</h3>
<p className="text-xs leading-relaxed" style={{color:'rgba(161,161,170,0.55)'}}>{desc}</p> <p className="text-xs leading-relaxed" style={{color:'var(--ft-subtle)'}}>{desc}</p>
</div> </div>
))} ))}
</div> </div>
@ -544,7 +544,7 @@ export default function Home() {
Your code. Your data.<br /> Your code. Your data.<br />
<em className="gradient-text not-italic">Your servers. Always.</em> <em className="gradient-text not-italic">Your servers. Always.</em>
</h2> </h2>
<p className="max-w-xl mx-auto" style={{color:'rgba(161,161,170,0.65)'}}> <p className="max-w-xl mx-auto" style={{color:'var(--ft-muted)'}}>
Fibe never stores, scans or touches your application data. It orchestrates your infrastructure, your rules, your jurisdiction. Fibe never stores, scans or touches your application data. It orchestrates your infrastructure, your rules, your jurisdiction.
</p> </p>
</div> </div>
@ -562,15 +562,15 @@ export default function Home() {
style={{borderColor:'rgba(139,92,246,0.12)'}}> style={{borderColor:'rgba(139,92,246,0.12)'}}>
<div className="text-2xl mb-4">{icon}</div> <div className="text-2xl mb-4">{icon}</div>
<h3 className="font-semibold text-white mb-2">{title}</h3> <h3 className="font-semibold text-white mb-2">{title}</h3>
<p className="text-sm leading-relaxed" style={{color:'rgba(161,161,170,0.65)'}}>{desc}</p> <p className="text-sm leading-relaxed" style={{color:'var(--ft-muted)'}}>{desc}</p>
</div> </div>
))} ))}
</div> </div>
{/* Pricing hint */} {/* Pricing hint */}
<div className="mt-8 glass rounded-2xl px-8 py-5 flex flex-col md:flex-row items-center justify-between gap-4" <div className="mt-8 glass rounded-2xl px-8 py-5 flex flex-col md:flex-row items-center justify-between gap-4"
style={{borderColor:'rgba(139,92,246,0.1)',background:'rgba(139,92,246,0.03)'}}> style={{borderColor:'rgba(139,92,246,0.1)',background:'var(--section-alt)'}}>
<p className="text-sm" style={{color:'rgba(161,161,170,0.6)'}}> <p className="text-sm" style={{color:'var(--ft-muted)'}}>
<span className="text-white font-medium">Start from ~$12/month</span> on a DigitalOcean Droplet. <span className="text-white font-medium">Start from ~$12/month</span> on a DigitalOcean Droplet.
Scale to whatever your project needs. Pay your cloud provider not us. Scale to whatever your project needs. Pay your cloud provider not us.
</p> </p>
@ -591,17 +591,17 @@ export default function Home() {
<h2 className="font-display text-4xl md:text-5xl font-normal mb-4" style={{letterSpacing:'-0.02em'}}> <h2 className="font-display text-4xl md:text-5xl font-normal mb-4" style={{letterSpacing:'-0.02em'}}>
The platform others can&apos;t be. The platform others can&apos;t be.
</h2> </h2>
<p style={{color:'rgba(161,161,170,0.6)'}}>Your infra. Your AI. Your rules. No one else can offer all three.</p> <p style={{color:'var(--ft-muted)'}}>Your infra. Your AI. Your rules. No one else can offer all three.</p>
</div> </div>
<div className="glass rounded-2xl overflow-hidden" style={{borderColor:'rgba(139,92,246,0.12)'}}> <div className="glass rounded-2xl overflow-hidden" style={{borderColor:'rgba(139,92,246,0.12)'}}>
{/* Header */} {/* Header */}
<div className="grid grid-cols-5 text-xs font-semibold uppercase tracking-widest px-6 py-4" <div className="grid grid-cols-5 text-xs font-semibold uppercase tracking-widest px-6 py-4"
style={{borderBottom:'1px solid rgba(139,92,246,0.1)',background:'rgba(139,92,246,0.05)'}}> style={{borderBottom:'1px solid rgba(139,92,246,0.1)',background:'rgba(139,92,246,0.05)'}}>
<div className="col-span-2" style={{color:'rgba(161,161,170,0.4)'}}>Feature</div> <div className="col-span-2" style={{color:'var(--ft-subtle)'}}>Feature</div>
<div className="text-center gradient-text">Fibe</div> <div className="text-center gradient-text">Fibe</div>
<div className="text-center" style={{color:'rgba(161,161,170,0.3)'}}>Vercel / Railway</div> <div className="text-center" style={{color:'var(--ft-dimmed)'}}>Vercel / Railway</div>
<div className="text-center" style={{color:'rgba(161,161,170,0.3)'}}>Kubernetes</div> <div className="text-center" style={{color:'var(--ft-dimmed)'}}>Kubernetes</div>
</div> </div>
{[ {[
@ -625,7 +625,7 @@ export default function Home() {
return ( return (
<div key={feature} className="grid grid-cols-5 px-6 py-3 text-sm items-center" <div key={feature} className="grid grid-cols-5 px-6 py-3 text-sm items-center"
style={{borderBottom: i < arr.length-1 ? '1px solid rgba(139,92,246,0.05)' : 'none'}}> style={{borderBottom: i < arr.length-1 ? '1px solid rgba(139,92,246,0.05)' : 'none'}}>
<div className="col-span-2" style={{color:'rgba(161,161,170,0.65)'}}>{feature}</div> <div className="col-span-2" style={{color:'var(--ft-muted)'}}>{feature}</div>
<div className="text-center">{cell(fibe)}</div> <div className="text-center">{cell(fibe)}</div>
<div className="text-center">{cell(vercel)}</div> <div className="text-center">{cell(vercel)}</div>
<div className="text-center">{cell(k8s)}</div> <div className="text-center">{cell(k8s)}</div>
@ -644,7 +644,7 @@ export default function Home() {
<h2 className="font-display text-4xl md:text-5xl font-normal" style={{letterSpacing:'-0.02em'}}> <h2 className="font-display text-4xl md:text-5xl font-normal" style={{letterSpacing:'-0.02em'}}>
No add-ons. No tiers. No surprises. No add-ons. No tiers. No surprises.
</h2> </h2>
<p className="mt-4" style={{color:'rgba(161,161,170,0.6)'}}> <p className="mt-4" style={{color:'var(--ft-muted)'}}>
Every feature ships in the box. Always. Every feature ships in the box. Always.
</p> </p>
</div> </div>
@ -691,7 +691,7 @@ export default function Home() {
<div key={feature} className="flex items-center gap-2.5 py-2.5" <div key={feature} className="flex items-center gap-2.5 py-2.5"
style={{borderBottom:'1px solid rgba(139,92,246,0.05)'}}> style={{borderBottom:'1px solid rgba(139,92,246,0.05)'}}>
<span className="text-emerald-400 text-xs shrink-0"></span> <span className="text-emerald-400 text-xs shrink-0"></span>
<span className="text-sm" style={{color:'rgba(161,161,170,0.65)'}}>{feature}</span> <span className="text-sm" style={{color:'var(--ft-muted)'}}>{feature}</span>
</div> </div>
))} ))}
</div> </div>
@ -706,7 +706,7 @@ export default function Home() {
<h2 className="font-display text-4xl md:text-5xl font-normal mb-4" style={{letterSpacing:'-0.02em'}}> <h2 className="font-display text-4xl md:text-5xl font-normal mb-4" style={{letterSpacing:'-0.02em'}}>
Battle-tested all the way down. Battle-tested all the way down.
</h2> </h2>
<p className="max-w-lg mx-auto" style={{color:'rgba(161,161,170,0.7)'}}> <p className="max-w-lg mx-auto" style={{color:'var(--ft-muted)'}}>
No WASM runtimes. No experimental protocols. Docker, SSH, git and Traefik No WASM runtimes. No experimental protocols. Docker, SSH, git and Traefik
doing what they&apos;ve done for a decade. doing what they&apos;ve done for a decade.
</p> </p>
@ -714,7 +714,7 @@ export default function Home() {
<div className="grid md:grid-cols-2 gap-10 mb-10"> <div className="grid md:grid-cols-2 gap-10 mb-10">
<div> <div>
<p className="text-xs font-semibold uppercase tracking-widest mb-4" style={{color:'rgba(255,255,255,0.2)'}}>Platform</p> <p className="text-xs font-semibold uppercase tracking-widest mb-4" style={{color:'var(--ft-ghost)'}}>Platform</p>
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
{['Docker','docker-compose','Traefik',"Let's Encrypt",'SSH','Go','PostgreSQL','Redis','Gitea'].map(t => ( {['Docker','docker-compose','Traefik',"Let's Encrypt",'SSH','Go','PostgreSQL','Redis','Gitea'].map(t => (
<span key={t} className="px-3 py-1.5 rounded-lg text-sm font-mono glass" <span key={t} className="px-3 py-1.5 rounded-lg text-sm font-mono glass"
@ -725,11 +725,11 @@ export default function Home() {
</div> </div>
</div> </div>
<div> <div>
<p className="text-xs font-semibold uppercase tracking-widest mb-4" style={{color:'rgba(255,255,255,0.2)'}}>Works with any framework</p> <p className="text-xs font-semibold uppercase tracking-widest mb-4" style={{color:'var(--ft-ghost)'}}>Works with any framework</p>
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
{['Next.js','Nuxt','SvelteKit','Remix','Rails','Django','FastAPI','Go Fiber','NestJS','Laravel','Spring Boot','Elixir/Phoenix','Bun'].map(t => ( {['Next.js','Nuxt','SvelteKit','Remix','Rails','Django','FastAPI','Go Fiber','NestJS','Laravel','Spring Boot','Elixir/Phoenix','Bun'].map(t => (
<span key={t} className="px-3 py-1.5 rounded-lg text-sm font-mono glass" <span key={t} className="px-3 py-1.5 rounded-lg text-sm font-mono glass"
style={{color:'rgba(161,161,170,0.6)',borderColor:'rgba(255,255,255,0.06)'}}> style={{color:'var(--ft-muted)',borderColor:'rgba(255,255,255,0.06)'}}>
{t} {t}
</span> </span>
))} ))}
@ -737,7 +737,7 @@ export default function Home() {
</div> </div>
</div> </div>
<div> <div>
<p className="text-xs font-semibold uppercase tracking-widest mb-4" style={{color:'rgba(255,255,255,0.2)'}}>Genies stack</p> <p className="text-xs font-semibold uppercase tracking-widest mb-4" style={{color:'var(--ft-ghost)'}}>Genies stack</p>
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
{['xterm.js','CodeMirror 6','WebSocket / PTY','Claude Code','Gemini CLI','OpenAI Codex','OpenCode','MCP','GHCR multi-arch'].map(t => ( {['xterm.js','CodeMirror 6','WebSocket / PTY','Claude Code','Gemini CLI','OpenAI Codex','OpenCode','MCP','GHCR multi-arch'].map(t => (
<span key={t} className="px-3 py-1.5 rounded-lg text-sm font-mono glass" <span key={t} className="px-3 py-1.5 rounded-lg text-sm font-mono glass"
@ -761,7 +761,7 @@ export default function Home() {
].map(({n, label}) => ( ].map(({n, label}) => (
<div key={label} className="glass rounded-2xl p-6 text-center" style={{borderColor:'rgba(139,92,246,0.12)'}}> <div key={label} className="glass rounded-2xl p-6 text-center" style={{borderColor:'rgba(139,92,246,0.12)'}}>
<div className="font-display text-4xl font-normal mb-1.5 gradient-text" style={{letterSpacing:'-0.02em'}}>{n}</div> <div className="font-display text-4xl font-normal mb-1.5 gradient-text" style={{letterSpacing:'-0.02em'}}>{n}</div>
<div className="text-xs" style={{color:'rgba(161,161,170,0.5)'}}>{label}</div> <div className="text-xs" style={{color:'var(--ft-subtle)'}}>{label}</div>
</div> </div>
))} ))}
</div> </div>
@ -775,7 +775,7 @@ export default function Home() {
<h2 className="font-display text-5xl md:text-7xl font-normal mb-4" style={{letterSpacing:'-0.02em'}}> <h2 className="font-display text-5xl md:text-7xl font-normal mb-4" style={{letterSpacing:'-0.02em'}}>
Ready to <em className="gradient-text not-italic">fibe</em>? Ready to <em className="gradient-text not-italic">fibe</em>?
</h2> </h2>
<p className="text-lg mb-2" style={{color:'rgba(161,161,170,0.65)'}}> <p className="text-lg mb-2" style={{color:'var(--ft-muted)'}}>
Your first Playground is free. No credit card. No CLI required to start. Your first Playground is free. No credit card. No CLI required to start.
</p> </p>
<p className="text-sm mb-10" style={{color:'rgba(139,92,246,0.45)'}}> <p className="text-sm mb-10" style={{color:'rgba(139,92,246,0.45)'}}>
@ -789,7 +789,7 @@ export default function Home() {
</a> </a>
<a href="https://github.com/fibegg" <a href="https://github.com/fibegg"
className="font-medium px-10 py-4 rounded-xl transition-all hover:text-white text-base glass" className="font-medium px-10 py-4 rounded-xl transition-all hover:text-white text-base glass"
style={{color:'rgba(161,161,170,0.6)',borderColor:'rgba(139,92,246,0.15)'}}> style={{color:'var(--ft-muted)',borderColor:'rgba(139,92,246,0.15)'}}>
Explore on GitHub Explore on GitHub
</a> </a>
</div> </div>
@ -802,10 +802,10 @@ export default function Home() {
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<div className="w-6 h-6 rounded-md flex items-center justify-center text-xs font-black" <div className="w-6 h-6 rounded-md flex items-center justify-center text-xs font-black"
style={{background:'linear-gradient(135deg, #7c3aed, #a78bfa)'}}>ƒ</div> style={{background:'linear-gradient(135deg, #7c3aed, #a78bfa)'}}>ƒ</div>
<span className="font-semibold" style={{color:'rgba(161,161,170,0.5)'}}>fibe</span> <span className="font-semibold" style={{color:'var(--ft-subtle)'}}>fibe</span>
</div> </div>
<span className="text-sm" style={{color:'rgba(161,161,170,0.2)'}}>© 2026 Fibe Build anything. Ship everything.</span> <span className="text-sm" style={{color:'var(--ft-ghost)'}}>© 2026 Fibe Build anything. Ship everything.</span>
<div className="flex gap-6 text-sm" style={{color:'rgba(161,161,170,0.35)'}}> <div className="flex gap-6 text-sm" style={{color:'var(--ft-dimmed)'}}>
<a href="https://github.com/fibegg" className="hover:text-white transition-colors">GitHub</a> <a href="https://github.com/fibegg" className="hover:text-white transition-colors">GitHub</a>
<a href="https://next.fibe.live" className="hover:text-white transition-colors">App</a> <a href="https://next.fibe.live" className="hover:text-white transition-colors">App</a>
<a href="https://git-next.fibe.live/fibegg" className="hover:text-white transition-colors">Gitea</a> <a href="https://git-next.fibe.live/fibegg" className="hover:text-white transition-colors">Gitea</a>