인증된 AgentReady.md 증명서
발급일 sig: 4a11b5ba8a9cb9b4 검증 →

분석된 URL

https://stackharden.com

다른 URL 분석

AI-Ready 점수

76 / B

양호

/ 100

토큰 절감량

HTML 토큰 5735
Markdown 토큰 115
절감 98%

점수 상세

시맨틱 HTML 93/100
콘텐츠 효율성 70/100
AI 발견 가능성 47/100
구조화 데이터 92/100
접근성 93/100

신흥 프로토콜

3개 중 0개 감지

AI 에이전트가 찾는 well-known 엔드포인트. 감지되면 에이전트가 서비스를 자동으로 발견하고 연결할 수 있습니다.

  • OAuth Discovery RFC 8414
    /.well-known/oauth-authorization-server
  • MCP Server Card Anthropic
    /.well-known/mcp.json
  • A2A Agent Card Google
    /.well-known/agent.json

사이트에 llms.txt 파일이 없습니다. AI 에이전트가 사이트 구조를 이해하도록 돕는 새로운 표준입니다.

구현 방법

llmstxt.org 사양에 따라 /llms.txt 파일을 만드세요. 사이트 설명과 주요 페이지 링크를 포함하세요.

페이지의 실제 콘텐츠와 전체 HTML의 비율이 낮습니다. 페이지 무게의 상당 부분이 콘텐츠가 아닌 마크업, 스크립트, 스타일입니다.

구현 방법

CSS를 외부 스타일시트로 이동하고, 인라인 스타일을 제거하고, JavaScript를 최소화하고, HTML이 콘텐츠 구조에 집중하도록 하세요.

사이트가 Markdown for Agents를 지원하지 않습니다. 이 Cloudflare 표준을 통해 AI 에이전트가 마크다운 형식으로 콘텐츠를 요청할 수 있으며, 토큰 사용량을 ~80% 줄일 수 있습니다.

구현 방법

다음 중 하나 이상을 구현하세요: (1) Accept: text/markdown에 마크다운 콘텐츠로 응답. (2) .md URL 제공 (예: /page.md). (3) <link rel="alternate" type="text/markdown"> 태그 추가. (4) 마크다운 발견을 위한 Link HTTP 헤더 추가.

{\n res.setHeader('Vary', 'Accept');\n res.setHeader('Link', '; rel=\"alternate\"; type=\"text/markdown\"');\n if ((req.headers.accept || '').includes('text/markdown')) {\n res.type('text/markdown; charset=utf-8');\n return res.send(renderMarkdown('page'));\n }\n res.render('page');\n});"},{"id":"fastify","label":"Fastify","language":"javascript","filename":"server.js","code":"// Mechanisms 1 + 4: content negotiation + Link header\nfastify.get('/page', async (req, reply) => {\n reply.header('Vary', 'Accept');\n reply.header('Link', '; rel=\"alternate\"; type=\"text/markdown\"');\n if ((req.headers.accept || '').includes('text/markdown')) {\n return reply.type('text/markdown; charset=utf-8').send(renderMarkdown('page'));\n }\n return reply.view('/page.ejs');\n});"},{"id":"nextjs","label":"Next.js","language":"typescript","filename":"app/page/route.ts","code":"// Next.js App Router — Route Handler returning Markdown\nimport { NextRequest } from 'next/server';\nimport { renderMarkdown } from '@/lib/md';\nexport async function GET(req: NextRequest) {\n const accept = req.headers.get('accept') || '';\n if (accept.includes('text/markdown')) {\n return new Response(await renderMarkdown('page'), {\n headers: {\n 'Content-Type': 'text/markdown; charset=utf-8',\n 'Vary': 'Accept',\n },\n });\n }\n // Fall through to the page component\n return new Response(null, { status: 404 });\n}"},{"id":"wordpress","label":"WordPress","language":"php","filename":"functions.php","code":"post_content));\n exit;\n});"},{"id":"static","label":"Hugo / Jekyll / Astro","language":"txt","filename":"static/page.md","code":"# Mechanism 2: serve .md alongside .html\n# Hugo: place page.md in /static/ — built unchanged\n# Jekyll: drop page.md in /assets/ — copied as-is\n# Astro: src/pages/page.md.ts that exports a GET returning markdown\n\n# Then advertise with mechanism 3 in :\n# "}] }'>

제목 구조에 문제가 있습니다 (레벨 건너뛰기 또는 다중 h1 태그). 깔끔한 계층 구조는 AI 에이전트가 콘텐츠 구성을 이해하는 데 도움을 줍니다.

구현 방법

페이지당 정확히 하나의 <h1>을 유지하고, 제목이 순차적 순서를 따르도록 하세요: h1 > h2 > h3. 레벨을 건너뛰지 마세요 (예: h1에서 바로 h3).

Open Graph 태그가 없거나 불완전합니다. OG 태그는 AI 에이전트(및 소셜 플랫폼)가 페이지의 제목, 설명, 이미지를 이해하는 데 도움을 줍니다.

구현 방법

페이지의 <head>에 og:title, og:description, og:image 메타 태그를 추가하세요.

