-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
157 lines (150 loc) · 5.68 KB
/
Copy pathindex.html
File metadata and controls
157 lines (150 loc) · 5.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<!doctype html>
<html lang="en-GB" class="dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="dark" />
<meta name="theme-color" content="#0b0f19" />
<title>Vishal Khan - AI and ML Engineer, London</title>
<meta
name="description"
content="AI and ML engineer in London. Databricks pipelines at Teleperformance, now an MSc in AI working on agent reliability. Every claim carries its source."
/>
<meta name="author" content="Vishal Khan" />
<meta
name="robots"
content="index, follow, max-image-preview:large, max-snippet:-1"
/>
<!-- Cross-origin referrers get the origin only, same-origin gets the path. -->
<meta name="referrer" content="strict-origin-when-cross-origin" />
<!--
Absolute, not root-relative. The page is reachable at vishalkhan.me and at
datasciencevishal.github.io, and LinkedIn's scraper does not resolve a
relative og:image at all, so a shared link rendered as an empty grey card.
This is the channel the URL actually travels through.
-->
<link rel="canonical" href="https://vishalkhan.me/" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/favicon.svg" />
<link
rel="preload"
href="/fonts/bricolage-grotesque-latin-wdth-normal.woff2"
as="font"
type="font/woff2"
crossorigin="anonymous"
/>
<link
rel="preload"
href="/fonts/ibm-plex-sans-latin-wght-normal.woff2"
as="font"
type="font/woff2"
crossorigin="anonymous"
/>
<!--
The hero figure's still. It is the largest contentful paint on every
viewport, and without this it queued behind the main bundle: on a
throttled phone it started at 645ms and finished at 2.4s, entirely
because 355 kB of JavaScript was ahead of it on the wire. It is in the
prerendered markup, but the preload scanner reaches this line first.
-->
<link
rel="preload"
href="/hero-figure.webp"
as="image"
type="image/webp"
fetchpriority="high"
/>
<meta property="og:type" content="profile" />
<meta property="og:url" content="https://vishalkhan.me/" />
<meta property="og:locale" content="en_GB" />
<meta property="og:site_name" content="Vishal Khan" />
<meta
property="og:title"
content="Vishal Khan - AI and ML Engineer, London"
/>
<meta
property="og:description"
content="A number nobody can check is not a number. AI and ML engineer in London, looking for an AI or ML internship now and full time from early 2027. No visa sponsorship needed."
/>
<meta property="og:image" content="https://vishalkhan.me/og-image.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta
property="og:image:alt"
content="Vishal Khan. A number nobody can check is not a number. AI and ML engineer in London."
/>
<meta name="twitter:card" content="summary_large_image" />
<meta
name="twitter:title"
content="Vishal Khan - AI and ML Engineer, London"
/>
<meta
name="twitter:description"
content="A number nobody can check is not a number. AI and ML engineer in London, looking for an AI or ML internship now and full time from early 2027. No visa sponsorship needed."
/>
<meta name="twitter:image" content="https://vishalkhan.me/og-image.jpg" />
<!--
"Vishal Khan" is a common name. This is what lets a search engine bind
the string to this particular person, his university and his profiles,
rather than guessing. Every field restates something already on the page.
-->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Vishal Khan",
"url": "https://vishalkhan.me/",
"image": "https://vishalkhan.me/og-image.jpg",
"jobTitle": "AI and ML Engineer",
"description": "AI and ML engineer in London, working on agent reliability and the evaluation of AI systems.",
"address": {
"@type": "PostalAddress",
"addressLocality": "London",
"addressCountry": "GB"
},
"alumniOf": [
{
"@type": "CollegeOrUniversity",
"name": "Northeastern University London",
"url": "https://www.nulondon.ac.uk/"
},
{
"@type": "CollegeOrUniversity",
"name": "Liverpool John Moores University",
"url": "https://www.ljmu.ac.uk/"
},
{
"@type": "CollegeOrUniversity",
"name": "University of Delhi",
"url": "https://www.du.ac.in/"
}
],
"knowsAbout": [
"Agent reliability",
"AI evaluation",
"Retrieval-augmented generation",
"Machine learning",
"Data engineering",
"Databricks"
],
"sameAs": [
"https://github.com/DataScienceVishal",
"https://www.linkedin.com/in/vishalkhandatascience/"
]
}
</script>
</head>
<body>
<!--
Blocking and first, on purpose. The hero's entrance is CSS gated on this
class, so the markup is visible by default and only hides itself where
there is JavaScript to reveal it again. Inline and synchronous so it runs
before the first paint and no flash of the hidden state is possible.
-->
<script>
document.documentElement.classList.add("js");
</script>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>