Rework website palette, copy, and theme support

- Align color palette with TUI Everforest theme (feynman.json)
- Rewrite homepage copy with sharper section headings and descriptions
- Fix dark/light theme toggle persistence across page navigation
- Add Shiki Everforest syntax themes for code blocks
- Fix copy-code button z-index and pointer events
- Add styled scrollbars and text selection colors
- Tighten hero image padding, remove unused public/hero.png
- Remove Modal/RunPod from site (Docker only for now)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Advait Paliwal
2026-03-24 14:42:03 -07:00
parent e651cb1f9b
commit 7d3fbc3f6b
6 changed files with 117 additions and 73 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 MiB

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 MiB

View File

@@ -13,21 +13,41 @@
var stored = localStorage.getItem('theme'); var stored = localStorage.getItem('theme');
var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
var dark = stored === 'dark' || (!stored && prefersDark); var dark = stored === 'dark' || (!stored && prefersDark);
if (dark) document.documentElement.classList.add('dark'); if (dark) {
function update() { document.documentElement.classList.add('dark');
var isDark = document.documentElement.classList.contains('dark'); } else {
document.getElementById('sun-icon').style.display = isDark ? 'block' : 'none'; document.documentElement.classList.remove('dark');
document.getElementById('moon-icon').style.display = isDark ? 'none' : 'block';
} }
update();
document.addEventListener('DOMContentLoaded', function() { function updateIcons() {
update(); var isDark = document.documentElement.classList.contains('dark');
document.getElementById('theme-toggle').addEventListener('click', function() { var sun = document.getElementById('sun-icon');
var moon = document.getElementById('moon-icon');
if (sun) sun.style.display = isDark ? 'block' : 'none';
if (moon) moon.style.display = isDark ? 'none' : 'block';
}
function bindToggle() {
var btn = document.getElementById('theme-toggle');
if (btn && !btn._bound) {
btn._bound = true;
btn.addEventListener('click', function() {
document.documentElement.classList.toggle('dark'); document.documentElement.classList.toggle('dark');
var isDark = document.documentElement.classList.contains('dark'); var isDark = document.documentElement.classList.contains('dark');
localStorage.setItem('theme', isDark ? 'dark' : 'light'); localStorage.setItem('theme', isDark ? 'dark' : 'light');
update(); updateIcons();
}); });
}
}
updateIcons();
document.addEventListener('DOMContentLoaded', function() {
updateIcons();
bindToggle();
});
document.addEventListener('astro:after-swap', function() {
updateIcons();
bindToggle();
}); });
})(); })();
</script> </script>

View File