post_content), 30);\n $image = get_the_post_thumbnail_url($post, 'large') ?: 'https://yoursite.com/og-image.jpg';\n $url = get_permalink($post);\n printf('' . \"\\n\", esc_attr($title));\n printf('' . \"\\n\", esc_attr($desc));\n printf('' . \"\\n\", esc_url($image));\n printf('' . \"\\n\", esc_url($url));\n echo '' . \"\\n\";\n}, 5);"},{"id":"nextjs","label":"Next.js","language":"typescript","filename":"app/page.tsx","code":"// Next.js App Router — Metadata API\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n title: \"StackHarden\",\n description: \"Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.\",\n openGraph: {\n title: \"StackHarden\",\n description: \"Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.\",\n url: \"https://stackharden.com\",\n images: [\"https://yoursite.com/og-image.jpg\"],\n type: 'website',\n },\n};"}] }'>
Markdown 토큰: 115
Practical infrastructure hardening for people who run real systems: SaaS builds, self-hosted apps, WordPress stacks, email servers, and VPS baselines. Every guide explains the security rationale and, where relevant, the NIS2 / ISO 27001 control it maps to — not just copy-paste commands.

Start with the [guides](https://stackharden.com/guides/), grab a [script](https://stackharden.com/scripts/), or run an [infrastructure checklist](https://stackharden.com/checklist/).
StackHarden

Practical infrastructure hardening for people who run real systems: SaaS builds, self-hosted apps, WordPress stacks, email servers, and VPS baselines. Every guide explains the security rationale and, where relevant, the NIS2 / ISO 27001 control it maps to — not just copy-paste commands.

Start with the [guides](https://stackharden.com/guides/), grab a [script](https://stackharden.com/scripts/), or run an [infrastructure checklist](https://stackharden.com/checklist/).

## Browse by series[All series →](https://stackharden.com/series/)

[### Data-tier hardening

Databases, caches, backups, and the logs they produce — PostgreSQL and Redis posture, backup and recovery patterns, log minimisation. The data layer of a production service and the operational trail …

7 pieces · Open series →](https://stackharden.com/series/data-tier-hardening/)[### AI security

Strategic and architectural pieces on deploying agentic AI in security contexts — control posture, reference architecture, threat modelling, prompt-injection defences, audit-trail design, with a …

3 pieces · Open series →](https://stackharden.com/series/ai-security/)[### Edge hardening

Nginx at the public boundary — modern TLS configuration, rate-limiting and fail2ban patterns, and the operational defaults that keep the edge from becoming the weak link.

3 pieces · Open series →](https://stackharden.com/series/edge-hardening/)[### Host hardening

Ubuntu and RHEL / AlmaLinux baselines, the SSH hardening they both depend on, and the system-state controls that turn a fresh provider image into a defensible internet-facing host.

3 pieces · Open series →](https://stackharden.com/series/host-hardening/)[### Compliance

NIS2, ISO 27001, and GDPR translated into the configurations, controls, and evidence an auditor will actually look at — with a short closing position on what is governance work that does not appear on …

2 pieces · Open series →](https://stackharden.com/series/compliance/)[### Launch readiness

Pre-launch verification — the 'have we actually done it' layer for new systems about to take production traffic. Currently anchored by the pre-launch VPS security checklist.

2 pieces · Open series →](https://stackharden.com/series/launch-readiness/)[### AI readiness

Making sites and services consumable by AI agents — Link headers, content signals, schema.org markup, and the emerging conventions that determine whether AI assistants can identify, ingest, and …

1 piece · Open series →](https://stackharden.com/series/ai-readiness/)[### App deployment

Practical deployment recipes for application stacks on a hardened VPS — gunicorn or equivalent under systemd, Caddy or Nginx in front, and the real-world integration bumps that only show up the first …

1 piece · Open series →](https://stackharden.com/series/app-deployment/)

## Latest checklists[All checklists →](https://stackharden.com/checklist/)

[### NIS2 Technical Readiness Checklist

A technical readiness checklist for the NIS2 risk-management measures that have a real surface on the box — hardening, patching, …

Open checklist →](https://stackharden.com/checklist/nis2-readiness/)[### Agentic AI Deployment Readiness Checklist

A design-review checklist for deploying an agentic AI system in a security context — architecture, threat model coverage, prompt-injection …

Open checklist →](https://stackharden.com/checklist/agentic-ai-deployment/)[### WordPress Hosting Security Checklist

A pre-launch and ongoing security checklist for agencies hosting WordPress sites — server isolation, wp-config flags, admin posture, plugin …

Open checklist →](https://stackharden.com/checklist/wordpress-security/)

## Latest guides[All guides →](https://stackharden.com/guides/)

[### Making a Static Site Agent-Ready: What I Changed, What I Didn't, and Why

A practitioner's walk-through of the agent-readiness signals that matter for a static content site on Hugo + Cloudflare Pages — Link headers, Content-Signal, the …

Read guide →](https://stackharden.com/guides/agent-readiness-static-site/)[### Building Agentic AI for Security: Architecture, Threat Modelling, and the Audit Trail You Will Actually Need

Reference architecture for an agentic AI security pipeline — STRIDE threat modelling, practical prompt-injection defences, and the audit trail your auditor will actually ask for.

Read guide →](https://stackharden.com/guides/agentic-ai-pipeline-reference/)[### Agentic AI in Security: Why Control Posture Matters More Than Capability

How to govern agentic AI in a security environment — human-in-the-loop vs human-on-the-loop, least privilege for autonomous systems, the prompt-injection attack surface, and the …

Read guide →](https://stackharden.com/guides/agentic-ai-control-posture/)[### Deploying a Flask Tools Site on a Hardened VPS Behind Caddy

A faithful walkthrough of deploying a small Flask app to a single VPS — system user, gunicorn over a unix socket, systemd with the hardening directives this site recommends, Caddy …

Read guide →](https://stackharden.com/guides/deploying-flask-on-caddy/)[### Log Minimisation Recipes — Nginx, Apache, PostgreSQL, Applications

Practical log\_format and configuration recipes that capture what you need for debugging and security without retaining what you don't. The application-layer companion to the …

Read guide →](https://stackharden.com/guides/log-minimisation-recipes/)[### Nginx Rate Limiting — limit\_req, limit\_conn, and fail2ban

Nginx rate limiting that actually protects authentication endpoints, signup flows, and expensive APIs — without locking out legitimate traffic. With sensible defaults and the …

Read guide →](https://stackharden.com/guides/nginx-ratelimit/)[### WordPress Hardening for Agencies

A WordPress hardening baseline aimed at agency hosting — server posture, wp-config flags, admin protection, plugin discipline, and the items that turn a CMS into a compliance …

Read guide →](https://stackharden.com/guides/wordpress-hardening/)[### Hardened RHEL / AlmaLinux VPS Baseline

A pragmatic RHEL 9 / AlmaLinux 9 hardening baseline — first-boot user setup, SSH, firewalld, automatic patching, SELinux verification, audit logging, and the order to apply them …

Read guide →](https://stackharden.com/guides/rhel-baseline/)[### Hardened Ubuntu VPS Baseline

A pragmatic Ubuntu 24.04 LTS hardening baseline — first-boot user setup, SSH, firewall, automatic security updates, audit logging, and time-sync — applied in the right order.

Read guide →](https://stackharden.com/guides/ubuntu-baseline/)[### Encrypted Backups with restic

An opinionated restic backup baseline — repository design, passphrase survival, retention, off-site targets, verification, and restoration drills. The compliance-friendly default …

Read guide →](https://stackharden.com/guides/encrypted-backups-restic/)

Emails when a new guide, script, or tool ships — roughly weekly, sometimes every few days. Double opt-in, no tracking.

[Subscribe →](https://stackharden.com/subscribe/)

[](https://stackharden.com/#top "Go to Top (Alt + G)")

[Subscribe](https://stackharden.com/subscribe/)  ·  [Write for us](https://stackharden.com/contribute/)  ·  [Privacy](https://stackharden.com/privacy/)  ·  [Cookies](https://stackharden.com/cookies/)  ·  [Disclaimer](https://stackharden.com/disclaimer/)

Operated by Data Vision IT Consulting Limited, Kilbride, Wicklow, Ireland.

이 파일을 서버의 /index.md에 업로드하여 AI 에이전트가 페이지의 깔끔한 버전에 접근할 수 있게 하세요. Accept: text/markdown 콘텐츠 협상을 설정하여 자동으로 제공할 수도 있습니다.

이 단일 페이지용으로 생성된 llms.txt

llms.txt 다운로드
# StackHarden

> Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.

## Main
- [StackHarden](https://stackharden.com): Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context ba…
- [About](https://stackharden.com/about/)
- [StackHarden](https://stackharden.com/)
- [Guides](https://stackharden.com/guides/)
- [Scripts](https://stackharden.com/scripts/)
- [Checklists](https://stackharden.com/checklist/)
- [Learner](https://stackharden.com/learner/)
- [Series](https://stackharden.com/series/)
- [Next  »](https://stackharden.com/page/2/)

전체 llms.txt는 도메인 전체 분석이 필요합니다 (곧 출시)

이 파일을 도메인 루트의 https://stackharden.com/llms.txt에 업로드하세요. ChatGPT, Claude, Perplexity 등의 AI 에이전트가 이 파일을 확인하여 사이트 구조를 파악합니다.

시맨틱 HTML

article 또는 main 요소 사용 (100/100)

Has <main>

올바른 제목 계층 구조 (70/100)

no <h1>

시맨틱 HTML 요소 사용 (100/100)

10 semantic elements, 11 divs (ratio: 48%)

의미 있는 이미지 alt 속성 (100/100)

No images found

낮은 div 중첩 깊이 (100/100)

Avg div depth: 0.1, max: 1

콘텐츠 효율성

양호한 토큰 감소율 (100/100)

98% token reduction (HTML→Markdown)

양호한 콘텐츠 대 잡음 비율 (0/100)

Content ratio: 1.6% (364 content chars / 22163 HTML bytes)

최소한의 인라인 스타일 (100/100)

0/216 elements with inline styles (0.0%)

적절한 페이지 무게 (100/100)

HTML size: 22KB

AI 발견 가능성

llms.txt 파일 있음 (0/100)

No llms.txt found

robots.txt 파일 있음 (100/100)

robots.txt exists

robots.txt가 AI 봇 허용 (100/100)

All major AI bots allowed

sitemap.xml 있음 (100/100)

Sitemap found

Markdown for Agents 지원 (0/100)
&#10007; Accept: text/markdown &#10007; .md URL &#10007; <link> tag &#10007; Link header
Content-Signal 있음 (robots.txt 또는 HTTP 헤더) (60/100)
&#10003; robots.txt &#10007; HTTP header &#10007; Policy

구조화 데이터

Schema.org / JSON-LD 있음 (100/100)

JSON-LD found: Organization

Open Graph 태그 있음 (67/100)

2/3 OG tags present

메타 설명 있음 (100/100)

Meta description: 126 chars

정규 URL 있음 (100/100)

Canonical URL present

lang 속성 있음 (100/100)

lang="en"

접근성

JavaScript 없이 콘텐츠 이용 가능 (100/100)

Content available without JavaScript

적절한 페이지 크기 (100/100)

Page size: 22KB

HTML에서 콘텐츠가 빠른 위치에 배치 (75/100)

Main content starts at 30% of HTML

{
  "url": "https://stackharden.com",
  "timestamp": 1779829477776,
  "fetch": {
    "mode": "simple",
    "timeMs": 112,
    "htmlSizeBytes": 22163,
    "supportsMarkdown": false,
    "markdownAgents": {
      "contentNegotiation": false,
      "mdUrl": {
        "found": false,
        "url": null
      },
      "linkTag": {
        "found": false,
        "url": null
      },
      "linkHeader": {
        "found": false,
        "url": null
      },
      "responseHeaders": {
        "contentSignal": null,
        "xMarkdownTokens": null,
        "vary": null
      },
      "frontmatter": {
        "present": false,
        "fields": [],
        "level": "none"
      },
      "level": "none"
    },
    "statusCode": 200
  },
  "extraction": {
    "title": "StackHarden",
    "excerpt": "Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.",
    "byline": null,
    "siteName": "StackHarden",
    "lang": "en",
    "contentLength": 364,
    "metadata": {
      "description": "Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.",
      "ogTitle": "StackHarden",
      "ogDescription": "Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.",
      "ogImage": null,
      "ogType": "website",
      "canonical": "https://stackharden.com/",
      "lang": "en",
      "schemas": [
        {
          "@context": "https://schema.org",
          "@type": "Organization",
          "name": "StackHarden",
          "url": "https://stackharden.com/",
          "description": "Hardened infrastructure guides, scripts and tools for sysadmins and agencies",
          "logo": "https://stackharden.com/favicon.ico",
          "sameAs": []
        }
      ],
      "robotsMeta": "index, follow",
      "author": null,
      "generator": "Hugo 0.147.0",
      "markdownAlternateHref": null
    }
  },
  "markdown": "Practical infrastructure hardening for people who run real systems: SaaS builds, self-hosted apps, WordPress stacks, email servers, and VPS baselines. Every guide explains the security rationale and, where relevant, the NIS2 / ISO 27001 control it maps to — not just copy-paste commands.\n\nStart with the [guides](https://stackharden.com/guides/), grab a [script](https://stackharden.com/scripts/), or run an [infrastructure checklist](https://stackharden.com/checklist/).\n",
  "fullPageMarkdown": "StackHarden\n\nPractical infrastructure hardening for people who run real systems: SaaS builds, self-hosted apps, WordPress stacks, email servers, and VPS baselines. Every guide explains the security rationale and, where relevant, the NIS2 / ISO 27001 control it maps to — not just copy-paste commands.\n\nStart with the [guides](https://stackharden.com/guides/), grab a [script](https://stackharden.com/scripts/), or run an [infrastructure checklist](https://stackharden.com/checklist/).\n\n## Browse by series[All series →](https://stackharden.com/series/)\n\n[### Data-tier hardening\n\nDatabases, caches, backups, and the logs they produce — PostgreSQL and Redis posture, backup and recovery patterns, log minimisation. The data layer of a production service and the operational trail …\n\n7 pieces · Open series →](https://stackharden.com/series/data-tier-hardening/)[### AI security\n\nStrategic and architectural pieces on deploying agentic AI in security contexts — control posture, reference architecture, threat modelling, prompt-injection defences, audit-trail design, with a …\n\n3 pieces · Open series →](https://stackharden.com/series/ai-security/)[### Edge hardening\n\nNginx at the public boundary — modern TLS configuration, rate-limiting and fail2ban patterns, and the operational defaults that keep the edge from becoming the weak link.\n\n3 pieces · Open series →](https://stackharden.com/series/edge-hardening/)[### Host hardening\n\nUbuntu and RHEL / AlmaLinux baselines, the SSH hardening they both depend on, and the system-state controls that turn a fresh provider image into a defensible internet-facing host.\n\n3 pieces · Open series →](https://stackharden.com/series/host-hardening/)[### Compliance\n\nNIS2, ISO 27001, and GDPR translated into the configurations, controls, and evidence an auditor will actually look at — with a short closing position on what is governance work that does not appear on …\n\n2 pieces · Open series →](https://stackharden.com/series/compliance/)[### Launch readiness\n\nPre-launch verification — the 'have we actually done it' layer for new systems about to take production traffic. Currently anchored by the pre-launch VPS security checklist.\n\n2 pieces · Open series →](https://stackharden.com/series/launch-readiness/)[### AI readiness\n\nMaking sites and services consumable by AI agents — Link headers, content signals, schema.org markup, and the emerging conventions that determine whether AI assistants can identify, ingest, and …\n\n1 piece · Open series →](https://stackharden.com/series/ai-readiness/)[### App deployment\n\nPractical deployment recipes for application stacks on a hardened VPS — gunicorn or equivalent under systemd, Caddy or Nginx in front, and the real-world integration bumps that only show up the first …\n\n1 piece · Open series →](https://stackharden.com/series/app-deployment/)\n\n## Latest checklists[All checklists →](https://stackharden.com/checklist/)\n\n[### NIS2 Technical Readiness Checklist\n\nA technical readiness checklist for the NIS2 risk-management measures that have a real surface on the box — hardening, patching, …\n\nOpen checklist →](https://stackharden.com/checklist/nis2-readiness/)[### Agentic AI Deployment Readiness Checklist\n\nA design-review checklist for deploying an agentic AI system in a security context — architecture, threat model coverage, prompt-injection …\n\nOpen checklist →](https://stackharden.com/checklist/agentic-ai-deployment/)[### WordPress Hosting Security Checklist\n\nA pre-launch and ongoing security checklist for agencies hosting WordPress sites — server isolation, wp-config flags, admin posture, plugin …\n\nOpen checklist →](https://stackharden.com/checklist/wordpress-security/)\n\n## Latest guides[All guides →](https://stackharden.com/guides/)\n\n[### Making a Static Site Agent-Ready: What I Changed, What I Didn't, and Why\n\nA practitioner's walk-through of the agent-readiness signals that matter for a static content site on Hugo + Cloudflare Pages — Link headers, Content-Signal, the …\n\nRead guide →](https://stackharden.com/guides/agent-readiness-static-site/)[### Building Agentic AI for Security: Architecture, Threat Modelling, and the Audit Trail You Will Actually Need\n\nReference architecture for an agentic AI security pipeline — STRIDE threat modelling, practical prompt-injection defences, and the audit trail your auditor will actually ask for.\n\nRead guide →](https://stackharden.com/guides/agentic-ai-pipeline-reference/)[### Agentic AI in Security: Why Control Posture Matters More Than Capability\n\nHow to govern agentic AI in a security environment — human-in-the-loop vs human-on-the-loop, least privilege for autonomous systems, the prompt-injection attack surface, and the …\n\nRead guide →](https://stackharden.com/guides/agentic-ai-control-posture/)[### Deploying a Flask Tools Site on a Hardened VPS Behind Caddy\n\nA faithful walkthrough of deploying a small Flask app to a single VPS — system user, gunicorn over a unix socket, systemd with the hardening directives this site recommends, Caddy …\n\nRead guide →](https://stackharden.com/guides/deploying-flask-on-caddy/)[### Log Minimisation Recipes — Nginx, Apache, PostgreSQL, Applications\n\nPractical log\\_format and configuration recipes that capture what you need for debugging and security without retaining what you don't. The application-layer companion to the …\n\nRead guide →](https://stackharden.com/guides/log-minimisation-recipes/)[### Nginx Rate Limiting — limit\\_req, limit\\_conn, and fail2ban\n\nNginx rate limiting that actually protects authentication endpoints, signup flows, and expensive APIs — without locking out legitimate traffic. With sensible defaults and the …\n\nRead guide →](https://stackharden.com/guides/nginx-ratelimit/)[### WordPress Hardening for Agencies\n\nA WordPress hardening baseline aimed at agency hosting — server posture, wp-config flags, admin protection, plugin discipline, and the items that turn a CMS into a compliance …\n\nRead guide →](https://stackharden.com/guides/wordpress-hardening/)[### Hardened RHEL / AlmaLinux VPS Baseline\n\nA pragmatic RHEL 9 / AlmaLinux 9 hardening baseline — first-boot user setup, SSH, firewalld, automatic patching, SELinux verification, audit logging, and the order to apply them …\n\nRead guide →](https://stackharden.com/guides/rhel-baseline/)[### Hardened Ubuntu VPS Baseline\n\nA pragmatic Ubuntu 24.04 LTS hardening baseline — first-boot user setup, SSH, firewall, automatic security updates, audit logging, and time-sync — applied in the right order.\n\nRead guide →](https://stackharden.com/guides/ubuntu-baseline/)[### Encrypted Backups with restic\n\nAn opinionated restic backup baseline — repository design, passphrase survival, retention, off-site targets, verification, and restoration drills. The compliance-friendly default …\n\nRead guide →](https://stackharden.com/guides/encrypted-backups-restic/)\n\nEmails when a new guide, script, or tool ships — roughly weekly, sometimes every few days. Double opt-in, no tracking.\n\n[Subscribe →](https://stackharden.com/subscribe/)\n\n[](https://stackharden.com/#top \"Go to Top (Alt + G)\")\n\n[Subscribe](https://stackharden.com/subscribe/)  ·  [Write for us](https://stackharden.com/contribute/)  ·  [Privacy](https://stackharden.com/privacy/)  ·  [Cookies](https://stackharden.com/cookies/)  ·  [Disclaimer](https://stackharden.com/disclaimer/)\n\nOperated by Data Vision IT Consulting Limited, Kilbride, Wicklow, Ireland.\n",
  "markdownStats": {
    "images": 0,
    "links": 3,
    "tables": 0,
    "codeBlocks": 0,
    "headings": 0
  },
  "tokens": {
    "htmlTokens": 5735,
    "markdownTokens": 115,
    "reduction": 5620,
    "reductionPercent": 98
  },
  "score": {
    "score": 76,
    "grade": "B",
    "dimensions": {
      "semanticHtml": {
        "score": 93,
        "weight": 20,
        "grade": "A",
        "checks": {
          "uses_article_or_main": {
            "score": 100,
            "weight": 20,
            "details": "Has <main>"
          },
          "proper_heading_hierarchy": {
            "score": 70,
            "weight": 25,
            "details": "no <h1>"
          },
          "semantic_elements": {
            "score": 100,
            "weight": 20,
            "details": "10 semantic elements, 11 divs (ratio: 48%)"
          },
          "meaningful_alt_texts": {
            "score": 100,
            "weight": 15,
            "details": "No images found"
          },
          "low_div_nesting": {
            "score": 100,
            "weight": 20,
            "details": "Avg div depth: 0.1, max: 1"
          }
        }
      },
      "contentEfficiency": {
        "score": 70,
        "weight": 25,
        "grade": "C",
        "checks": {
          "token_reduction_ratio": {
            "score": 100,
            "weight": 40,
            "details": "98% token reduction (HTML→Markdown)"
          },
          "content_to_noise_ratio": {
            "score": 0,
            "weight": 30,
            "details": "Content ratio: 1.6% (364 content chars / 22163 HTML bytes)"
          },
          "minimal_inline_styles": {
            "score": 100,
            "weight": 15,
            "details": "0/216 elements with inline styles (0.0%)"
          },
          "reasonable_page_weight": {
            "score": 100,
            "weight": 15,
            "details": "HTML size: 22KB"
          }
        }
      },
      "aiDiscoverability": {
        "score": 47,
        "weight": 25,
        "grade": "D",
        "checks": {
          "has_llms_txt": {
            "score": 0,
            "weight": 20,
            "details": "No llms.txt found"
          },
          "has_robots_txt": {
            "score": 100,
            "weight": 10,
            "details": "robots.txt exists"
          },
          "robots_allows_ai_bots": {
            "score": 100,
            "weight": 15,
            "details": "All major AI bots allowed"
          },
          "has_sitemap": {
            "score": 100,
            "weight": 10,
            "details": "Sitemap found"
          },
          "supports_markdown_negotiation": {
            "score": 0,
            "weight": 25,
            "details": "No Markdown for Agents support detected"
          },
          "has_content_signals": {
            "score": 60,
            "weight": 20,
            "details": "robots.txt: search=yes, ai-input=yes, ai-train=no"
          }
        }
      },
      "structuredData": {
        "score": 92,
        "weight": 15,
        "grade": "A",
        "checks": {
          "has_schema_org": {
            "score": 100,
            "weight": 30,
            "details": "JSON-LD found: Organization"
          },
          "has_open_graph": {
            "score": 67,
            "weight": 25,
            "details": "2/3 OG tags present"
          },
          "has_meta_description": {
            "score": 100,
            "weight": 20,
            "details": "Meta description: 126 chars"
          },
          "has_canonical_url": {
            "score": 100,
            "weight": 15,
            "details": "Canonical URL present"
          },
          "has_lang_attribute": {
            "score": 100,
            "weight": 10,
            "details": "lang=\"en\""
          }
        }
      },
      "accessibility": {
        "score": 93,
        "weight": 15,
        "grade": "A",
        "checks": {
          "content_without_js": {
            "score": 100,
            "weight": 40,
            "details": "Content available without JavaScript"
          },
          "reasonable_page_size": {
            "score": 100,
            "weight": 30,
            "details": "Page size: 22KB"
          },
          "fast_content_position": {
            "score": 75,
            "weight": 30,
            "details": "Main content starts at 30% of HTML"
          }
        }
      }
    }
  },
  "recommendations": [
    {
      "id": "add_llms_txt",
      "priority": "critical",
      "category": "aiDiscoverability",
      "titleKey": "rec.add_llms_txt.title",
      "descriptionKey": "rec.add_llms_txt.description",
      "howToKey": "rec.add_llms_txt.howto",
      "effort": "quick-win",
      "estimatedImpact": 10,
      "checkScore": 0,
      "checkDetails": "No llms.txt found"
    },
    {
      "id": "improve_content_ratio",
      "priority": "critical",
      "category": "contentEfficiency",
      "titleKey": "rec.improve_content_ratio.title",
      "descriptionKey": "rec.improve_content_ratio.description",
      "howToKey": "rec.improve_content_ratio.howto",
      "effort": "moderate",
      "estimatedImpact": 6,
      "checkScore": 0,
      "checkDetails": "Content ratio: 1.6% (364 content chars / 22163 HTML bytes)"
    },
    {
      "id": "add_markdown_negotiation",
      "priority": "critical",
      "category": "aiDiscoverability",
      "titleKey": "rec.add_markdown_negotiation.title",
      "descriptionKey": "rec.add_markdown_negotiation.description",
      "howToKey": "rec.add_markdown_negotiation.howto",
      "effort": "significant",
      "estimatedImpact": 6,
      "checkScore": 0,
      "checkDetails": "No Markdown for Agents support detected"
    },
    {
      "id": "fix_heading_hierarchy",
      "priority": "medium",
      "category": "semanticHtml",
      "titleKey": "rec.fix_heading_hierarchy.title",
      "descriptionKey": "rec.fix_heading_hierarchy.description",
      "howToKey": "rec.fix_heading_hierarchy.howto",
      "effort": "quick-win",
      "estimatedImpact": 6,
      "checkScore": 70,
      "checkDetails": "no <h1>"
    },
    {
      "id": "add_open_graph",
      "priority": "medium",
      "category": "structuredData",
      "titleKey": "rec.add_open_graph.title",
      "descriptionKey": "rec.add_open_graph.description",
      "howToKey": "rec.add_open_graph.howto",
      "effort": "quick-win",
      "estimatedImpact": 4,
      "checkScore": 67,
      "checkDetails": "2/3 OG tags present"
    }
  ],
  "llmsTxtPreview": "# StackHarden\n\n> Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.\n\n## Main\n- [StackHarden](https://stackharden.com): Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context ba…\n- [About](https://stackharden.com/about/)\n- [StackHarden](https://stackharden.com/)\n- [Guides](https://stackharden.com/guides/)\n- [Scripts](https://stackharden.com/scripts/)\n- [Checklists](https://stackharden.com/checklist/)\n- [Learner](https://stackharden.com/learner/)\n- [Series](https://stackharden.com/series/)\n- [Next  »](https://stackharden.com/page/2/)\n\n",
  "llmsTxtExisting": null,
  "emergingProtocols": {
    "oauthDiscovery": {
      "exists": false,
      "url": "https://stackharden.com/.well-known/oauth-authorization-server"
    },
    "mcpServerCard": {
      "exists": false,
      "url": "https://stackharden.com/.well-known/mcp.json"
    },
    "a2aAgentCard": {
      "exists": false,
      "url": "https://stackharden.com/.well-known/agent.json"
    },
    "count": 0
  },
  "snippets": [
    {
      "id": "add_llms_txt",
      "title": "Create /llms.txt",
      "description": "Upload this file to your web root. It tells AI agents what your site is about and which pages matter.",
      "language": "markdown",
      "code": "# StackHarden\n\n> Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.\n\n## Main\n- [StackHarden](https://stackharden.com): Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context ba…\n- [About](https://stackharden.com/about/)\n- [StackHarden](https://stackharden.com/)\n- [Guides](https://stackharden.com/guides/)\n- [Scripts](https://stackharden.com/scripts/)\n- [Checklists](https://stackharden.com/checklist/)\n- [Learner](https://stackharden.com/learner/)\n- [Series](https://stackharden.com/series/)\n- [Next  »](https://stackharden.com/page/2/)\n\n",
      "filename": "/llms.txt"
    },
    {
      "id": "fix_heading_hierarchy",
      "title": "Fix heading hierarchy",
      "description": "Your page has no <h1>. Every page needs exactly one <h1> as the main heading. Add it inside your <main> or <article>.",
      "language": "html",
      "code": "<h1>StackHarden</h1>",
      "filename": "<main> or <article>"
    },
    {
      "id": "add_open_graph",
      "title": "Add missing Open Graph tags",
      "description": "Open Graph tags control how your page looks when shared on social media and how AI platforms preview your URL in answers.",
      "language": "html",
      "code": "<meta property=\"og:image\" content=\"https://yoursite.com/og-image.jpg\">\n<meta property=\"og:url\" content=\"https://stackharden.com\">\n<meta property=\"og:type\" content=\"website\">",
      "filename": "<head>",
      "stacks": [
        {
          "id": "html",
          "label": "HTML <head>",
          "language": "html",
          "filename": "<head>",
          "code": "<meta property=\"og:image\" content=\"https://yoursite.com/og-image.jpg\">\n<meta property=\"og:url\" content=\"https://stackharden.com\">\n<meta property=\"og:type\" content=\"website\">"
        },
        {
          "id": "wordpress",
          "label": "WordPress",
          "language": "php",
          "filename": "functions.php",
          "code": "<?php\n// Quick Open Graph tags without a plugin (skip if Yoast / Rank Math is active)\nadd_action('wp_head', function () {\n    if (!is_singular()) return;\n    $post = get_queried_object();\n    $title = get_the_title($post);\n    $desc  = get_the_excerpt($post) ?: wp_trim_words(strip_tags($post->post_content), 30);\n    $image = get_the_post_thumbnail_url($post, 'large') ?: 'https://yoursite.com/og-image.jpg';\n    $url   = get_permalink($post);\n    printf('<meta property=\"og:title\" content=\"%s\">' . \"\\n\", esc_attr($title));\n    printf('<meta property=\"og:description\" content=\"%s\">' . \"\\n\", esc_attr($desc));\n    printf('<meta property=\"og:image\" content=\"%s\">' . \"\\n\", esc_url($image));\n    printf('<meta property=\"og:url\" content=\"%s\">' . \"\\n\", esc_url($url));\n    echo '<meta property=\"og:type\" content=\"article\">' . \"\\n\";\n}, 5);"
        },
        {
          "id": "nextjs",
          "label": "Next.js",
          "language": "typescript",
          "filename": "app/page.tsx",
          "code": "// Next.js App Router — Metadata API\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n  title: \"StackHarden\",\n  description: \"Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.\",\n  openGraph: {\n    title: \"StackHarden\",\n    description: \"Hardened infrastructure guides, scripts and tools for sysadmins and small agencies — with NIS2 and ISO 27001 context baked in.\",\n    url: \"https://stackharden.com\",\n    images: [\"https://yoursite.com/og-image.jpg\"],\n    type: 'website',\n  },\n};"
        }
      ]
    },
    {
      "id": "add_markdown_negotiation",
      "title": "Support Markdown for Agents",
      "description": "Let AI agents request a clean Markdown version of any page via content negotiation, .md alternate URLs, link tags or Link headers.",
      "language": "html",
      "code": "<!-- Mechanism 3: link tag advertising the .md alternate -->\n<link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">",
      "filename": "<head>",
      "stacks": [
        {
          "id": "html",
          "label": "HTML <head>",
          "language": "html",
          "filename": "<head>",
          "code": "<!-- Mechanism 3: link tag advertising the .md alternate -->\n<link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">"
        },
        {
          "id": "express",
          "label": "Express",
          "language": "javascript",
          "filename": "server.js",
          "code": "// Mechanisms 1 + 4: content negotiation + Link header\napp.get('/page', (req, res) => {\n  res.setHeader('Vary', 'Accept');\n  res.setHeader('Link', '</page.md>; rel=\"alternate\"; type=\"text/markdown\"');\n  if ((req.headers.accept || '').includes('text/markdown')) {\n    res.type('text/markdown; charset=utf-8');\n    return res.send(renderMarkdown('page'));\n  }\n  res.render('page');\n});"
        },
        {
          "id": "fastify",
          "label": "Fastify",
          "language": "javascript",
          "filename": "server.js",
          "code": "// Mechanisms 1 + 4: content negotiation + Link header\nfastify.get('/page', async (req, reply) => {\n  reply.header('Vary', 'Accept');\n  reply.header('Link', '</page.md>; rel=\"alternate\"; type=\"text/markdown\"');\n  if ((req.headers.accept || '').includes('text/markdown')) {\n    return reply.type('text/markdown; charset=utf-8').send(renderMarkdown('page'));\n  }\n  return reply.view('/page.ejs');\n});"
        },
        {
          "id": "nextjs",
          "label": "Next.js",
          "language": "typescript",
          "filename": "app/page/route.ts",
          "code": "// Next.js App Router — Route Handler returning Markdown\nimport { NextRequest } from 'next/server';\nimport { renderMarkdown } from '@/lib/md';\nexport async function GET(req: NextRequest) {\n  const accept = req.headers.get('accept') || '';\n  if (accept.includes('text/markdown')) {\n    return new Response(await renderMarkdown('page'), {\n      headers: {\n        'Content-Type': 'text/markdown; charset=utf-8',\n        'Vary': 'Accept',\n      },\n    });\n  }\n  // Fall through to the page component\n  return new Response(null, { status: 404 });\n}"
        },
        {
          "id": "wordpress",
          "label": "WordPress",
          "language": "php",
          "filename": "functions.php",
          "code": "<?php\n// Mechanism 1: respond to Accept: text/markdown on the same URL\nadd_action('template_redirect', function () {\n    if (!is_singular()) return;\n    $accept = $_SERVER['HTTP_ACCEPT'] ?? '';\n    if (strpos($accept, 'text/markdown') === false) return;\n    header('Content-Type: text/markdown; charset=utf-8');\n    header('Vary: Accept');\n    $post = get_queried_object();\n    echo \"# \" . get_the_title($post) . \"\\n\\n\";\n    echo wp_strip_all_tags(apply_filters('the_content', $post->post_content));\n    exit;\n});"
        },
        {
          "id": "static",
          "label": "Hugo / Jekyll / Astro",
          "language": "txt",
          "filename": "static/page.md",
          "code": "# Mechanism 2: serve .md alongside .html\n# Hugo: place page.md in /static/ — built unchanged\n# Jekyll: drop page.md in /assets/ — copied as-is\n# Astro: src/pages/page.md.ts that exports a GET returning markdown\n\n# Then advertise with mechanism 3 in <head>:\n#   <link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">"
        }
      ]
    }
  ]
}

API를 사용하여 프로그래밍 방식으로 가져올 수 있습니다 (곧 출시)

이 JSON은 내부용입니다 — Markdown 및 llms.txt 파일과 달리 사이트에 업로드하기 위한 것이 아닙니다. 시간에 따른 점수 추적을 위한 기준값으로 저장하거나, 개발팀과 공유하거나, CI/CD 파이프라인에 통합하세요.

결과 공유

Twitter LinkedIn

배지 삽입

이 배지를 사이트에 추가하세요. AI 준비도 점수가 변경되면 자동으로 업데이트됩니다.

AgentReady.md score for stackharden.com
Script 권장
<script src="https://agentready.md/badge.js" data-id="ae0ab0c0-3510-4b0a-acb3-d0a80078b1bd" data-domain="stackharden.com"></script>
Markdown
[![AgentReady.md score for stackharden.com](https://agentready.md/badge/stackharden.com.svg)](https://agentready.md/ko/r/ae0ab0c0-3510-4b0a-acb3-d0a80078b1bd)

곧 출시: 전체 도메인 분석

전체 도메인을 크롤링하고, llms.txt를 생성하고, AI 준비도 점수를 시간에 따라 모니터링하세요. 대기자 명단에 등록하여 알림을 받으세요.

명단에 등록되었습니다! 서비스 출시 시 알려드리겠습니다.