feat: SEO altyapısı — pre-render, meta tags, blog posts, robots/sitemap

- vite-plugin-prerender yerine Playwright tabanlı post-build pre-render scripti
  (apps/web/scripts/prerender.mjs): 10 public route statik HTML'e dönüştürülüyor
- usePageMeta hook: her public route'da özgün title/description/canonical/OG tags
- index.html: favicon.svg, canonical, OG/Twitter Card, geliştirilmiş title+desc
- apps/web/public/: robots.txt, sitemap.xml (10 URL), favicon.svg
- nginx HSTS header eklendi (Strict-Transport-Security)
- Blog post sayfaları: blog_/$slug.tsx (4 tam yazı, 600-800 kelime)
- blog.tsx: post kartlarına Link eklendi
- Homepage: Schema.org JSON-LD (Organization + SoftwareApplication)
- Footer: placeholder href="#" sosyal linkler kaldırıldı
- deploy.sh + deploy.yml: playwright install chromium + prerender adımı

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Sase Dev
2026-02-22 14:15:35 +00:00
parent f1a27810db
commit 7194393e6d
32 changed files with 1022 additions and 539 deletions

View File

@@ -25,6 +25,7 @@ import { Route as DashboardSettingsRouteImport } from "./routes/dashboard/settin
import { Route as DashboardSearchRouteImport } from "./routes/dashboard/search"
import { Route as DashboardHistoryRouteImport } from "./routes/dashboard/history"
import { Route as DashboardBillingRouteImport } from "./routes/dashboard/billing"
import { Route as BlogSlugRouteImport } from "./routes/blog_/$slug"
import { Route as AuthResetPasswordRouteImport } from "./routes/_auth/reset-password"
import { Route as AuthRegisterRouteImport } from "./routes/_auth/register"
import { Route as AuthLoginRouteImport } from "./routes/_auth/login"
@@ -119,6 +120,11 @@ const DashboardBillingRoute = DashboardBillingRouteImport.update({
path: "/billing",
getParentRoute: () => DashboardRoute,
} as any)
const BlogSlugRoute = BlogSlugRouteImport.update({
id: "/blog_/$slug",
path: "/blog/$slug",
getParentRoute: () => rootRouteImport,
} as any)
const AuthResetPasswordRoute = AuthResetPasswordRouteImport.update({
id: "/reset-password",
path: "/reset-password",
@@ -209,6 +215,7 @@ export interface FileRoutesByFullPath {
"/login": typeof AuthLoginRoute
"/register": typeof AuthRegisterRoute
"/reset-password": typeof AuthResetPasswordRoute
"/blog/$slug": typeof BlogSlugRoute
"/dashboard/billing": typeof DashboardBillingRoute
"/dashboard/history": typeof DashboardHistoryRoute
"/dashboard/search": typeof DashboardSearchRoute
@@ -239,6 +246,7 @@ export interface FileRoutesByTo {
"/login": typeof AuthLoginRoute
"/register": typeof AuthRegisterRoute
"/reset-password": typeof AuthResetPasswordRoute
"/blog/$slug": typeof BlogSlugRoute
"/dashboard/billing": typeof DashboardBillingRoute
"/dashboard/history": typeof DashboardHistoryRoute
"/dashboard/search": typeof DashboardSearchRoute
@@ -272,6 +280,7 @@ export interface FileRoutesById {
"/_auth/login": typeof AuthLoginRoute
"/_auth/register": typeof AuthRegisterRoute
"/_auth/reset-password": typeof AuthResetPasswordRoute
"/blog_/$slug": typeof BlogSlugRoute
"/dashboard/billing": typeof DashboardBillingRoute
"/dashboard/history": typeof DashboardHistoryRoute
"/dashboard/search": typeof DashboardSearchRoute
@@ -305,6 +314,7 @@ export interface FileRouteTypes {
| "/login"
| "/register"
| "/reset-password"
| "/blog/$slug"
| "/dashboard/billing"
| "/dashboard/history"
| "/dashboard/search"
@@ -335,6 +345,7 @@ export interface FileRouteTypes {
| "/login"
| "/register"
| "/reset-password"
| "/blog/$slug"
| "/dashboard/billing"
| "/dashboard/history"
| "/dashboard/search"
@@ -367,6 +378,7 @@ export interface FileRouteTypes {
| "/_auth/login"
| "/_auth/register"
| "/_auth/reset-password"
| "/blog_/$slug"
| "/dashboard/billing"
| "/dashboard/history"
| "/dashboard/search"
@@ -396,6 +408,7 @@ export interface RootRouteChildren {
PricingRoute: typeof PricingRoute
PrivacyRoute: typeof PrivacyRoute
TermsRoute: typeof TermsRoute
BlogSlugRoute: typeof BlogSlugRoute
}
declare module "@tanstack/react-router" {
@@ -512,6 +525,13 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof DashboardBillingRouteImport
parentRoute: typeof DashboardRoute
}
"/blog_/$slug": {
id: "/blog_/$slug"
path: "/blog/$slug"
fullPath: "/blog/$slug"
preLoaderRoute: typeof BlogSlugRouteImport
parentRoute: typeof rootRouteImport
}
"/_auth/reset-password": {
id: "/_auth/reset-password"
path: "/reset-password"
@@ -682,6 +702,7 @@ const rootRouteChildren: RootRouteChildren = {
PricingRoute: PricingRoute,
PrivacyRoute: PrivacyRoute,
TermsRoute: TermsRoute,
BlogSlugRoute: BlogSlugRoute,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)