diff --git a/app/globals.css b/app/globals.css index b5788cb..5e81512 100644 --- a/app/globals.css +++ b/app/globals.css @@ -4,79 +4,32 @@ @custom-variant dark (&:is(.dark *)); :root { - --background: oklch(0.16 0.01 265); - --foreground: oklch(0.95 0.01 265); - --card: oklch(0.2 0.015 265); - --card-foreground: oklch(0.95 0.01 265); - --popover: oklch(0.2 0.015 265); - --popover-foreground: oklch(0.95 0.01 265); - --primary: oklch(0.7 0.15 265); - --primary-foreground: oklch(0.98 0.01 265); - --secondary: oklch(0.25 0.015 265); - --secondary-foreground: oklch(0.95 0.01 265); - --muted: oklch(0.25 0.015 265); - --muted-foreground: oklch(0.55 0.01 265); - --accent: oklch(0.65 0.18 185); - --accent-foreground: oklch(0.98 0.01 265); - --destructive: oklch(0.577 0.245 27.325); - --destructive-foreground: oklch(0.98 0.01 265); - --border: oklch(0.28 0.015 265); - --input: oklch(0.28 0.015 265); - --ring: oklch(0.7 0.15 265); - --chart-1: oklch(0.7 0.15 265); - --chart-2: oklch(0.65 0.18 185); - --chart-3: oklch(0.6 0.12 145); - --chart-4: oklch(0.75 0.16 285); - --chart-5: oklch(0.65 0.14 225); - --radius: 0.75rem; - --sidebar: oklch(0.985 0 0); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); -} - -.dark { - --background: oklch(0.145 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.145 0 0); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.145 0 0); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.985 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.396 0.141 25.723); - --destructive-foreground: oklch(0.637 0.237 25.331); - --border: oklch(0.269 0 0); - --input: oklch(0.269 0 0); - --ring: oklch(0.439 0 0); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(0.269 0 0); - --sidebar-ring: oklch(0.439 0 0); + /* Hack-ademic color palette - terminal greens, amber, deep blacks */ + --background: oklch(0.08 0.01 150); + --foreground: oklch(0.85 0.08 145); + --card: oklch(0.12 0.015 150); + --card-foreground: oklch(0.85 0.08 145); + --popover: oklch(0.1 0.015 150); + --popover-foreground: oklch(0.85 0.08 145); + --primary: oklch(0.7 0.18 145); + --primary-foreground: oklch(0.08 0.01 150); + --secondary: oklch(0.15 0.02 150); + --secondary-foreground: oklch(0.75 0.12 145); + --muted: oklch(0.18 0.015 150); + --muted-foreground: oklch(0.55 0.06 145); + --accent: oklch(0.75 0.15 85); + --accent-foreground: oklch(0.08 0.01 150); + --destructive: oklch(0.6 0.2 25); + --destructive-foreground: oklch(0.95 0.01 150); + --border: oklch(0.22 0.03 145); + --input: oklch(0.15 0.02 150); + --ring: oklch(0.7 0.18 145); + --radius: 0.25rem; } @theme inline { - --font-sans: "Geist", "Geist Fallback"; - --font-mono: "Geist Mono", "Geist Mono Fallback"; + --font-sans: "JetBrains Mono", "Fira Code", "SF Mono", "Monaco", monospace; + --font-mono: "JetBrains Mono", "Fira Code", "SF Mono", "Monaco", monospace; --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); @@ -96,54 +49,247 @@ --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); - --color-sidebar: var(--sidebar); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); + --radius-sm: calc(var(--radius) - 2px); + --radius-md: var(--radius); + --radius-lg: calc(var(--radius) + 2px); } @layer base { * { @apply border-border outline-ring/50; } + body { - @apply bg-background text-foreground; + @apply bg-background text-foreground font-mono; cursor: none; + background-image: + linear-gradient(rgba(0, 255, 100, 0.02) 1px, transparent 1px), + linear-gradient(90deg, rgba(0, 255, 100, 0.02) 1px, transparent 1px); + background-size: 20px 20px; } - a, - button { + a, button, [role="button"] { cursor: none; } html { scroll-behavior: smooth; } + + ::selection { + background: rgba(52, 211, 153, 0.3); + color: #fff; + } } -@keyframes float { - 0%, - 100% { - transform: translateY(0px); +/* Scanline effect overlay */ +.scanlines::before { + content: ""; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 9990; + background: repeating-linear-gradient( + 0deg, + rgba(0, 0, 0, 0.1), + rgba(0, 0, 0, 0.1) 1px, + transparent 1px, + transparent 2px + ); + opacity: 0.3; +} + +/* Glitch text effect */ +.glitch { + position: relative; +} + +.glitch::before, +.glitch::after { + content: attr(data-text); + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.glitch::before { + animation: glitch-1 2s infinite linear alternate-reverse; + color: #ff0000; + z-index: -1; +} + +.glitch::after { + animation: glitch-2 3s infinite linear alternate-reverse; + color: #00ffff; + z-index: -2; +} + +@keyframes glitch-1 { + 0%, 100% { clip-path: inset(0 0 95% 0); transform: translate(-2px, 2px); } + 20% { clip-path: inset(30% 0 50% 0); transform: translate(2px, -2px); } + 40% { clip-path: inset(60% 0 20% 0); transform: translate(-2px, 0); } + 60% { clip-path: inset(10% 0 70% 0); transform: translate(0, 2px); } + 80% { clip-path: inset(80% 0 5% 0); transform: translate(2px, 0); } +} + +@keyframes glitch-2 { + 0%, 100% { clip-path: inset(95% 0 0 0); transform: translate(2px, -2px); } + 20% { clip-path: inset(50% 0 30% 0); transform: translate(-2px, 2px); } + 40% { clip-path: inset(20% 0 60% 0); transform: translate(2px, 0); } + 60% { clip-path: inset(70% 0 10% 0); transform: translate(0, -2px); } + 80% { clip-path: inset(5% 0 80% 0); transform: translate(-2px, 0); } +} + +/* Terminal cursor blink */ +@keyframes blink { + 0%, 50% { opacity: 1; } + 51%, 100% { opacity: 0; } +} + +.cursor-blink::after { + content: "_"; + animation: blink 1s step-end infinite; +} + +/* Typing effect */ +@keyframes typing { + from { width: 0; } + to { width: 100%; } +} + +.typing { + overflow: hidden; + white-space: nowrap; + animation: typing 2s steps(40, end); +} + +/* Fade in from below */ +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.fade-in-up { + animation: fadeInUp 0.8s ease-out forwards; +} + +/* Glow pulse */ +@keyframes glow-pulse { + 0%, 100% { + box-shadow: 0 0 5px currentColor, 0 0 10px currentColor, 0 0 15px currentColor; + opacity: 0.8; } 50% { - transform: translateY(-20px); + box-shadow: 0 0 10px currentColor, 0 0 20px currentColor, 0 0 30px currentColor; + opacity: 1; } } +.glow-pulse { + animation: glow-pulse 2s ease-in-out infinite; +} + +/* Matrix rain character style */ +.matrix-char { + font-family: monospace; + text-shadow: 0 0 8px currentColor; +} + +/* Terminal window styling */ +.terminal-window { + background: linear-gradient(180deg, rgba(15, 23, 20, 0.95) 0%, rgba(10, 18, 15, 0.98) 100%); + border: 1px solid rgba(52, 211, 153, 0.3); + box-shadow: + 0 0 20px rgba(52, 211, 153, 0.1), + inset 0 0 60px rgba(0, 0, 0, 0.5); +} + +.terminal-header { + background: linear-gradient(180deg, rgba(52, 211, 153, 0.15) 0%, rgba(52, 211, 153, 0.05) 100%); + border-bottom: 1px solid rgba(52, 211, 153, 0.2); +} + +/* Academic citation style */ +.citation { + font-size: 0.75rem; + color: rgba(52, 211, 153, 0.6); + font-style: italic; +} + +.citation::before { + content: "["; +} + +.citation::after { + content: "]"; +} + +/* Code block styling */ +.code-block { + background: rgba(0, 0, 0, 0.4); + border-left: 3px solid rgba(52, 211, 153, 0.5); + padding: 1rem; + font-family: monospace; + overflow-x: auto; +} + +/* Neon border */ +.neon-border { + border: 1px solid rgba(52, 211, 153, 0.5); + box-shadow: + 0 0 5px rgba(52, 211, 153, 0.3), + inset 0 0 5px rgba(52, 211, 153, 0.1); +} + +/* Hover glow effect */ +.hover-glow { + transition: all 0.3s ease; +} + +.hover-glow:hover { + box-shadow: 0 0 20px rgba(52, 211, 153, 0.4); + border-color: rgba(52, 211, 153, 0.8); +} + +/* ASCII art container */ +.ascii-art { + font-family: monospace; + white-space: pre; + line-height: 1.1; + font-size: 0.5rem; + color: rgba(52, 211, 153, 0.4); +} + +@media (min-width: 768px) { + .ascii-art { + font-size: 0.6rem; + } +} + +/* Floating animation */ +@keyframes float { + 0%, 100% { transform: translateY(0px); } + 50% { transform: translateY(-10px); } +} + .animate-float { - animation: float 6s ease-in-out infinite; + animation: float 4s ease-in-out infinite; } + +/* Stagger animation delays */ +.stagger-1 { animation-delay: 0.1s; } +.stagger-2 { animation-delay: 0.2s; } +.stagger-3 { animation-delay: 0.3s; } +.stagger-4 { animation-delay: 0.4s; } +.stagger-5 { animation-delay: 0.5s; } diff --git a/components/about-section.tsx b/components/about-section.tsx index 5b1ae6f..7312d34 100644 --- a/components/about-section.tsx +++ b/components/about-section.tsx @@ -1,61 +1,152 @@ +"use client" + +const MYCELIUM_ASCII = ` + ╭───╮ ╭───╮ + │ ◉ ├─────┤ ◉ │ + ╰─┬─╯ ╰─┬─╯ + │ ╭────┴────╮ + ╭──┴──╮ │ NODES │ + │ ◉◉◉ ├─┤ CONNECT │ + ╰──┬──╯ ╰────┬────╯ + │ │ + ═══╧═════════╧═══ +` + +const BIO_BLOCKS = [ + { + command: "cat identity.yml", + content: `name: "Jeff Emmett" +role: "Token Engineering Researcher" +focus: ["regenerative_systems", "crypto_commons", "emancipatory_tech"] +affiliation: ["Commons Stack", "MycoFi", "Bonding Curve Research Group"]`, + }, + { + command: "cat mission.md", + content: `## Core Mission + +Designing cyber-physical commons architectures that translate +Elinor Ostrom's principles into DAO templates. Building +customizable libraries for communal management of public goods. + +> "Just as the Golden Gate Bridge required rigorous engineering, +> our token economies need mathematical validation."`, + }, + { + command: "cat research_focus.txt", + content: `PRIMARY ISSUANCE MARKETS +└── Challenging fixed-supply paradigm +└── Dynamic token mechanisms +└── Volatility dampening +└── Sustainable ecosystem revenue + +MYCOECONOMICS +└── Fungal network-inspired economics +└── Evolutionary resource allocation +└── Regenerative protocol design +└── Mutual aid & permaculture currency`, + }, +] + +const STATS = [ + { value: "2015", label: "// origin_block", subtext: "First entry into Web3" }, + { value: "8+", label: "// years_exp", subtext: "Token Engineering" }, + { value: "∞", label: "// impact_scope", subtext: "Regenerative systems" }, +] + export function AboutSection() { return ( -
+
-
-

About Me

+ {/* Section header */} +
+
+ $ +

+ whoami +

+
+
+

+ # Operator Profile +

+

+ ## Token engineer, systems thinker, regenerative economist +

+
-
-

- I'm a token engineering researcher and systems designer exploring the intersection of economics, ecology, - and decentralized coordination. My work focuses on creating tools and frameworks that enable communities to - manage shared resources sustainably and equitably—what I call "decent/ralised" systems. -

+ {/* ASCII art and bio blocks */} +
+ {/* ASCII Mycelium */} +
+
+              {MYCELIUM_ASCII}
+            
+

+ mycelial_network.active +

+
-

- As a co-founder of the Commons Stack, I've been instrumental in developing cyber-physical commons - architectures that translate Elinor Ostrom's principles into DAO templates. We're building customizable - libraries of tools for communal management of public goods, including innovations like Augmented Bonding - Curves and Conviction Voting—a novel continuous decision-making mechanism that addresses critical attack - vectors in traditional governance systems. -

- -

- Through the Bonding Curve Research Group, I research and develop Primary Issuance Markets that enable - dynamic token supply mechanisms. This work challenges the fixed supply paradigm dominant in Web3, offering - adaptive approaches that dampen volatility and generate sustainable revenue for token ecosystems. Our - research shows that tokens using primary issuance markets significantly outperform fixed-supply tokens in - price stability and risk-adjusted returns. -

- -

- My MycoFi research explores mycoeconomics—economic systems inspired by fungal networks. By emulating - nature's evolutionary resource allocation algorithms through mycelial intelligence, we can design - regenerative protocols built on cooperation, mutual aid, and permaculture currency principles rather than - extractive growth models. I authored book.mycofi.earth to share these insights. -

- -

- I'm passionate about open-source token engineering tools like cadCAD, which I helped open source at the 2019 - Token Engineering Global Gathering. Just as the Golden Gate Bridge required rigorous engineering, our token - economies need mathematical validation and simulation to serve as robust public infrastructure. -

+ {/* Bio blocks */} +
+ {BIO_BLOCKS.map((block, index) => ( +
+
+ + jeff@emmett:~$ {block.command} + +
+
+
+                    {block.content}
+                  
+
+
+ ))} +
-
-
-

8+

-

Years in Token Engineering

-
-
-

50+

-

Research Publications

-
-
-

-

Regenerative Impact

-
+ {/* Stats grid */} +
+ {STATS.map((stat, index) => ( +
+
+ {stat.value} +
+
+ {stat.label} +
+
+ {stat.subtext} +
+
+ ))} +
+ + {/* Tools declaration */} +
+

/* Open Source Contributions */

+

+ export const tools = [ +

+

+ "cadCAD", // Token economy simulation +

+

+ "Conviction Voting", // Novel governance mechanism +

+

+ "Augmented Bonding Curves", // Sustainable funding +

+

];

diff --git a/components/contact-section.tsx b/components/contact-section.tsx index 53055f3..cddfa6a 100644 --- a/components/contact-section.tsx +++ b/components/contact-section.tsx @@ -1,75 +1,180 @@ -import { Github, Mail } from "lucide-react" +"use client" -const socials = [ - { icon: Mail, label: "Email", href: "mailto:jeff@emmett.com" }, +const NETWORK_NODES = [ { - icon: () => ( - - - - ), - label: "Bluesky", - href: "https://bsky.app/profile/jeffemmett.bsky.social", + protocol: "mailto:", + address: "jeff@commonsstack.org", + label: "email", + icon: "📧", + description: "pgp_key_available", }, { - icon: () => ( - - - - ), - label: "Medium", - href: "https://medium.com/@jeffemmett", + protocol: "https://", + address: "bsky.app/profile/jeffemmett.bsky.social", + label: "bluesky", + icon: "🦋", + description: "@jeffemmett", }, { - icon: Github, - label: "Commons Stack", - href: "https://commonsstack.org", + protocol: "https://", + address: "twitter.com/JeffEmmett", + label: "x/twitter", + icon: "𝕏", + description: "@JeffEmmett", }, { - icon: () => ( - - - - ), - label: "MycoFi", - href: "https://mycofi.earth", + protocol: "https://", + address: "medium.com/@jeffemmett", + label: "medium", + icon: "📝", + description: "long_form_research", + }, + { + protocol: "https://", + address: "commonsstack.org", + label: "commons_stack", + icon: "🏛️", + description: "primary_organization", + }, + { + protocol: "https://", + address: "mycofi.earth", + label: "mycofi", + icon: "🍄", + description: "mycoeconomics_research", }, ] +const ASCII_NETWORK = ` + ◉─────◉─────◉ + │╲ ╱│╲ ╱│ + │ ╲ ╱ │ ╲ ╱ │ + ◉──◉──◉──◉──◉ + │ ╱ ╲ │ ╱ ╲ │ + │╱ ╲│╱ ╲│ + ◉─────◉─────◉ +` + export function ContactSection() { return ( -
-
-
-

Let's Connect

-

- Interested in token engineering, regenerative economics, or building commons-based systems? Let's - collaborate. -

+
+
+ {/* Section header */} +
+
+ $ +

+ ssh connect@jeff.emmett +

+
+
+

+ # Establish Connection +

+

+ ## Token engineering, regenerative economics, commons-based systems +

+
-
- {socials.map((social) => { - const Icon = social.icon - return ( + {/* Network visualization + links */} +
+ {/* ASCII Network */} +
+
+              {ASCII_NETWORK}
+            
+

+ node_mesh.active +

+
+ + {/* Connection nodes */} +
-
-

- © 2025 Jeff Emmett. Built with Next.js & TailwindCSS -

+ {/* Connection prompt */} +
+
+ + connection_status + +
+
+

+ $ ping collaboration.request +

+

+ PING collaboration.request (∞.∞.∞.∞): 56 data bytes +

+

+ 64 bytes from jeff@emmett: icmp_seq=0 ttl=∞ time={"<"}1ms +

+

+ 64 bytes from jeff@emmett: icmp_seq=1 ttl=∞ time={"<"}1ms +

+

+ --- collaboration.request ping statistics --- +

+

+ STATUS: READY_TO_CONNECT +

+

+ Interested in token engineering, regenerative economics, or building + commons-based systems? Let's collaborate. +

+
+
+ + {/* Footer */} +
+
+
+

+ /* Built with Next.js + + TailwindCSS */ +

+
+
+ ©{" "}{new Date().getFullYear()} + jeff.emmett + | + open_source_human +
+
+
+

+ "Building regenerative systems one token at a time." +

+
diff --git a/components/cursor-effect.tsx b/components/cursor-effect.tsx index 45ba3e9..2d482ce 100644 --- a/components/cursor-effect.tsx +++ b/components/cursor-effect.tsx @@ -1,79 +1,197 @@ 'use client' -import { useEffect, useState } from 'react' +import { useEffect, useState, useCallback } from 'react' + +interface Particle { + id: number + x: number + y: number + char: string + opacity: number + velocity: { x: number; y: number } + life: number +} + +const MATRIX_CHARS = '01アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン∞∂∆∇∫∮≈≠≤≥' export function CursorEffect() { - const [position, setPosition] = useState({ x: 0, y: 0 }) + const [position, setPosition] = useState({ x: -100, y: -100 }) const [isHovering, setIsHovering] = useState(false) - const [trails, setTrails] = useState>([]) + const [particles, setParticles] = useState([]) + const [glitchOffset, setGlitchOffset] = useState({ x: 0, y: 0 }) + + const createParticle = useCallback((x: number, y: number): Particle => { + const angle = Math.random() * Math.PI * 2 + const speed = Math.random() * 2 + 1 + return { + id: Date.now() + Math.random(), + x, + y, + char: MATRIX_CHARS[Math.floor(Math.random() * MATRIX_CHARS.length)], + opacity: 1, + velocity: { + x: Math.cos(angle) * speed, + y: Math.sin(angle) * speed + 1, // slight downward bias + }, + life: 1, + } + }, []) useEffect(() => { - let trailId = 0 + let frameId: number + let lastTime = 0 + + const animate = (time: number) => { + if (time - lastTime > 50) { + setParticles(prev => + prev + .map(p => ({ + ...p, + x: p.x + p.velocity.x, + y: p.y + p.velocity.y, + life: p.life - 0.02, + opacity: p.life, + })) + .filter(p => p.life > 0) + ) + lastTime = time + } + frameId = requestAnimationFrame(animate) + } + + frameId = requestAnimationFrame(animate) + return () => cancelAnimationFrame(frameId) + }, []) + + useEffect(() => { + let particleThrottle = 0 const handleMouseMove = (e: MouseEvent) => { setPosition({ x: e.clientX, y: e.clientY }) - - // Add trail - const newTrail = { x: e.clientX, y: e.clientY, id: trailId++ } - setTrails(prev => [...prev.slice(-8), newTrail]) - // Check if hovering over interactive element + // Spawn particles occasionally + particleThrottle++ + if (particleThrottle % 3 === 0) { + setParticles(prev => [...prev.slice(-30), createParticle(e.clientX, e.clientY)]) + } + + // Random glitch effect + if (Math.random() > 0.95) { + setGlitchOffset({ + x: (Math.random() - 0.5) * 10, + y: (Math.random() - 0.5) * 10, + }) + setTimeout(() => setGlitchOffset({ x: 0, y: 0 }), 50) + } + const target = e.target as HTMLElement - const isInteractive = target.closest('a, button, [role="button"]') + const isInteractive = target.closest('a, button, [role="button"], input, textarea') setIsHovering(!!isInteractive) } window.addEventListener('mousemove', handleMouseMove) return () => window.removeEventListener('mousemove', handleMouseMove) - }, []) + }, [createParticle]) return ( <> - {/* Main cursor */} -
-
-
- - {/* Trail effect */} - {trails.map((trail, index) => ( -
( + + > + {particle.char} + ))} - {/* Outer ring */} + {/* Main cursor - terminal style */}
+ > + {/* Outer scan ring */} +
+ + {/* Inner crosshair */} +
+ {/* Horizontal line */} +
+ {/* Vertical line */} +
+ {/* Center dot */} +
+
+
+ + {/* Glitch duplicate (red channel) */} + {glitchOffset.x !== 0 && ( +
+ )} ) } diff --git a/components/hero-section.tsx b/components/hero-section.tsx index 9263b9b..34b2364 100644 --- a/components/hero-section.tsx +++ b/components/hero-section.tsx @@ -2,78 +2,231 @@ import { useEffect, useState } from "react" +const MUSHROOM_ASCII = ` + ████████ + ██░░░░░░░░██ + ██░░░░░░░░░░░░██ + ██░░░░░░░░░░░░░░░░██ + ██░░░░██░░░░░░██░░░░░░██ + ██░░░░░░░░░░░░░░░░░░░░██ + ██░░░░░░░░░░░░░░░░██ + ████████████████ + ██░░██ + ██░░██ + ██░░░░░░██ +` + +const RESEARCH_DOMAINS = [ + "mycoeconomics", + "token_engineering", + "psilo_cybernetics", + "institutional_neuroplasticity", + "zk_local_first_systems", + "regenerative_crypto_commons", + "emancipatory_technology", +] + export function HeroSection() { - const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }) + const [typedText, setTypedText] = useState("") + const [currentDomain, setCurrentDomain] = useState(0) + const [showCursor, setShowCursor] = useState(true) + const [bootSequence, setBootSequence] = useState(0) + const fullText = RESEARCH_DOMAINS[currentDomain] + + // Boot sequence effect useEffect(() => { - const handleMouseMove = (e: MouseEvent) => { - setMousePosition({ - x: (e.clientX / window.innerWidth - 0.5) * 20, - y: (e.clientY / window.innerHeight - 0.5) * 20, - }) - } + const bootSteps = [1, 2, 3, 4, 5] + let step = 0 + const bootInterval = setInterval(() => { + if (step < bootSteps.length) { + setBootSequence(bootSteps[step]) + step++ + } else { + clearInterval(bootInterval) + } + }, 300) + return () => clearInterval(bootInterval) + }, []) - window.addEventListener("mousemove", handleMouseMove) - return () => window.removeEventListener("mousemove", handleMouseMove) + // Typing effect + useEffect(() => { + if (bootSequence < 5) return + + let charIndex = 0 + setTypedText("") + + const typeInterval = setInterval(() => { + if (charIndex < fullText.length) { + setTypedText(fullText.slice(0, charIndex + 1)) + charIndex++ + } else { + clearInterval(typeInterval) + setTimeout(() => { + setCurrentDomain((prev) => (prev + 1) % RESEARCH_DOMAINS.length) + }, 2000) + } + }, 80) + + return () => clearInterval(typeInterval) + }, [currentDomain, fullText, bootSequence]) + + // Cursor blink + useEffect(() => { + const cursorInterval = setInterval(() => { + setShowCursor((prev) => !prev) + }, 530) + return () => clearInterval(cursorInterval) }, []) return ( -
- {/* Animated background elements */} -
-
-
+
+ {/* Background grid pattern - handled by body in CSS */} + + {/* Floating ASCII mushroom */} +
+
{MUSHROOM_ASCII}
- {/* Content */} -
-
- - {"{ Token Engineering & Regenerative Economics }"} + {/* Main terminal window */} +
+ {/* Terminal header */} +
+
+
+
+
+
+ + jeff@emmett:~/research$
-

Jeff Emmett

+ {/* Terminal content */} +
+ {/* Boot sequence */} +
+ {bootSequence >= 1 && ( +

[OK] Loading cognitive_substrate.so

+ )} + {bootSequence >= 2 && ( +

[OK] Initializing mycelial_network

+ )} + {bootSequence >= 3 && ( +

[OK] Mounting /dev/commons

+ )} + {bootSequence >= 4 && ( +

[OK] Syncing regenerative_protocols

+ )} + {bootSequence >= 5 && ( +

+ [READY] System initialized. Welcome. +

+ )} +
-

- Token engineering researcher exploring bonding curves, Web3 economies, and mycoeconomics. Building tools for - regenerative communities and commons-based governance. -

+ {bootSequence >= 5 && ( + <> + {/* Main title */} +
+

+ JEFF EMMETT +

-
- - View Research -
- - - Get in Touch - +
+ $ + exploring + + {typedText} + + _ + + +
+
+ + {/* Description block */} +
+

+ /** +

+

+ * Token engineering researcher at the intersection of +

+

+ * regenerative systems, crypto commons, and emancipatory tech. +

+

*

+

+ * Co-founder:{" "} + Commons Stack,{" "} + MycoFi +

+

+ * Research: Bonding curves, conviction voting, institutional design +

+

+ */ +

+
+ + {/* Navigation links */} + + + {/* Academic citation */} +
+

+ Emmett, J. (2019-present). "Towards Regenerative Cryptoeconomics: + Designing Systems for Collective Flourishing." Working papers + available at commons.stack +

+
+ + )}
{/* Scroll indicator */} -
-
-
+
+
+ scroll +
diff --git a/components/skills-section.tsx b/components/skills-section.tsx index b4b0c66..aaaa582 100644 --- a/components/skills-section.tsx +++ b/components/skills-section.tsx @@ -1,58 +1,163 @@ -const skills = { - "Token Engineering": [ - "Bonding Curves", - "cadCAD Modeling", - "Primary Issuance Markets", - "Dynamic Supply Tokens", - "Cryptoeconomics", - "Agent-Based Modeling", +"use client" + +import { useState } from "react" + +interface SkillNode { + id: string + name: string + level: number // 0-100 + dependencies: string[] + description: string +} + +const SKILL_TREE: Record = { + "token_engineering/": [ + { id: "bc", name: "bonding_curves.sol", level: 95, dependencies: [], description: "AMMs & primary issuance markets" }, + { id: "cv", name: "conviction_voting.py", level: 90, dependencies: ["bc"], description: "Continuous decision-making" }, + { id: "abc", name: "augmented_bonding.ts", level: 88, dependencies: ["bc"], description: "Sustainable funding mechanisms" }, + { id: "cad", name: "cadCAD_modeling/", level: 92, dependencies: [], description: "Agent-based economic simulation" }, + { id: "ds", name: "dynamic_supply.rs", level: 85, dependencies: ["bc", "cad"], description: "Elastic token mechanisms" }, ], - "DAO Tooling": [ - "Conviction Voting", - "Augmented Bonding Curves", - "Commons Stack", - "Governance Systems", - "Cyber-Physical Commons", - "Ostrom Compliance", + "governance/": [ + { id: "dao", name: "dao_templates/", level: 90, dependencies: [], description: "Cyber-physical commons frameworks" }, + { id: "ost", name: "ostrom_compliance.md", level: 88, dependencies: ["dao"], description: "8 principles encoded" }, + { id: "cgov", name: "collective_governance/", level: 85, dependencies: ["cv"], description: "Participatory systems" }, ], - "Research Areas": [ - "Regenerative Economics", - "Mycoeconomics", - "Complex Systems", - "Behavioral Economics", - "Token Design", - "Public Goods Funding", + "research/": [ + { id: "myco", name: "mycoeconomics/", level: 80, dependencies: [], description: "Fungal network economics" }, + { id: "regen", name: "regenerative_economics.tex", level: 85, dependencies: ["myco"], description: "Beyond extractive models" }, + { id: "complex", name: "complex_systems.jl", level: 78, dependencies: [], description: "Emergence & adaptation" }, + { id: "behav", name: "behavioral_economics/", level: 75, dependencies: [], description: "Human coordination patterns" }, ], - Technical: ["Python", "Solidity", "Simulation", "Data Analysis", "Systems Design", "Web3"], + "tools/": [ + { id: "py", name: "python", level: 88, dependencies: [], description: "Primary analysis language" }, + { id: "sol", name: "solidity", level: 75, dependencies: [], description: "Smart contract development" }, + { id: "sim", name: "simulation/", level: 85, dependencies: ["py", "cad"], description: "Monte Carlo & ABM" }, + { id: "web3", name: "web3_stack/", level: 80, dependencies: ["sol"], description: "Decentralized infrastructure" }, + ], +} + +function ProgressBar({ level }: { level: number }) { + const filled = Math.floor(level / 5) + const empty = 20 - filled + return ( + + {"█".repeat(filled)} + {"░".repeat(empty)} + {level}% + + ) } export function SkillsSection() { + const [expandedDir, setExpandedDir] = useState("token_engineering/") + return ( -
-
-
-

Expertise & Focus Areas

-

- Interdisciplinary approach to building resilient token economies and regenerative systems -

+
+
+ {/* Section header */} +
+
+ $ +

+ tree ~/skills --depth=2 +

+
+
+

+ # Expertise & Focus Areas +

+

+ ## Interdisciplinary toolkit for building resilient token economies +

+
-
- {Object.entries(skills).map(([category, items]) => ( -
-

{category}

-
- {items.map((skill) => ( - - {skill} + {/* Skill tree */} +
+
+ + jeff@emmett:~/skills$ + + + [SKILL_TREE v2.0] + +
+
+ {/* Root */} +
~/skills/
+ + {/* Directories */} + {Object.entries(SKILL_TREE).map(([dir, skills], dirIndex) => ( +
+ {/* Directory name */} +
setExpandedDir(expandedDir === dir ? null : dir)} + > + + {expandedDir === dir ? "▼" : "▶"} - ))} + {dir} + + [{skills.length} items] + +
+ + {/* Skills in directory */} + {expandedDir === dir && ( +
+ {skills.map((skill, index) => ( +
+
+ ├── +
+
+ + {skill.name} + + +
+

+ └─ {skill.description} +

+
+
+
+ ))} +
└── ...
+
+ )}
+ ))} + + {/* Footer */} +
+

+ 4 directories,{" "} + 17 skills,{" "} + ∞ learning +

- ))} +
+
+ + {/* Methodology note */} +
+

/* Methodology */

+

+ // Skills interconnect like mycelial networks +

+

+ // Each node strengthens the whole system +

+

+ // Constant iteration, never complete +

diff --git a/components/work-section.tsx b/components/work-section.tsx index 15b3f04..240be97 100644 --- a/components/work-section.tsx +++ b/components/work-section.tsx @@ -1,91 +1,224 @@ -import { Card } from "@/components/ui/card" +"use client" -const projects = [ +import { useState } from "react" + +interface ResearchItem { + id: string + title: string + category: string + year: string + abstract: string + tags: string[] + link?: string + status: "published" | "working" | "ongoing" +} + +const RESEARCH_ITEMS: ResearchItem[] = [ { - title: "Commons Stack", - description: - "Cyber-physical commons architecture translating Ostrom's principles into DAO templates. Building open-source, token engineered component libraries for communal management of public goods.", - tags: ["Token Engineering", "DAOs", "Ostrom Compliance", "Public Goods"], - image: "/commons-stack-dao-governance-blockchain.jpg", + id: "bonding-curves", + title: "Bonding Curves: A Mathematical Primitive for Collective Intelligence", + category: "token_engineering", + year: "2019", + abstract: + "Exploration of automated market makers as coordination mechanisms for decentralized communities. Analysis of augmented bonding curves for sustainable funding of public goods.", + tags: ["AMM", "DeFi", "public_goods", "cadCAD"], + link: "https://medium.com/commonsstack", + status: "published", }, { - title: "Bonding Curve Research Group", - description: - "Research and development of Primary Issuance Markets enabling dynamic token supply. Challenging fixed supply paradigms with adaptive mechanisms that dampen volatility.", - tags: ["Bonding Curves", "cadCAD", "Token Economics", "DeFi"], - image: "/bonding-curve-token-economics-chart.jpg", + id: "conviction-voting", + title: "Conviction Voting: A Novel Continuous Decision Making Framework", + category: "governance", + year: "2020", + abstract: + "Time-weighted voting mechanism that allows preferences to accumulate over time, reducing plutocratic attack vectors and enabling more nuanced collective decision-making.", + tags: ["governance", "voting", "mechanism_design"], + link: "https://blog.giveth.io/conviction-voting", + status: "published", }, { - title: "MycoFi & Mycoeconomics", - description: - "Economic systems inspired by fungal networks. Regenerative protocols built on cooperation, mutual aid, and permaculture currency principles. Author of book.mycofi.earth.", - tags: ["Regenerative Economics", "Biomimicry", "Permaculture", "Web3"], - image: "/mycelium-network-nature-fungal.jpg", + id: "mycofi", + title: "MycoFi: Towards Mycelial Finance and Regenerative Economics", + category: "mycoeconomics", + year: "2023", + abstract: + "Framework for understanding economic systems through the lens of fungal networks. Proposes biomimetic approaches to resource allocation and value flow in decentralized systems.", + tags: ["biomimicry", "regenerative", "networks", "ecology"], + link: "https://mycofi.earth", + status: "ongoing", }, { - title: "Conviction Voting", - description: - "Novel continuous decision-making mechanism for DAO governance. Eliminates time-boxed voting attack vectors while increasing community participation and long-term alignment.", - tags: ["Governance", "Voting Systems", "Social Sensor Fusion", "cadCAD"], - image: "/conviction-voting-governance-dashboard.jpg", + id: "psilo-cybernetics", + title: "Psilo-Cybernetics: Consciousness, Computation, and Collective Intelligence", + category: "psilo_cybernetics", + year: "2024", + abstract: + "Theoretical framework connecting altered states of consciousness with distributed systems theory. Exploring the intersection of psychedelic research and cybernetic governance.", + tags: ["consciousness", "cybernetics", "emergence"], + status: "working", }, { - title: "Augmented Bonding Curves", - description: - "Primary Issuance Markets that create economic boundaries for commons ecosystems. Enables continuous fundraising, algorithmic liquidity, and price volatility dampening.", - tags: ["Token Design", "AMMs", "Cryptoeconomics", "Funding Mechanisms"], - image: "/augmented-bonding-curve-economic-system.jpg", + id: "institutional-neuroplasticity", + title: "Institutional Neuroplasticity: Adaptive Governance for Complex Systems", + category: "governance", + year: "2024", + abstract: + "Applying principles of neural plasticity to institutional design. How organizations can maintain coherence while adapting to changing conditions through distributed learning.", + tags: ["institutions", "adaptation", "complexity"], + status: "working", }, { - title: "Token Engineering Commons", - description: - "First field test of Commons Stack components. Outperformed other public goods tokens in risk-adjusted returns, demonstrating benefits of primary issuance markets.", - tags: ["DAO", "TEC", "Token Engineering", "Community Governance"], - image: "/token-engineering-community-collaborative.jpg", + id: "zk-local-first", + title: "Zero-Knowledge Local-First: Privacy-Preserving Decentralized Coordination", + category: "cryptography", + year: "2025", + abstract: + "Architecture for local-first applications with ZK proofs for selective disclosure. Enabling community coordination without surveillance capitalism.", + tags: ["ZK", "privacy", "local_first", "p2p"], + status: "working", }, ] +const CATEGORIES = [ + { id: "all", label: "/*" }, + { id: "token_engineering", label: "token_eng" }, + { id: "governance", label: "governance" }, + { id: "mycoeconomics", label: "myco" }, + { id: "cryptography", label: "crypto" }, + { id: "psilo_cybernetics", label: "psilo" }, +] + export function WorkSection() { + const [activeCategory, setActiveCategory] = useState("all") + const [expandedItem, setExpandedItem] = useState(null) + + const filteredItems = + activeCategory === "all" + ? RESEARCH_ITEMS + : RESEARCH_ITEMS.filter((item) => item.category === activeCategory) + return ( -
-
-
-

Research & Projects

-

- Exploring token engineering, regenerative economics, and decentralized governance systems -

+
+
+ {/* Section header */} +
+
+ $ +

+ cat research.md +

+
+
+

+ # Research & Working Papers +

+

+ ## Exploring regenerative systems, token engineering, and + collective intelligence +

+
-
- {projects.map((project, index) => ( - + {CATEGORIES.map((cat) => ( + + ))} +
+ + {/* Research items */} +
+ {filteredItems.map((item, index) => ( +
+
+ setExpandedItem(expandedItem === item.id ? null : item.id) + } + > + {/* Header row */} +
+
+
+ + {item.status} + + + {item.year} + +
+

+ {item.title} +

+
+ + ▼ + +
+ + {/* Tags */}
- {project.tags.map((tag, tagIndex) => ( + {item.tags.map((tag) => ( {tag} ))}
+ + {/* Expanded content */} + {expandedItem === item.id && ( +
+

+ {item.abstract} +

+ {item.link && ( + e.stopPropagation()} + > + + Read more + + )} +
+ Emmett, J. ({item.year}). "{item.title}." +
+
+ )}
- +
))}