site: houndav.com is live, and the install commands on it work
Phase 7's first half. A single self-contained page — no build step, no framework, no dependencies — deployed to /srv/houndav/www and serving. Downloads published to dl.houndav.com, and both install commands on the page were run end to end from those public URLs before this commit. The positioning is the one the product actually earns. It does not lead with "antivirus", because at $89.95 that reads expensive next to ESET at $40 and cheap next to JetBrains at $169 — and because the claim would be wrong. It leads with the fact that turned out to be the whole thesis: 97% of npm's OSV records are malicious packages, not vulnerabilities. Alongside 235,577 indicators, 2 ms to refuse a binary at execve, and 0.8 ms added to a normal program starting. Every number on that page is measured, and every one of them appears in a commit message here. Themes: light is the bare :root, dark is layered twice — once for the un-stamped "follow the system" state via prefers-color-scheme, once for an explicit [data-theme="dark"] — so all three of auto/light/dark resolve as complete sets rather than half a palette. The toggle persists to localStorage inside try/catch, because a private window throws on access and a theme switch must not take the page down with it. The sticky header now sets an opaque background BEFORE the color-mix and backdrop-filter enhancement, behind @supports. A sticky header that falls back to transparent puts scrolling content underneath the navigation, which is worse than having no blur at all. WHAT I COULD NOT VERIFY, and it matters: the browser available to me renders with CSS disabled — document.styleSheets.length is 0 with the <style> element present, every computed style comes back unset and every font resolves to Times. So I have confirmed the bytes are served correctly, the CSS parses (balanced braces, no unterminated comments, no undefined custom properties, no missing semicolons), the HTML tags balance, the viewport meta is present and there are eight responsive breakpoints — but I have NOT SEEN THIS PAGE. Somebody with eyes should look before it is advertised anywhere. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
43e3d37b55
commit
fe49518383
1 changed files with 614 additions and 0 deletions
614
site/index.html
Normal file
614
site/index.html
Normal file
|
|
@ -0,0 +1,614 @@
|
|||
<!doctype html>
|
||||
<html lang="en" data-theme="auto">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Hound — endpoint and supply-chain security for Linux</title>
|
||||
<meta name="description" content="Hound blocks a binary before it runs and reads your lockfiles against 235,577 packages that exist only to be malware. Open source agent, Linux-native, built for people who ship software.">
|
||||
<link rel="icon" href="/icons/app-32.png" type="image/png">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;600;700&family=IBM+Plex+Sans:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap">
|
||||
<style>
|
||||
/* ── tokens ──────────────────────────────────────────────────────────
|
||||
Light is the bare :root, dark is layered over it twice — once for the
|
||||
un-stamped "follow the system" state, once for an explicit choice —
|
||||
so all three of auto/light/dark resolve as a complete set. */
|
||||
:root {
|
||||
--bg: #F7F7FB;
|
||||
--raised: #FFFFFF;
|
||||
--panel: #FFFFFF;
|
||||
--line: #E2E2EC;
|
||||
--line-hi: #C9C9DA;
|
||||
--fg: #14141C;
|
||||
--dim: #55556B;
|
||||
--faint: #8A8AA0;
|
||||
--brand: #5A58C8;
|
||||
--brand-dim: #7B79D8;
|
||||
--on-brand: #FFFFFF;
|
||||
--ok: #147A3D;
|
||||
--warn: #9A6100;
|
||||
--bad: #C22222;
|
||||
--code-bg: #F0F0F7;
|
||||
--shadow: 0 1px 2px rgb(20 20 28 / .06), 0 8px 24px rgb(20 20 28 / .05);
|
||||
--term-bg: #0B0E14;
|
||||
--term-fg: #E8ECF4;
|
||||
--term-dim: #8B96AB;
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root:not([data-theme="light"]) {
|
||||
--bg: #0B0E14;
|
||||
--raised: #12161F;
|
||||
--panel: #161B26;
|
||||
--line: #232B3A;
|
||||
--line-hi: #32405A;
|
||||
--fg: #E8ECF4;
|
||||
--dim: #8B96AB;
|
||||
--faint: #5A6478;
|
||||
--brand: #9896E0;
|
||||
--brand-dim: #7B79C8;
|
||||
--on-brand: #0B0E14;
|
||||
--ok: #22C55E;
|
||||
--warn: #F59E0B;
|
||||
--bad: #EF4444;
|
||||
--code-bg: #0F131C;
|
||||
--shadow: 0 8px 30px rgb(0 0 0 / .45);
|
||||
--term-bg: #080B10;
|
||||
}
|
||||
}
|
||||
:root[data-theme="dark"] {
|
||||
--bg: #0B0E14;
|
||||
--raised: #12161F;
|
||||
--panel: #161B26;
|
||||
--line: #232B3A;
|
||||
--line-hi: #32405A;
|
||||
--fg: #E8ECF4;
|
||||
--dim: #8B96AB;
|
||||
--faint: #5A6478;
|
||||
--brand: #9896E0;
|
||||
--brand-dim: #7B79C8;
|
||||
--on-brand: #0B0E14;
|
||||
--ok: #22C55E;
|
||||
--warn: #F59E0B;
|
||||
--bad: #EF4444;
|
||||
--code-bg: #0F131C;
|
||||
--shadow: 0 8px 30px rgb(0 0 0 / .45);
|
||||
--term-bg: #080B10;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
html { scroll-behavior: smooth; }
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
html { scroll-behavior: auto; }
|
||||
* { animation: none !important; transition: none !important; }
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--bg);
|
||||
color: var(--fg);
|
||||
font: 16px/1.65 "IBM Plex Sans", system-ui, -apple-system, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.wrap { max-width: 1080px; margin: 0 auto; padding: 0 24px; }
|
||||
.mono { font-family: "JetBrains Mono", ui-monospace, monospace; }
|
||||
|
||||
a { color: var(--brand); text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
a:focus-visible, button:focus-visible {
|
||||
outline: 2px solid var(--brand); outline-offset: 3px; border-radius: 6px;
|
||||
}
|
||||
|
||||
h1, h2, h3 { font-family: "Space Grotesk", system-ui, sans-serif; letter-spacing: -.02em; text-wrap: balance; }
|
||||
p { text-wrap: pretty; }
|
||||
|
||||
/* ── header ───────────────────────────────────────────────────────── */
|
||||
header {
|
||||
position: sticky; top: 0; z-index: 20;
|
||||
/* Opaque first. A sticky header that falls back to transparent puts
|
||||
scrolling content underneath the navigation, which is worse than
|
||||
having no blur. color-mix and backdrop-filter are the enhancement. */
|
||||
background: var(--bg);
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
@supports (backdrop-filter: blur(1px)) and (background: color-mix(in srgb, red 50%, transparent)) {
|
||||
header {
|
||||
background: color-mix(in srgb, var(--bg) 88%, transparent);
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
}
|
||||
.bar { display: flex; align-items: center; gap: 16px; height: 62px; }
|
||||
.logo { display: flex; align-items: center; gap: 10px; color: var(--fg); }
|
||||
.logo:hover { text-decoration: none; }
|
||||
.logo svg { width: 30px; height: 30px; flex: 0 0 auto; }
|
||||
.logo b { font: 700 18px/1 "Space Grotesk", system-ui, sans-serif; }
|
||||
nav.links { margin-left: auto; display: flex; gap: 22px; align-items: center; }
|
||||
nav.links a { color: var(--dim); font-size: 14.5px; font-weight: 500; }
|
||||
nav.links a:hover { color: var(--fg); text-decoration: none; }
|
||||
@media (max-width: 720px) { nav.links a.hide-sm { display: none; } }
|
||||
|
||||
/* theme switch */
|
||||
.theme {
|
||||
display: inline-flex; border: 1px solid var(--line-hi); border-radius: 999px;
|
||||
padding: 2px; background: var(--raised); gap: 1px;
|
||||
}
|
||||
.theme button {
|
||||
appearance: none; border: 0; background: transparent; cursor: pointer;
|
||||
color: var(--faint); padding: 5px 8px; border-radius: 999px; line-height: 0;
|
||||
}
|
||||
.theme button svg { width: 15px; height: 15px; }
|
||||
.theme button[aria-pressed="true"] { background: var(--brand); color: var(--on-brand); }
|
||||
|
||||
.btn {
|
||||
display: inline-flex; align-items: center; gap: 8px;
|
||||
background: var(--brand); color: var(--on-brand);
|
||||
font: 600 14.5px/1 "IBM Plex Sans", system-ui, sans-serif;
|
||||
padding: 11px 17px; border-radius: 9px; border: 1px solid transparent;
|
||||
}
|
||||
.btn:hover { background: var(--brand-dim); text-decoration: none; }
|
||||
.btn.ghost { background: transparent; color: var(--fg); border-color: var(--line-hi); }
|
||||
.btn.ghost:hover { background: var(--raised); }
|
||||
|
||||
/* ── hero ─────────────────────────────────────────────────────────── */
|
||||
.hero { padding: 84px 0 56px; display: grid; grid-template-columns: 1.05fr .95fr; gap: 56px; align-items: center; }
|
||||
@media (max-width: 900px) { .hero { grid-template-columns: 1fr; gap: 36px; padding: 52px 0 36px; } }
|
||||
.eyebrow {
|
||||
font-family: "JetBrains Mono", ui-monospace, monospace;
|
||||
font-size: 12px; letter-spacing: 1.3px; text-transform: uppercase;
|
||||
color: var(--brand); margin-bottom: 18px;
|
||||
}
|
||||
.hero h1 { font-size: clamp(34px, 5.2vw, 54px); line-height: 1.05; font-weight: 700; }
|
||||
.hero .lede { color: var(--dim); font-size: 18px; margin: 20px 0 30px; max-width: 52ch; }
|
||||
.cta { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; }
|
||||
.cta .note { color: var(--faint); font-size: 13.5px; }
|
||||
|
||||
/* terminal */
|
||||
.term {
|
||||
background: var(--term-bg); border: 1px solid var(--line); border-radius: 13px;
|
||||
box-shadow: var(--shadow); overflow: hidden;
|
||||
}
|
||||
.term-bar {
|
||||
display: flex; align-items: center; gap: 9px; padding: 10px 14px;
|
||||
border-bottom: 1px solid rgb(255 255 255 / .07);
|
||||
font: 500 11.5px/1 "JetBrains Mono", monospace; color: var(--term-dim);
|
||||
}
|
||||
.term-bar i { width: 9px; height: 9px; border-radius: 50%; background: #32405A; display: inline-block; }
|
||||
.term pre {
|
||||
margin: 0; padding: 16px 18px 20px; overflow-x: auto;
|
||||
font: 12.5px/1.75 "JetBrains Mono", ui-monospace, monospace;
|
||||
color: var(--term-fg);
|
||||
}
|
||||
.term .p { color: #9896E0; }
|
||||
.term .d { color: #5A6478; }
|
||||
.term .g { color: #22C55E; }
|
||||
.term .r { color: #EF4444; }
|
||||
.term .y { color: #F59E0B; }
|
||||
|
||||
/* ── stat band ────────────────────────────────────────────────────── */
|
||||
.band { border-block: 1px solid var(--line); background: var(--raised); }
|
||||
.stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--line); }
|
||||
@media (max-width: 820px) { .stats { grid-template-columns: repeat(2, 1fr); } }
|
||||
.stat { background: var(--raised); padding: 26px 22px; }
|
||||
.stat b { display: block; font: 700 clamp(24px, 3.6vw, 34px)/1 "Space Grotesk", system-ui, sans-serif; font-variant-numeric: tabular-nums; }
|
||||
.stat span { display: block; margin-top: 7px; font-size: 13px; color: var(--dim); }
|
||||
|
||||
/* ── sections ─────────────────────────────────────────────────────── */
|
||||
section { padding: 76px 0; }
|
||||
@media (max-width: 720px) { section { padding: 52px 0; } }
|
||||
.kicker {
|
||||
font-family: "JetBrains Mono", ui-monospace, monospace;
|
||||
font-size: 11.5px; letter-spacing: 1.2px; text-transform: uppercase;
|
||||
color: var(--faint); margin-bottom: 12px;
|
||||
}
|
||||
section h2 { font-size: clamp(26px, 3.6vw, 36px); font-weight: 700; }
|
||||
section .sub { color: var(--dim); margin-top: 14px; max-width: 62ch; font-size: 17px; }
|
||||
|
||||
.grid2 { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 18px; margin-top: 40px; }
|
||||
.grid3 { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 18px; margin-top: 40px; }
|
||||
@media (max-width: 880px) { .grid2, .grid3 { grid-template-columns: 1fr; } }
|
||||
|
||||
.card {
|
||||
background: var(--panel); border: 1px solid var(--line);
|
||||
border-radius: 13px; padding: 24px;
|
||||
}
|
||||
.card h3 { font-size: 18px; font-weight: 600; margin-bottom: 9px; }
|
||||
.card p { color: var(--dim); font-size: 14.5px; }
|
||||
.card .tag {
|
||||
display: inline-block; font-family: "JetBrains Mono", monospace;
|
||||
font-size: 10.5px; letter-spacing: .7px; text-transform: uppercase;
|
||||
color: var(--brand); background: color-mix(in srgb, var(--brand) 12%, transparent);
|
||||
padding: 3px 8px; border-radius: 999px; margin-bottom: 12px;
|
||||
}
|
||||
|
||||
code, .inline {
|
||||
font-family: "JetBrains Mono", ui-monospace, monospace; font-size: .88em;
|
||||
background: var(--code-bg); border: 1px solid var(--line);
|
||||
padding: 1px 6px; border-radius: 5px; color: var(--fg);
|
||||
}
|
||||
|
||||
/* ── pricing ──────────────────────────────────────────────────────── */
|
||||
.tiers { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 18px; margin-top: 40px; align-items: start; }
|
||||
@media (max-width: 880px) { .tiers { grid-template-columns: 1fr; } }
|
||||
.tier { background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 26px; }
|
||||
.tier.feature { border-color: var(--brand); box-shadow: var(--shadow); }
|
||||
.tier h3 { font-size: 15px; font-weight: 600; color: var(--dim); letter-spacing: .3px; text-transform: uppercase; }
|
||||
.price { margin: 14px 0 4px; font: 700 34px/1 "Space Grotesk", system-ui, sans-serif; font-variant-numeric: tabular-nums; }
|
||||
.price small { font-size: 15px; font-weight: 500; color: var(--dim); }
|
||||
.tier .who { color: var(--faint); font-size: 13.5px; min-height: 40px; }
|
||||
.tier ul { list-style: none; margin: 20px 0 24px; display: flex; flex-direction: column; gap: 10px; }
|
||||
.tier li { display: grid; grid-template-columns: 18px 1fr; gap: 10px; font-size: 14.5px; color: var(--dim); }
|
||||
.tier li svg { width: 14px; height: 14px; margin-top: 5px; color: var(--ok); }
|
||||
.tier .btn { width: 100%; justify-content: center; }
|
||||
|
||||
/* ── install ──────────────────────────────────────────────────────── */
|
||||
.install { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-top: 36px; }
|
||||
@media (max-width: 880px) { .install { grid-template-columns: 1fr; } }
|
||||
.copy {
|
||||
display: flex; align-items: center; gap: 12px;
|
||||
background: var(--code-bg); border: 1px solid var(--line);
|
||||
border-radius: 10px; padding: 13px 15px; overflow-x: auto;
|
||||
}
|
||||
.copy code { background: none; border: 0; padding: 0; white-space: nowrap; font-size: 13px; }
|
||||
.copy button {
|
||||
margin-left: auto; appearance: none; border: 1px solid var(--line-hi);
|
||||
background: var(--raised); color: var(--dim); cursor: pointer;
|
||||
font: 500 12px/1 "IBM Plex Sans", system-ui, sans-serif;
|
||||
padding: 6px 10px; border-radius: 6px; flex: 0 0 auto;
|
||||
}
|
||||
.copy button:hover { color: var(--fg); }
|
||||
|
||||
/* ── footer ───────────────────────────────────────────────────────── */
|
||||
footer { border-top: 1px solid var(--line); padding: 40px 0 56px; color: var(--faint); font-size: 13.5px; }
|
||||
.foot { display: flex; gap: 28px; flex-wrap: wrap; align-items: center; }
|
||||
.foot a { color: var(--dim); }
|
||||
.foot .right { margin-left: auto; }
|
||||
@media (max-width: 640px) { .foot .right { margin-left: 0; } }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header>
|
||||
<div class="wrap bar">
|
||||
<a class="logo" href="/">
|
||||
<svg viewBox="0 0 28 28" aria-hidden="true"><rect width="28" height="28" rx="6.3" fill="var(--brand)"/><g transform="translate(3.2,3.2) scale(0.771)" fill="var(--on-brand)" fill-rule="nonzero"><path d="M3.80069371,23.1130888 C4.43848107,23.5650959 5.14832497,23.919844 5.9089202,24.1573863 L4.47060635,26.3139954 C4.11309659,26.8500464 3.3887224,26.9947828 2.85267132,26.637273 C2.35490959,26.3052997 2.19455701,25.6569993 2.46043143,25.1368862 L2.52939365,25.019338 L3.80069371,23.1130888 Z M14.5833333,1.16666667 C16.7811895,1.16666667 18.6893658,2.52489596 19.4646473,4.47968116 L19.5335,4.66666667 L24.3833333,4.66666667 C25.0448446,4.66666667 25.5894608,5.16717524 25.6591362,5.81016498 L25.6666667,5.94999885 L25.6666667,11.375 C25.6666667,14.0328704 23.5754085,16.2023012 20.9485691,16.3276156 L20.7083333,16.3333333 L18.7961667,16.3321667 L18.8104203,16.3635263 C19.2754933,17.3735749 19.6443042,18.3167095 19.9164818,19.1943797 L20.0445161,19.627766 C20.7657518,22.2003082 19.7286621,25.1941618 17.5638169,26.637392 C17.0277001,26.9948032 16.3033525,26.8499337 15.9459413,26.3138169 C15.5885301,25.7777001 15.7333996,25.0533525 16.2695164,24.6959413 C17.5764793,23.8246327 18.2515149,21.8759509 17.7978097,20.2576506 C17.4455369,19.0011449 16.8372737,17.5384042 15.9713012,15.8761384 C15.8759396,15.6930882 15.8261459,15.4897339 15.8261459,15.2833333 C15.8261459,14.6231337 16.3245332,14.0799436 16.9690039,14.0080605 L17.1092123,14 L20.7083333,14 C22.0976747,14 23.2349191,12.9206448 23.3272774,11.5547236 L23.3333333,11.375 L23.3333333,6.99883333 L17.6136472,7.00006824 L17.4704091,5.99857195 C17.2758266,4.63808519 16.1483073,3.59829995 14.780321,3.50658494 L14.5833333,3.5 L12.7831667,3.5 L12.5783017,3.50389564 C8.27042644,3.63569563 4.8164366,7.09906173 4.67140846,11.3859455 L4.66666667,11.6666667 L4.66631609,16.8880679 L4.67097109,17.092305 C4.76225687,18.9495018 6.29888585,20.4166667 8.16666667,20.4166667 C10.0996633,20.4166667 11.6666667,18.8496633 11.6666667,16.9166667 C11.6666667,16.1268183 11.523797,15.416107 11.2062777,14.4675176 L10.7570788,13.2056109 C10.1975498,11.6462738 9.90930052,10.544355 9.77521466,9.11410583 C9.71507223,8.47258663 10.1863712,7.90377749 10.8278904,7.84363507 C11.4694096,7.78349264 12.0382188,8.25479164 12.0983612,8.89631084 C12.1996371,9.97658728 12.4067419,10.8376191 12.8110905,12.0132787 L13.3678001,13.5759215 L13.4189446,13.7268763 C13.8098537,14.8947176 14,15.8406089 14,16.9166667 C14,20.1383277 11.3883277,22.75 8.16666667,22.75 C5.13975753,22.75 2.63542176,20.439154 2.35770657,17.4371488 L2.3393951,17.1781792 L2.33333333,16.9166667 L2.33333333,11.6666667 C2.33333333,6.09263102 6.68344803,1.51408374 12.2162292,1.1851268 L12.4308333,1.17483333 L12.4315796,1.16666667 L14.5833333,1.16666667 Z M16.1504743,6.81070338 L16.4543586,8.53411695 C16.5662457,9.1686603 16.1425491,9.77376175 15.5080058,9.88564887 C14.8734624,9.99753598 14.268361,9.57383938 14.1564739,8.93929603 L13.8525895,7.21588246 C13.7407024,6.58133911 14.164399,5.97623765 14.7989424,5.86435054 C15.4334857,5.75246343 16.0385872,6.17616002 16.1504743,6.81070338 Z"></path></g></svg>
|
||||
<b>Hound</b>
|
||||
</a>
|
||||
<nav class="links">
|
||||
<a href="#what" class="hide-sm">What it catches</a>
|
||||
<a href="#agents" class="hide-sm">For agents</a>
|
||||
<a href="#pricing">Pricing</a>
|
||||
<div class="theme" role="group" aria-label="Colour theme">
|
||||
<button data-set="light" aria-pressed="false" title="Light">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg>
|
||||
</button>
|
||||
<button data-set="auto" aria-pressed="true" title="Follow system">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="13" rx="2"/><path d="M8 21h8M12 17v4"/></svg>
|
||||
</button>
|
||||
<button data-set="dark" aria-pressed="false" title="Dark">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
||||
</button>
|
||||
</div>
|
||||
<a class="btn" href="#install">Install</a>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<div class="wrap">
|
||||
<div class="hero">
|
||||
<div>
|
||||
<div class="eyebrow">Linux · open source agent</div>
|
||||
<h1>Your antivirus has never heard of the things that actually reach your machine.</h1>
|
||||
<p class="lede">
|
||||
Hound blocks a binary before it runs, and reads your lockfiles against
|
||||
<strong>235,577 packages that exist only to be malware</strong>. Built for people who
|
||||
ship software, on the machines they ship it from.
|
||||
</p>
|
||||
<div class="cta">
|
||||
<a class="btn" href="#install">Install on Linux</a>
|
||||
<a class="btn ghost" href="#what">See what it catches</a>
|
||||
<span class="note">Free tier, no account.</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="term" aria-label="Example terminal output">
|
||||
<div class="term-bar"><i></i><i></i><i></i> joe@thinkpad — hound</div>
|
||||
<pre><span class="p">$</span> hound supply-chain ~/src/dashboard
|
||||
|
||||
<span class="r">✘ 2 critical</span>, 1 warning across 1,284 packages
|
||||
|
||||
<span class="r">CRITICAL</span> @vue/cli-plugin-babe1@1.0.2
|
||||
<span class="d">node_modules/@vue/cli-plugin-babe1/package.json</span>
|
||||
Its "postinstall" step runs automatically when the
|
||||
package is installed — before you have used any of
|
||||
its code — and it downloads a script from the
|
||||
internet and runs it immediately.
|
||||
<span class="p">→</span> Do not install this package. If it is already
|
||||
installed, rotate any credentials it could read.
|
||||
|
||||
<span class="r">CRITICAL</span> mcp-github-tools@0.3.1
|
||||
<span class="d">~/.config/mcp/servers.json</span>
|
||||
Handed GITHUB_TOKEN, and its code is downloaded
|
||||
fresh from the internet on every launch.
|
||||
|
||||
<span class="y">WARNING</span> CLAUDE.md
|
||||
<span class="d">vendor/awesome-agents/CLAUDE.md</span>
|
||||
Contains instructions aimed at your assistant
|
||||
rather than at you.
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="band">
|
||||
<div class="wrap">
|
||||
<div class="stats">
|
||||
<div class="stat"><b>97%</b><span>of npm's security records are malware, not bugs</span></div>
|
||||
<div class="stat"><b>235,577</b><span>malicious packages Hound knows by name</span></div>
|
||||
<div class="stat"><b>2 ms</b><span>to refuse a malicious binary at <span class="mono">execve</span></span></div>
|
||||
<div class="stat"><b>0.8 ms</b><span>added to a normal program starting</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<section id="what">
|
||||
<div class="wrap">
|
||||
<div class="kicker">What it catches</div>
|
||||
<h2>The Linux desktop threat is not a Windows virus.</h2>
|
||||
<p class="sub">
|
||||
Traditional antivirus databases are overwhelmingly Windows malware — useful if you are a
|
||||
file server passing infections along, irrelevant to the laptop you write code on. What
|
||||
actually reaches a developer machine is a dependency, a model file, or a repository.
|
||||
</p>
|
||||
|
||||
<div class="grid3">
|
||||
<div class="card">
|
||||
<span class="tag">Supply chain</span>
|
||||
<h3>Dependencies that are malware</h3>
|
||||
<p>Typosquats, and the newer problem: names an AI invented that somebody then registered. Hound reads your lockfiles — so it catches what <em>will</em> be installed, before the payload runs during installation.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="tag">Execution</span>
|
||||
<h3>Refused before it runs</h3>
|
||||
<p>Real-time protection that denies <span class="mono">execve</span> rather than reporting it afterwards. Built on fanotify, with a watchdog that fails open — a bug in Hound must never be able to freeze your machine.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="tag">Model files</span>
|
||||
<h3>Weights that are programs</h3>
|
||||
<p>A pickle-based <span class="mono">.pt</span> or <span class="mono">.ckpt</span> executes code the moment it loads. Downloading weights is a code-execution decision, and Hound reads the opcodes before you find out the hard way.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="tag">Persistence</span>
|
||||
<h3>What changed since last time</h3>
|
||||
<p>Half of a Linux compromise is a line added to a startup file, not a file on disk. Hound keeps a hashed ledger of systemd units, cron, autostart, shell profiles and authorized_keys, and reports what moved.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="tag">Install scripts</span>
|
||||
<h3>Code that runs on <span class="mono">npm install</span></h3>
|
||||
<p>A <span class="mono">postinstall</span> hook that pipes a remote script into a shell, decodes something scrambled and runs it, or reaches for your SSH keys. It executes before you have used a line of the package.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<span class="tag">Rootkits</span>
|
||||
<h3>Questions with factual answers</h3>
|
||||
<p>A process the kernel has but <span class="mono">/proc</span> does not list. A setuid binary no installed package claims. Not guesswork against a list of names that only holds on one distribution.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="agents" class="band">
|
||||
<div class="wrap">
|
||||
<div class="kicker">For people who code with agents</div>
|
||||
<h2>Your assistant can ask Hound first.</h2>
|
||||
<p class="sub">
|
||||
Hound ships an MCP server. Point Claude, Cursor, VS Code or anything else that speaks MCP
|
||||
at it, and your assistant can check a repository before it installs its dependencies or
|
||||
starts working in it.
|
||||
</p>
|
||||
|
||||
<div class="grid2">
|
||||
<div class="term" aria-label="MCP configuration">
|
||||
<div class="term-bar"><i></i><i></i><i></i> ~/.config/mcp/servers.json</div>
|
||||
<pre>{
|
||||
<span class="p">"mcpServers"</span>: {
|
||||
<span class="p">"hound"</span>: {
|
||||
<span class="p">"command"</span>: <span class="g">"/usr/bin/hound-mcp"</span>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<span class="d">// No npx — nothing fetched at launch.</span>
|
||||
<span class="d">// No env — no secret handed over.</span>
|
||||
<span class="d">// No path — no directory granted.</span>
|
||||
<span class="d">//</span>
|
||||
<span class="d">// Hound flags all three in other</span>
|
||||
<span class="d">// people's configs. Ours passes its</span>
|
||||
<span class="d">// own audit.</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div style="display:flex; flex-direction:column; gap:18px;">
|
||||
<div class="card">
|
||||
<h3>Four read-only tools</h3>
|
||||
<p><span class="mono">check_project</span>, <span class="mono">check_package</span>, <span class="mono">check_file</span>, <span class="mono">check_mcp_config</span>. There is no quarantine tool and never will be — an assistant that can be persuaded by the repository it is reading must not be able to make your antivirus delete things.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>It audits the tools you already trust</h3>
|
||||
<p>Every MCP server in your config runs with your permissions and gets called without asking you. Hound tells you which ones download their code fresh on every launch, and which ones you handed a token.</p>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>Written to be read twice</h3>
|
||||
<p>Once by the model, once by you. No rule identifiers, no jargon, and a clean result says what it did <em>not</em> check — because "nothing wrong" that reads as a blanket endorsement is worse than no answer.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="pricing">
|
||||
<div class="wrap">
|
||||
<div class="kicker">Pricing</div>
|
||||
<h2>The scanner is free. The blocking and the intelligence are not.</h2>
|
||||
<p class="sub">
|
||||
A free tier that cannot protect anything is a bad first impression, so real-time file
|
||||
protection is in the free build. The line is drawn at refusing execution, and at the
|
||||
threat feed.
|
||||
</p>
|
||||
|
||||
<div class="tiers">
|
||||
<div class="tier">
|
||||
<h3>Free</h3>
|
||||
<div class="price">$0</div>
|
||||
<p class="who">Everyone. No account, no telemetry.</p>
|
||||
<ul>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>On-demand scanning, CLI and desktop app</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>Real-time file protection</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>Quarantine vault</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>MCP server for your assistant</li>
|
||||
</ul>
|
||||
<a class="btn ghost" href="#install">Install</a>
|
||||
</div>
|
||||
|
||||
<div class="tier feature">
|
||||
<h3>Pro</h3>
|
||||
<div class="price">$89.95 <small>/ year</small></div>
|
||||
<p class="who">One machine. For people who build software on it.</p>
|
||||
<ul>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>Everything in Free</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg><strong>Execution gate</strong> — refuse a binary before it runs</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg><strong>Supply-chain scanner</strong> with the full feed</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>Persistence ledger and rootkit checks</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>Signed definitions, updated automatically</li>
|
||||
</ul>
|
||||
<a class="btn" href="#install">Get Pro</a>
|
||||
</div>
|
||||
|
||||
<div class="tier">
|
||||
<h3>Fleet</h3>
|
||||
<div class="price">$249.95 <small>/ month</small></div>
|
||||
<p class="who">Up to 10 seats, then $15 per seat. Annual at ten months' price.</p>
|
||||
<ul>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>Everything in Pro, on every machine</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>Central console, enrolment and policy</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg><strong>Compliance reports</strong> an auditor accepts</li>
|
||||
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>Air-gapped definition mirrors</li>
|
||||
</ul>
|
||||
<a class="btn ghost" href="mailto:sales@houndav.com?subject=Hound%20Fleet">Talk to us</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="install" class="band">
|
||||
<div class="wrap">
|
||||
<div class="kicker">Install</div>
|
||||
<h2>One command, then it is running.</h2>
|
||||
<p class="sub">
|
||||
Ubuntu, Debian and Linux Mint today. The execution gate ships switched <strong>off</strong> —
|
||||
it needs root and covers your whole filesystem, so turning it on is your decision rather
|
||||
than the installer's.
|
||||
</p>
|
||||
|
||||
<div class="install">
|
||||
<div>
|
||||
<p style="color:var(--dim); font-size:14px; margin-bottom:10px;"><strong style="color:var(--fg)">Debian, Ubuntu, Mint</strong></p>
|
||||
<div class="copy">
|
||||
<code id="c1">curl -fsSL https://dl.houndav.com/deb/hound_latest_amd64.deb -o hound.deb && sudo apt install ./hound.deb</code>
|
||||
<button data-copy="c1">Copy</button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p style="color:var(--dim); font-size:14px; margin-bottom:10px;"><strong style="color:var(--fg)">Try it without installing</strong></p>
|
||||
<div class="copy">
|
||||
<code id="c2">curl -fsSL https://dl.houndav.com/appimage/Hound-latest-x86_64.AppImage -o hound && chmod +x hound && ./hound status</code>
|
||||
<button data-copy="c2">Copy</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p style="color:var(--faint); font-size:13.5px; margin-top:22px;">
|
||||
The AppImage runs as your user and leaves nothing behind. It cannot do the execution gate —
|
||||
that needs privileges an uninstalled bundle does not have — and it will tell you so rather
|
||||
than failing quietly.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<div class="wrap">
|
||||
<div class="kicker">Open source</div>
|
||||
<h2>You are installing a root daemon that can block execution.</h2>
|
||||
<p class="sub">
|
||||
So you should be able to read it. The agent is Apache-2.0 and the definitions are signed
|
||||
with a key whose public half is compiled into the binary — anyone can verify that what
|
||||
they received is what we published. What you pay for is the threat feed, the console and
|
||||
support, not permission to look.
|
||||
</p>
|
||||
<div class="cta" style="margin-top:26px;">
|
||||
<a class="btn ghost" href="https://git.joelovestech.com/Hound/Antivirus">Read the source</a>
|
||||
<a class="btn ghost" href="https://defs.houndav.com/index.json">See the definitions index</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div class="wrap foot">
|
||||
<span>© 2026 Hound</span>
|
||||
<a href="https://git.joelovestech.com/Hound/Antivirus">Source</a>
|
||||
<a href="mailto:support@houndav.com">Support</a>
|
||||
<a href="https://dl.houndav.com/">Downloads</a>
|
||||
<span class="right mono" style="font-size:12px;">Definitions 2026.08.21 · 235,577 indicators</span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
var root = document.documentElement;
|
||||
var buttons = Array.prototype.slice.call(document.querySelectorAll('.theme button'));
|
||||
|
||||
function apply(mode) {
|
||||
if (mode === 'auto') { root.removeAttribute('data-theme'); }
|
||||
else { root.setAttribute('data-theme', mode); }
|
||||
buttons.forEach(function (b) {
|
||||
b.setAttribute('aria-pressed', String(b.dataset.set === mode));
|
||||
});
|
||||
}
|
||||
|
||||
var saved = 'auto';
|
||||
try { saved = localStorage.getItem('hound-theme') || 'auto'; } catch (e) { /* private mode */ }
|
||||
apply(saved);
|
||||
|
||||
buttons.forEach(function (b) {
|
||||
b.addEventListener('click', function () {
|
||||
var mode = b.dataset.set;
|
||||
apply(mode);
|
||||
try { localStorage.setItem('hound-theme', mode); } catch (e) { /* ignore */ }
|
||||
});
|
||||
});
|
||||
|
||||
document.querySelectorAll('[data-copy]').forEach(function (btn) {
|
||||
btn.addEventListener('click', function () {
|
||||
var el = document.getElementById(btn.dataset.copy);
|
||||
if (!el) return;
|
||||
var done = function () {
|
||||
var was = btn.textContent;
|
||||
btn.textContent = 'Copied';
|
||||
setTimeout(function () { btn.textContent = was; }, 1400);
|
||||
};
|
||||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||
navigator.clipboard.writeText(el.textContent).then(done, function () {});
|
||||
} else {
|
||||
var r = document.createRange();
|
||||
r.selectNodeContents(el);
|
||||
var s = window.getSelection();
|
||||
s.removeAllRanges(); s.addRange(r);
|
||||
try { document.execCommand('copy'); done(); } catch (e) {}
|
||||
s.removeAllRanges();
|
||||
}
|
||||
});
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in a new issue