Last active
January 20, 2026 01:04
-
-
Save snoble/382be60880ba0d38905006f9e144a107 to your computer and use it in GitHub Desktop.
BurritoScript - TypeScript with Superpowers (Interactive Landing Page)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!doctype html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>BurritoScript — TypeScript with Superpowers</title><meta name="description" content="An effect system that makes your code automatically debuggable, verifiable, and optimizable. Built for the age of AI-assisted development." /><style>@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Outfit:wght@400;500;600;700;800&display=swap');:root { --bg-deep: #0a0a0f; --bg-surface: #12121a; --bg-elevated: #1a1a24; --accent-primary: #ff6b35; --accent-secondary: #00d4aa; --accent-tertiary: #7c3aed; --text-primary: #fafafa; --text-secondary: #a0a0b0; --text-muted: #6a6a7a; --border: #2a2a3a; --glow-orange: rgba(255, 107, 53, 0.5); --glow-teal: rgba(0, 212, 170, 0.4);}* { box-sizing: border-box; margin: 0; padding: 0; }html { scroll-behavior: smooth; }body { font-family: 'Outfit', -apple-system, BlinkMacSystemFont, sans-serif; background: var(--bg-deep); color: var(--text-primary); line-height: 1.6; overflow-x: hidden;}code, pre, .mono { font-family: 'JetBrains Mono', 'SF Mono', Consolas, monospace;}a { color: inherit; text-decoration: none; }.container { max-width: 1200px; margin: 0 auto; padding: 0 24px; }.bg-grid { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-image: linear-gradient(rgba(255, 107, 53, 0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 107, 53, 0.03) 1px, transparent 1px); background-size: 60px 60px; pointer-events: none; z-index: -1; animation: gridMove 20s linear infinite;}@keyframes gridMove { 0% { transform: translate(0, 0); } 100% { transform: translate(60px, 60px); }}.watermark { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 80vw; height: 80vw; max-width: 1000px; max-height: 1000px; opacity: 0.06; pointer-events: none; z-index: 0;}.watermark svg { width: 100%; height: 100%; color: var(--accent-secondary);}.orb { position: fixed; border-radius: 50%; filter: blur(80px); pointer-events: none; z-index: -1; animation: float 8s ease-in-out infinite;}.orb-1 { width: 600px; height: 600px; background: var(--glow-orange); top: -200px; right: -200px; animation-delay: 0s;}.orb-2 { width: 500px; height: 500px; background: var(--glow-teal); bottom: -150px; left: -150px; animation-delay: -4s;}.orb-3 { width: 300px; height: 300px; background: rgba(124, 58, 237, 0.3); top: 50%; left: 50%; animation-delay: -2s;}@keyframes float { 0%, 100% { transform: translate(0, 0) scale(1); } 25% { transform: translate(30px, -30px) scale(1.05); } 50% { transform: translate(-20px, 20px) scale(0.95); } 75% { transform: translate(-30px, -20px) scale(1.02); }}.reveal { opacity: 0; transform: translateY(40px); transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);}.reveal.visible { opacity: 1; transform: translateY(0);}.reveal-delay-1 { transition-delay: 0.1s; }.reveal-delay-2 { transition-delay: 0.2s; }.reveal-delay-3 { transition-delay: 0.3s; }.reveal-delay-4 { transition-delay: 0.4s; }nav { position: fixed; top: 0; left: 0; right: 0; padding: 20px 0; background: rgba(10, 10, 15, 0.7); backdrop-filter: blur(20px); border-bottom: 1px solid var(--border); z-index: 100; transition: background 0.3s, padding 0.3s;}nav.scrolled { background: rgba(10, 10, 15, 0.95); padding: 12px 0;}.nav-inner { display: flex; justify-content: space-between; align-items: center;}.logo { font-weight: 800; font-size: 22px; display: flex; align-items: center; gap: 10px; transition: transform 0.3s;}.logo:hover { transform: scale(1.05); }.logo-icon { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; position: relative;}.logo-icon svg { width: 32px; height: 32px; filter: drop-shadow(0 0 8px var(--accent-secondary)); animation: jellyFloat 3s ease-in-out infinite, jellyGlow 2s ease-in-out infinite;}@keyframes jellyFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-3px); }}@keyframes jellyGlow { 0%, 100% { filter: drop-shadow(0 0 8px var(--accent-secondary)); } 50% { filter: drop-shadow(0 0 16px var(--accent-secondary)) drop-shadow(0 0 24px var(--accent-primary)); }}.nav-links { display: flex; gap: 32px;}.nav-link { font-size: 14px; color: var(--text-secondary); font-weight: 500; transition: color 0.2s, transform 0.2s; position: relative;}.nav-link::after { content: ''; position: absolute; bottom: -4px; left: 0; width: 0; height: 2px; background: var(--accent-primary); transition: width 0.3s;}.nav-link:hover { color: var(--text-primary); }.nav-link:hover::after { width: 100%; }.nav-cta { background: var(--accent-primary); color: var(--bg-deep); padding: 10px 20px; border-radius: 8px; font-weight: 600; font-size: 14px; transition: transform 0.2s, box-shadow 0.2s; position: relative; overflow: hidden;}.nav-cta::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent); transition: left 0.5s;}.nav-cta:hover::before { left: 100%; }.nav-cta:hover { transform: translateY(-2px); box-shadow: 0 8px 24px var(--glow-orange);}.hero { min-height: 100vh; display: flex; align-items: center; padding: 140px 0 100px; position: relative;}.hero-content { position: relative; z-index: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 60px; align-items: center;}.hero-text { max-width: 600px; }.badge { display: inline-flex; align-items: center; gap: 8px; background: rgba(255, 107, 53, 0.1); border: 1px solid rgba(255, 107, 53, 0.3); padding: 8px 16px; border-radius: 999px; font-size: 13px; font-weight: 600; color: var(--accent-primary); margin-bottom: 24px; animation: badgePulse 2s ease-in-out infinite;}@keyframes badgePulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(255, 107, 53, 0.4); } 50% { box-shadow: 0 0 0 8px rgba(255, 107, 53, 0); }}.badge-dot { width: 8px; height: 8px; background: var(--accent-primary); border-radius: 50%; animation: pulse 1.5s infinite;}@keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.5; transform: scale(0.8); }}h1 { font-size: 68px; font-weight: 800; line-height: 1.05; margin-bottom: 24px; letter-spacing: -0.03em;}h1 .gradient { background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary), var(--accent-tertiary), var(--accent-primary)); background-size: 300% 300%; -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: gradientShift 4s ease infinite;}@keyframes gradientShift { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; }}.hero-subtitle { font-size: 20px; color: var(--text-secondary); max-width: 520px; margin-bottom: 40px;}.cta-group { display: flex; gap: 16px; flex-wrap: wrap;}.btn { display: inline-flex; align-items: center; gap: 8px; padding: 16px 28px; border-radius: 12px; font-weight: 600; font-size: 16px; transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); position: relative; overflow: hidden;}.btn-primary { background: linear-gradient(135deg, var(--accent-primary), #ff8f5a); color: var(--bg-deep); box-shadow: 0 4px 20px var(--glow-orange);}.btn-primary:hover { transform: translateY(-3px) scale(1.02); box-shadow: 0 12px 40px var(--glow-orange);}.btn-primary:active { transform: translateY(-1px) scale(0.98); }.btn-secondary { background: var(--bg-elevated); border: 1px solid var(--border); color: var(--text-primary);}.btn-secondary:hover { background: var(--bg-surface); border-color: var(--accent-primary); transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.3);}.hero-code { background: var(--bg-surface); border: 1px solid var(--border); border-radius: 16px; overflow: hidden; box-shadow: 0 24px 64px rgba(0, 0, 0, 0.4); animation: codeFloat 6s ease-in-out infinite;}@keyframes codeFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); }}.code-tabs { display: flex; gap: 0; background: var(--bg-deep); border-bottom: 1px solid var(--border);}.code-tab { flex: 1; padding: 12px 16px; background: transparent; border: none; color: var(--text-muted); font-family: inherit; font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.3s; position: relative;}.code-tab:hover { color: var(--text-secondary); }.code-tab.active { color: var(--accent-primary); background: var(--bg-surface);}.code-tab.active::after { content: ''; position: absolute; bottom: -1px; left: 0; right: 0; height: 2px; background: var(--accent-primary);}.code-tab .arrow { margin: 0 4px; opacity: 0.5; }.code-panels { position: relative; min-height: 200px; }.code-panel { position: absolute; top: 0; left: 0; right: 0; padding: 20px; opacity: 0; transform: translateX(20px); transition: opacity 0.4s, transform 0.4s; pointer-events: none;}.code-panel.active { opacity: 1; transform: translateX(0); pointer-events: auto; position: relative;}.code-panel pre { font-size: 12px; line-height: 1.7; color: var(--text-secondary); margin: 0;}.code-panel .comment { color: var(--accent-secondary); }.code-panel .warning { color: #f59e0b; }.code-panel .error { color: #ef4444; }.code-header { display: flex; align-items: center; gap: 8px; padding: 14px 18px; background: var(--bg-elevated); border-bottom: 1px solid var(--border);}.code-dot { width: 12px; height: 12px; border-radius: 50%; transition: transform 0.2s;}.code-header:hover .code-dot { transform: scale(1.2); }.code-dot:nth-child(1) { background: #ff5f57; }.code-dot:nth-child(2) { background: #febc2e; }.code-dot:nth-child(3) { background: #28c840; }.code-title { margin-left: 12px; font-size: 13px; color: var(--text-muted);}.code-body { padding: 20px; font-size: 13px; line-height: 1.7; color: var(--text-secondary); overflow-x: auto; position: relative;}.cursor { display: inline-block; width: 2px; height: 1.2em; background: var(--accent-primary); margin-left: 2px; animation: blink 1s step-end infinite; vertical-align: text-bottom;}@keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; }}.features { padding: 140px 0; position: relative;}.section-header { text-align: center; max-width: 700px; margin: 0 auto 80px;}.section-header h2 { font-size: 52px; font-weight: 800; margin-bottom: 20px; letter-spacing: -0.02em;}.section-header p { font-size: 18px; color: var(--text-secondary);}.features-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px;}.feature-card { background: var(--bg-surface); border: 1px solid var(--border); border-radius: 24px; padding: 36px; transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1); position: relative; overflow: hidden;}.feature-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); transform: scaleX(0); transform-origin: left; transition: transform 0.4s;}.feature-card:hover::before { transform: scaleX(1); }.feature-card:hover { transform: translateY(-8px); border-color: var(--accent-primary); box-shadow: 0 20px 60px rgba(0,0,0,0.3), 0 0 40px var(--glow-orange);}.feature-icon { font-size: 42px; margin-bottom: 20px; display: inline-block; animation: iconBounce 2s ease-in-out infinite; animation-play-state: paused;}.feature-card:hover .feature-icon { animation-play-state: running;}@keyframes iconBounce { 0%, 100% { transform: translateY(0) rotate(0deg); } 25% { transform: translateY(-5px) rotate(-5deg); } 75% { transform: translateY(-5px) rotate(5deg); }}.feature-card h3 { font-size: 26px; font-weight: 700; margin-bottom: 12px;}.feature-card p { color: var(--text-secondary); margin-bottom: 24px; font-size: 16px;}.feature-code { background: var(--bg-deep); border-radius: 12px; padding: 18px; font-size: 12px; color: var(--text-secondary); overflow-x: auto; white-space: pre; line-height: 1.6; border: 1px solid var(--border); transition: border-color 0.3s;}.feature-card:hover .feature-code { border-color: var(--accent-secondary);}.quickstart { padding: 140px 0; background: var(--bg-surface); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); position: relative;}.quickstart-content { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: center;}.quickstart-text h2 { font-size: 52px; font-weight: 800; margin-bottom: 24px; letter-spacing: -0.02em;}.quickstart-text p { font-size: 18px; color: var(--text-secondary); margin-bottom: 40px;}.quickstart-steps { display: flex; flex-direction: column; gap: 20px;}.step { display: flex; align-items: center; gap: 20px; padding: 16px; background: var(--bg-elevated); border-radius: 16px; border: 1px solid transparent; transition: all 0.3s; cursor: default;}.step:hover { border-color: var(--accent-primary); transform: translateX(8px); background: var(--bg-deep);}.step-number { width: 40px; height: 40px; background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); color: var(--bg-deep); border-radius: 12px; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 16px; flex-shrink: 0; transition: transform 0.3s;}.step:hover .step-number { transform: scale(1.1) rotate(5deg); }.step-text { color: var(--text-secondary); font-size: 16px;}.step-text strong { color: var(--text-primary); }.quickstart-terminal { background: var(--bg-deep); border: 1px solid var(--border); border-radius: 20px; overflow: hidden; box-shadow: 0 20px 60px rgba(0,0,0,0.4);}.terminal-header { display: flex; align-items: center; gap: 8px; padding: 16px 20px; background: var(--bg-elevated); border-bottom: 1px solid var(--border);}.terminal-body { padding: 24px; font-size: 14px; line-height: 2; min-height: 280px;}.terminal-line { opacity: 0; animation: terminalType 0.5s forwards;}.terminal-line:nth-child(1) { animation-delay: 0.3s; }.terminal-line:nth-child(2) { animation-delay: 0.6s; }.terminal-line:nth-child(3) { animation-delay: 0.9s; }.terminal-line:nth-child(4) { animation-delay: 1.5s; }.terminal-line:nth-child(5) { animation-delay: 1.8s; }.terminal-line:nth-child(6) { animation-delay: 2.4s; }.terminal-line:nth-child(7) { animation-delay: 2.7s; }.terminal-line:nth-child(8) { animation-delay: 3.3s; }.terminal-line:nth-child(9) { animation-delay: 3.6s; }@keyframes terminalType { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); }}.terminal-body .prompt { color: var(--accent-secondary); font-weight: 600; }.terminal-body .comment { color: var(--text-muted); font-style: italic; }.terminal-body .cmd { color: var(--text-primary); }.philosophy { padding: 140px 0;}.philosophy-content { display: grid; grid-template-columns: repeat(3, 1fr); gap: 32px;}.philosophy-card { background: var(--bg-surface); border: 1px solid var(--border); border-radius: 24px; padding: 48px 36px; text-align: center; transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1); position: relative; overflow: hidden;}.philosophy-card::after { content: ''; position: absolute; inset: 0; background: radial-gradient(circle at 50% 0%, var(--glow-orange), transparent 70%); opacity: 0; transition: opacity 0.4s; pointer-events: none;}.philosophy-card:hover::after { opacity: 0.1; }.philosophy-card:hover { transform: translateY(-12px) scale(1.02); border-color: var(--accent-primary); box-shadow: 0 24px 60px rgba(0,0,0,0.3);}.philosophy-card h3 { font-size: 22px; font-weight: 700; margin-bottom: 16px; position: relative;}.philosophy-card p { color: var(--text-secondary); font-size: 15px; line-height: 1.7; position: relative;}.philosophy-icon { font-size: 56px; margin-bottom: 28px; display: inline-block; transition: transform 0.4s;}.philosophy-card:hover .philosophy-icon { transform: scale(1.2) rotate(10deg);}.case-study { padding: 140px 0; background: var(--bg-surface); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);}.case-study-content { display: grid; gap: 40px;}.case-problem { background: var(--bg-elevated); border: 1px solid var(--border); border-radius: 20px; padding: 32px;}.case-problem h3 { font-size: 24px; margin-bottom: 16px; color: #ef4444;}.case-problem ul { list-style: none; display: grid; gap: 12px; margin-top: 16px;}.case-problem li { padding-left: 24px; position: relative; color: var(--text-secondary);}.case-problem li::before { content: '✗'; position: absolute; left: 0; color: #ef4444;}.case-diagram { background: var(--bg-deep); border: 1px solid var(--border); border-radius: 20px; padding: 32px; overflow: hidden;}.diagram-container { display: flex; justify-content: center; align-items: center;}.system-diagram { width: 100%; max-width: 600px; height: auto;}.case-how-it-works { background: linear-gradient(135deg, var(--bg-elevated), var(--bg-surface)); border: 1px solid var(--accent-tertiary); border-radius: 20px; padding: 40px;}.case-how-it-works h3 { font-size: 28px; margin-bottom: 16px; color: var(--accent-tertiary);}.how-intro { font-size: 16px; color: var(--text-secondary); margin-bottom: 32px; line-height: 1.7;}.how-intro strong { color: var(--accent-primary); }.how-intro em { color: var(--accent-secondary); font-style: normal; }.how-steps { display: grid; gap: 24px;}.how-step { display: grid; grid-template-columns: 48px 1fr; gap: 20px; align-items: start;}.how-step-num { width: 48px; height: 48px; background: linear-gradient(135deg, var(--accent-tertiary), var(--accent-secondary)); border-radius: 12px; display: flex; align-items: center; justify-content: center; font-weight: 800; font-size: 20px; color: var(--bg-deep);}.how-step-content { background: var(--bg-deep); border: 1px solid var(--border); border-radius: 12px; padding: 20px;}.how-step-content strong { display: block; font-size: 16px; margin-bottom: 8px; color: var(--text-primary);}.how-step-content p { font-size: 14px; color: var(--text-muted); margin-bottom: 12px;}.how-step-content pre { font-size: 12px; line-height: 1.6; color: var(--text-secondary); background: var(--bg-surface); padding: 12px; border-radius: 8px; overflow-x: auto; white-space: pre;}.case-solution { background: var(--bg-elevated); border: 1px solid var(--accent-secondary); border-radius: 20px; padding: 32px;}.case-solution h3 { font-size: 24px; margin-bottom: 24px; color: var(--accent-secondary);}.solution-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px;}.solution-item { text-align: center;}.solution-icon { font-size: 32px; margin-bottom: 12px;}.solution-item strong { display: block; margin-bottom: 8px; color: var(--text-primary);}.solution-item p { font-size: 13px; color: var(--text-muted);}.case-code { background: var(--bg-deep); border: 1px solid var(--border); border-radius: 16px; padding: 24px; overflow-x: auto;}.case-code pre { font-size: 13px; line-height: 1.7; color: var(--text-secondary); white-space: pre;}@media (max-width: 900px) { .solution-grid { grid-template-columns: repeat(2, 1fr); }}.cta { padding: 160px 0; text-align: center; position: relative; overflow: hidden;}.cta::before { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 1000px; height: 500px; background: radial-gradient(ellipse, var(--glow-orange), transparent 60%); opacity: 0.4; animation: ctaPulse 4s ease-in-out infinite; pointer-events: none;}@keyframes ctaPulse { 0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.3; } 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.5; }}.cta-content { position: relative; z-index: 1;}.cta h2 { font-size: 60px; font-weight: 800; margin-bottom: 24px; letter-spacing: -0.02em;}.cta p { font-size: 20px; color: var(--text-secondary); max-width: 600px; margin: 0 auto 48px;}footer { padding: 48px 0; border-top: 1px solid var(--border); text-align: center; color: var(--text-muted); font-size: 14px;}footer a { color: var(--accent-primary); transition: color 0.2s;}footer a:hover { color: var(--accent-secondary); }@media (max-width: 900px) { .hero-content { grid-template-columns: 1fr; gap: 40px; } .hero-code { display: none; } h1 { font-size: 44px; } .features-grid { grid-template-columns: 1fr; } .quickstart-content { grid-template-columns: 1fr; gap: 40px; } .philosophy-content { grid-template-columns: 1fr; } .cta h2 { font-size: 36px; } .nav-links { display: none; }}</style></head><body><div class="orb orb-1"></div><div class="orb orb-2"></div><div class="orb orb-3"></div><div class="watermark"><svg viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="wm-glow" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#00d4aa" stop-opacity="0.8"/><stop offset="50%" stop-color="#7c3aed" stop-opacity="1"/><stop offset="100%" stop-color="#00d4aa" stop-opacity="0.8"/></linearGradient><filter id="wm-blur"><feGaussianBlur stdDeviation="0.3"/></filter></defs><ellipse cx="16" cy="11" rx="9" ry="7" fill="none" stroke="currentColor" stroke-width="1.5" opacity="0.3"/><path d="M10 9 Q16 5 22 9" fill="none" stroke="currentColor" stroke-width="1" opacity="0.2"/><path d="M8 17 Q7 21 9 25" stroke="currentColor" stroke-width="1.25" fill="none" stroke-linecap="round" opacity="0.3"/><path d="M12 18 Q11 23 13 27" stroke="currentColor" stroke-width="1.25" fill="none" stroke-linecap="round" opacity="0.3"/><path d="M16 18 Q15 24 16 28" stroke="currentColor" stroke-width="1.25" fill="none" stroke-linecap="round" opacity="0.3"/><path d="M20 18 Q21 23 19 27" stroke="currentColor" stroke-width="1.25" fill="none" stroke-linecap="round" opacity="0.3"/><path d="M24 17 Q25 21 23 25" stroke="currentColor" stroke-width="1.25" fill="none" stroke-linecap="round" opacity="0.3"/><ellipse cx="16" cy="11" rx="9" ry="7" fill="none" stroke="url(#wm-glow)" stroke-width="2" filter="url(#wm-blur)" stroke-dasharray="8 50" stroke-linecap="round"><animate attributeName="stroke-dashoffset" values="0;-58" dur="4s" repeatCount="indefinite"/></ellipse><path d="M8 17 Q7 21 9 25" stroke="url(#wm-glow)" stroke-width="2" fill="none" stroke-linecap="round" filter="url(#wm-blur)" stroke-dasharray="3 20"><animate attributeName="stroke-dashoffset" values="0;-23" dur="2.5s" repeatCount="indefinite"/></path><path d="M12 18 Q11 23 13 27" stroke="url(#wm-glow)" stroke-width="2" fill="none" stroke-linecap="round" filter="url(#wm-blur)" stroke-dasharray="3 20"><animate attributeName="stroke-dashoffset" values="0;-23" dur="2.8s" begin="0.3s" repeatCount="indefinite"/></path><path d="M16 18 Q15 24 16 28" stroke="url(#wm-glow)" stroke-width="2" fill="none" stroke-linecap="round" filter="url(#wm-blur)" stroke-dasharray="3 20"><animate attributeName="stroke-dashoffset" values="0;-23" dur="2.2s" begin="0.6s" repeatCount="indefinite"/></path><path d="M20 18 Q21 23 19 27" stroke="url(#wm-glow)" stroke-width="2" fill="none" stroke-linecap="round" filter="url(#wm-blur)" stroke-dasharray="3 20"><animate attributeName="stroke-dashoffset" values="0;-23" dur="2.6s" begin="0.2s" repeatCount="indefinite"/></path><path d="M24 17 Q25 21 23 25" stroke="url(#wm-glow)" stroke-width="2" fill="none" stroke-linecap="round" filter="url(#wm-blur)" stroke-dasharray="3 20"><animate attributeName="stroke-dashoffset" values="0;-23" dur="2.4s" begin="0.5s" repeatCount="indefinite"/></path></svg></div><div class="bg-grid"></div><nav><div class="container nav-inner"><a href="#" class="logo"><div class="logo-icon"><svg viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="jellyGrad" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#00d4aa"/><stop offset="100%" stop-color="#7c3aed"/></linearGradient><linearGradient id="jellyGlow" x1="0.5" y1="0" x2="0.5" y2="1"><stop offset="0%" stop-color="#00d4aa" stop-opacity="0.8"/><stop offset="100%" stop-color="#00d4aa" stop-opacity="0"/></linearGradient></defs><!-- Bell/dome --><ellipse cx="16" cy="12" rx="10" ry="8" fill="url(#jellyGrad)" opacity="0.9"/><ellipse cx="16" cy="12" rx="7" ry="5" fill="url(#jellyGlow)" opacity="0.6"/><!-- Inner glow --><ellipse cx="16" cy="11" rx="4" ry="3" fill="#fff" opacity="0.3"/><!-- Tentacles --><path d="M8 18 Q6 22 8 26" stroke="url(#jellyGrad)" stroke-width="1.5" fill="none" opacity="0.8"><animate attributeName="d" values="M8 18 Q6 22 8 26;M8 18 Q10 22 8 26;M8 18 Q6 22 8 26" dur="2s" repeatCount="indefinite"/></path><path d="M12 19 Q10 24 12 28" stroke="url(#jellyGrad)" stroke-width="1.5" fill="none" opacity="0.8"><animate attributeName="d" values="M12 19 Q10 24 12 28;M12 19 Q14 24 12 28;M12 19 Q10 24 12 28" dur="2.3s" repeatCount="indefinite"/></path><path d="M16 20 Q14 25 16 29" stroke="url(#jellyGrad)" stroke-width="1.5" fill="none" opacity="0.9"><animate attributeName="d" values="M16 20 Q14 25 16 29;M16 20 Q18 25 16 29;M16 20 Q14 25 16 29" dur="1.8s" repeatCount="indefinite"/></path><path d="M20 19 Q22 24 20 28" stroke="url(#jellyGrad)" stroke-width="1.5" fill="none" opacity="0.8"><animate attributeName="d" values="M20 19 Q22 24 20 28;M20 19 Q18 24 20 28;M20 19 Q22 24 20 28" dur="2.1s" repeatCount="indefinite"/></path><path d="M24 18 Q26 22 24 26" stroke="url(#jellyGrad)" stroke-width="1.5" fill="none" opacity="0.8"><animate attributeName="d" values="M24 18 Q26 22 24 26;M24 18 Q22 22 24 26;M24 18 Q26 22 24 26" dur="2.4s" repeatCount="indefinite"/></path></svg></div>BurritoScript</a><div class="nav-links"><a class="nav-link" href="#features">Features</a><a class="nav-link" href="#case-study">Case Study</a><a class="nav-link" href="#quickstart">Quickstart</a><a class="nav-link" href="https://github.com/burritoscript/burritoscript">GitHub</a></div><a class="nav-cta" href="#quickstart">Get Started</a></div></nav><section class="hero"><div class="container hero-content"><div class="hero-text"><div class="badge"><span class="badge-dot"></span>Open Source</div><h1>TypeScript with <span class="gradient">superpowers</span></h1><p class="hero-subtitle">An effect system that makes your code automatically debuggable, verifiable, and optimizable. Built for the age of AI-assisted development.</p><div class="cta-group"><a class="btn btn-primary" href="#quickstart"><span>⚡</span> Get Started</a><a class="btn btn-secondary" href="https://github.com/burritoscript/burritoscript"><span>★</span> Star on GitHub</a></div></div><div class="hero-code"><div class="code-header"><div class="code-dot"></div><div class="code-dot"></div><div class="code-dot"></div><span class="code-title mono">The BurritoScript Pipeline</span></div><div class="code-tabs"><button class="code-tab active" data-panel="write">1. You Write</button><button class="code-tab" data-panel="see"><span class="arrow">→</span>2. Burrito Sees</button><button class="code-tab" data-panel="get"><span class="arrow">→</span>3. You Get</button></div><div class="code-panels"><div class="code-panel active" id="panel-write"><pre class="mono">// You write this | |
| async function transfer(db, from, to, amt) { | |
| const balance = await db.getBalance(from) | |
| await db.debit(from, amt) | |
| await db.credit(to, amt) | |
| return { success: true } | |
| }</pre></div><div class="code-panel" id="panel-see"><pre class="mono">// Burrito sees this | |
| { tag: "Op", interface: "db", | |
| method: "getBalance", args: ["from"], | |
| next: balance => | |
| { tag: "Op", method: "debit", ... } | |
| }</pre></div><div class="code-panel" id="panel-get"><pre class="mono">// You get this | |
| $ burrito race transfer.burrito.ts | |
| ⚠️ Race condition detected! | |
| db.getBalance → db.debit | |
| Another request can interleave | |
| $ burrito run --provenance | |
| balance = 500 ← db.getBalance("alice")</pre></div></div></div></div></section><section id="features" class="features"><div class="container"><div class="section-header reveal"><h2>Superpowers for your code</h2><p>BurritoScript's effect system gives you capabilities that are impossible in regular TypeScript.</p></div><div class="features-grid"><div class="feature-card reveal reveal-delay-1"><div class="feature-icon">🔍</div><h3>Provenance Debugging</h3><p>CLI commands trace any value to its origin. Perfect for AI agents debugging your code.</p><pre class="feature-code mono">$ pnpm burrito explain total | |
| total = 1050 | |
| ├─ expression: "amount + fee" | |
| ├─ source: payment.ts:15 | |
| └─ inputs: | |
| ├── amount = 1000 ← payload.amount | |
| └── fee = 50 ← db.getFee()</pre></div><div class="feature-card reveal reveal-delay-2"><div class="feature-icon">⚡</div><h3>Race Condition Detection</h3><p>Exhaustively enumerate all interleavings. Find concurrency bugs before production.</p><pre class="feature-code mono">enumerateInterleavings( | |
| [increment, increment], | |
| { initialState: { counter: 0 } } | |
| ) | |
| // Found 2 buggy executions where | |
| // counter === 1 instead of 2</pre></div><div class="feature-card reveal reveal-delay-3"><div class="feature-icon">🎯</div><h3>Zero-Overhead Reactivity</h3><p>Static analysis generates precise binding maps. O(1) DOM updates, no virtual DOM.</p><pre class="feature-code mono">// binding map (computed at build time) | |
| ['count'] → #counter.textContent | |
| ['theme'] → body.className | |
| setState(['count'], 42) | |
| // Only #counter updates. Nothing else.</pre></div><div class="feature-card reveal reveal-delay-4"><div class="feature-icon">🛡️</div><h3>Built for AI Agents</h3><p>Business logic and infrastructure stay separate. AI writes features, you verify safety.</p><pre class="feature-code mono">// AI writes clean async/await | |
| async function updateEmail(db, id, email) { | |
| const user = await db.getUser(id) | |
| await db.saveUser({ ...user, email }) | |
| return { success: true } | |
| } | |
| // You configure infrastructure separately | |
| { retries: 3, concurrency: "serialized" }</pre></div></div></div></section><section id="quickstart" class="quickstart"><div class="container quickstart-content"><div class="quickstart-text reveal"><h2>Up and running in<br/>60 seconds</h2><p>BurritoScript works with your existing TypeScript setup. No config required.</p><div class="quickstart-steps"><div class="step reveal reveal-delay-1"><div class="step-number">1</div><div class="step-text"><strong>Install</strong> the CLI with npm</div></div><div class="step reveal reveal-delay-2"><div class="step-number">2</div><div class="step-text"><strong>Write</strong> your logic in .burrito.ts files</div></div><div class="step reveal reveal-delay-3"><div class="step-number">3</div><div class="step-text"><strong>Run</strong> with superpowers enabled</div></div></div></div><div class="quickstart-terminal reveal reveal-delay-2"><div class="terminal-header"><div class="code-dot"></div><div class="code-dot"></div><div class="code-dot"></div><span class="code-title mono">Terminal</span></div><div class="terminal-body mono"><div class="terminal-line"><span class="comment"># Install</span></div><div class="terminal-line"><span class="prompt">$ </span><span class="cmd">npm install burritoscript</span></div><div class="terminal-line"> </div><div class="terminal-line"><span class="comment"># Run your first effect</span></div><div class="terminal-line"><span class="prompt">$ </span><span class="cmd">npx burrito run my-app.burrito.ts</span></div><div class="terminal-line"> </div><div class="terminal-line"><span class="comment"># Find concurrency bugs</span></div><div class="terminal-line"><span class="prompt">$ </span><span class="cmd">npx burrito interleave my-app.burrito.ts</span></div><div class="terminal-line"> </div></div></div></div></section><section id="philosophy" class="philosophy"><div class="container"><div class="section-header reveal"><h2>Built on solid foundations</h2><p>BurritoScript separates what from how, so you can focus on business logic while the framework handles infrastructure.</p></div><div class="philosophy-content"><div class="philosophy-card reveal reveal-delay-1"><div class="philosophy-icon">📊</div><h3>Effects as Data</h3><p>Your async operations become tangible data structures that can be analyzed, traced, and optimized at build time.</p></div><div class="philosophy-card reveal reveal-delay-2"><div class="philosophy-icon">🔬</div><h3>Static Analysis</h3><p>Find race conditions, N+1 queries, and permission gaps before your code runs. Not with tests—with proofs.</p></div><div class="philosophy-card reveal reveal-delay-3"><div class="philosophy-icon">🤖</div><h3>AI-Native</h3><p>Business logic and infrastructure concerns stay separate, so AI agents can safely modify production code.</p></div></div></div></section><section id="case-study" class="case-study"><div class="container"><div class="section-header reveal"><h2>Case Study: Flash Sale Lottery</h2><p>How BurritoScript solves the impossible: 100 concurrent requests, 10 items, zero race conditions.</p></div><div class="case-study-content"><div class="case-problem reveal reveal-delay-1"><h3>The Problem</h3><p>A flash sale drops 10 limited-edition items. 100 users click "Buy" simultaneously. Traditional approaches fail:</p><ul><li><strong>Race conditions</strong> — Multiple users read "10 in stock" before any writes</li><li><strong>Overselling</strong> — 50 orders placed for 10 items</li><li><strong>Database overload</strong> — 100 reads + 100 writes in milliseconds</li><li><strong>Unfair</strong> — Fastest connection wins, not random chance</li></ul></div><div class="case-diagram reveal reveal-delay-2"><div class="diagram-container"><svg class="system-diagram" viewBox="0 0 600 400" fill="none" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="reqGrad" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#ff6b35"/><stop offset="100%" stop-color="#ff8f5a"/></linearGradient><linearGradient id="batchGrad" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#00d4aa"/><stop offset="100%" stop-color="#00f0c0"/></linearGradient><linearGradient id="dbGrad" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#7c3aed"/><stop offset="100%" stop-color="#a78bfa"/></linearGradient><filter id="glow"><feGaussianBlur stdDeviation="3" result="blur"/><feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g class="requests-group"><text x="60" y="30" fill="#6a6a7a" font-size="12" text-anchor="middle">100 Requests</text><circle cx="40" cy="70" r="12" fill="url(#reqGrad)" opacity="0.9"><animate attributeName="cy" values="70;200;70" dur="3s" repeatCount="indefinite"/></circle><circle cx="60" cy="90" r="12" fill="url(#reqGrad)" opacity="0.8"><animate attributeName="cy" values="90;200;90" dur="3s" begin="0.1s" repeatCount="indefinite"/></circle><circle cx="80" cy="75" r="12" fill="url(#reqGrad)" opacity="0.85"><animate attributeName="cy" values="75;200;75" dur="3s" begin="0.2s" repeatCount="indefinite"/></circle><circle cx="50" cy="110" r="12" fill="url(#reqGrad)" opacity="0.7"><animate attributeName="cy" values="110;200;110" dur="3s" begin="0.15s" repeatCount="indefinite"/></circle><circle cx="70" cy="130" r="12" fill="url(#reqGrad)" opacity="0.75"><animate attributeName="cy" values="130;200;130" dur="3s" begin="0.25s" repeatCount="indefinite"/></circle><text x="60" y="165" fill="#6a6a7a" font-size="10" text-anchor="middle">. . .</text></g><g class="arrow-to-batch"><path d="M100 200 L180 200" stroke="#ff6b35" stroke-width="2" stroke-dasharray="5,5"><animate attributeName="stroke-dashoffset" values="10;0" dur="0.5s" repeatCount="indefinite"/></path><polygon points="175,195 185,200 175,205" fill="#ff6b35"/></g><g class="batch-queue"><rect x="200" y="100" width="200" height="200" rx="16" fill="#12121a" stroke="url(#batchGrad)" stroke-width="2"/><text x="300" y="125" fill="#00d4aa" font-size="14" font-weight="600" text-anchor="middle">BatchQueue</text><rect x="215" y="140" width="170" height="50" rx="8" fill="#1a1a24" stroke="#2a2a3a"/><text x="300" y="158" fill="#6a6a7a" font-size="9" text-anchor="middle">QUEUE (100ms window)</text><text x="300" y="178" fill="#a0a0b0" font-size="11" text-anchor="middle">100 requests waiting...</text><rect x="215" y="200" width="170" height="80" rx="8" fill="#0a0a0f" stroke="#7c3aed"/><text x="300" y="218" fill="#7c3aed" font-size="9" text-anchor="middle">CONSUMER (runs on close)</text><g class="lottery"><circle cx="250" cy="248" r="8" fill="#ff6b35"><animate attributeName="opacity" values="1;0.3;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="275" cy="248" r="8" fill="#00d4aa"><animate attributeName="opacity" values="1;0.3;1" dur="1s" begin="0.2s" repeatCount="indefinite"/></circle><circle cx="300" cy="248" r="8" fill="#ff6b35"><animate attributeName="opacity" values="1;0.3;1" dur="1s" begin="0.4s" repeatCount="indefinite"/></circle><circle cx="325" cy="248" r="8" fill="#00d4aa"><animate attributeName="opacity" values="1;0.3;1" dur="1s" begin="0.6s" repeatCount="indefinite"/></circle><circle cx="350" cy="248" r="8" fill="#ff6b35"><animate attributeName="opacity" values="1;0.3;1" dur="1s" begin="0.8s" repeatCount="indefinite"/></circle><text x="300" y="273" fill="#6a6a7a" font-size="10" text-anchor="middle">→ lotteryResolver()</text></g></g><g class="arrow-to-db"><path d="M420 200 L480 200" stroke="#00d4aa" stroke-width="2" stroke-dasharray="5,5"><animate attributeName="stroke-dashoffset" values="10;0" dur="0.5s" repeatCount="indefinite"/></path><polygon points="475,195 485,200 475,205" fill="#00d4aa"/></g><g class="database"><ellipse cx="540" cy="160" rx="40" ry="15" fill="url(#dbGrad)"/><rect x="500" y="160" width="80" height="60" fill="url(#dbGrad)"/><ellipse cx="540" cy="220" rx="40" ry="15" fill="url(#dbGrad)"/><ellipse cx="540" cy="160" rx="40" ry="15" fill="#1a1a24" opacity="0.3"/><text x="540" y="195" fill="#fff" font-size="12" font-weight="600" text-anchor="middle">DB</text><text x="540" y="250" fill="#6a6a7a" font-size="10" text-anchor="middle">1 atomic write</text></g><g class="results"><text x="300" y="330" fill="#a0a0b0" font-size="12" text-anchor="middle">Results</text><g class="winners"><circle cx="220" cy="360" r="10" fill="#00d4aa"/><text x="220" y="364" fill="#0a0a0f" font-size="10" text-anchor="middle">✓</text><circle cx="245" cy="360" r="10" fill="#00d4aa"/><text x="245" y="364" fill="#0a0a0f" font-size="10" text-anchor="middle">✓</text><circle cx="270" cy="360" r="10" fill="#00d4aa"/><text x="270" y="364" fill="#0a0a0f" font-size="10" text-anchor="middle">✓</text><text x="295" y="364" fill="#6a6a7a" font-size="10">...</text><text x="250" y="390" fill="#00d4aa" font-size="10" text-anchor="middle">10 winners</text></g><g class="losers"><circle cx="340" cy="360" r="10" fill="#3a3a4a"/><text x="340" y="364" fill="#6a6a7a" font-size="10" text-anchor="middle">✗</text><circle cx="365" cy="360" r="10" fill="#3a3a4a"/><text x="365" y="364" fill="#6a6a7a" font-size="10" text-anchor="middle">✗</text><circle cx="390" cy="360" r="10" fill="#3a3a4a"/><text x="390" y="364" fill="#6a6a7a" font-size="10" text-anchor="middle">✗</text><text x="415" y="364" fill="#6a6a7a" font-size="10">...</text><text x="370" y="390" fill="#6a6a7a" font-size="10" text-anchor="middle">90 fair rejections</text></g></g></svg></div></div><div class="case-how-it-works reveal reveal-delay-3"><h3>How It Works: Effect Suspension</h3><p class="how-intro">BurritoService runs a <strong>queue consumer</strong> that collects requests within a time window. When the window closes, your <strong>resolver</strong> runs once with all queued requests. Each original request then <em>resumes</em> with its individual result from the resolver's array.</p><div class="how-steps"><div class="how-step"><div class="how-step-num">1</div><div class="how-step-content"><strong>You write clean async/await</strong><p>Each HTTP request handler is just normal BurritoScript</p><pre class="mono">// purchase.burrito.ts | |
| async function purchase(inventory: Inventory, userId: string) { | |
| return await inventory.purchase({ userId, qty: 1 }) | |
| }</pre></div></div><div class="how-step"><div class="how-step-num">2</div><div class="how-step-content"><strong>Requests enter the queue (100ms window)</strong><p>A queue consumer collects all requests that arrive within the batch window</p><pre class="mono">// BatchQueue config: windowMs = 100 | |
| // | |
| // t=0ms: user-001 arrives → queued | |
| // t=12ms: user-002 arrives → queued | |
| // t=47ms: user-003 arrives → queued | |
| // ...99 more arrive... | |
| // t=100ms: window closes, consumer wakes up</pre></div></div><div class="how-step"><div class="how-step-num">3</div><div class="how-step-content"><strong>Queue consumer invokes your resolver</strong><p>When the window closes, the consumer calls your resolver with ALL queued requests</p><pre class="mono">// Consumer calls your resolver with the batch: | |
| await lotteryResolver([ | |
| { userId: "user-001", qty: 1 }, | |
| { userId: "user-002", qty: 1 }, | |
| // ... 98 more | |
| ]) | |
| // Your resolver returns: [result₁, result₂, ... result₁₀₀]</pre></div></div><div class="how-step"><div class="how-step-num">4</div><div class="how-step-content"><strong>Each await resumes with its result</strong><p>Request 1 gets result[0], Request 2 gets result[1], etc.</p><pre class="mono">// user-001: await returns { success: true, orderId: "..." } | |
| // user-047: await returns { success: false, message: "Sold out" } | |
| // Each HTTP request gets its own response!</pre></div></div></div></div><div class="case-solution reveal reveal-delay-4"><h3>The Result</h3><div class="solution-grid"><div class="solution-item"><div class="solution-icon">📦</div><strong>100 → 1</strong><p>100 requests batched into 1 resolver call</p></div><div class="solution-item"><div class="solution-icon">🎲</div><strong>Fair Lottery</strong><p>Random selection, not fastest-connection-wins</p></div><div class="solution-item"><div class="solution-icon">⚡</div><strong>1 DB Write</strong><p>Single atomic operation, zero race conditions</p></div><div class="solution-item"><div class="solution-icon">✨</div><strong>100 Responses</strong><p>Each user gets their individual answer</p></div></div></div></div></div></section><section class="cta"><div class="container cta-content reveal"><h2>Ready to level up?</h2><p>Join developers building more reliable software with less effort. BurritoScript is open source and free forever.</p><div class="cta-group" style="justify-content: center;"><a class="btn btn-primary" href="https://github.com/burritoscript/burritoscript"><span>→</span> View on GitHub</a><a class="btn btn-secondary" href="#features"><span>📖</span> Read the Docs</a></div></div></section><footer><div class="container"><p>BurritoScript is <a href="https://github.com/burritoscript/burritoscript">open source</a> under the MIT license.</p></div></footer><script>// Scroll reveal animation | |
| const observerOptions = { threshold: 0.1, rootMargin: "0px 0px -50px 0px" }; | |
| const observer = new IntersectionObserver((entries) => { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| entry.target.classList.add("visible"); | |
| } | |
| }); | |
| }, observerOptions); | |
| document.querySelectorAll(".reveal").forEach(el => observer.observe(el)); | |
| // Nav scroll effect | |
| window.addEventListener("scroll", () => { | |
| const nav = document.querySelector("nav"); | |
| if (window.scrollY > 50) { | |
| nav.classList.add("scrolled"); | |
| } else { | |
| nav.classList.remove("scrolled"); | |
| } | |
| }); | |
| // Code tabs with auto-cycling | |
| const tabs = document.querySelectorAll(".code-tab"); | |
| const panels = document.querySelectorAll(".code-panel"); | |
| const panelIds = ["write", "see", "get"]; | |
| let currentPanel = 0; | |
| let autoCycle; | |
| function showPanel(index) { | |
| tabs.forEach(t => t.classList.remove("active")); | |
| panels.forEach(p => p.classList.remove("active")); | |
| tabs[index].classList.add("active"); | |
| panels[index].classList.add("active"); | |
| currentPanel = index; | |
| } | |
| function startAutoCycle() { | |
| autoCycle = setInterval(() => { | |
| showPanel((currentPanel + 1) % 3); | |
| }, 3000); | |
| } | |
| tabs.forEach((tab, i) => { | |
| tab.addEventListener("click", () => { | |
| clearInterval(autoCycle); | |
| showPanel(i); | |
| startAutoCycle(); | |
| }); | |
| }); | |
| // Start auto-cycling after 2s | |
| setTimeout(startAutoCycle, 2000);</script></body></html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment