mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
Calculator, captable, careers, cloud, compare, contact and contact-sales, customers, dashboards, dataroom, datastore, dev, download, enso, enterprise, extension, family, integrations, investors, kai, learn, legal and their components say their words through t() in client code, <T> in server components and phrase() where copy is held as data; one sentence is one key, figures and links its arguments. Rebased on main: in every conflict main's file stands (its copy, layout and styling) and only the wrapping is added back, including copy main added since. Claude-Session: https://claude.ai/code/session_015XYKLjZtDTJEnMo4eK3AFH
82 lines
4.5 KiB
TypeScript
82 lines
4.5 KiB
TypeScript
'use client'
|
|
|
|
import { ArrowRight, AlertTriangle, Eye, Filter, Lock, Plug, ScrollText, Shield } from 'lucide-react'
|
|
import { ProductLanding } from '@/components/product/ProductLanding'
|
|
import { ProductFooter } from '@/components/products/ProductFooter'
|
|
import { useI18n } from '@hanzo/i18n/react'
|
|
|
|
/**
|
|
* Guard, through the ONE product kit.
|
|
*
|
|
* The largest cluster left: TWELVE pages — engine, gateway, guard, ingress,
|
|
* jin, metrics, o11y, operator, sentinel, skills, telemetry, visor — at 85%+
|
|
* identical className sets, each a hero, a six-card grid and a call to action
|
|
* written out again. All twelve pass one typed props object to
|
|
* `ProductLanding`. See LLM.md, "Tailwind is NOT gone".
|
|
*
|
|
* EVERY WORD IS THE ONE THAT WAS HERE. ProductFooter came out of the final
|
|
* card's `max-w-3xl` wrapper, where it had been rendering narrower than on
|
|
* every other product page.
|
|
*/
|
|
|
|
export default function GuardPage() {
|
|
const { t } = useI18n()
|
|
return (
|
|
<>
|
|
<ProductLanding
|
|
badge={"hanzoai/guard"}
|
|
badgeIcon={Shield}
|
|
title={"Guard"}
|
|
tagline={t("It reads what goes into a model, and what comes back")}
|
|
lede={t("People paste their social security number into a chat box. Guard catches it on the way out and replaces it before the model ever sees it, then reads the reply on the way back. It runs three ways: as a proxy in front of an LLM API, as a wrapper around a command-line tool, or as a filter in front of an MCP server. A Rust library and a Unix pipe if you would rather not run a process at all.")}
|
|
ctas={[
|
|
{ label: t("View on GitHub"), href: "https://github.com/hanzoai" },
|
|
]}
|
|
what={{
|
|
title: t("What it looks for"),
|
|
sub: t("Detectors you can read, thresholds you can move, and no claim to understand meaning. Guard is the first layer, not the only one."),
|
|
pillars: [
|
|
{
|
|
icon: AlertTriangle,
|
|
title: t("Six shapes an injection takes"),
|
|
body: t("Overriding the instructions, role-play, asking for the system prompt, bypassing a rule, hiding the ask in an encoding, and reframing the context. A match returns a confidence rather than a verdict, and you decide what confidence is worth blocking."),
|
|
},
|
|
{
|
|
icon: Lock,
|
|
title: t("The things people paste by accident"),
|
|
body: t("Social security numbers, card numbers checked against the Luhn digit so a phone number is not mistaken for one, emails, phone numbers, IP addresses, and provider API keys. Each becomes a typed marker, so the model still knows a card number was there and does not lose the sentence."),
|
|
},
|
|
{
|
|
icon: Filter,
|
|
title: t("Both directions, on purpose"),
|
|
body: t("The reply is read with the same detectors as the request, because the leak that matters is usually the one coming back. A machine-learning classifier for categories like violence and self-harm is available and off unless you turn it on — pattern matching is the default because it is the part that behaves the same every time."),
|
|
},
|
|
{
|
|
icon: ScrollText,
|
|
title: t("You set the dials"),
|
|
body: t("Turn each detector on or off, set the injection threshold, add your own patterns for whatever is sensitive in your domain, and choose the marker text. Requests are rate limited per user with a token bucket, so a single caller cannot burn the budget."),
|
|
},
|
|
{
|
|
icon: Eye,
|
|
title: t("A log that is not a second copy of the leak"),
|
|
body: t("Decisions are written as JSON lines with a hash of the content, not the content. Logging what you just redacted would put it in a file with weaker access control than the one you took it out of. Turn content logging on deliberately, or leave it off."),
|
|
},
|
|
{
|
|
icon: Plug,
|
|
title: t("Nothing to rewrite"),
|
|
body: t("Start the proxy with your provider as the upstream and point the base URL at it. Or wrap a CLI tool over a pseudo-terminal and everything you type is filtered on its way in. Or put it in front of an MCP server and filter the tool calls."),
|
|
},
|
|
],
|
|
}}
|
|
finalCta={{
|
|
title: t("Get started with Guard"),
|
|
buttons: [
|
|
{ label: t("View on GitHub"), href: "https://github.com/hanzoai" },
|
|
],
|
|
}}
|
|
/>
|
|
<ProductFooter slug={"guard"} name={"Guard"} />
|
|
</>
|
|
)
|
|
}
|