Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/about/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ export default function AboutPage() {
<p className="eyebrow">About AgentNine</p>
<h1 id="founder-title">What an AgentNine listing tells you.</h1>
<p className="founder-lede">
Each listing links to its upstream source and records available setup and system-access details.
Each listing links to the original project and records available setup and system-access details.
</p>
<div className="founder-actions">
<Link
Expand Down Expand Up @@ -147,11 +147,11 @@ export default function AboutPage() {

<section className="about-editorial prose-page" aria-labelledby="about-agentnine-title">
<h2 id="about-agentnine-title">What a listing covers</h2>
<p>Listings record setup steps, version details, hardware requirements, system access, and removal instructions when those details are available from the upstream project.</p>
<p>Listings record setup steps, version details, hardware requirements, system access, and removal instructions when those details are available from the original project.</p>
<h2>How listing details are checked</h2>
<p>We use the linked repository and project documentation. Read <Link className="text-link" href="/methodology">how verification and freshness are recorded</Link> to see what those checks do and do not establish.</p>
<h2>Selection and removal</h2>
<p>Projects need a clear upstream source and a documented first-run path. We may mark or remove a listing if its source breaks, setup details become misleading, or a serious issue makes continued listing inappropriate. We do not audit upstream security, licensing, or legal compliance.</p>
<p>Projects need a clearly identified original source and documented first-run instructions. We may mark or remove a listing if its source breaks, setup details become misleading, or a serious issue makes continued listing inappropriate. We do not audit the project’s security, licensing, or legal compliance.</p>
<h2>Independent by design</h2>
<p>We are not affiliated with the creators or repositories listed here. A listing is not a partnership, endorsement, or security certification. If you spot a broken detail, <Link className="text-link" href="/contact">tell us</Link>.</p>
</section>
Expand Down
2 changes: 1 addition & 1 deletion app/compare/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const rows: Array<[string, (agent: Agent) => string]> = [
["Network access", (agent) => agent.network_access || "Not recorded"],
["File access", (agent) => agent.file_access || "Not recorded"],
["Hardware", (agent) => agent.hardware_requirements || "Not recorded"],
["Upstream changes since verification", (agent) => agent.upstream_changed_since_verification ? "Changed since verification" : "No change recorded"],
["Project changes since verification", (agent) => agent.upstream_changed_since_verification ? "Changed since verification" : "No change recorded"],
];

export default async function ComparePage({ searchParams }: { searchParams: Promise<{ agents?: string }> }) {
Expand Down
30 changes: 26 additions & 4 deletions app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -610,9 +610,10 @@ body:has(.faq-page) .floating-contact { display: none; }
.search-page-heading h1 { margin-bottom: 0; }
.search-shell { max-width: 1040px; margin-top: 0; }
.search-input-wrap { position: relative; min-height: 78px; background: color-mix(in srgb, var(--field) 88%, transparent); border: 1px solid color-mix(in srgb, var(--ink) 16%, var(--line)); border-radius: var(--radius-card); display: flex; align-items: center; padding: 0 22px; box-shadow: none; transition: border-color 180ms ease, box-shadow 180ms ease, transform 180ms ease; }
.search-input-wrap:focus-within { border-color: color-mix(in srgb, var(--blue) 65%, var(--line)); box-shadow: 0 22px 60px color-mix(in srgb, var(--blue) 12%, transparent), 0 0 0 4px color-mix(in srgb, var(--focus-ring) 12%, transparent); transform: translateY(-1px); }
.search-input-wrap:focus-within { border-color: color-mix(in srgb, var(--blue-text) 65%, var(--line)); outline: 2px solid color-mix(in srgb, var(--blue-text) 35%, transparent); outline-offset: 3px; }
.search-icon { display: grid; width: 28px; height: 28px; place-items: center; border: 1px solid color-mix(in srgb, var(--blue) 45%, var(--line)); border-radius: 50%; color: var(--blue-text); line-height: 1; opacity: .95; }
.search-input-wrap input { flex: 1; min-width: 0; border: 0; outline: 0; padding: 22px 16px; background: transparent; color: var(--ink); font-size: 19px; letter-spacing: -.025em; }
.search-input-wrap input:focus-visible { outline: none; box-shadow: none; }
.search-scope { margin: 9px 2px 0; color: var(--muted); font-size: var(--font-size-sm); line-height: 1.5; }
.recent-agent-searches { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; margin: 12px 2px 0; color: var(--muted); font-size: var(--font-size-xs); }
.recent-agent-searches > span { margin-right: 2px; font-weight: 700; }
Expand Down Expand Up @@ -1064,10 +1065,16 @@ kbd { color: var(--muted); border: 1px solid var(--line); border-radius: var(--r
.command-card strong { display: block; margin-bottom: 8px; font-size: var(--font-size-sm); text-transform: uppercase; letter-spacing: .08em; color: var(--blue-text); }
.command-card pre { margin: 0; white-space: pre-wrap; font: 12px/1.7 var(--font-geist-mono), monospace; }
.setup-guide { display: grid; gap: 10px; }
.setup-platform { border: 1px solid var(--line); border-radius: var(--radius-control); background: var(--surface); }
.setup-platform summary { display: flex; justify-content: space-between; align-items: center; gap: 12px; min-height: 52px; padding: 12px 14px; cursor: pointer; color: var(--ink); font-size: var(--font-size-sm); font-weight: 700; }
.setup-platform summary::marker { color: var(--blue-text); }
.setup-platform { border: 1px solid var(--line); border-radius: var(--radius-control); background: var(--surface); interpolate-size: allow-keywords; }
.setup-platform summary { display: flex; justify-content: space-between; align-items: center; gap: 12px; min-height: 52px; padding: 12px 14px; list-style: none; cursor: pointer; color: var(--ink); font-size: var(--font-size-sm); font-weight: 700; }
.setup-platform summary::-webkit-details-marker { display: none; }
.setup-platform summary::after { width: 8px; height: 8px; flex: 0 0 8px; margin: -4px 4px 0 0; border-right: 1.5px solid var(--muted); border-bottom: 1.5px solid var(--muted); content: ""; transform: rotate(45deg); transition: transform 200ms cubic-bezier(.2, .75, .25, 1), border-color 160ms ease; }
.setup-platform summary:hover { color: var(--blue-text); }
.setup-platform summary:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 3px; }
.setup-platform[open] summary { border-bottom: 1px solid var(--line); }
.setup-platform[open] summary::after { border-color: var(--blue-text); transform: rotate(225deg); }
.setup-platform::details-content { display: block; block-size: 0; overflow: clip; opacity: 0; transition: block-size 240ms cubic-bezier(.22, 1, .36, 1), opacity 150ms ease-out, content-visibility 240ms allow-discrete; }
.setup-platform[open]::details-content { block-size: auto; opacity: 1; }
.setup-code-row { display: grid; gap: 10px; margin: 14px; }
.setup-code-row h4, .setup-code-row p { margin: 0; color: var(--ink); font-size: var(--font-size-sm); }
.setup-code-row .command-card { margin: 0; }
Expand Down Expand Up @@ -1702,13 +1709,24 @@ kbd { color: var(--muted); border: 1px solid var(--line); border-radius: var(--r
.recent-section { background: var(--hero-surface); }
.recent-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; }
.recent-grid .agent-card { min-width: 0; }
.home-news-section { border-top: 1px solid var(--line); }
.home-news-heading { display: flex; align-items: end; justify-content: space-between; gap: 24px; margin-bottom: 30px; }
.home-news-heading h2 { margin: 0; font-size: clamp(34px, 4.5vw, 58px); line-height: .98; letter-spacing: -.07em; }
.home-news-all-link { display: inline-flex; min-height: 44px; align-items: center; gap: 7px; color: var(--blue-text); font-size: var(--font-size-md); font-weight: 700; text-underline-offset: 4px; }
.home-news-all-link:hover { text-decoration: underline; }
.home-news-all-link:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 3px; }
.home-news-list { max-width: none; }
.home-news-list > li { padding: 22px 0 24px; }
.home-news-list h3 { margin: 0; font-size: clamp(1.25rem, 2vw, 1.65rem); letter-spacing: -.04em; line-height: 1.2; }
.home-news-list h3 a:hover { color: var(--blue-text); text-decoration: underline; text-underline-offset: 4px; }
.new-standards { border-top: 1px solid var(--line); }
.new-standards .container { display: grid; grid-template-columns: minmax(260px, .8fr) 1.5fr; gap: 80px; align-items: start; }
.standards-intro > p:last-child { max-width: 330px; margin-top: 24px; color: var(--muted); line-height: 1.6; }
.new-standards .standards-list { gap: 24px; }
.new-standards .feature-item { padding-top: 18px; border-top: 2px solid var(--ink); }
.new-standards .feature-item h3 { font-size: 24px; letter-spacing: -.05em; }
@media (max-width: 800px) {
.home-news-heading { align-items: start; }
.new-standards .container { grid-template-columns: 1fr; gap: 44px; }
.new-standards .standards-intro h2 { font-size: clamp(34px, 10vw, 48px); }
.new-standards .standards-intro > p:last-child { max-width: 34rem; }
Expand Down Expand Up @@ -1806,6 +1824,7 @@ kbd { color: var(--muted); border: 1px solid var(--line); border-radius: var(--r
.fey-meteor-shower i { animation: none; }
.fey-card, .fey-card:hover, .fey-card:hover ~ .fey-card { transition: none; translate: none; rotate: none; }
.home-faq-chevron, .home-faq-answer, .home-faq-answer-inner,
.setup-platform::details-content, .setup-platform summary::after,
.faq-item-chevron, .faq-answer, .faq-answer-inner { transition: none; }
}
@media (max-height: 560px) {
Expand All @@ -1832,6 +1851,7 @@ kbd { color: var(--muted); border: 1px solid var(--line); border-radius: var(--r
[data-theme="dark"] .button-light,
[data-theme="dark"] .contact-form input,
[data-theme="dark"] .contact-form textarea { background: var(--surface); border-color: var(--line); color: var(--ink); }
[data-theme="dark"] .search-input-wrap:focus-within { border-color: var(--blue-text); }
[data-theme="dark"] .admin-toolbar,
[data-theme="dark"] .admin-table thead th,
[data-theme="dark"] .admin-table tbody tr:hover { background: var(--surface-soft); }
Expand Down Expand Up @@ -2060,6 +2080,8 @@ kbd { color: var(--muted); border: 1px solid var(--line); border-radius: var(--r
.news-editor-markdown-input { min-height: 240px; }
}
@media (max-width: 560px) {
.home-news-heading { gap: 12px; }
.home-news-heading h2 { font-size: clamp(32px, 9vw, 42px); }
.agents-name-list { grid-template-columns: 1fr; }
.agents-name-list li:nth-child(odd) { padding-right: 0; border-right: 0; }
.agents-name-list li:nth-child(even) { padding-left: 0; }
Expand Down
10 changes: 5 additions & 5 deletions app/methodology/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,22 @@ export default function MethodologyPage() {
<div className="page-heading">
<p className="eyebrow">Trust and methodology</p>
<h1>Evidence, freshness, and clear limits.</h1>
<p>AgentNine separates what was checked from what is only visible in the upstream repository. Missing data stays missing.</p>
<p>AgentNine separates what was checked from what is only visible in the project repository. Missing data stays missing.</p>
</div>
<section className="trust-methodology-grid" aria-label="AgentNine methodology">
<article className="trust-methodology-card">
<h2>Verification states</h2>
<p><strong>Verified</strong> means all five checklist items have recorded evidence, repository freshness is current, and no later upstream change is recorded.</p>
<p><strong>Verified</strong> means all five checklist items have recorded evidence, repository freshness is current, and no later project change is recorded.</p>
<p><strong>Partially verified</strong> means only some of those items are recorded. A record without evidence is left as unverified rather than treated as tested.</p>
</article>
<article className="trust-methodology-card">
<h2>Freshness signals</h2>
<p>A repository metadata check date is used when available. Otherwise, freshness uses the latest recorded upstream commit. A stale flag or a date older than 180 days marks the record <strong>Needs review</strong>, including records with all five checklist items complete.</p>
<p>If neither a metadata check date nor an upstream commit date is available, freshness is unknown and the record is not labeled <strong>Verified</strong>. The setup-review date describes when checklist evidence was recorded; it does not determine repository freshness.</p>
<p>A repository metadata check date is used when available. Otherwise, freshness uses the latest recorded commit to the project repository. A stale flag or a date older than 180 days marks the record <strong>Needs review</strong>, including records with all five checklist items complete.</p>
<p>If neither a metadata check date nor a project commit date is available, freshness is unknown and the record is not labeled <strong>Verified</strong>. The setup-review date describes when checklist evidence was recorded; it does not determine repository freshness.</p>
</article>
<article className="trust-methodology-card">
<h2>What this is not</h2>
<p>A score is not a safety certification, security audit, endorsement, or guarantee that upstream behavior has stayed unchanged.</p>
<p>A score is not a safety certification, security audit, endorsement, or guarantee that the project has stayed unchanged.</p>
<p>Read the source repository, license, permissions, provider terms, and current issues before running an agent.</p>
</article>
</section>
Expand Down
6 changes: 3 additions & 3 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export default function Home() {
"@id": `${SITE_URL}/#website`,
url: SITE_URL,
name: "AgentNine",
description: "Compare AI agent projects by source, setup requirements, and documented access.",
description: "Find open-source AI agents in AgentNine's directory. Browse by category, compare listings, and review setup, source, and access details.",
publisher: { "@id": `${SITE_URL}/#organization` },
},
{
Expand Down Expand Up @@ -50,7 +50,7 @@ export default function Home() {
<p>Each listing keeps those details separate so you can review them before a first run.</p>
</div>
<div className="standards-list">
<div className="feature-item"><span className="feature-number">A</span><h3>Source</h3><p>Open the upstream repository and review the release or commit behind the record.</p></div>
<div className="feature-item"><span className="feature-number">A</span><h3>Source</h3><p>Open the project repository and review the release or commit behind the record.</p></div>
<div className="feature-item"><span className="feature-number">B</span><h3>Setup</h3><p>Check installation commands, environment requirements, and first-run guidance.</p></div>
<div className="feature-item"><span className="feature-number">C</span><h3>Access</h3><p>Review network, file, memory, port, and provider details before local execution.</p></div>
</div>
Expand Down Expand Up @@ -89,6 +89,6 @@ export default function Home() {

export const metadata = createPublicPageMetadata({
title: "Open-Source AI Agent Directory",
description: "Browse an open-source AI agent directory with project sources, setup guides, system requirements, and documented access details.",
description: "Find open-source AI agents in AgentNine's directory. Browse by category, compare listings, and review setup guides, source links, and access details.",
path: "/",
});
8 changes: 4 additions & 4 deletions app/terms/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export default function TermsPage() {
<p>
AgentNine is a public directory of AI-agent projects. It provides listings, editorial
context, setup notes, recorded verification information, search and comparison tools, and
links to upstream sources. Public browsing does not require an account.
links to the original project sources. Public browsing does not require an account.
</p>
<p>
Google Analytics and Meta Pixel are optional and are enabled only if you allow them. You
Expand All @@ -55,15 +55,15 @@ export default function TermsPage() {
AgentNine does not grant a license to third-party projects listed in the directory.
Software, names, logos, documentation, and other materials remain subject to their
respective owners&apos; terms and licenses. Before downloading or running a project, review
its upstream license, security posture, dependencies, permissions, and applicable
its license, security posture, dependencies, permissions, and applicable
provider terms. You are responsible for your use of external software.
</p>
<p>
Verification scores, dates, and evidence describe checks recorded at a point in time. They
are not safety certifications, endorsements, security audits, warranties, or guarantees of
compatibility or performance. Listings, instructions, prices, dependencies, and links may
be incomplete, outdated, or unavailable. Check important details against the upstream
project before relying on them.
be incomplete, outdated, or unavailable. Check important details against the project’s
own documentation before relying on them.
</p>
<p>
Some listed projects may be dual-use, including tools that can be used for security
Expand Down
4 changes: 2 additions & 2 deletions components/HomeFaqAccordion.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ const questions = [
{
question: "What does “verified” mean?",
answer:
"All five checklist items have recorded evidence, the listing is not marked stale, and no later upstream change is recorded. A review date appears only when one has been recorded. This is not a safety certification.",
"All five checklist items have recorded evidence, the listing is not marked stale, and no later project change is recorded. A review date appears only when one has been recorded. This is not a safety certification.",
},
{
question: "Where does a listing’s information come from?",
answer:
"Each published listing links to its upstream repository. Open that source to check the current code, setup instructions, and license.",
"Each published listing links to its project repository. Open that source to check the current code, setup instructions, and license.",
},
];

Expand Down
2 changes: 1 addition & 1 deletion components/SetupGuidePanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export function SetupGuidePanel({ guide }: {
return <details className="setup-platform" key={os}>
<summary>{label}</summary>
{platform?.install_route ? <p className="setup-platform-route">{platform.install_route}</p> : null}
{unsupported ? <p className="setup-platform-empty">The upstream project does not support this OS.</p> : <>
{unsupported ? <p className="setup-platform-empty">The project does not support this OS.</p> : <>
{/* If there's no platform data or no commands, show a clear message so the panel has visible content and users know why it may be empty. */}
{/* If there is no platform entry for this OS: show either a reviewed-empty message or the unreviewed placeholders depending on whether the source was checked. */}
{(!platform) && (sourceChecked
Expand Down
Loading
Loading