
02 — Screens and brief
- Reader contract
- Archive → article → related content
- Multi-tenant
- One route, N channels
- Search signals
- Canonical / hreflang / JSON-LD
- Client
- Yurasis platform
- Role
- Public information architecture, article reading UX, multi-tenant rendering, technical SEO, traffic attribution
03 — Multi-tenant reader
One publishing system serves every customer channel
The article reader lives at /[lang]/article/[blogSlug]/[postSlug]. The blogSlug segment selects which blog's configuration to apply — primary color, name, categories, AdSense publisher ID, and site verification tags all come from the blog record. There is no per-blog deployment, no per-blog codebase, and no per-blog build.
The list view supports category and tag discovery, while the reader keeps titles, cover images, captions, headings, anchors, and related links easy to scan. The same public contract powers the Yurasis guide channel shown in this case study.
04 — SEO
Search-ready output is part of the reader contract
Each article page injects BlogPosting (with headline, description, author, publisher, image, wordCount, and timeRequired), Blog (with publisher reference), BreadcrumbList (three-item chain: Yurasis → blog → post), and FAQPage (when the post stores a faqSchema array). All four blocks are rendered as <script type="application/ld+json"> in the server HTML.
hreflang alternates are derived from published translation references. canonicalTranslation() prefers an indexable translation for the requested locale, then follows the channel default and Korean/English fallbacks, preventing unsupported or draft variants from becoming accidental search targets.
05 — Related posts
Related reading continues the discovery journey
When a post has a category, the reader fetches up to six posts from the same category, excludes the current post, and renders the first four as a related posts grid below the article. When no category exists the query falls back to the post's first tag. No embeddings, no ML model — just a filtered API call at request time.
The cards preserve the public URL contract and language preference, so a reader can continue within the same channel rather than reaching a dead end after one article.
06 — Analytics
Measurement happens after the page is readable
View count is incremented by a ViewTracker client component that fires a POST request after hydration using a keepalive fetch. The server renders the article without waiting for the view event — the count the reader sees is viewCount + 1, accounting for the current visit before the API confirms it.
Traffic attribution is recorded alongside the view event and daily metrics are aggregated separately. The public reader stays focused on speed and legibility while the dashboard receives useful performance data.
Interactive build
Yurasis Article
Browse the live Yurasis guide channel, then open an article to review the searchable archive, responsive reader, screenshots, anchors, related content, and structured SEO output.