@@ -37,8 +37,11 @@ const { title, description = 'Research-first AI agent', active = 'home' } = Astr
document.addEventListener('astro:after-swap', function() { document.addEventListener('astro:after-swap', function() {
var stored = localStorage.getItem('theme'); var stored = localStorage.getItem('theme');
var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; var prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (stored === 'dark' || (!stored && prefersDark)) { var shouldBeDark = stored === 'dark' || (!stored && prefersDark);
if (shouldBeDark) {
document.documentElement.classList.add('dark'); document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
} }
var isDark = document.documentElement.classList.contains('dark'); var isDark = document.documentElement.classList.contains('dark');
var sun = document.getElementById('sun-icon'); var sun = document.getElementById('sun-icon');

View File

@@ -1,14 +1,13 @@
--- ---
import Base from '../layouts/Base.astro'; import Base from '../layouts/Base.astro';
import AsciiLogo from '../components/AsciiLogo.astro';
--- ---
<Base title="Feynman — The open source AI research agent" active="home"> <Base title="Feynman — The open source AI research agent" active="home">
<section class="text-center pt-24 pb-20 px-6"> <section class="text-center pt-24 pb-20 px-6">
<div class="max-w-2xl mx-auto"> <div class="max-w-2xl mx-auto">
<h1 class="text-5xl sm:text-6xl font-bold tracking-tight mb-6" style="text-wrap: balance">The open source AI research agent</h1> <h1 class="text-5xl sm:text-6xl font-bold tracking-tight mb-6" style="text-wrap: balance">Research from the command line</h1>
<p class="text-lg text-text-muted mb-10 leading-relaxed" style="text-wrap: pretty">Investigate topics, write papers, run experiments, review research, audit codebases &mdash; every output cited and source-grounded</p> <p class="text-lg text-text-muted mb-10 leading-relaxed" style="text-wrap: pretty">Feynman reads papers, searches the web, writes drafts, runs experiments, and cites every claim. Open source. Runs locally.</p>
<button id="copy-btn" class="group inline-flex items-center justify-between gap-3 bg-surface rounded-lg px-5 py-3 mb-8 font-mono text-sm hover:border-accent/40 hover:text-accent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent rounded-lg border border-border max-w-full" aria-label="Copy install command"> <button id="copy-btn" class="group inline-flex items-center justify-between gap-3 bg-surface rounded-lg px-5 py-3 mb-8 font-mono text-sm border border-border hover:border-accent/40 hover:text-accent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent max-w-full" aria-label="Copy install command">
<code class="text-accent text-left">curl -fsSL https://feynman.is/install | bash</code> <code class="text-accent text-left">curl -fsSL https://feynman.is/install | bash</code>
<span id="copy-icon" class="shrink-0 text-text-dim group-hover:text-accent transition-colors" aria-hidden="true"> <span id="copy-icon" class="shrink-0 text-text-dim group-hover:text-accent transition-colors" aria-hidden="true">
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" /><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" /></svg> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" /><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" /></svg>
@@ -26,62 +25,63 @@ import AsciiLogo from '../components/AsciiLogo.astro';
<section class="py-20 px-6"> <section class="py-20 px-6">
<div class="max-w-5xl mx-auto"> <div class="max-w-5xl mx-auto">
<h2 class="text-2xl font-bold text-center mb-12">What you type &rarr; what happens</h2> <h2 class="text-2xl font-bold text-center mb-4">Ask a question, get a cited answer</h2>
<div class="bg-surface rounded-xl p-6 font-mono text-sm leading-loose max-w-2xl mx-auto"> <p class="text-center text-text-muted mb-12 max-w-xl mx-auto">Feynman dispatches research agents that search papers, crawl the web, and synthesize findings with inline citations back to the source.</p>
<div class="bg-surface rounded-xl p-6 font-mono text-sm leading-loose max-w-2xl mx-auto border border-border">
<div class="flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> "what do we know about scaling laws"</span></div> <div class="flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> "what do we know about scaling laws"</span></div>
<div class="text-text-dim mt-1 ml-6 text-xs">Searches papers and web, produces a cited research brief</div> <div class="text-text-dim mt-1 ml-6 text-xs">Searches papers and web, produces a cited research brief</div>
<div class="mt-4 flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> deepresearch "mechanistic interpretability"</span></div> <div class="mt-4 flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> deepresearch "mechanistic interpretability"</span></div>
<div class="text-text-dim mt-1 ml-6 text-xs">Multi-agent investigation with parallel researchers, synthesis, verification</div> <div class="text-text-dim mt-1 ml-6 text-xs">Multi-agent deep dive with parallel researchers, synthesis, and verification</div>
<div class="mt-4 flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> lit "RLHF alternatives"</span></div> <div class="mt-4 flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> lit "RLHF alternatives"</span></div>
<div class="text-text-dim mt-1 ml-6 text-xs">Literature review with consensus, disagreements, open questions</div> <div class="text-text-dim mt-1 ml-6 text-xs">Literature review covering consensus, disagreements, and open questions</div>
<div class="mt-4 flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> audit 2401.12345</span></div> <div class="mt-4 flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> audit 2401.12345</span></div>
<div class="text-text-dim mt-1 ml-6 text-xs">Compares paper claims against the public codebase</div> <div class="text-text-dim mt-1 ml-6 text-xs">Compares paper claims against the public codebase</div>
<div class="mt-4 flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> replicate "chain-of-thought improves math"</span></div> <div class="mt-4 flex gap-4"><span class="text-text-dim shrink-0">$</span><span><span class="text-accent">feynman</span> replicate "chain-of-thought improves math"</span></div>
<div class="text-text-dim mt-1 ml-6 text-xs">Asks where to run, then builds a replication plan</div> <div class="text-text-dim mt-1 ml-6 text-xs">Builds a replication plan, picks a compute target, runs the experiment</div>
</div> </div>
</div> </div>
</section> </section>
<section class="py-20 px-6"> <section class="py-20 px-6">
<div class="max-w-5xl mx-auto"> <div class="max-w-5xl mx-auto">
<h2 class="text-2xl font-bold text-center mb-12">Workflows</h2> <h2 class="text-2xl font-bold text-center mb-4">Workflows</h2>
<p class="text-center text-text-muted mb-10">Ask naturally or use slash commands as shortcuts.</p> <p class="text-center text-text-muted mb-10 max-w-xl mx-auto">Structured research workflows you can trigger with a slash command or just ask for in natural language.</p>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 max-w-4xl mx-auto"> <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 max-w-4xl mx-auto">
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/deepresearch</div> <div class="font-mono text-sm text-accent mb-2">/deepresearch</div>
<p class="text-sm text-text-muted">Source-heavy multi-agent investigation</p> <p class="text-sm text-text-muted">Multi-agent investigation across papers, web, and code</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/lit</div> <div class="font-mono text-sm text-accent mb-2">/lit</div>
<p class="text-sm text-text-muted">Literature review from paper search and primary sources</p> <p class="text-sm text-text-muted">Literature review from primary sources with consensus mapping</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/review</div> <div class="font-mono text-sm text-accent mb-2">/review</div>
<p class="text-sm text-text-muted">Simulated peer review with severity and revision plan</p> <p class="text-sm text-text-muted">Simulated peer review with severity scores and a revision plan</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/audit</div> <div class="font-mono text-sm text-accent mb-2">/audit</div>
<p class="text-sm text-text-muted">Paper vs. codebase mismatch audit</p> <p class="text-sm text-text-muted">Check paper claims against what the code actually does</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/replicate</div> <div class="font-mono text-sm text-accent mb-2">/replicate</div>
<p class="text-sm text-text-muted">Replication plan with environment selection</p> <p class="text-sm text-text-muted">Design and run a replication in a sandboxed Docker container</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/compare</div> <div class="font-mono text-sm text-accent mb-2">/compare</div>
<p class="text-sm text-text-muted">Source comparison matrix</p> <p class="text-sm text-text-muted">Side-by-side source comparison with agreement and conflict matrix</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/draft</div> <div class="font-mono text-sm text-accent mb-2">/draft</div>
<p class="text-sm text-text-muted">Paper-style draft from research findings</p> <p class="text-sm text-text-muted">Turn research findings into a polished paper-style draft</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/autoresearch</div> <div class="font-mono text-sm text-accent mb-2">/autoresearch</div>
<p class="text-sm text-text-muted">Autonomous experiment loop</p> <p class="text-sm text-text-muted">Hypothesis &rarr; experiment &rarr; measure &rarr; repeat</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-mono text-sm text-accent mb-2">/watch</div> <div class="font-mono text-sm text-accent mb-2">/watch</div>
<p class="text-sm text-text-muted">Recurring research watch</p> <p class="text-sm text-text-muted">Recurring monitor for new papers, code, or product updates</p>
</div> </div>
</div> </div>
</div> </div>
@@ -89,24 +89,24 @@ import AsciiLogo from '../components/AsciiLogo.astro';
<section class="py-20 px-6"> <section class="py-20 px-6">
<div class="max-w-5xl mx-auto"> <div class="max-w-5xl mx-auto">
<h2 class="text-2xl font-bold text-center mb-12">Agents</h2> <h2 class="text-2xl font-bold text-center mb-4">Agents that do the work</h2>
<p class="text-center text-text-muted mb-10">Four bundled research agents, dispatched automatically.</p> <p class="text-center text-text-muted mb-10 max-w-xl mx-auto">Feynman dispatches specialized agents behind the scenes. You ask a question &mdash; the right team assembles.</p>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4"> <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<div class="bg-surface rounded-xl p-6 text-center"> <div class="bg-surface rounded-xl p-6 text-center border border-border">
<div class="font-semibold text-accent mb-2">Researcher</div> <div class="font-semibold text-accent mb-2">Researcher</div>
<p class="text-sm text-text-muted">Gathers evidence across papers, web, repos, and docs</p> <p class="text-sm text-text-muted">Hunts for evidence across papers, the web, repos, and docs</p>
</div> </div>
<div class="bg-surface rounded-xl p-6 text-center"> <div class="bg-surface rounded-xl p-6 text-center border border-border">
<div class="font-semibold text-accent mb-2">Reviewer</div> <div class="font-semibold text-accent mb-2">Reviewer</div>
<p class="text-sm text-text-muted">Simulated peer review with severity-graded feedback</p> <p class="text-sm text-text-muted">Grades claims by severity, flags gaps, and suggests revisions</p>
</div> </div>
<div class="bg-surface rounded-xl p-6 text-center"> <div class="bg-surface rounded-xl p-6 text-center border border-border">
<div class="font-semibold text-accent mb-2">Writer</div> <div class="font-semibold text-accent mb-2">Writer</div>
<p class="text-sm text-text-muted">Structured briefs and drafts from research notes</p> <p class="text-sm text-text-muted">Structures notes into briefs, drafts, and paper-style output</p>
</div> </div>
<div class="bg-surface rounded-xl p-6 text-center"> <div class="bg-surface rounded-xl p-6 text-center border border-border">
<div class="font-semibold text-accent mb-2">Verifier</div> <div class="font-semibold text-accent mb-2">Verifier</div>
<p class="text-sm text-text-muted">Inline citations and source URL verification</p> <p class="text-sm text-text-muted">Checks every citation, verifies URLs, removes dead links</p>
</div> </div>
</div> </div>
</div> </div>
@@ -114,25 +114,18 @@ import AsciiLogo from '../components/AsciiLogo.astro';
<section class="py-20 px-6"> <section class="py-20 px-6">
<div class="max-w-5xl mx-auto"> <div class="max-w-5xl mx-auto">
<h2 class="text-2xl font-bold text-center mb-12">Tools</h2> <h2 class="text-2xl font-bold text-center mb-4">Sources</h2>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4 max-w-3xl mx-auto"> <p class="text-center text-text-muted mb-10 max-w-xl mx-auto">Where Feynman finds information and what it uses to build answers.</p>
<div class="bg-surface rounded-xl p-5"> <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 max-w-4xl mx-auto">
<div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-semibold mb-1"><a href="https://www.alphaxiv.org/" class="text-accent hover:underline">AlphaXiv</a></div> <div class="font-semibold mb-1"><a href="https://www.alphaxiv.org/" class="text-accent hover:underline">AlphaXiv</a></div>
<p class="text-sm text-text-muted">Paper search, Q&A, code reading, persistent annotations</p> <p class="text-sm text-text-muted">Paper search, Q&A, code reading, and persistent annotations</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-semibold mb-1"><a href="https://www.docker.com/" class="text-accent hover:underline">Docker</a></div>
<p class="text-sm text-text-muted">Isolated container execution for safe local experiments</p>
</div>
<div class="bg-surface rounded-xl p-5">
<div class="font-semibold mb-1">Web search</div> <div class="font-semibold mb-1">Web search</div>
<p class="text-sm text-text-muted">Gemini or Perplexity, zero-config default</p> <p class="text-sm text-text-muted">Gemini or Perplexity, zero-config by default</p>
</div> </div>
<div class="bg-surface rounded-xl p-5"> <div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-semibold mb-1">Session search</div>
<p class="text-sm text-text-muted">Indexed recall across prior research sessions</p>
</div>
<div class="bg-surface rounded-xl p-5">
<div class="font-semibold mb-1">Preview</div> <div class="font-semibold mb-1">Preview</div>
<p class="text-sm text-text-muted">Browser and PDF export of generated artifacts</p> <p class="text-sm text-text-muted">Browser and PDF export of generated artifacts</p>
</div> </div>
@@ -140,6 +133,19 @@ import AsciiLogo from '../components/AsciiLogo.astro';
</div> </div>
</section> </section>
<section class="py-20 px-6">
<div class="max-w-5xl mx-auto">
<h2 class="text-2xl font-bold text-center mb-4">Compute</h2>
<p class="text-center text-text-muted mb-10 max-w-xl mx-auto">Experiments run in sandboxed Docker containers on your machine. Your code stays local.</p>
<div class="grid grid-cols-1 gap-4 max-w-md mx-auto">
<div class="bg-surface rounded-xl p-5 border border-border">
<div class="font-semibold mb-1"><a href="https://www.docker.com/" class="text-accent hover:underline">Docker</a></div>
<p class="text-sm text-text-muted">Isolated container execution for safe local experiments</p>
</div>
</div>
</div>
</section>
<section class="py-20 px-6 text-center"> <section class="py-20 px-6 text-center">
<div class="max-w-xl mx-auto"> <div class="max-w-xl mx-auto">
<p class="text-text-muted mb-6">Built on <a href="https://github.com/badlogic/pi-mono" class="text-accent hover:underline">Pi</a> and <a href="https://www.alphaxiv.org/" class="text-accent hover:underline">alphaXiv</a>. MIT licensed. Open source.</p> <p class="text-text-muted mb-6">Built on <a href="https://github.com/badlogic/pi-mono" class="text-accent hover:underline">Pi</a> and <a href="https://www.alphaxiv.org/" class="text-accent hover:underline">alphaXiv</a>. MIT licensed. Open source.</p>

View File

@@ -111,32 +111,35 @@ body {
padding: 0; padding: 0;
} }
.copy-code { .prose pre .copy-code {
all: unset;
position: absolute; position: absolute;
top: 0.75rem; top: 0.75rem;
right: 0.75rem; right: 0.75rem;
z-index: 10;
display: grid; display: grid;
place-items: center; place-items: center;
width: 28px; width: 28px;
height: 28px; height: 28px;
padding: 0;
margin: 0;
border: none;
border-radius: 0.25rem; border-radius: 0.25rem;
color: var(--color-text-dim); color: var(--color-text-dim);
background: var(--color-surface-2); background: var(--color-surface-2);
opacity: 0; opacity: 0;
transition: opacity 0.15s, color 0.15s; transition: opacity 0.15s, color 0.15s;
cursor: pointer; cursor: pointer;
pointer-events: auto;
} }
pre:hover .copy-code { .prose pre:hover .copy-code {
opacity: 1; opacity: 1;
} }
.copy-code:hover { .prose pre .copy-code:hover {
color: var(--color-accent); color: var(--color-accent);
} }
.prose table { .prose table {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
@@ -225,6 +228,18 @@ pre:hover .copy-code {
color: var(--color-text); color: var(--color-text);
} }
.dark .astro-code {
background-color: var(--shiki-dark-bg) !important;
}
.dark .astro-code code span {
color: var(--shiki-dark) !important;
background-color: var(--shiki-dark-bg) !important;
font-style: var(--shiki-dark-font-style) !important;
font-weight: var(--shiki-dark-font-weight) !important;
text-decoration: var(--shiki-dark-text-decoration) !important;
}
.agent-entry { .agent-entry {
background-color: var(--color-surface); background-color: var(--color-surface);
border-radius: 0.75rem; border-radius: 0.75rem;