diff --git a/apps/website/package.json b/apps/website/package.json
index cceb5e2da0..691347dda7 100644
--- a/apps/website/package.json
+++ b/apps/website/package.json
@@ -15,6 +15,7 @@
"check:render": "node scripts/render-check.mjs",
"check:deployed": "node scripts/deployed-check.mjs",
"check:aria": "node scripts/aria-refs-check.mjs",
+ "check:service-entry": "node scripts/service-entry-check.mjs",
"typecheck:update": "node scripts/typecheck-ratchet.mjs --update",
"audit:en": "node qa/lang_audit.mjs",
"audit:ru": "node qa/ru_audit.mjs"
diff --git a/apps/website/scripts/service-entry-check.mjs b/apps/website/scripts/service-entry-check.mjs
new file mode 100644
index 0000000000..c84a341a0d
--- /dev/null
+++ b/apps/website/scripts/service-entry-check.mjs
@@ -0,0 +1,26 @@
+import { readFileSync } from 'node:fs'
+
+const root = new URL('..', import.meta.url)
+const component = readFileSync(new URL('src/components/ServiceEntry.tsx', root), 'utf8')
+const app = readFileSync(new URL('src/App.tsx', root), 'utf8')
+
+const requirements = [
+ ['official Telegram bot URL', component.includes('https://t.me/t27ai_bot?start=website')],
+ ['English Telegram CTA', component.includes('Open in Telegram')],
+ ['Russian Telegram CTA', component.includes('Открыть в Telegram')],
+ ['English verified-profile explanation', component.includes('verified Telegram profile')],
+ ['Russian verified-profile explanation', component.includes('подтверждённого профиля Telegram')],
+ ['browser CTA uses native disabled semantics', component.includes('')],
+]
+
+const failed = requirements.filter(([, ok]) => !ok)
+if (failed.length) {
+ for (const [name] of failed) console.error(`FAIL: ${name}`)
+ process.exit(1)
+}
+
+console.log(`PASS: ${requirements.length} service-entry requirements`)
diff --git a/apps/website/src/App.tsx b/apps/website/src/App.tsx
index 4dfdf913c7..2dcc9c8465 100644
--- a/apps/website/src/App.tsx
+++ b/apps/website/src/App.tsx
@@ -1,6 +1,7 @@
import { lazy, Suspense } from 'react'
import Navigation from './components/Navigation'
import Footer from './components/Footer'
+import ServiceEntry from './components/ServiceEntry'
import { TnfHero } from './components/sections/tnf'
// Главная страница построена под статьёй «Trinity S³AI: Ternary Network Floats»
@@ -45,6 +46,7 @@ export default function App() {
+
}>
diff --git a/apps/website/src/components/ServiceEntry.tsx b/apps/website/src/components/ServiceEntry.tsx
new file mode 100644
index 0000000000..48cd1f8262
--- /dev/null
+++ b/apps/website/src/components/ServiceEntry.tsx
@@ -0,0 +1,57 @@
+import { useI18n } from '../i18n/context'
+
+const TELEGRAM_URL = 'https://t.me/t27ai_bot?start=website'
+
+const copy = {
+ en: {
+ eyebrow: 'TRINITY S3AI SERVICE',
+ title: 'Continue with your own Telegram identity',
+ body: 'The agent works only inside a verified Telegram profile. The website does not create a parallel account, expose credentials, or let one user act as another.',
+ telegram: 'Open in Telegram',
+ browser: 'Try in browser',
+ browserNote: 'Browser access will appear here after the owner confirms a stable public Mini App URL.',
+ },
+ ru: {
+ eyebrow: 'СЕРВИС TRINITY S3AI',
+ title: 'Продолжите со своим профилем Telegram',
+ body: 'Агент работает только внутри подтверждённого профиля Telegram. Сайт не создаёт параллельную учётную запись, не раскрывает ключи и не позволяет действовать от имени другого пользователя.',
+ telegram: 'Открыть в Telegram',
+ browser: 'Попробовать в браузере',
+ browserNote: 'Вход из браузера появится здесь после подтверждения владельцем стабильного публичного URL Mini App.',
+ },
+}
+
+export default function ServiceEntry() {
+ const { lang } = useI18n()
+ const t = copy[lang === 'ru' ? 'ru' : 'en']
+
+ return (
+
+
+
+
{t.eyebrow}
+
{t.title}
+
{t.body}
+
+
+
+ {t.browserNote}
+
+
+
+
+ )
+}