Skip to content

Commit fbb73e1

Browse files
updates
1 parent b35c445 commit fbb73e1

11 files changed

Lines changed: 783 additions & 21 deletions

File tree

app/interviews/[slug]/page.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
4040
'en-CA': canonical,
4141
'en-GB': canonical,
4242
'en-AU': canonical,
43+
'en-IE': canonical,
4344
'x-default': canonical,
4445
},
4546
},
@@ -61,6 +62,12 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
6162
description: interview.description,
6263
images: [defaultOgImage.url],
6364
},
65+
other: {
66+
'article:section': 'Interview Questions',
67+
...(interview.keywords
68+
? { 'article:tag': interview.keywords.split(',').map((k) => k.trim()).slice(0, 6).join(',') }
69+
: {}),
70+
},
6471
};
6572
}
6673

@@ -81,6 +88,9 @@ export default async function InterviewPostPage({ params }: Props) {
8188
dateModified={interview.lastmod?.trim()}
8289
url={url}
8390
type="Article"
91+
keywords={interview.keywords}
92+
articleSection="Interview Questions"
93+
faqs={interview.faqs}
8494
/>
8595
<PostLayout
8696
title={interview.title}

app/layout.tsx

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,52 @@ import {
66
HOME_HTML_TITLE,
77
HOME_META_DESCRIPTION,
88
SITE_NAME,
9+
SITE_URL,
910
defaultOgImage,
1011
} from '@/lib/site-seo';
1112

13+
const organizationSchema = {
14+
'@context': 'https://schema.org',
15+
'@type': 'Organization',
16+
'@id': 'https://proxytechsupport.com/#organization',
17+
name: SITE_NAME,
18+
url: SITE_URL,
19+
logo: {
20+
'@type': 'ImageObject',
21+
url: 'https://proxytechsupport.com/images/logo.png',
22+
width: 200,
23+
height: 60,
24+
},
25+
description:
26+
'Real-time IT job support and proxy interview assistance for software developers and engineers across USA, UK, Canada, Australia, Europe, Germany, Ireland, Singapore, and worldwide. Same-day start. All major time zones covered.',
27+
contactPoint: {
28+
'@type': 'ContactPoint',
29+
contactType: 'customer support',
30+
availableLanguage: 'English',
31+
areaServed: ['US', 'GB', 'CA', 'AU', 'IE', 'DE', 'SG', 'NZ', 'AE'],
32+
},
33+
areaServed: ['US', 'GB', 'CA', 'AU', 'IE', 'DE', 'SG', 'NZ', 'AE'],
34+
knowsAbout: [
35+
'IT Job Support',
36+
'Proxy Interview Support',
37+
'AWS Cloud Engineering',
38+
'DevOps',
39+
'Site Reliability Engineering',
40+
'AI/ML Engineering',
41+
'Software Development',
42+
'Technical Interview Preparation',
43+
],
44+
};
45+
46+
const websiteSchema = {
47+
'@context': 'https://schema.org',
48+
'@type': 'WebSite',
49+
'@id': 'https://proxytechsupport.com/#website',
50+
url: SITE_URL,
51+
name: SITE_NAME,
52+
publisher: { '@id': 'https://proxytechsupport.com/#organization' },
53+
};
54+
1255
export const metadata: Metadata = {
1356
metadataBase: new URL('https://proxytechsupport.com'),
1457
title: {
@@ -38,6 +81,7 @@ export const metadata: Metadata = {
3881
'en-CA': 'https://proxytechsupport.com',
3982
'en-GB': 'https://proxytechsupport.com',
4083
'en-AU': 'https://proxytechsupport.com',
84+
'en-IE': 'https://proxytechsupport.com',
4185
'x-default': 'https://proxytechsupport.com',
4286
},
4387
},
@@ -70,6 +114,14 @@ export default function RootLayout({
70114
return (
71115
<html lang="en">
72116
<body>
117+
<script
118+
type="application/ld+json"
119+
dangerouslySetInnerHTML={{ __html: JSON.stringify(organizationSchema) }}
120+
/>
121+
<script
122+
type="application/ld+json"
123+
dangerouslySetInnerHTML={{ __html: JSON.stringify(websiteSchema) }}
124+
/>
73125
<SiteAnalytics />
74126
<GoogleTagManagerNoscript />
75127
{children}

app/robots.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,74 @@ export default function robots(): MetadataRoute.Robots {
163163
userAgent: 'omgili',
164164
allow: '/',
165165
},
166+
// ── Yahoo! Search (Slurp) ────────────────────────────────────────────
167+
{
168+
userAgent: 'Slurp',
169+
allow: '/',
170+
},
171+
// ── DuckDuckGo ───────────────────────────────────────────────────────
172+
{
173+
userAgent: 'DuckDuckBot',
174+
allow: '/',
175+
},
176+
// ── Baidu ────────────────────────────────────────────────────────────
177+
{
178+
userAgent: 'Baiduspider',
179+
allow: '/',
180+
},
181+
// ── Yandex ───────────────────────────────────────────────────────────
182+
{
183+
userAgent: 'YandexBot',
184+
allow: '/',
185+
},
186+
// ── Naver (South Korean search engine) ──────────────────────────────
187+
{
188+
userAgent: 'NaverBot',
189+
allow: '/',
190+
},
191+
// ── Sogou (Chinese search engine) ───────────────────────────────────
192+
{
193+
userAgent: 'Sogou',
194+
allow: '/',
195+
},
196+
// ── Internet Archive / Wayback Machine ──────────────────────────────
197+
{
198+
userAgent: 'ia_archiver',
199+
allow: '/',
200+
},
201+
// ── Social preview bots (link unfurling / OG card rendering) ────────
202+
{
203+
userAgent: 'Twitterbot',
204+
allow: '/',
205+
},
206+
{
207+
userAgent: 'LinkedInBot',
208+
allow: '/',
209+
},
210+
{
211+
userAgent: 'facebookexternalhit',
212+
allow: '/',
213+
},
214+
{
215+
userAgent: 'WhatsApp',
216+
allow: '/',
217+
},
218+
{
219+
userAgent: 'Discordbot',
220+
allow: '/',
221+
},
222+
{
223+
userAgent: 'Slackbot',
224+
allow: '/',
225+
},
226+
{
227+
userAgent: 'TelegramBot',
228+
allow: '/',
229+
},
230+
{
231+
userAgent: 'Iframely',
232+
allow: '/',
233+
},
166234
],
167235
sitemap: `${SITE_URL}/sitemap.xml`,
168236
host: SITE_URL,

components/ArticleStructuredData.tsx

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ type Props = {
1313
type?: 'BlogPosting' | 'Article' | 'TechArticle';
1414
/** Topic — TechArticle maps to `about` + `teaches`; BlogPosting sets schema.org `about` when present. */
1515
about?: string;
16+
/** Comma-separated keywords string from meta.ts — emitted as schema `keywords`. */
17+
keywords?: string;
18+
/** Article section label (e.g. "Interview Questions"). Defaults to "IT Job Support" for TechArticle. */
19+
articleSection?: string;
1620
/** FAQs to emit as an inline FAQPage schema alongside the article schema. */
1721
faqs?: ArticleFaq[];
1822
};
@@ -25,6 +29,8 @@ export default function ArticleStructuredData({
2529
url,
2630
type = 'BlogPosting',
2731
about,
32+
keywords,
33+
articleSection,
2834
faqs,
2935
}: Props) {
3036
const published = datePublished ? `${datePublished}T12:00:00+05:30` : undefined;
@@ -51,37 +57,25 @@ export default function ArticleStructuredData({
5157
},
5258
image: `${SITE_URL}/images/previewimg.png`,
5359
...(published ? { datePublished: published, dateModified: modified ?? published } : {}),
54-
/**
55-
* Speakable specification — tells AI agents and voice assistants which
56-
* CSS selectors contain the most important extractable content.
57-
* h1 = canonical subject; h2 = section labels; .post-content = body text.
58-
*/
60+
inLanguage: 'en-US',
61+
isAccessibleForFree: true,
62+
...(keywords ? { keywords } : {}),
63+
...(articleSection ? { articleSection } : {}),
5964
speakable: {
6065
'@type': 'SpeakableSpecification',
6166
cssSelector: ['h1', 'h2', 'h3', '.post-content'],
6267
},
6368
};
6469

65-
if (type === 'BlogPosting' && about) {
66-
articleSchema.about = {
67-
'@type': 'Thing',
68-
name: about,
69-
};
70+
if (about) {
71+
articleSchema.about = { '@type': 'Thing', name: about };
7072
}
7173

7274
// TechArticle-specific properties
7375
if (type === 'TechArticle') {
7476
articleSchema.proficiencyLevel = 'Expert';
75-
articleSchema.articleSection = 'IT Job Support';
76-
if (about) {
77-
articleSchema.about = {
78-
'@type': 'Thing',
79-
name: about,
80-
};
81-
articleSchema.teaches = about;
82-
}
83-
articleSchema.inLanguage = 'en-US';
84-
articleSchema.isAccessibleForFree = true;
77+
if (!articleSection) articleSchema.articleSection = 'IT Job Support';
78+
if (about) articleSchema.teaches = about;
8579
}
8680

8781
const faqSchema = faqs && faqs.length > 0
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { loadInterviewBodyHtml } from '@/lib/interview-body-html';
2+
3+
export default function Article() {
4+
const html = loadInterviewBodyHtml('2026-06-11-senior-cloud-engineer-aws-migration-finance-interview-questions');
5+
return <div dangerouslySetInnerHTML={{ __html: html }} />;
6+
}

0 commit comments

Comments
 (0)