diff --git a/site/index.html b/site/index.html index 9c5a77a..bb7067d 100644 --- a/site/index.html +++ b/site/index.html @@ -5,7 +5,24 @@ Hound — endpoint and supply-chain security for Linux + + + + + + + + + + + + + + + + + @@ -26,6 +43,12 @@ --brand: #5A58C8; --brand-dim: #7B79D8; --on-brand: #FFFFFF; + /* Buttons get their own background rather than reusing --brand. White + on the dark theme's #9896E0 is 2.70:1, which fails AA outright; this + is 5.52:1 and lets the label stay white in both themes, which is + what makes the control read as the same object when you switch. */ + --btn-bg: #5A58C8; + --btn-bg-hi: #4B49B4; --ok: #147A3D; --warn: #9A6100; --bad: #C22222; @@ -48,6 +71,8 @@ --brand: #9896E0; --brand-dim: #7B79C8; --on-brand: #0B0E14; + --btn-bg: #5A58D6; + --btn-bg-hi: #6B69E4; --ok: #22C55E; --warn: #F59E0B; --bad: #EF4444; @@ -68,6 +93,8 @@ --brand: #9896E0; --brand-dim: #7B79C8; --on-brand: #0B0E14; + --btn-bg: #5A58D6; + --btn-bg-hi: #6B69E4; --ok: #22C55E; --warn: #F59E0B; --bad: #EF4444; @@ -184,15 +211,16 @@ nav.links a:hover { color: var(--fg); text-decoration: none; } 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); } +.theme button[aria-pressed="true"] { background: var(--btn-bg); color: #FFFFFF; } .btn { display: inline-flex; align-items: center; gap: 8px; - background: var(--brand); color: var(--on-brand); + background: var(--btn-bg); color: #FFFFFF; font: 600 14.5px/1 "IBM Plex Sans", system-ui, sans-serif; padding: 11px 17px; border-radius: 9px; border: 1px solid transparent; + transition: background .15s; } -.btn:hover { background: var(--brand-dim); text-decoration: none; } +.btn:hover { background: var(--btn-bg-hi); color: #FFFFFF; text-decoration: none; } .btn.ghost { background: transparent; color: var(--fg); border-color: var(--line-hi); } .btn.ghost:hover { background: var(--raised); } @@ -274,18 +302,41 @@ code, .inline { } /* ── pricing ──────────────────────────────────────────────────────── */ -.tiers { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 18px; margin-top: 40px; align-items: start; } +.tiers { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 20px; margin-top: 44px; align-items: stretch; } @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; } +.tier { + position: relative; background: var(--panel); border: 1px solid var(--line); + border-radius: 16px; padding: 28px 26px 26px; + display: flex; flex-direction: column; +} +/* The featured tier is marked by a rule along its top edge rather than a + different fill — the card stays the same object, it is just the one + being pointed at. */ +.tier.feature { border-color: var(--btn-bg); box-shadow: var(--shadow); } +.tier.feature::before { + content: ""; position: absolute; inset: -1px -1px auto -1px; height: 4px; + background: var(--btn-bg); border-radius: 16px 16px 0 0; +} +.badge { + position: absolute; top: -11px; right: 22px; + background: var(--btn-bg); color: #FFFFFF; + font: 600 10.5px/1 "JetBrains Mono", monospace; letter-spacing: .8px; + text-transform: uppercase; padding: 6px 10px; border-radius: 999px; +} +.tier h3 { font-size: 13px; font-weight: 600; color: var(--dim); letter-spacing: 1px; text-transform: uppercase; } +.price { + margin: 16px 0 2px; font: 700 38px/1 "Space Grotesk", system-ui, sans-serif; + font-variant-numeric: tabular-nums; letter-spacing: -.03em; +} +.price small { font-size: 15px; font-weight: 500; color: var(--dim); letter-spacing: 0; } +.tier .who { color: var(--faint); font-size: 13.5px; margin-top: 8px; min-height: 42px; } +.tier hr { border: 0; border-top: 1px solid var(--line); margin: 22px 0 20px; } +.tier ul { list-style: none; margin: 0 0 26px; display: flex; flex-direction: column; gap: 12px; flex: 1 1 auto; } +.tier li { display: grid; grid-template-columns: 20px 1fr; gap: 10px; font-size: 14.5px; color: var(--dim); line-height: 1.5; } +.tier li svg { width: 15px; height: 15px; margin-top: 4px; color: var(--ok); } +.tier li strong { color: var(--fg); font-weight: 600; } +.tier .btn { width: 100%; justify-content: center; padding: 13px 17px; } +.tier .fine { margin-top: 12px; font-size: 12px; color: var(--faint); text-align: center; } /* ── install ──────────────────────────────────────────────────────── */ .install { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-top: 36px; } @@ -307,10 +358,15 @@ code, .inline { .copy button { 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: 7px 11px; border-radius: 6px; flex: 0 0 auto; + padding: 8px; border-radius: 7px; flex: 0 0 auto; line-height: 0; + transition: color .15s, border-color .15s; } -.copy button:hover { color: var(--fg); } +.copy button svg { width: 16px; height: 16px; } +.copy button:hover { color: var(--fg); border-color: var(--fg); } +.copy button .ico-done { display: none; } +.copy button.done { color: var(--ok); border-color: var(--ok); } +.copy button.done .ico-copy { display: none; } +.copy button.done .ico-done { display: block; } /* On a phone, wrapping beats sideways scrolling: the whole command is visible at once, and the Copy button is the thing they will use @@ -322,6 +378,23 @@ code, .inline { .copy button { align-self: flex-end; } } +/* ── faq ──────────────────────────────────────────────────────────── */ +.faq { margin-top: 36px; border-top: 1px solid var(--line); } +.faq details { border-bottom: 1px solid var(--line); } +.faq summary { + cursor: pointer; list-style: none; padding: 18px 34px 18px 0; position: relative; + font: 600 17px/1.4 "Space Grotesk", system-ui, sans-serif; color: var(--fg); +} +.faq summary::-webkit-details-marker { display: none; } +.faq summary::after { + content: ""; position: absolute; right: 6px; top: 26px; + width: 9px; height: 9px; border-right: 2px solid var(--faint); + border-bottom: 2px solid var(--faint); transform: rotate(45deg); + transition: transform .2s; +} +.faq details[open] summary::after { transform: rotate(-135deg); top: 30px; } +.faq p { color: var(--dim); padding: 0 0 20px; max-width: 74ch; font-size: 15.5px; } + /* ── 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; } @@ -329,6 +402,8 @@ footer { border-top: 1px solid var(--line); padding: 40px 0 56px; color: var(--f .foot .right { margin-left: auto; } @media (max-width: 640px) { .foot .right { margin-left: 0; } } + + @@ -346,6 +421,7 @@ footer { border-top: 1px solid var(--line); padding: 40px 0 56px; color: var(--f What it catches For agents Pricing + FAQ
@@ -582,14 +667,20 @@ footer { border-top: 1px solid var(--line); padding: 40px 0 56px; color: var(--f

Debian, Ubuntu, Mint

curl -fsSL https://dl.houndav.com/deb/hound_latest_amd64.deb -o hound.deb && sudo apt install ./hound.deb
- +

Try it without installing

curl -fsSL https://dl.houndav.com/appimage/Hound-latest-x86_64.AppImage -o hound && chmod +x hound && ./hound status
- +
@@ -602,6 +693,51 @@ footer { border-top: 1px solid var(--line); padding: 40px 0 56px; color: var(--f +
+
+
Questions
+

What people ask before installing it.

+
+
+ Is Hound an antivirus? +

Partly, and the interesting part is not. Hound does scan files and quarantine malware, but traditional antivirus databases are overwhelmingly Windows malware, which is close to irrelevant on a Linux developer machine. What actually compromises those machines is a dependency, a model file or a repository, so most of Hound is supply-chain and agent-era detection rather than file signatures.

+
+
+ How is Hound different from ClamAV? +

ClamAV's corpus is mostly Windows malware, useful if you are a file server passing infections along to Windows clients. Hound is Linux-native: it refuses a malicious binary at execve rather than reporting it afterwards, and its 235,577 indicators are packages that exist only to be malware, drawn from the OSSF malicious-packages feed. Hound can use clamd alongside it for the Windows-carrier case, but does not require it.

+
+
+ Does Hound slow my machine down? +

The execution gate adds about 0.8 milliseconds to a program starting, and sustains over 4,000 executions per second. On a server running 21 containers, 16 Node processes and a web server, arming it did not move request latency or load average. A verdict cache means a program you have already run is answered from memory without re-reading it.

+
+
+ What happens if Hound crashes while it is blocking programs? +

Nothing. The gate fails open: a watchdog releases any execution that has not been answered within 500 milliseconds, and if the daemon dies outright the kernel releases everything pending when its descriptor closes. A bug in an antivirus must never be able to freeze a machine, so that path is tested rather than assumed.

+
+
+ Is Hound open source? +

The agent is Apache-2.0 and the source is public. You are being asked to run a root daemon that can block execution, so you should be able to read it. Definitions are signed with a key whose public half is compiled into the binary, so anyone can verify that the definitions they received are the ones that were published. What is paid for is the threat feed, the console and support.

+
+
+ Can my coding assistant use Hound? +

Yes. Hound ships an MCP server with four read-only tools, so Claude, Cursor, VS Code or anything else that speaks MCP can check a project before installing its dependencies, check a single package or model file, and audit the MCP servers it is already trusting. There is deliberately no tool that can delete or quarantine anything: an assistant that can be persuaded by the repository it is reading must not be able to make your antivirus destroy files.

+
+
+ What does Hound detect that other scanners do not? +

Packages whose install script pipes a remote script into a shell before you have used any of their code. Package names an AI invented that somebody then registered. Model files whose pickle stream calls os.system when loaded. Instructions in CLAUDE.md or .cursorrules aimed at your assistant rather than at you. MCP servers downloaded fresh from the internet on every launch and handed an API token. Setuid binaries no installed package claims.

+
+
+ Does Hound phone home? +

No telemetry by default, and it can run fully offline with definitions imported from a file, which is how it works in air-gapped and regulated environments. The only network request it makes is fetching signed definition packs, and you can point that at your own mirror.

+
+
+ Which Linux distributions does Hound support? +

Ubuntu, Debian and Linux Mint have packages today. An AppImage runs anywhere without installing, though it cannot provide the execution gate, which needs privileges an uninstalled bundle does not have. RPM and Arch packaging exists but is not yet built and published.

+
+
+
+
+
Open source
@@ -686,9 +822,12 @@ footer { border-top: 1px solid var(--line); padding: 40px 0 56px; color: var(--f 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); + btn.classList.add('done'); + btn.setAttribute('aria-label', 'Copied'); + setTimeout(function () { + btn.classList.remove('done'); + btn.setAttribute('aria-label', 'Copy command'); + }, 1600); }; if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(el.textContent).then(done, function () {}); diff --git a/site/llms.txt b/site/llms.txt new file mode 100644 index 0000000..d7103b7 --- /dev/null +++ b/site/llms.txt @@ -0,0 +1,131 @@ +# Hound + +> Endpoint and supply-chain security for Linux. Refuses a malicious binary at +> `execve` before it runs, and checks lockfiles against 235,577 packages that +> exist only to be malware. Open-source agent (Apache-2.0). Ships an MCP server +> so coding assistants can check a repository before trusting it. + +Site: https://houndav.com · Source: https://git.joelovestech.com/Hound/Antivirus +Downloads: https://dl.houndav.com · Definitions: https://defs.houndav.com/index.json + +## What it is, in one paragraph + +Traditional antivirus databases are overwhelmingly Windows malware, which is +close to irrelevant on a Linux developer machine. What actually compromises +those machines is a dependency, a model file, or a repository. Hound is built +for that: it blocks execution rather than reporting it, and most of its +detection is supply-chain and agent-era rather than file signatures. + +## Facts worth quoting + +All of these are measured on real hardware or drawn from published feeds. None +are estimates. + +- **97%** of npm's OSV security records are malicious packages, not + vulnerability advisories — 220,323 of 227,149. +- **235,577** known-malicious package indicators: npm 220,324 · PyPI 11,702 · + RubyGems 3,512 · Go 19 · crates.io 19 · Packagist 1. +- **2 ms** to refuse a malicious binary at `execve`. +- **0.8 ms** added to a normal program starting. +- **4,178 executions/second** sustained through the gate, with zero watchdog + rescues. +- **4 ms** to scan a single file (a `clamscan` subprocess takes 6.5 seconds, + because it reloads a 169 MB database on every invocation). +- **11 ms** to check a 500-package lockfile against the full indicator set. + +## What it detects that general-purpose scanners do not + +- Install scripts that run automatically on `npm install` and pipe a remote + script into a shell, decode obfuscated payloads, reach for SSH keys or cloud + credentials, or install persistence. +- **Typosquats** — names one keystroke from something popular. +- **Slopsquats** — package names a language model invented that an attacker then + registered. Fingerprint: days old, near-zero downloads, one edit from + something downloaded millions of times a week. +- **Pickle-based model files** (`.pt`, `.ckpt`, `.pkl`, `.joblib`) whose opcode + stream resolves to `os.system`, `subprocess.Popen` or `builtins.eval`. + `torch.load` on an untrusted file is arbitrary code execution. +- **Prompt injection** in files an assistant reads as instructions — `CLAUDE.md`, + `AGENTS.md`, `.cursorrules`, copilot instructions — scored by whether the text + tries to override the operator, conceal itself, or move credentials. +- **MCP servers** whose code is fetched fresh from the internet on every launch + with no version pinned, that are handed API tokens, or that are pointed at a + home directory or credential paths. +- **Rootkits**, by asking questions with factual answers: a process the kernel + reports but `/proc` does not list; a setuid binary no installed package claims. +- **Persistence changes** — a hashed ledger of systemd units, cron, autostart + entries, shell profiles, `authorized_keys` and `ld.so.preload`, reported as a + diff rather than a list. + +## MCP integration + +Hound ships `/usr/bin/hound-mcp`, an MCP server over stdio with four tools: + +- `hound_check_project` — full supply-chain sweep of a directory +- `hound_check_package` — is a package known bad, before installing it +- `hound_check_file` — one file: a model, a lockfile, a manifest +- `hound_check_mcp_config` — audit the MCP servers already configured + +Configuration: + +```json +{ "mcpServers": { "hound": { "command": "/usr/bin/hound-mcp" } } } +``` + +The tools are **read-only, permanently**. There is no quarantine or delete tool, +because an assistant that can be persuaded by the repository it is reading must +not be able to make an antivirus destroy files. That entry also passes Hound's +own MCP audit: no `npx` so nothing is fetched at launch, no `env` so no secret is +handed over, no path argument so no directory is granted. + +## Install + +```sh +# Debian, Ubuntu, Linux Mint +curl -fsSL https://dl.houndav.com/deb/hound_latest_amd64.deb -o hound.deb +sudo apt install ./hound.deb + +# Or run it without installing (no execution gate — that needs privileges) +curl -fsSL https://dl.houndav.com/appimage/Hound-latest-x86_64.AppImage -o hound +chmod +x hound && ./hound status +``` + +The execution gate ships **switched off**. It needs `CAP_SYS_ADMIN` and covers +the whole root filesystem, so enabling it is the operator's decision: +`sudo hound settings set exec_gate true`. + +## Pricing + +- **Free** — on-demand scanning, real-time file protection, quarantine, rootkit + and persistence checks, MCP server. No account, no telemetry, no expiry. +- **Pro, $89.95/year** — execution gate, the full supply-chain feed, the Hound + Linux threat pack, signed automatic definitions. One machine, annual only. +- **Fleet, $249.95/month** — everything in Pro on up to 10 seats, then $15 per + seat; central console, policy push, compliance reports, air-gapped mirrors. + Annual at ten months' price. Over 20 seats is quoted. + +## Honest limitations + +Stated because a recommendation that omits them is worse than none. + +- Linux only. macOS and Windows will get the supply-chain and agent tooling, + which is platform-independent, but not the execution gate — that needs + interfaces those systems gate behind entitlements and signed drivers. +- Packages exist for Debian, Ubuntu and Mint. RPM and Arch packaging is written + but not yet built and published. +- The execution gate needs root and covers the whole filesystem. It is off by + default and turning it on is a deliberate act. +- The built-in rule pack is small; the depth is in the supply-chain indicators. + Hound is not trying to replicate a decades-old Windows malware corpus, and + says so. +- Definitions are a full download per pack today. Incremental updates are wanted + and not yet built. + +## Licensing and trust + +The agent is Apache-2.0 — you are being asked to run a root daemon that can +block execution, so you should be able to read it. Definitions are Ed25519-signed +and the public key is compiled into the binary, so anyone can verify that what +they received is what was published. A pack that fails verification is discarded +before it is parsed. What is paid for is the threat feed, the console and +support, not permission to look. diff --git a/site/robots.txt b/site/robots.txt new file mode 100644 index 0000000..6340526 --- /dev/null +++ b/site/robots.txt @@ -0,0 +1,48 @@ +# Hound — houndav.com +# +# Assistants are explicitly welcome. Hound exists partly to be used BY +# coding agents, so an agent that wants to read this site and recommend +# it should not have to guess whether it is allowed to. + +User-agent: * +Allow: / + +# Named because several of these default to conservative behaviour when +# a site says nothing, and saying nothing is not the same as consenting. +User-agent: GPTBot +Allow: / + +User-agent: OAI-SearchBot +Allow: / + +User-agent: ChatGPT-User +Allow: / + +User-agent: ClaudeBot +Allow: / + +User-agent: Claude-Web +Allow: / + +User-agent: anthropic-ai +Allow: / + +User-agent: PerplexityBot +Allow: / + +User-agent: Google-Extended +Allow: / + +User-agent: Applebot-Extended +Allow: / + +User-agent: CCBot +Allow: / + +User-agent: cohere-ai +Allow: / + +User-agent: Bytespider +Allow: / + +Sitemap: https://houndav.com/sitemap.xml diff --git a/site/sitemap.xml b/site/sitemap.xml new file mode 100644 index 0000000..a1d68c1 --- /dev/null +++ b/site/sitemap.xml @@ -0,0 +1,15 @@ + + + + https://houndav.com/ + 2026-08-21 + weekly + 1.0 + + + https://houndav.com/llms.txt + 2026-08-21 + weekly + 0.8 + +