9148c358d0
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를 Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류. - 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로 자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거, 동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거. - 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming, Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business, Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로, 나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는 title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백). 원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지. - 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서. - 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는 지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지. - Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경. - 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
7.2 KiB
7.2 KiB
id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
| id | title | category | status | canonical_id | aliases | duplicate_of | source_trust_level | confidence_score | verification_status | tags | raw_sources | last_reinforced | github_commit | tech_stack | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| wiki-2026-0508-seo-중심의-마케팅-및-블로그-사이트-구축 | SEO 중심의 마케팅 및 블로그 사이트 구축 | 10_Wiki/Topics | verified | self |
|
none | A | 0.9 | applied |
|
2026-05-10 | pending |
|
SEO 중심의 마케팅 및 블로그 사이트 구축
매 한 줄
"매 organic search 의 의 LCP < 2.5s + crawlability + structured data + content velocity 의 four-pillar 의 site architecture.". 2026 의 의 SEO-first build 의 의 default stack 의 Astro / Next.js (SSG) + MDX content + Schema.org JSON-LD + Core Web Vitals optimization — 매 GEO (Generative Engine Optimization, AI overview) 의 등장 의 의 traditional SEO 의 augment.
매 핵심
매 4-pillar
- Crawlability: server-rendered HTML, sitemap, robots.txt, canonical URLs, hreflang.
- Performance: LCP < 2.5s, INP < 200ms, CLS < 0.1 — Core Web Vitals 의 ranking factor.
- Content: depth, freshness, E-E-A-T (Experience, Expertise, Authoritativeness, Trust).
- Structure: Schema.org JSON-LD, OpenGraph, semantic HTML, internal linking.
매 stack 선택
- Astro: content-heavy, Islands architecture, minimal JS — best LCP.
- Next.js (App Router, SSG mode): hybrid 가능, MDX support, vast ecosystem.
- Hugo / 11ty: pure SSG, sub-second build, no JS runtime.
- WordPress (headless): editorial workflow + Astro/Next frontend.
매 2026 GEO consideration
- AI overview (Google SGE, Perplexity, ChatGPT search) 의 citation 의 desired — clear
<h1>, summary paragraph, bulleted facts, schema markup. - LLM-friendly: clean semantic HTML, llms.txt 의 publishing.
매 응용
- SaaS marketing site (homepage + features + pricing + blog).
- Tech blog with MDX + code highlighting.
- Documentation site (Mintlify, Nextra, Starlight).
- Local business + multi-region landing pages.
💻 패턴
Astro 의 blog setup
---
// src/pages/blog/[slug].astro
import { getCollection } from 'astro:content';
import Layout from '@/layouts/Article.astro';
export async function getStaticPaths() {
const posts = await getCollection('blog');
return posts.map((post) => ({ params: { slug: post.slug }, props: { post } }));
}
const { post } = Astro.props;
const { Content } = await post.render();
---
<Layout
title={post.data.title}
description={post.data.description}
canonical={`https://site.com/blog/${post.slug}`}
ogImage={post.data.ogImage}
>
<article>
<h1>{post.data.title}</h1>
<Content />
</article>
</Layout>
JSON-LD (Article schema)
// components/ArticleSchema.tsx
export function ArticleSchema({ post }: { post: Post }) {
return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'Article',
headline: post.title,
datePublished: post.publishedAt,
dateModified: post.updatedAt,
author: { '@type': 'Person', name: post.author },
image: post.ogImage,
}),
}}
/>
);
}
Sitemap (Next.js App Router)
// app/sitemap.ts
import type { MetadataRoute } from 'next';
import { getAllPosts } from '@/lib/posts';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getAllPosts();
return [
{ url: 'https://site.com', lastModified: new Date(), priority: 1 },
...posts.map((p) => ({
url: `https://site.com/blog/${p.slug}`,
lastModified: p.updatedAt,
changeFrequency: 'monthly' as const,
priority: 0.7,
})),
];
}
Robots + canonical (Next.js metadata)
// app/blog/[slug]/page.tsx
export async function generateMetadata({ params }): Promise<Metadata> {
const post = await getPost(params.slug);
return {
title: post.title,
description: post.summary,
alternates: { canonical: `/blog/${post.slug}` },
openGraph: {
title: post.title,
description: post.summary,
images: [post.ogImage],
type: 'article',
},
twitter: { card: 'summary_large_image' },
};
}
LCP 최적화 (preload hero image)
<link rel="preload" as="image" href="/hero.avif" fetchpriority="high" />
<img src="/hero.avif" alt="..." width="1200" height="630" loading="eager" decoding="async" />
MDX + content collection (Astro)
// src/content/config.ts
import { defineCollection, z } from 'astro:content';
export const collections = {
blog: defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
description: z.string().max(160),
publishedAt: z.date(),
author: z.string(),
tags: z.array(z.string()),
ogImage: z.string().optional(),
}),
}),
};
llms.txt (2026 GEO)
# https://site.com/llms.txt
# Site: Acme Inc. — SaaS for X
# License: CC-BY-4.0 for blog content
# Index:
- /blog/* — engineering articles
- /docs/* — product documentation
- /pricing — current pricing
CWV 의 monitoring (Vercel Speed Insights / web-vitals)
import { onLCP, onINP, onCLS } from 'web-vitals';
function send(metric: any) {
navigator.sendBeacon('/api/vitals', JSON.stringify(metric));
}
onLCP(send);
onINP(send);
onCLS(send);
매 결정 기준
| 상황 | Stack |
|---|---|
| Pure content / blog | Astro (Islands, near-zero JS) |
| Marketing + app shell | Next.js (App Router, SSG/ISR) |
| Editorial team (CMS) | Headless WP / Sanity + Astro |
| Docs site | Starlight / Nextra / Mintlify |
| Multi-region SEO | Next.js + i18n routing + hreflang |
기본값: Astro + MDX + Vercel/Netlify deploy + Sanity/Contentlayer (if CMS needed).
🔗 Graph
- 부모: SEO · 프론트엔드 및 UIUX 표준
- 응용: Astro · MDX
- Adjacent: Core Web Vitals Optimization (INP, LCP, CLS)
🤖 LLM 활용
언제: marketing site, blog, docs, public-facing SEO-critical content, GEO optimization. 언제 X: authenticated app (SPA), real-time UI (SPA/SSR), no SEO requirement.
❌ 안티패턴
- SPA 의 marketing site: crawlable HTML 의 부재 — SSG/SSR 의 mandatory.
- Render-blocking JS / fonts: LCP 의 destroy —
font-display: swap, defer non-critical JS. - Image 의 dimensions 의 unspecified: CLS regression —
width/height의 항상 의 specify. - Duplicate content 의 canonical 의 부재: SEO penalty —
<link rel="canonical">의 필수. - Schema.org 없음: rich result + AI overview citation 의 lose — JSON-LD 의 add.
- Sitemap 의 stale: ISR / on-demand revalidate or build-time regenerate.
- GEO ignore: AI search traffic 의 2026 의 surge — llms.txt + clear semantic HTML.
🧪 검증 / 중복
- Verified (Google Search Central, web.dev CWV, Astro/Next.js 2026 docs, llms.txt spec).
- 신뢰도 A.
🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — full 2026 SEO playbook with GEO + Astro/Next stack |