fix: misc refactors, easings

This commit is contained in:
Austin Pickett
2026-03-11 15:35:40 -04:00
parent 3ac5b42cb6
commit 253f23762b
3 changed files with 358 additions and 231 deletions
+233 -213
View File
@@ -153,17 +153,6 @@
data-platform="linux"
onclick="switchPlatform('linux')"
>
<svg
width="14"
height="14"
viewBox="0 0 24 24"
fill="currentColor"
style="opacity: 0.7"
>
<path
d="M12.504 0c-.155 0-.315.008-.48.021-4.226.333-3.105 4.807-3.17 6.298-.076 1.092-.3 1.953-1.05 3.02-.885 1.051-2.127 2.75-2.716 4.521-.278.832-.41 1.684-.287 2.489a.424.424 0 00-.11.135c-.26.268-.45.6-.663.839-.199.199-.485.267-.797.4-.313.136-.658.269-.864.68-.09.189-.136.394-.132.602 0 .199.027.4.055.536.058.399.116.728.04.97-.249.68-.28 1.145-.106 1.484.174.334.535.47.94.601.81.2 1.91.135 2.774.6.926.466 1.866.67 2.616.47.526-.116.97-.464 1.208-.946.587-.003 1.23-.269 2.26-.334.699-.058 1.574.267 2.577.2.025.134.063.198.114.333l.003.003c.391.778 1.113 1.368 1.884 1.43.39.03.8-.066 1.109-.199.69-.3 1.286-1.006 1.652-1.963.086-.235.188-.479.152-.88-.064-.406-.358-.597-.548-.899-.19-.301-.2-.335-.2-.68 0-.348.076-.664.152-.901.1-.256.233-.478.21-.783l-.003-.003c-.091-.472-.279-.861-.607-1.144-.327-.283-.762-.409-1.032-.433-.18-.04-.33-.063-.44-.143-.12-.09-.21-.29-.19-.543 .029-.272.089-.549.178-.822.188-.57.456-1.128.748-1.633.02-.044.04-.09.06-.133a.205.205 0 00.015-.04c.413-.916.64-1.866.64-2.699 0-1.039-.258-1.904-.608-2.572-.11-.188-.208-.368-.32-.527a.604.604 0 00-.038-.06c-.725-1.05-1.735-1.572-2.74-1.795a6.986 6.986 0 00-1.18-.133h-.005c-.163 0-.32.01-.478.025z"
/>
</svg>
Linux / macOS / WSL
</button>
</div>
@@ -397,160 +386,7 @@ hermes gateway install</code></pre>
</div>
</section>
<section class="section" id="features">
<div class="container">
<div class="section-header">
<h2>Features</h2>
</div>
<div class="features-grid">
<div class="feature-card">
<div class="feature-icon">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<path
d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
/>
</svg>
</div>
<h3>Lives Where You Do</h3>
<p>
Telegram, Discord, Slack, WhatsApp, and CLI from a single gateway
— start on one, pick up on another.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="22 7 13.5 15.5 8.5 10.5 2 17" />
<polyline points="16 7 22 7 22 13" />
</svg>
</div>
<h3>Grows the Longer It Runs</h3>
<p>
Persistent memory and auto-generated skills — it learns your
projects and never forgets how it solved a problem.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="12" cy="12" r="10" />
<polyline points="12 6 12 12 16 14" />
</svg>
</div>
<h3>Scheduled Automations</h3>
<p>
Natural language cron scheduling for reports, backups, and
briefings — running unattended through the gateway.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="18" cy="18" r="3" />
<circle cx="6" cy="6" r="3" />
<path d="M6 21V9a9 9 0 0 0 9 9" />
<path d="M18 3v12a9 9 0 0 1-9-9" />
</svg>
</div>
<h3>Delegates & Parallelizes</h3>
<p>
Isolated subagents with their own conversations, terminals, and
Python RPC scripts for zero-context-cost pipelines.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<rect x="3" y="11" width="18" height="11" rx="2" ry="2" />
<path d="M7 11V7a5 5 0 0 1 10 0v4" />
</svg>
</div>
<h3>Real Sandboxing</h3>
<p>
Five backends — local, Docker, SSH, Singularity, Modal — with
container hardening and namespace isolation.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="12" cy="12" r="10" />
<line x1="2" y1="12" x2="22" y2="12" />
<path
d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"
/>
</svg>
</div>
<h3>Full Web & Browser Control</h3>
<p>
Web search, browser automation, vision, image generation,
text-to-speech, and multi-model reasoning.
</p>
</div>
</div>
</div>
</section>
<!-- Terminal Demo -->
<section class="section section-demo" id="demo">
<div class="container">
<div class="section-header">
@@ -571,69 +407,253 @@ hermes gateway install</code></pre>
</div>
</section>
<section class="section section-specs" id="specs">
<!-- Features + Specs -->
<section class="section" id="features">
<div class="container">
<div class="specs-list">
<div class="spec-row">
<h3 class="spec-label">Tools</h3>
<p class="spec-value">
40+ built-in — web search, terminal, file system, browser
automation, vision, image generation, text-to-speech, code
execution, subagent delegation, memory, task planning, cron
scheduling, multi-model reasoning, and more.
<div class="section-header">
<h2>Features</h2>
</div>
<div class="features-grid">
<div class="feature-card">
<div class="feature-header">
<div class="feature-icon">
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<path
d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
/>
</svg>
</div>
<h3>Lives Where You Do</h3>
</div>
<p>
Telegram, Discord, Slack, WhatsApp, and CLI from a single gateway
— start on one, pick up on another.
</p>
</div>
<div class="spec-row">
<h3 class="spec-label">Platforms</h3>
<p class="spec-value">
Telegram, Discord, Slack, WhatsApp, Signal, Email, and CLI — all
from a single gateway. Connect to
<a
href="https://portal.nousresearch.com"
target="_blank"
rel="noopener"
>Nous Portal</a
>, OpenRouter, or any OpenAI-compatible API.
<div class="feature-card">
<div class="feature-header">
<div class="feature-icon">
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="22 7 13.5 15.5 8.5 10.5 2 17" />
<polyline points="16 7 22 7 22 13" />
</svg>
</div>
<h3>Grows the Longer It Runs</h3>
</div>
<p>
Persistent memory and auto-generated skills — it learns your
projects and never forgets how it solved a problem.
</p>
</div>
<div class="spec-row">
<h3 class="spec-label">Environments</h3>
<p class="spec-value">
Run locally, in Docker, over SSH, on Modal, Daytona, or
Singularity. Container hardening with read-only root, dropped
capabilities, and namespace isolation.
<div class="feature-card">
<div class="feature-header">
<div class="feature-icon">
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="12" cy="12" r="10" />
<polyline points="12 6 12 12 16 14" />
</svg>
</div>
<h3>Scheduled Automations</h3>
</div>
<p>
Natural language cron scheduling for reports, backups, and
briefings — running unattended through the gateway.
</p>
</div>
<div class="spec-row">
<h3 class="spec-label">Skills</h3>
<p class="spec-value">
40+ bundled skills covering MLOps, GitHub workflows, research, and
more. The agent creates new skills on the fly and shares them via
the open
<a href="https://agentskills.io" target="_blank" rel="noopener"
>agentskills.io</a
>
format. Install community skills from
<a href="https://clawhub.ai" target="_blank" rel="noopener"
>ClawHub</a
>,
<a href="https://lobehub.com" target="_blank" rel="noopener"
>LobeHub</a
>, and GitHub.
<div class="feature-card">
<div class="feature-header">
<div class="feature-icon">
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="18" cy="18" r="3" />
<circle cx="6" cy="6" r="3" />
<path d="M6 21V9a9 9 0 0 0 9 9" />
<path d="M18 3v12a9 9 0 0 1-9-9" />
</svg>
</div>
<h3>Delegates & Parallelizes</h3>
</div>
<p>
Isolated subagents with their own conversations, terminals, and
Python RPC scripts for zero-context-cost pipelines.
</p>
</div>
<div class="spec-row">
<h3 class="spec-label">Research</h3>
<p class="spec-value">
Batch trajectory generation with parallel workers and
checkpointing. Atropos integration for RL training. Export to
ShareGPT for fine-tuning with trajectory compression.
<div class="feature-card">
<div class="feature-header">
<div class="feature-icon">
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<rect x="3" y="11" width="18" height="11" rx="2" ry="2" />
<path d="M7 11V7a5 5 0 0 1 10 0v4" />
</svg>
</div>
<h3>Real Sandboxing</h3>
</div>
<p>
Five backends — local, Docker, SSH, Singularity, Modal — with
container hardening and namespace isolation.
</p>
</div>
<div class="feature-card">
<div class="feature-header">
<div class="feature-icon">
<svg
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="12" cy="12" r="10" />
<line x1="2" y1="12" x2="22" y2="12" />
<path
d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"
/>
</svg>
</div>
<h3>Full Web & Browser Control</h3>
</div>
<p>
Web search, browser automation, vision, image generation,
text-to-speech, and multi-model reasoning.
</p>
</div>
</div>
<div class="features-more">
<button class="more-toggle" onclick="toggleSpecs()" id="specs-toggle">
<span class="toggle-label">More details</span>
<svg
class="more-chevron"
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="6 9 12 15 18 9" />
</svg>
</button>
</div>
<div class="specs-wrapper" id="specs-wrapper">
<div class="specs-list">
<div class="spec-row">
<h3 class="spec-label">Tools</h3>
<p class="spec-value">
40+ built-in — web search, terminal, file system, browser
automation, vision, image generation, text-to-speech, code
execution, subagent delegation, memory, task planning, cron
scheduling, multi-model reasoning, and more.
</p>
</div>
<div class="spec-row">
<h3 class="spec-label">Platforms</h3>
<p class="spec-value">
Telegram, Discord, Slack, WhatsApp, Signal, Email, and CLI — all
from a single gateway. Connect to
<a
href="https://portal.nousresearch.com"
target="_blank"
rel="noopener"
>Nous Portal</a
>, OpenRouter, or any OpenAI-compatible API.
</p>
</div>
<div class="spec-row">
<h3 class="spec-label">Environments</h3>
<p class="spec-value">
Run locally, in Docker, over SSH, on Modal, Daytona, or
Singularity. Container hardening with read-only root, dropped
capabilities, and namespace isolation.
</p>
</div>
<div class="spec-row">
<h3 class="spec-label">Skills</h3>
<p class="spec-value">
40+ bundled skills covering MLOps, GitHub workflows, research,
and more. The agent creates new skills on the fly and shares
them via the open
<a href="https://agentskills.io" target="_blank" rel="noopener"
>agentskills.io</a
>
format. Install community skills from
<a href="https://clawhub.ai" target="_blank" rel="noopener"
>ClawHub</a
>,
<a href="https://lobehub.com" target="_blank" rel="noopener"
>LobeHub</a
>, and GitHub.
</p>
</div>
<div class="spec-row">
<h3 class="spec-label">Research</h3>
<p class="spec-value">
Batch trajectory generation with parallel workers and
checkpointing. Atropos integration for RL training. Export to
ShareGPT for fine-tuning with trajectory compression.
</p>
</div>
</div>
</div>
</div>
</section>
+32 -1
View File
@@ -62,6 +62,37 @@ function toggleMobileNav() {
document.getElementById("nav-mobile").classList.toggle("open");
}
function toggleSpecs() {
const wrapper = document.getElementById("specs-wrapper");
const btn = document.getElementById("specs-toggle");
const label = btn.querySelector(".toggle-label");
const isOpen = wrapper.classList.contains("open");
if (isOpen) {
wrapper.style.maxHeight = wrapper.scrollHeight + "px";
requestAnimationFrame(() => {
wrapper.style.maxHeight = "0";
});
wrapper.classList.remove("open");
btn.classList.remove("open");
if (label) label.textContent = "More details";
} else {
wrapper.classList.add("open");
wrapper.style.maxHeight = wrapper.scrollHeight + "px";
btn.classList.add("open");
if (label) label.textContent = "Less";
wrapper.addEventListener(
"transitionend",
() => {
if (wrapper.classList.contains("open")) {
wrapper.style.maxHeight = "none";
}
},
{ once: true }
);
}
}
// --- Copy to clipboard ---
function copyInstall() {
const text = document.getElementById("install-command").textContent;
@@ -93,7 +124,7 @@ function copyText(btn) {
// --- Scroll-triggered fade-in ---
function initScrollAnimations() {
const elements = document.querySelectorAll(
".feature-card, .spec-row, .install-step, " +
".feature-card, .install-step, " +
".section-header, .terminal-window",
);
+93 -17
View File
@@ -28,6 +28,27 @@
--container: 1080px;
--radius: 12px;
--radius-sm: 8px;
--ease-in-quad: cubic-bezier(.55, .085, .68, .53);
--ease-in-cubic: cubic-bezier(.550, .055, .675, .19);
--ease-in-quart: cubic-bezier(.895, .03, .685, .22);
--ease-in-quint: cubic-bezier(.755, .05, .855, .06);
--ease-in-expo: cubic-bezier(.95, .05, .795, .035);
--ease-in-circ: cubic-bezier(.6, .04, .98, .335);
--ease-out-quad: cubic-bezier(.25, .46, .45, .94);
--ease-out-cubic: cubic-bezier(.215, .61, .355, 1);
--ease-out-quart: cubic-bezier(.165, .84, .44, 1);
--ease-out-quint: cubic-bezier(.23, 1, .32, 1);
--ease-out-expo: cubic-bezier(.19, 1, .22, 1);
--ease-out-circ: cubic-bezier(.075, .82, .165, 1);
--ease-in-out-quad: cubic-bezier(.455, .03, .515, .955);
--ease-in-out-cubic: cubic-bezier(.645, .045, .355, 1);
--ease-in-out-quart: cubic-bezier(.77, 0, .175, 1);
--ease-in-out-quint: cubic-bezier(.86, 0, .07, 1);
--ease-in-out-expo: cubic-bezier(1, 0, 0, 1);
--ease-in-out-circ: cubic-bezier(.785, .135, .15, .86);
}
html {
@@ -52,7 +73,7 @@ body {
a {
color: var(--primary);
text-decoration: none;
transition: color 0.2s;
transition: color 0.2s var(--ease-out-quad);
}
a:hover {
color: var(--primary-light);
@@ -137,6 +158,7 @@ strong {
color: var(--text);
font-weight: 600;
font-size: 15px;
transition: color 0.2s var(--ease-out-quad);
}
.nav-logo:hover { color: var(--primary-light); }
@@ -165,7 +187,7 @@ strong {
display: flex;
align-items: center;
gap: 4px;
transition: color 0.2s;
transition: color 0.2s var(--ease-out-quad);
}
.nav-links a:hover { color: #fff; }
@@ -205,6 +227,7 @@ strong {
font-size: 15px;
font-weight: 500;
padding: 4px 0;
transition: color 0.2s var(--ease-out-quad);
}
.nav-mobile a:hover {
@@ -265,7 +288,7 @@ strong {
text-align: center;
text-shadow: 0 0 20px rgba(48, 80, 255, 0.3);
opacity: 0.85;
transition: opacity 0.3s;
transition: opacity 0.3s var(--ease-out-cubic);
overflow-x: auto;
white-space: pre;
}
@@ -310,7 +333,7 @@ strong {
border: 1px solid var(--border);
border-radius: var(--radius);
overflow: hidden;
transition: border-color 0.3s;
transition: border-color 0.3s var(--ease-out-quad);
}
.install-widget:hover {
@@ -355,7 +378,7 @@ strong {
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
transition: color 0.2s var(--ease-out-quad), background 0.2s var(--ease-out-quad);
background: transparent;
color: var(--text-muted);
}
@@ -398,7 +421,7 @@ strong {
overflow: hidden;
text-overflow: ellipsis;
text-align: left;
transition: opacity 0.15s;
transition: opacity 0.15s var(--ease-out-quad);
}
/* --- Code block tabs (install step section) --- */
@@ -415,7 +438,7 @@ strong {
font-size: 11px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
transition: color 0.2s var(--ease-out-quad), background 0.2s var(--ease-out-quad);
background: transparent;
color: var(--text-muted);
}
@@ -443,7 +466,7 @@ strong {
border-radius: 6px;
font-family: var(--font-sans);
font-size: 12px;
transition: all 0.2s;
transition: color 0.2s var(--ease-out-quad), background 0.2s var(--ease-out-quad);
}
.copy-btn:hover {
color: var(--primary-light);
@@ -471,7 +494,7 @@ strong {
border-radius: var(--radius);
font-size: 14px;
font-weight: 550;
transition: all 0.25s;
transition: background 0.25s var(--ease-out-quint), border-color 0.25s var(--ease-out-quad), color 0.2s var(--ease-out-quad), transform 0.25s var(--ease-out-quint);
border: 1px solid transparent;
}
@@ -530,7 +553,7 @@ strong {
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 20px;
transition: all 0.3s;
transition: border-color 0.3s var(--ease-out-quad), background 0.3s var(--ease-out-quad), transform 0.3s var(--ease-out-quint);
}
.feature-card:hover {
@@ -539,17 +562,23 @@ strong {
transform: translateY(-2px);
}
.feature-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
}
.feature-icon {
margin-bottom: 16px;
color: var(--primary-light);
opacity: 0.85;
flex-shrink: 0;
}
.feature-card h3 {
font-size: 16px;
font-size: 15px;
font-weight: 600;
color: #fff;
margin-bottom: 10px;
letter-spacing: -0.01em;
}
@@ -562,6 +591,8 @@ strong {
/* --- Terminal Demo --- */
.section-demo {
padding-bottom: 60px;
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
.terminal-window {
@@ -635,14 +666,59 @@ strong {
.t-highlight { color: #90B0FF; }
.t-tool { color: var(--text-muted); }
/* --- Specs Toggle --- */
.features-more {
text-align: center;
margin-top: 32px;
}
.more-toggle {
background: none;
border: 1px solid var(--border);
color: var(--text-dim);
font-size: 14px;
font-family: inherit;
padding: 8px 20px;
border-radius: 6px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 6px;
transition: color 0.2s var(--ease-out-quad), border-color 0.2s var(--ease-out-quad);
}
.more-toggle:hover {
color: var(--primary-light);
border-color: var(--primary-light);
}
.more-chevron {
transition: transform 0.3s var(--ease-in-out-cubic);
}
.more-toggle.open .more-chevron {
transform: rotate(180deg);
}
.specs-wrapper {
max-height: 0;
overflow: hidden;
transition: max-height 0.4s var(--ease-out-quart), opacity 0.3s var(--ease-out-quad);
opacity: 0;
}
.specs-wrapper.open {
opacity: 1;
}
/* --- Specs --- */
.section-specs {
border-top: 1px solid var(--border);
}
.specs-list {
max-width: 720px;
margin: 0 auto;
padding-top: 24px;
}
.spec-row {
@@ -673,7 +749,7 @@ strong {
.spec-value a {
color: var(--text);
border-bottom: 1px solid var(--border-hover);
transition: border-color 0.2s, color 0.2s;
transition: border-color 0.2s var(--ease-out-quad), color 0.2s var(--ease-out-quad);
}
.spec-value a:hover {
@@ -807,7 +883,7 @@ strong {
.footer-copy a {
color: var(--text-dim);
transition: color 0.2s;
transition: color 0.2s var(--ease-out-quad);
}
.footer-copy a:hover {
@@ -818,7 +894,7 @@ strong {
.fade-in {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.6s ease, transform 0.6s ease;
transition: opacity 0.6s var(--ease-out-quart), transform 0.6s var(--ease-out-quart);
}
.fade-in.visible {