1<!DOCTYPE html><html lang="en"> <head><!-- Global Metadata --><meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <!-- Brand font preloads. Required pair for `font-display: optional` on the Geist 2 display/text face: without this the request cannot start until scalar.css is 3 fetched, parsed and the face matched, which is past optional's ~100ms block 4 period, so the face never paints. Mirrors the font preloads in layouts/Layout.astro. --> <link rel="preload" href="/fonts/gyByhwUxId8gMEwcGFU-3.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/or3nQ6H-1_WfwkMZI_qYFrcdmg-1.woff2" as="font" type="font/woff2" crossorigin> <meta name="ahrefs-site-verification" content="829fb945ed2a40d4dad32c8964743b72dc96b5f533a0a9f960d149fd06ad2b8a"> <meta name="robots" content="index,follow"> <meta name="keywords" content="AI training, data labeling, RLHF, LLM evaluation, AI trainers, data labelers, annotation, red teaming, domain experts, AI talent marketplace, human data, preference data, supervised fine-tuning, managed service, OpenTrain"> <meta name="author" content="OpenTrain AI"> <meta name="creator" content="OpenTrain AI"> <meta name="publisher" content="OpenTrain AI"> <!-- Theme Script -->
4<script> 5(() => { 6 const storageKey = "starlight-theme"; 7 const dayStartHour = 7; 8 const dayEndHour = 19; 9 const forcedTheme = null; 10 let savedTheme = null; 11 12 try { 13 savedTheme = localStorage.getItem(storageKey); 14 } catch { 15 savedTheme = null; 16 } 17 18 const hour = new Date().getHours(); 19 const automaticTheme = hour >= dayStartHour && hour < dayEndHour ? 'light' : 'dark'; 20 const initialTheme = forcedTheme === 'light' || forcedTheme === 'dark' 21 ? forcedTheme 22 : savedTheme === 'light' || savedTheme === 'dark' 23 ? savedTheme 24 : automaticTheme; 25 26 document.documentElement.classList.toggle('dark', initialTheme === 'dark'); 27})(); 28</script>
28 <!-- Favicon --> <link rel="icon" type="image/png" sizes="96x96" href="/images/favicon.png"><link rel="icon" type="image/png" sizes="96x96" href="/images/favicon.png"><link rel="icon" href="/images/favicon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/images/favicon.png"> <link rel="shortcut icon" href="/images/favicon.png"> <link rel="sitemap" href="/sitemap-index.xml"> <meta name="generator" content="Astro v7.3.5"> <!-- Canonical URL --> <link rel="canonical" href="https://www.opentrain.ai/about/"> <!-- Primary Meta Tags --> <title>About OpenTrain AI</title> <meta name="title" content="About OpenTrain AI"> <meta name="description" content="Learn how OpenTrain AI is building the open platform for AI training, data labeling, and evaluation with vetted experts and transparent pricing."> <!-- Open Graph / Facebook --> <meta property="og:type" content="website"> <meta property="og:url" content="https://www.opentrain.ai/about/"> <meta property="og:site_name" content="OpenTrain AI"> <meta property="og:title" content="About OpenTrain AI"> <meta property="og:description" content="Learn how OpenTrain AI is building the open platform for AI training, data labeling, and evaluation with vetted experts and transparent pricing."> <meta property="og:image" content="https://www.opentrain.ai/images/og/opentrain-default-talent-layer.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="630"> <meta property="og:image:alt" content="OpenTrain AI | Open talent network for AI training and data labeling"> <!-- Twitter --> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:url" content="https://www.opentrain.ai/about/"> <meta name="twitter:title" content="About OpenTrain AI"> <meta name="twitter:description" content="Learn how OpenTrain AI is building the open platform for AI training, data labeling, and evaluation with vetted experts and transparent pricing."> <meta name="twitter:image" content="https://www.opentrain.ai/images/og/opentrain-default-talent-layer.png"> <meta name="twitter:creator" content="@opentrainai">
28<script> 29 (() => { 30 if (window.__opentrainPostHogLoadStarted) return; 31 window.__opentrainPostHogLoadStarted = true; 32 33 const SOCIAL_HOSTS = new Set([ 34 "x.com", 35 "twitter.com", 36 "www.linkedin.com", 37 "linkedin.com" 38 ]); 39 40 const CTA_TEXT = /\b(post a job|get a quote|create account|sign up|try opentrain|join now|join free|list free|list your company|hire freelancers|managed service|see pricing|view pricing|start hiring|become a freelancer)\b/i; 41 const APP_HOST = "app.opentrain.ai"; 42 43 const cleanText = (value) => value.replace(/\s+/g, " ").trim().slice(0, 120); 44 const isOpenTrainHost = (host) => host === "opentrain.ai" || host.endsWith(".opentrain.ai"); 45 46 const getUtmProperties = (url) => { 47 const params = url.searchParams; 48 return { 49 utm_source: params.get("utm_source") || undefined, 50 utm_medium: params.get("utm_medium") || undefined, 51 utm_campaign: params.get("utm_campaign") || undefined, 52 utm_content: params.get("utm_content") || undefined, 53 utm_term: params.get("utm_term") || undefined 54 }; 55 }; 56 57 const getRegion = (element) => { 58 const region = element.closest("header, footer, nav, main, section, article, aside"); 59 if (!region) return "unknown"; 60 return region.tagName.toLowerCase(); 61 }; 62 63 const getAppIntent = (url, text) => { 64 const key = url.searchParams.get("key"); 65 const q = url.searchParams.get("q"); 66 if (key === "signup" || /\b(sign up|create account|post a job)\b/i.test(text)) return "signup"; 67 if (key === "login" || /\b(log in|login)\b/i.test(text)) return "login"; 68 if (q === "hire" || /\b(hire|post a job)\b/i.test(text)) return "hire"; 69 return "app_launch"; 70 }; 71 72 const capture = (eventName, properties) => { 73 if (!window.posthog || typeof window.posthog.capture !== "function") return; 74 window.posthog.capture(eventName, properties); 75 }; 76 77 // Consent. The Probo banner writes `probo_consent` as URL-encoded JSON 78 // ({ action, data: { <category slug>: boolean } }) and fires probo-ready / 79 // probo-consent. Persistence is allowed only for the analytics category.
80 let consentMode = null; // "OPT_IN" | "OPT_OUT" | null (from probo-ready) 81 let gpcApplied = false; 82 let proboReady = false; 83 let proboWaiters = []; 84 85 const readProboAnalyticsConsent = () => { 86 try { 87 const pair = document.cookie.split("; ").find((c) => c.startsWith("probo_consent=")); 88 if (!pair) return null; 89 const parsed = JSON.parse(decodeURIComponent(pair.slice("probo_consent=".length))); 90 if (!parsed || typeof parsed !== "object") return null; 91 const categories = parsed.data && typeof parsed.data === "object" ? parsed.data : parsed; 92 const analytics = Object.entries(categories).find(([slug]) => /analytic|statistic/i.test(slug)); 93 if (analytics) return Boolean(analytics[1]); 94 if (parsed.action === "ACCEPT_ALL") return true; 95 if (parsed.action === "REJECT_ALL" || parsed.action === "GPC") return false; 96 // A decision exists but has no analytics category: treat as denied. 97 return false; 98 } catch { 99 return null; 100 } 101 }; 102 103 // true = persist, false = memory only, null = the banner has not decided yet. 104 const persistenceAllowed = () => { 105 // GPC is an explicit browser signal and must override any older consent 106 // cookie that may have allowed analytics on an earlier visit. 107 if (gpcApplied || navigator.globalPrivacyControl === true) return false; 108 const fromCookie = readProboAnalyticsConsent(); 109 if (fromCookie !== null) return fromCookie; 110 if (consentMode === "OPT_OUT") return true; 111 if (consentMode === "OPT_IN") return false; 112 return null; 113 }; 114 115 // Shared consent signal for app.opentrain.ai. `probo_consent` is host-only, 116 // so the app cannot read it. The analytics decision is mirrored into a 117 // parent-domain cookie with the banner's lifetime: "allowed" only for an 118 // explicit analytics grant without GPC, "denied" for a rejection, a later 119 // withdrawal or GPC. The value is one of those two words, never an id. 120 const SHARED_CONSENT = "opentrain_analytics_consent"; 121 const SHARED_CONSENT_ATTRIBUTES = "; Domain=.opentrain.ai; Path=/; Secure; SameSite=Lax";
122 let consentExpiryDays = null; 123 124 const sharedConsentValue = () => { 125 if (gpcApplied || navigator.globalPrivacyControl === true) return "denied"; 126 const decided = readProboAnalyticsConsent(); 127 if (decided === null) return null; 128 return decided ? "allowed" : "denied"; 129 }; 130 131 // force: a banner decision just rewrote probo_consent, so restart the 132 // lifetime too. Otherwise write only when the signal is missing or stale. 133 const mirrorConsent = (force) => { 134 if (!isOpenTrainHost(window.location.hostname || "")) return; 135 const value = sharedConsentValue(); 136 const pair = document.cookie.split("; ").find((c) => c.startsWith(SHARED_CONSENT + "=")); 137 const current = pair ? pair.slice(SHARED_CONSENT.length + 1) : null; 138 if (value === null) { 139 if (current !== null) document.cookie = SHARED_CONSENT + "=" + SHARED_CONSENT_ATTRIBUTES + "; Max-Age=0"; 140 return; 141 } 142 if (!force && value === current) return; 143 const lifetime = consentExpiryDays ? "; Max-Age=" + Math.round(consentExpiryDays * 86400) : ""; 144 document.cookie = SHARED_CONSENT + "=" + value + SHARED_CONSENT_ATTRIBUTES + lifetime; 145 }; 146 147 const PERSISTENT = { 148 persistence: "localStorage+cookie", 149 cross_subdomain_cookie: true, 150 cookie_domain: ".opentrain.ai" 151 }; 152 const MEMORY = { persistence: "memory" }; 153 let persistent = false; 154 155 // Job-page labels (ids and channel labels only, never visitor data). They 156 // are cleared on every other page so persistence never carries a job's 157 // labels onto a later page. 158 const JOB_PROPERTY_KEYS = [ 159 "page_type", "job_id", "partner", "ch", "sub", 160 "utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term" 161 ]; 162 const TOUCH_KEYS = ["ch", "sub", "job_id", "utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term"]; 163 const LABEL = /^[a-zA-Z0-9._-]{1,120}$/; 164 165 const readJobProperties = () => { 166 const ctx = window.__otJobAnalytics; 167 if (!ctx || typeof ctx !== "object" || typeof ctx.job_id !== "string" || !LABEL.test(ctx.job_id)) return null; 168 const props = { page_type: "job_detail", job_id: ctx.job_id }; 169 ["partner", "ch", "sub"].forEach((key) => { 170 if (typeof ctx[key] === "string" && LABEL.test(ctx[key])) props[key] = ctx[key]; 171 }); 172 // UTM values must be plain labels too: free text or an address is dropped. 173 const utm = getUtmProperties(new URL(window.location.href)); 174 Object.keys(utm).forEach((key) => { 175 if (typeof utm[key] === "string" && LABEL.test(utm[key])) props[key] = utm[key]; 176 }); 177 return props; 178 }; 179 180 const registerJobProperties = (ph) => { 181 const props = readJobProperties(); 182 JOB_PROPERTY_KEYS.forEach((key) => { 183 if (!props || !(key in props)) ph.unregister(key); 184 }); 185 if (props) ph.register(props); 186 }; 187 188 // First-touch ($set_once) and last-touch ($set) labels on the person. Only 189 // with persistence: in memory mode every page load is a new anonymous id, 190 // so a person profile per page view would be noise. 191 const setJobPersonProperties = (ph) => { 192 const props = readJobProperties(); 193 if (!props || !persistent || typeof ph.setPersonProperties !== "function") return; 194 const now = new Date().toISOString(); 195 const setOnce = { first_seen_at: now }; 196 const set = { last_seen_at: now }; 197 TOUCH_KEYS.forEach((key) => { 198 setOnce["first_" + key] = props[key] || null; 199 set["last_" + key] = props[key] || null; 200 }); 201 ph.setPersonProperties(set, setOnce); 202 }; 203 204 const applyConsent = () => { 205 if (!window.__opentrainPostHogInitialized || !window.posthog) return; 206 const allowed = persistenceAllowed() === true; 207 if (allowed === persistent) return; 208 persistent = allowed; 209 window.posthog.set_config(allowed ? PERSISTENT : MEMORY); 210 window.posthog.register({ analytics_consent: persistent ? "granted" : "memory" }); 211 if (allowed) setJobPersonProperties(window.posthog); 212 }; 213 214 document.addEventListener("probo-ready", (e) => { 215 const detail = e && e.detail; 216 const mode = detail && detail.config && detail.config.consent_mode; 217 consentMode = mode === "OPT_IN" || mode === "OPT_OUT" ? mode : null; 218 gpcApplied = Boolean(detail && detail.gpcApplied); 219 const days = detail && detail.config && detail.config.consent_expiry_days; 220 consentExpiryDays = typeof days === "number" && days > 0 ? days : null; 221 proboReady = true; 222 const waiters = proboWaiters; 223 proboWaiters = [];
224 waiters.forEach((run) => run()); 225 applyConsent(); 226 mirrorConsent(false); 227 }); 228 document.addEventListener("probo-consent", () => { 229 // The SDK writes its cookie in the same handler; read it on the next tick. 230 window.setTimeout(() => { 231 applyConsent(); 232 mirrorConsent(true); 233 }, 0); 234 }); 235 236 // Init waits (briefly) for the banner so the persistence mode is right at 237 // init; if the banner has not answered by then, start in memory mode. 238 const whenConsentKnown = (run) => { 239 if (proboReady || persistenceAllowed() !== null) { 240 run(); 241 return; 242 } 243 let done = false; 244 const once = () => { 245 if (done) return; 246 done = true; 247 run(); 248 }; 249 proboWaiters.push(once); 250 window.setTimeout(once, 3000); 251 }; 252 253 // apply_click: one event per click on an Apply control, sent by beacon so 254 // it survives the navigation that follows. Clicks before PostHog has 255 // started are held for this page and sent once it loads. 256 const APPLY_METHODS = new Set([ 257 "apply_button", "google", "apple", "email", "email_signin", "partner_handoff", "internal_handoff" 258 ]); 259 const pendingApplyClicks = []; 260 const flushPendingApplyClicks = (ph) => { 261 pendingApplyClicks.splice(0).forEach(({ properties, resolve }) => { 262 if (ph) sendApplyClick(properties, ph); 263 resolve(); 264 }); 265 }; 266 const cleanDestination = (value) => { 267 if (typeof value !== "string") return undefined; 268 if (/^[a-z_]{1,40}$/.test(value)) return value; 269 try { 270 const url = new URL(value, window.location.href); 271 return url.origin + url.pathname; 272 } catch { 273 return undefined; 274 } 275 }; 276 const sendApplyClick = (properties, ph) => { 277 const target = ph || window.posthog; 278 if (!target || typeof target.capture !== "function") return; 279 target.capture("apply_click", { ...(readJobProperties() || {}), ...properties }, { transport: "sendBeacon" }); 280 }; 281 window.__otAnalytics = { 282 applyClick: (method, destination) => { 283 if (!APPLY_METHODS.has(method)) return Promise.resolve(); 284 const properties = { apply_method: method, destination: cleanDestination(destination) }; 285 if (window.__opentrainPostHogInitialized) { 286 sendApplyClick(properties); 287 return Promise.resolve(); 288 } 289 const result = new Promise((resolve) => { 290 if (pendingApplyClicks.length < 10) { 291 pendingApplyClicks.push({ properties, resolve }); 292 } else { 293 resolve(); 294 } 295 startPostHog(); 296 }); 297 // Do not hold an Apply navigation forever if the analytics config is 298 // unavailable. The queued click is still sent when the SDK loads. 299 return Promise.race([result, new Promise((resolve) => window.setTimeout(resolve, 1500))]); 300 } 301 }; 302 303 const installClickTracking = () => { 304 document.addEventListener("click", (event) => { 305 const element = event.target instanceof Element 306 ? event.target.closest("a, button, [role='button']") 307 : null; 308 if (!element) return; 309 310 const href = element instanceof HTMLAnchorElement 311 ? element.href 312 : element.getAttribute("data-analytics-href"); 313 const text = cleanText(element.getAttribute("aria-label") || element.textContent || ""); 314 const currentUrl = new URL(window.location.href); 315 const linkUrl = href ? new URL(href, window.location.href) : null; 316 const baseProperties = { 317 page_url: currentUrl.href, 318 page_path: currentUrl.pathname, 319 link_url: linkUrl?.href, 320 link_host: linkUrl?.hostname, 321 link_path: linkUrl?.pathname, 322 link_text: text || undefined, 323 link_target: element.getAttribute("target") || undefined, 324 click_region: getRegion(element), 325 ...getUtmProperties(currentUrl) 326 }; 327 328 const explicitCta = element.getAttribute("data-analytics-cta"); 329 const isCta = explicitCta === "true" || CTA_TEXT.test(text) || (linkUrl ? CTA_TEXT.test(linkUrl.pathname) : false); 330 if (isCta) { 331 capture("marketing_cta_click", { 332 ...baseProperties, 333 cta_label: text || explicitCta || undefined 334 }); 335 } 336 337 if (!linkUrl) return; 338 339 if (linkUrl.hostname === APP_HOST) { 340 capture("marketing_app_click", { 341 ...baseProperties, 342 app_intent: getAppIntent(linkUrl, text) 343 }); 344 } 345 346 if (SOCIAL_HOSTS.has(linkUrl.hostname)) { 347 capture("marketing_social_click", { 348 ...baseProperties, 349 social_platform: linkUrl.hostname.includes("linkedin") ? "linkedin" : "x" 350 }); 351 } 352 353 if (linkUrl.hostname !== window.location.hostname && !isOpenTrainHost(linkUrl.hostname)) { 354 capture("marketing_outbound_click", baseProperties); 355 } 356 }, { capture: true }); 357 }; 358 359 const installFormTracking = () => { 360 document.addEventListener("submit", (event) => { 361 const form = event.target instanceof HTMLFormElement ? event.target : null; 362 if (!form) return; 363 364 const currentUrl = new URL(window.location.href); 365 const formName = 366 form.getAttribute("data-analytics-form") || 367 form.getAttribute("name") || 368 form.id || 369 "unnamed_form"; 370 const formAction = form.getAttribute("action") || undefined; 371 372 capture("marketing_form_submit", { 373 form_name: formName, 374 form_action: formAction, 375 page_url: currentUrl.href, 376 page_path: currentUrl.pathname, 377 ...getUtmProperties(currentUrl) 378 }); 379 }, { capture: true }); 380 }; 381 382 // Contact-form field names. A submit before the form hydrated used to put 383 // them in the page URL as a query string, so strip them from every 384 // URL-valued property before an event leaves the browser. 385 const PERSONAL_QUERY_KEYS = new Set(["name", "email", "phone", "company", "message"]); 386 const stripPersonalQuery = (value) => { 387 if (typeof value !== "string" || !value.includes("?") || !/^(https?:\/\/|\/)/i.test(value)) return value;
388 try { 389 const url = new URL(value, window.location.href); 390 const keys = Array.from(url.searchParams.keys()).filter((key) => PERSONAL_QUERY_KEYS.has(key.toLowerCase())); 391 if (!keys.length) return value; 392 keys.forEach((key) => url.searchParams.delete(key)); 393 return /^https?:/i.test(value) ? url.href : url.pathname + url.search + url.hash; 394 } catch { 395 return value; 396 } 397 }; 398 const stripPersonalQueries = (props) => { 399 if (!props || typeof props !== "object") return; 400 Object.keys(props).forEach((key) => { 401 props[key] = stripPersonalQuery(props[key]); 402 }); 403 }; 404 // Covers $current_url, $referrer, $pathname, $session_entry_*, page_url, 405 // link_url and the $set / $set_once person properties ($initial_*). 406 const sanitizeEvent = (event) => { 407 if (!event) return event; 408 [event.properties, event.$set, event.$set_once].forEach(stripPersonalQueries); 409 if (event.properties) [event.properties.$set, event.properties.$set_once].forEach(stripPersonalQueries); 410 return event; 411 }; 412 413 const initPostHog = ({ projectKey, apiHost }) => { 414 if (!projectKey || !apiHost || !window.posthog || window.__opentrainPostHogInitialized) return; 415 416 // We never call identify() and never read form field values. 417 // Persistence is cookieless ("memory") unless the visitor's banner 418 // choice allows analytics storage; see persistenceAllowed() above. 419 // Note: this
419<script> ships verbatim to the public HTML. Do not 420 // reference internal tracker ids or other private identifiers in 421 // inline-script comments â keep that context in PR descriptions 422 // or Astro frontmatter (which is stripped before render). 423 persistent = persistenceAllowed() === true; 424 window.posthog.init(projectKey, { 425 api_host: apiHost, 426 defaults: "2026-01-30", 427 capture_pageview: "history_change", 428 capture_performance: false, 429 autocapture: false, 430 ...(persistent ? PERSISTENT : MEMORY), 431 disable_session_recording: true, 432 disable_surveys: true, 433 disable_web_experiments: true, 434 disable_external_dependency_loading: true, 435 advanced_disable_decide: true, 436 advanced_disable_feature_flags: true, 437 before_send: sanitizeEvent, 438 // Runs before the SDK sends the initial $pageview, so job labels 439 // reach it as super properties. 440 loaded: (ph) => { 441 registerJobProperties(ph); 442 ph.register({ analytics_consent: persistent ? "granted" : "memory" }); 443 setJobPersonProperties(ph); 444 flushPendingApplyClicks(ph); 445 } 446 }); 447 448 installClickTracking(); 449 installFormTracking(); 450 window.__opentrainPostHogInitialized = true; 451 // The banner may have answered while the SDK was loading. 452 applyConsent(); 453 }; 454 455 const loadPostHog = (apiHost) => { 456 !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]); 457 }; 458 459 let posthogStarted = false; 460 let posthogStartPromise; 461 const startPostHog = () => { 462 if (posthogStartPromise) return posthogStartPromise; 463 posthogStarted = true; 464 posthogStartPromise = fetch("/api/posthog-config.json", { credentials: "same-origin" }) 465 .then((response) => response.ok ? response.json() : null) 466 .then((config) => { 467 if (!config?.enabled || !config.projectKey || !config.apiHost) { 468 flushPendingApplyClicks(); 469 return; 470 } 471 whenConsentKnown(() => { 472 loadPostHog(config.apiHost); 473 initPostHog(config); 474 }); 475 }) 476 .catch(() => flushPendingApplyClicks()); 477 return posthogStartPromise; 478 }; 479 480 // Defer the PostHog config fetch + array.js load until after the first 481 // render window (or the user starts interacting). requestIdleCallback can 482 // fire before mobile LCP on quiet pages, so add a short post-load delay 483 // before waiting for idle. 484 const scheduleIdle = () => { 485 window.setTimeout(() => { 486 if ("requestIdleCallback" in window) { 487 window.requestIdleCallback(startPostHog, { timeout: 2500 }); 488 } else { 489 window.setTimeout(startPostHog, 1500); 490 } 491 }, 4500); 492 }; 493 494 const interactionEvents = ["pointerdown", "keydown", "touchstart"]; 495 const onInteraction = () => {
496 interactionEvents.forEach((evt) => 497 window.removeEventListener(evt, onInteraction, { capture: true }) 498 ); 499 startPostHog(); 500 }; 501 interactionEvents.forEach((evt) => 502 window.addEventListener(evt, onInteraction, { capture: true, passive: true, once: true }) 503 ); 504 505 if (document.readyState === "complete") { 506 scheduleIdle(); 507 } else { 508 window.addEventListener("load", scheduleIdle, { once: true }); 509 } 510 })(); 511</script>
511
511<script> 512 (() => { 513 if (window.__otAdsLoadStarted) return; 514 window.__otAdsLoadStarted = true; 515 516 const queue = []; 517 let config = null; 518 let loaded = false; 519 let allowed = null; // null = undecided, true/false = decided 520 let consentMode = null; // "OPT_IN" | "OPT_OUT" | null (from probo-ready) 521 522 const readProboConsent = () => { 523 try { 524 const pair = document.cookie.split("; ").find((c) => c.startsWith("probo_consent=")); 525 if (!pair) return null; 526 const parsed = JSON.parse(decodeURIComponent(pair.slice("probo_consent=".length))); 527 if (!parsed || typeof parsed !== "object") return null; 528 // Probo stores the per-category decision under `data` 529 // ({ bid, v, vid, action, data: { necessary, analytics, advertising, ... } }); 530 // older/flat shapes are read the same way. 531 const categories = parsed.data && typeof parsed.data === "object" ? parsed.data : parsed; 532 const ad = Object.entries(categories).find(([slug]) => /advert|marketing|ads/i.test(slug)); 533 if (ad) return Boolean(ad[1]); 534 if (parsed.action === "ACCEPT_ALL") return true; 535 if (parsed.action === "REJECT_ALL") return false; 536 // A decision exists but has no advertising category: treat as denied. 537 return false; 538 } catch { 539 return null; 540 } 541 }; 542 543 const decide = () => { 544 const fromCookie = readProboConsent(); 545 if (fromCookie !== null) return fromCookie; 546 if (consentMode === "OPT_OUT") return true; 547 return null; 548 }; 549 550 const loadScript = (src, onload) => { 551 const s = document.createElement("script"); 552 s.async = true; 553 s.src = src; 554 if (onload) s.onload = onload; 555 document.head.appendChild(s); 556 }; 557 558 const loadTags = () => { 559 if (loaded || !config || !config.enabled) return; 560 loaded = true; 561 if (config.linkedin) { 562 window._linkedin_partner_id = config.linkedin.partnerId; 563 window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || []; 564 window._linkedin_data_partner_ids.push(config.linkedin.partnerId); 565 window.lintrk = window.lintrk || function () { (window.lintrk.q = window.lintrk.q || []).push(arguments); }; 566 loadScript("https://snap.licdn.com/li.lms-analytics/insight.min.js"); 567 } 568 if (config.reddit) { 569 window.rdt = window.rdt || function () { (window.rdt.callQueue = window.rdt.callQueue || []).push(arguments); }; 570 window.rdt.sendEvent = window.rdt.sendEvent || window.rdt; 571 loadScript("https://www.redditstatic.com/ads/pixel.js"); 572 window.rdt("init", config.reddit.pixelId); 573 window.rdt("track", "PageVisit"); 574 } 575 if (config.google) { 576 window.dataLayer = window.dataLayer || []; 577 window.gtag = window.gtag || function () { window.dataLayer.push(arguments); }; 578 loadScript("https://www.googletagmanager.com/gtag/js?id=" + encodeURIComponent(config.google.adsId)); 579 window.gtag("js", new Date()); 580 window.gtag("config", config.google.adsId, { allow_enhanced_conversions: false }); 581 } 582 if (config.meta) { 583 if (!window.fbq) { 584 const n = (window.fbq = function () { n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments); }); 585 n.push = n; n.loaded = true; n.version = "2.0"; n.queue = []; 586 loadScript("https://connect.facebook.net/en_US/fbevents.js"); 587 } 588 // Automatic Advanced Matching off: job pages have the express-apply 589 // email field, and no email, name or phone may reach Meta. 590 window.fbq("set", "autoConfig", false, config.meta.pixelId); 591 window.fbq("init", config.meta.pixelId); 592 window.fbq("track", "PageView"); 593 } 594 }; 595 596 const send = (event, props) => { 597 if (!config) return; 598 const isSignup = event === "signup"; 599 if (config.linkedin) { 600 const id = isSignup ? config.linkedin.conversions.signup : config.linkedin.conversions.referralClick; 601 if (id && window.lintrk) window.lintrk("track", { conversion_id: Number(id) || id }); 602 } 603 if (config.reddit && window.rdt) { 604 window.rdt("track", isSignup ? "SignUp" : "Lead", { customEventName: isSignup ? undefined : "referral_click" }); 605 } 606 if (config.google) { 607 const label = isSignup ? config.google.conversions.signup : config.google.conversions.referralClick; 608 const params = { send_to: config.google.adsId + "/" + label }; 609 // The app's shared event id, so Google de-duplicates against the server upload. 610 if (props.eventId) params.transaction_id = props.eventId; 611 if (label && window.gtag) window.gtag("event", "conversion", params); 612 } 613 if (config.meta && window.fbq) { 614 const name = isSignup ? "CompleteRegistration" : "Lead"; 615 // Same id as the Conversions API event, so Meta de-duplicates the pair. 616 if (props.eventId) window.fbq("track", name, { content_ids: [props.jobId] }, { eventID: props.eventId }); 617 else window.fbq("track", name, { content_ids: [props.jobId] }); 618 } 619 }; 620 621 const flush = () => { 622 if (allowed !== true) return; 623 loadTags(); 624 while (queue.length) { 625 const item = queue.shift(); 626 send(item.event, item.props); 627 } 628 }; 629 630 const reevaluate = () => { 631 const next = decide(); 632 if (next === null) return; 633 allowed = next; 634 if (allowed) flush(); 635 else queue.length = 0; 636 }; 637 638 window.__otAds = { 639 track: (event, props) => { 640 if (allowed === false) return; 641 queue.push({ event, props: props || {} }); 642 if (allowed === true) flush(); 643 }, 644 }; 645 646 document.addEventListener("probo-ready", (e) => { 647 const mode = e && e.detail && e.detail.config && e.detail.config.consent_mode; 648 consentMode = mode === "OPT_IN" || mode === "OPT_OUT" ? mode : null; 649 reevaluate(); 650 }); 651 document.addEventListener("probo-consent", () => { 652 // The SDK writes its cookie in the same handler; read it on the next tick. 653 window.setTimeout(reevaluate, 0); 654 }); 655 656 const start = () => { 657 fetch("/api/ad-tags-config.json", { credentials: "same-origin" }) 658 .then((r) => (r.ok ? r.json() : null)) 659 .then((c) => { 660 if (!c || !c.enabled) return; 661 config = c; 662 reevaluate(); 663 }) 664 .catch(() => {}); 665 }; 666 window.setTimeout(() => { 667 if ("requestIdleCallback" in window) window.requestIdleCallback(start, { timeout: 2500 }); 668 else window.setTimeout(start, 1500); 669 }, 800); 670 })(); 671</script>
671 <meta name="ot-attribution-endpoint" content="https://attribution.opentrain.ai/collect">
671<script>(function(){const endpoint = "https://attribution.opentrain.ai/collect"; 672 673 (() => { 674 if (!endpoint) return; 675 676 // Cookie reader â attribution cookies are host-scoped and not HttpOnly. 677 const readCookie = (name) => { 678 const match = document.cookie.match( 679 new RegExp("(?:^|; )" + name.replace(/[.$?*|{}()[\]\\/+^]/g, "\\$&") + "=([^;]*)") 680 ); 681 return match ? decodeURIComponent(match[1]) : null; 682 }; 683 684 const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; 685 const uuid = () => { 686 if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") { 687 return crypto.randomUUID(); 688 } 689 // Minimal v4 fallback â cryptographically weak, only used when 690 // crypto.randomUUID is unavailable (very old browsers). 691 return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => { 692 const r = (Math.random() * 16) | 0; 693 const v = c === "x" ? r : (r & 0x3) | 0x8; 694 return v.toString(16); 695 }); 696 }; 697 698 const utmFromUrl = (url) => { 699 const qs = new URL(url).searchParams; 700 const take = (k) => { 701 const v = qs.get(k); 702 return v && v.trim().length > 0 ? v.trim().toLowerCase() : null; 703 }; 704 return { 705 utm_source: take("utm_source"), 706 utm_medium: take("utm_medium"), 707 utm_campaign: take("utm_campaign"), 708 utm_content: take("utm_content"), 709 utm_term: take("utm_term"), 710 ot_cid: take("ot_cid"), 711 }; 712 }; 713 714 const buildEnvelope = (name, overrides) => { 715 const anonymousId = readCookie("_ot_aid"); 716 const sessionId = readCookie("_ot_sid"); 717 if (!anonymousId || !UUID_RE.test(anonymousId)) return null; 718 if (!sessionId || !UUID_RE.test(sessionId)) return null; 719 720 const pageUrl = new URL(window.location.href); 721 const utm = utmFromUrl(pageUrl.href); 722 723 return Object.assign( 724 { 725 event: name, 726 event_id: uuid(), 727 ts: new Date().toISOString(), 728 path: pageUrl.pathname + pageUrl.search, 729 referrer: document.referrer || null, 730 anonymous_id: anonymousId, 731 session_id: sessionId, 732 attribution_sig: readCookie("_ot_attrib"), 733 utm_source: utm.utm_source, 734 utm_medium: utm.utm_medium, 735 utm_campaign: utm.utm_campaign, 736 utm_content: utm.utm_content, 737 utm_term: utm.utm_term, 738 ot_cid: utm.ot_cid, 739 internal: pageUrl.searchParams.get("ot_internal") === "1", 740 metadata: null, 741 }, 742 overrides || {} 743 ); 744 }; 745 746 const send = (envelope) => { 747 if (!envelope) return; 748 try { 749 const json = JSON.stringify(envelope); 750 // sendBeacon keeps the request alive across page unloads but does 751 // not let us set a custom Content-Type header directly; the Blob 752 // MIME type doubles as the Content-Type the browser sends. 753 if (navigator.sendBeacon) { 754 const blob = new Blob([json], { type: "application/json" }); 755 if (navigator.sendBeacon(endpoint, blob)) return; 756 } 757 fetch(endpoint, { 758 method: "POST", 759 headers: { "content-type": "application/json" }, 760 body: json, 761 keepalive: true, 762 credentials: "omit", 763 }).catch(() => { 764 // Attribution must never surface errors to users. 765 }); 766 } catch (err) { 767 // Swallow â attribution is best-effort. 768 } 769 }; 770 771 let lastPageViewPath = null; 772 const firePageView = () => { 773 const path = window.location.pathname + window.location.search; 774 if (path === lastPageViewPath) return; 775 lastPageViewPath = path; 776 send(buildEnvelope("marketing_page_view")); 777 }; 778 779 // CTA detection: 780 // 1. Explicit opt-in: any element carrying `[data-ot-cta]`, value is 781 // the CTA name (e.g. `post_a_job`). 782 // 2. Convention: any link or button that routes to app.opentrain.ai â 783 // those are the meaningful conversion CTAs on this site. 784 const ctaName = (el) => { 785 const explicit = el.closest("[data-ot-cta]"); 786 if (explicit) { 787 const name = explicit.getAttribute("data-ot-cta"); 788 if (name && name.length > 0 && name.length <= 64) return name; 789 } 790 const linkEl = el.closest("a[href]"); 791 if (!linkEl) return null; 792 const href = linkEl.getAttribute("href") || "";
793 try { 794 const target = new URL(href, window.location.href); 795 if (target.hostname === "app.opentrain.ai") { 796 // Shorten target path to a dimension-friendly label. 797 const seg = target.pathname.replace(/^\/+|\/+$/g, "").split("/")[0] || "root"; 798 return `app_${seg}`; 799 } 800 } catch { 801 /* ignore invalid hrefs */ 802 } 803 return null; 804 }; 805 806 const onDocClick = (event) => { 807 const t = event.target instanceof Element ? event.target : null; 808 if (!t) return; 809 const name = ctaName(t); 810 if (!name) return; 811 const linkEl = t.closest("a[href]"); 812 let destination = null; 813 if (linkEl) { 814 try { 815 destination = new URL(linkEl.getAttribute("href"), window.location.href).href; 816 } catch { 817 destination = linkEl.getAttribute("href"); 818 } 819 } 820 send( 821 buildEnvelope("marketing_cta_click", { 822 metadata: { cta: name, destination }, 823 }) 824 ); 825 }; 826 827 const install = () => { 828 document.addEventListener("click", onDocClick, { capture: true, passive: true }); 829 firePageView(); 830 }; 831 832 if (document.readyState === "loading") { 833 document.addEventListener("DOMContentLoaded", install, { once: true }); 834 } else { 835 install(); 836 } 837 838 // Astro View Transitions â re-fire page_view on client-side nav. 839 document.addEventListener("astro:page-load", firePageView); 840 })(); 841})();</script>
841<link rel="alternate" hreflang="en" href="https://www.opentrain.ai/about/"><link rel="alternate" hreflang="es" href="https://www.opentrain.ai/es/about/"><link rel="alternate" hreflang="fr" href="https://www.opentrain.ai/fr/about/"><link rel="alternate" hreflang="de" href="https://www.opentrain.ai/de/about/"><link rel="alternate" hreflang="ja" href="https://www.opentrain.ai/ja/about/"><link rel="alternate" hreflang="x-default" href="https://www.opentrain.ai/about/"><meta property="og:locale" content="en_US"><meta property="og:locale:alternate" content="es_ES"><meta property="og:locale:alternate" content="fr_FR"><meta property="og:locale:alternate" content="de_DE"><meta property="og:locale:alternate" content="ja_JP">
841<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":["Organization","OnlineBusiness"],"@id":"https://www.opentrain.ai/#organization","name":"OpenTrain AI","url":"https://www.opentrain.ai","logo":{"@type":"ImageObject","url":"https://www.opentrain.ai/images/opentrain-logo-google.png","contentUrl":"https://www.opentrain.ai/images/opentrain-logo-google.png","width":512,"height":512},"sameAs":["https://www.linkedin.com/company/opentrain/","https://x.com/OpenTrainAI"],"contactPoint":{"@type":"ContactPoint","contactType":"sales","email":"[email protected]"},"description":"Open talent network for AI training and data labeling with self-service hiring and managed service options.","areaServed":"Worldwide","knowsAbout":["AI Training","Data Labeling","RLHF","LLM Evaluation","Red Teaming","Computer Vision Annotation","Natural Language Processing"],"slogan":"Open talent network for AI training and data labeling"},{"@type":"WebSite","@id":"https://www.opentrain.ai/#website","url":"https://www.opentrain.ai","name":"OpenTrain AI","description":"Open talent network for AI training and data labeling. Hire AI Trainers and Data Labelers for any tool or workflow.","publisher":{"@id":"https://www.opentrain.ai/#organization"},"inLanguage":"en"},{"@type":"WebPage","@id":"https://www.opentrain.ai/about/","url":"https://www.opentrain.ai/about/","name":"About OpenTrain AI","description":"Learn how OpenTrain AI is building the open platform for AI training, data labeling, and evaluation with vetted experts and transparent pricing.","isPartOf":{"@id":"https://www.opentrain.ai/#website"},"inLanguage":"en"}]}</script>
841<link rel="dns-prefetch" href="https://widget.trustpilot.com"><link rel="preconnect" href="https://widget.trustpilot.com" crossorigin><link rel="stylesheet" href="/_astro/ScalarLayout.DaILym8L.css">
841<script type="module" src="/_astro/page.B9hPg2Bv.js"></script>
841</head> <body class="min-h-screen antialiased flex flex-col"> <a href="#main-content" class="sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 focus:z-[100000] focus:rounded-md focus:bg-white focus:px-3 focus:py-2 focus:text-sm focus:text-black focus:shadow-lg focus:outline-none focus:ring-2 focus:ring-black"> Skip to content </a> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style>
841<script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script>
841<script>(()=>{var g=Object.defineProperty;var w=(a,s,c)=>s in a?g(a,s,{enumerable:!0,configurable:!0,writable:!0,value:c}):a[s]=c;var l=(a,s,c)=>w(a,typeof s!="symbol"?s+"":s,c);var E=new Set(["__proto__","constructor","prototype"]);{let a={0:t=>y(t),1:t=>c(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(c(t)),5:t=>new Set(c(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},s=t=>{let[p,e]=t;return p in a?a[p](e):void 0},c=t=>t.map(s),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([p,e])=>[p,s(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let r=this.querySelectorAll("astro-slot"),n={},d=this.querySelectorAll("template[data-astro-template]");for(let o of d){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(n[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of r){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(n[o.getAttribute("name")||"default"]=o.innerHTML)}let u;try{u=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(o){let i=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(i+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${i}`,this.getAttribute("props"),o),o}let h;await this.hydrator(this)(this.Component,u,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),r.disconnect(),this.childrenConnectedCallback()},r=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});r.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}getRetryImportUrl(e){let r=new URL(e,document.baseURI);return r.searchParams.set("astro-retry",Date.now().toString()),r.toString()}async importWithRetry(e){try{return await import(e)}catch(r){return await new Promise(n=>setTimeout(n,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let r=this.getAttribute("component-url"),n=new CustomEvent("astro:hydration-error",{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:r}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${r}`,e)}async start(){let e=JSON.parse(this.getAttribute("opts")),r=this.getAttribute("client");if(Astro[r]===void 0){window.addEventListener(`astro:${r}`,()=>this.start(),{once:!0});return}try{await Astro[r](async()=>{let n=this.getAttribute("renderer-url");try{let[d,{default:u}]=await Promise.all([this.importWithRetry(this.getAttribute("component-url")),n?this.importWithRetry(n):Promise.resolve({default:()=>()=>{}})]),h=this.getAttribute("component-export")||"default";if(h.includes(".")){this.Component=d;for(let m of h.split(".")){if(E.has(m)||!this.Component||typeof this.Component!="object"&&typeof this.Component!="function"||!Object.hasOwn(this.Component,m))throw new Error(`Invalid component export path: ${h}`);this.Component=this.Component[m]}}else{if(E.has(h))throw new Error(`Invalid component export path: ${h}`);this.Component=d[h]}return this.hydrator=u,this.hydrate}catch(d){return this.handleHydrationError(d),()=>{}}},e,this)}catch(n){this.handleHydrationError(n)}}attributeChangedCallback(){this.hydrate()}}l(f,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",f)}})();</script>
841<astro-island uid="6HUGv" prefix="r8" component-url="/_astro/navbar.BWyoiFye.js" component-export="default" renderer-url="/_astro/client.BB2I2q6P.js" props="{"currentPage":[0,"/about/"],"initialDark":[0,false],"llmSolutions":[1,[[0,{"slug":[0,"llm-evaluation"],"name":[0,"LLM Evaluation"],"iconWhiteBg":[0,"/images/cms/694266261a2ec983456dbb4b_LLM-Evaluation.svg"]}],[0,{"slug":[0,"ai-red-teaming"],"name":[0,"Red Teaming"],"iconWhiteBg":[0,"/images/cms/6942672046da3c29baf24e7b_Red-Teaming.svg"]}],[0,{"slug":[0,"hallucination-audits"],"name":[0,"Hallucination Audits"],"iconWhiteBg":[0,"/images/cms/6942665606905068b3f3557b_Hallucination-Audits-Icon.svg"]}],[0,{"slug":[0,"rlhf-and-preference-data"],"name":[0,"RLHF & Preference Data"],"iconWhiteBg":[0,"/images/cms/694266ea6c354509ac0e2b52_RLHF-and-Preference-Data.svg"]}],[0,{"slug":[0,"supervised-fine-tuning"],"name":[0,"Supervised Fine-Tuning"],"iconWhiteBg":[0,"/images/cms/694267ab73e434a82f016d29_Supervised-Fine-Tuning-Icon.svg"]}],[0,{"slug":[0,"code-generation-review"],"name":[0,"Code Generation Review"],"iconWhiteBg":[0,"/images/cms/6942647c7690419191196845_Code-Generation-Review.svg"]}]]],"labelingSolutions":[1,[[0,{"slug":[0,"document-annotation"],"name":[0,"Document Annotation"],"iconWhiteBg":[0,"/images/cms/694264ef8f3aa7bce8d17a9e_Document-and-OCR-Data-Labeling.svg"]}],[0,{"slug":[0,"image-annotation"],"name":[0,"Image Annotation"],"iconWhiteBg":[0,"/images/cms/69426668b34ad18bad7feab7_Image-Annotation-Icon.svg"]}],[0,{"slug":[0,"segmentation"],"name":[0,"Segmentation"],"iconWhiteBg":[0,"/images/cms/6942676d5f1427d975ffbe55_Segmentation.svg"]}],[0,{"slug":[0,"video-annotation"],"name":[0,"Video Annotation"],"iconWhiteBg":[0,"/images/cms/694267dff5294d142e94f9f8_Video-Annotation.svg"]}],[0,{"slug":[0,"text-annotation"],"name":[0,"Text Annotation"],"iconWhiteBg":[0,"/images/cms/694267be2cc99452edd83067_Text-Annotation-Icon.svg"]}],[0,{"slug":[0,"speech-and-audio-labeling"],"name":[0,"Speech and Audio Labeling"],"iconWhiteBg":[0,"/images/cms/69426790d6dabf7228ee9480_Speech-and-Audio-Labeling.svg"]}]]],"careerPages":[1,[[0,{"slug":[0,"mathematics"],"domain":[0,"Mathematics"],"label":[0]}],[0,{"slug":[0,"biology"],"domain":[0,"Biology"],"label":[0]}],[0,{"slug":[0,"chemistry"],"domain":[0,"Chemistry"],"label":[0]}],[0,{"slug":[0,"physics"],"domain":[0,"Physics"],"label":[0]}],[0,{"slug":[0,"law"],"domain":[0,"Law"],"label":[0]}],[0,{"slug":[0,"finance"],"domain":[0,"Finance"],"label":[0]}]]],"expertCount":[0,"495,000+"],"locale":[0,"en"],"chrome":[0,{"nav":[0,{"skipToContent":[0,"Skip to content"],"ariaMain":[0,"Main navigation"],"ariaMobile":[0,"Mobile navigation"],"ariaOpenMenu":[0,"Open menu"],"ariaCloseMenu":[0,"Close menu"],"dropdowns":[0,{"platform":[0,"Platform"],"solutions":[0,"Solutions"],"integrations":[0,"Integrations"],"researcherTools":[0,"Researcher Tools"]}],"links":[0,{"pricing":[0,"Pricing"],"findWork":[0,"Find Work"],"managedService":[0,"Managed Service"],"managedServiceBadge":[0,"For Large Projects"]}],"cta":[0,{"logIn":[0,"Log In"],"createAccount":[0,"Create Account"]}],"scalarDynamic":[0,{"joinTrainersHeadline":[0,"Join {count} AI Trainers"],"viewAllDomainsLabel":[0,"View All {count}+ Domains"]}],"scalarLabelOverrides":[0,{"For AI Companies":[0,"For AI Companies"],"For Freelancers":[0,"For Freelancers"],"For Data Labeling Companies":[0,"For Data Labeling Companies"],"Resources":[0,"Resources"],"About Us":[0,"About Us"],"Contact":[0,"Contact"],"AI and ML terminology":[0,"AI and ML terminology"],"API and developer docs":[0,"API and developer docs"],"Add vetted specialists to your team":[0,"Add vetted specialists to your team"],"Become a Freelancer":[0,"Become a Freelancer"],"Blog":[0,"Blog"],"Bring Your Own Platform":[0,"Bring Your Own Platform"],"Browse All Jobs":[0,"Browse All Jobs"],"Browse Integrations":[0,"Browse Integrations"],"Browse career paths by domain":[0,"Browse career paths by domain"],"Custom Quote":[0,"Custom Quote"],"Custom pricing for large projects":[0,"Custom pricing for large projects"],"Every open AI training job, updated daily":[0,"Every open AI training job, updated daily"],"Find Clients and Browse RFPs":[0,"Find Clients and Browse RFPs"],"Find pre-vetted AI trainers":[0,"Find pre-vetted AI trainers"],"For large or complex projects":[0,"For large or complex projects"],"Free for freelancers. Always.":[0,"Free for freelancers. Always."],"From posting to delivery":[0,"From posting to delivery"],"Get Started":[0,"Get Started"],"Get discovered by AI companies looking for labeling vendors":[0,"Get discovered by AI companies looking for labeling vendors"],"Get found by AI labs and startups":[0,"Get found by AI labs and startups"],"Get in touch":[0,"Get in touch"],"Glossary":[0,"Glossary"],"Grow Your Business":[0,"Grow Your Business"],"Healthcare & Medicine":[0,"Healthcare & Medicine"],"Hire Freelancers":[0,"Hire Freelancers"],"Join Now":[0,"Join Now"],"Join the largest AI training network":[0,"Join the largest AI training network"],"LLM & Agent Solutions":[0,"LLM & Agent Solutions"],"LLM training and data labeling":[0,"LLM training and data labeling"],"Label Studio, CVAT, and more":[0,"Label Studio, CVAT, and more"],"Learn More":[0,"Learn More"],"List Free":[0,"List Free"],"Math & Science":[0,"Math & Science"],"Multimodal":[0,"Multimodal"],"News and insights":[0,"News and insights"],"Our mission and team":[0,"Our mission and team"],"Popular Domains":[0,"Popular Domains"],"Post a job and hire directly":[0,"Post a job and hire directly"],"Reasoning Verification":[0,"Reasoning Verification"],"See the vendor listing process":[0,"See the vendor listing process"],"Self-Service: Post a Job":[0,"Self-Service: Post a Job"],"Services":[0,"Services"],"
841Software Engineering":[0,"Software Engineering"],"Solutions":[0,"Solutions"],"Speech & Audio":[0,"Speech & Audio"],"Text & Programmatic":[0,"Text & Programmatic"],"Translation":[0,"Translation"],"Transparent published rates":[0,"Transparent published rates"],"View All":[0,"View All"],"Vision":[0,"Vision"],"We handle everything end-to-end":[0,"We handle everything end-to-end"],"We recruit, train, and manage":[0,"We recruit, train, and manage"],"We recruit, train, and manage your team":[0,"We recruit, train, and manage your team"],"We're the talent layer, not the tool. Use any annotation platform.":[0,"We're the talent layer, not the tool. Use any annotation platform."],"Works with your tools":[0,"Works with your tools"],"Writing & Linguistics":[0,"Writing & Linguistics"]}]}],"themeLabels":[0,{"lightMode":[0,"Light mode"],"darkMode":[0,"Dark mode"]}],"footerLabelOverrides":[0,{}]}],"forceTheme":[0]}" ssr client="load" opts="{"name":"Navbar","value":true}" await-children><header class="fixed top-0 left-0 right-0 z-50 border-b backdrop-blur-lg transition-[background-color,border-color] duration-300 ease-in-out border-border bg-background/80"><div><div class="container relative z-10 max-w-[120rem] px-4"><div class="flex items-center border-x py-4 lg:border-none lg:py-6"><a href="/" aria-label="OpenTrain AI home" class="flex shrink-0 items-center ps-6 lg:ps-0 dark:[&>img]:invert"><img src="/images/OpenTrain-AI-Icon.svg" alt="OpenTrain AI" aria-hidden="true" width="28" height="28" class="hidden h-7 w-7 object-contain lg:block xl:hidden"/><img src="/images/OpenTrain-AI-Logo.svg" alt="OpenTrain AI" width="140" height="27" class="h-[27px] w-[140px] object-contain lg:hidden xl:block xl:h-[23px] xl:w-[120px] 2xl:h-[27px] 2xl:w-[140px]"/></a><span class="sr-only">For AI Companies</span><div class="me-6 ml-auto flex flex-1 items-center justify-end lg:me-0 lg:hidden"><div class="inline-flex items-center rounded-full bg-muted/30 p-px mr-2" data-theme-toggle="true"><button type="button" aria-label="Light mode" aria-pressed="true" class="inline-flex size-6 cursor-pointer items-center justify-center rounded-full transition-all duration-200 bg-background text-foreground shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun size-3.5" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></button><button type="button" aria-label="Dark mode" aria-pressed="false" class="inline-flex size-6 cursor-pointer items-center justify-center rounded-full transition-all duration-200 text-muted-foreground/70 hover:text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon size-3.5" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg></button></div><button data-slot="button" class="items-center cursor-pointer justify-center gap-2 tracking-normal whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border bg-card hover:bg-accent hover:text-accent-foreground dark:bg-[#232222] dar
841k:border-input dark:hover:bg-[#232222] size-9 relative flex !bg-transparent" aria-expanded="false" data-mobile-nav-toggle="true"><span class="sr-only">Open menu</span><div class="absolute top-1/2 left-1/2 block w-[18px] -translate-x-1/2 -translate-y-1/2"><span aria-hidden="true" class="absolute block h-0.5 w-full rounded-full bg-current transition-transform duration-500 ease-in-out -translate-y-1.5"></span><span aria-hidden="true" class="absolute block h-0.5 w-full rounded-full bg-current transition-transform duration-500 ease-in-out"></span><span aria-hidden="true" class="absolute block h-0.5 w-full rounded-full bg-current transition-transform duration-500 ease-in-out translate-y-1.5"></span></div></button></div><div class="hidden min-w-0 flex-1 items-center justify-between lg:flex ms-3 xl:ms-4 2xl:ms-6"><nav aria-label="Main navigation"><ul class="flex list-none items-center gap-0 xl:gap-0.5"></ul></nav><div class="bordered-div-padding flex shrink-0 items-center justify-end gap-2 border lg:border-none lg:!p-0"><div class="items-center rounded-full bg-muted/30 p-px hidden lg:inline-flex" data-theme-toggle="true"><button type="button" aria-label="Light mode" aria-pressed="true" class="inline-flex size-6 cursor-pointer items-center justify-center rounded-full transition-all duration-200 bg-background text-foreground shadow-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun size-3.5" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></button><button type="button" aria-label="Dark mode" aria-pressed="false" class="inline-flex size-6 cursor-pointer items-center justify-center rounded-full transition-all duration-200 text-muted-foreground/70 hover:text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon size-3.5" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg></button></div><a href="https://app.opentrain.ai/?key=login"><button data-slot="button" class="inline-flex items-center cursor-pointer justify-center tracking-normal whitespace-nowrap text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5 lg:text-[13px] xl:text-sm">Log In</button></a><a href="https://app.opentrain.ai/?key=signup" class="ms-3 lg:ms-1 xl:ms-2"><button data-slot="button" class="inline-flex items-center cursor-pointer justify-center tracking-normal whitespace-nowrap text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground hover:bg-primary/90 h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5 lg:text-[13px] xl:text-sm">Create Account</button></a></div></div></div></div></div></header><!--astro:end--></astro-island> <main id="main-content" class="flex-1 pt-[69px]"> <div id="ot-locale-suggestion" role="status" aria-live="polite" class="relative z-10 hidden border-b border-neutral-300 bg-white px-3 py-2 data-[visible=true]:block"> <div class="mx-auto flex max-w-[1428px] items-center justify-center gap-3 text-sm text-neutral-950 max-sm:flex-col max-sm:items-stretch"> <p class="m-0 leading-snug"> 842View this page in <span data-locale-native></span>? 843</p> <div class="flex shrink-0 items-center gap-2 max-sm:w-full max-sm:flex-col max-sm:items-stretch"> <a href="#" data-locale-action="view" class="inline-flex min-h-9 items-center justify-center rounded-md bg-black px-3 text-sm font-medium text-white hover:opacity-90 max-sm:w-full max-sm:flex-none"> 844View <span class="ml-1" data-locale-english></span> </a> <button type="button" data-locale-action="dismiss" class="inline-flex min-h-9 items-center justify-center rounded-md border border-neutral-400 bg-white px-3 text-sm font-medium text-neutral-950 hover:bg-neutral-100 max-sm:w-full max-sm:flex-none"> 845Keep English 846</button> </div> </div> </div>
846<script>(function(){const configJson = "{\"enabled\":true,\"defaultLocale\":\"en\",\"choiceCookie\":\"ot_locale_choice\",\"dismissedCookie\":\"ot_locale_suggestion_dismissed\",\"choiceStorageKey\":\"ot_locale_choice\",\"dismissedStorageKey\":\"ot_locale_suggestion_dismissed\",\"cookieMaxAgeSeconds\":31536000,\"botUserAgentPatternSources\":[\"bot\",\"spider\",\"crawl(?!er-website)\",\"crawler\",\"slurp\",\"bingpreview\",\"fetch\",\"headless\",\"archive\\\\.org_bot\",\"facebookexternalhit\",\"lighthouse\",\"yandex\",\"baiduspider\",\"duckduckbot\",\"applebot\",\"semrushbot\",\"ahrefssiteaudit\",\"ahrefsbot\",\"mj12bot\",\"petalbot\",\"gptbot\",\"oai-searchbot\",\"claudebot\",\"anthropic-ai\",\"perplexitybot\",\"ccbot\",\"meta-externalagent\",\"amazonbot\"],\"locales\":[{\"code\":\"es\",\"englishName\":\"Spanish\",\"nativeName\":\"Español\",\"hreflang\":\"es\",\"register\":\"es-419\",\"urlPrefix\":\"/es\"},{\"code\":\"fr\",\"englishName\":\"French\",\"nativeName\":\"Français\",\"hreflang\":\"fr\",\"register\":\"fr-FR\",\"urlPrefix\":\"/fr\"},{\"code\":\"de\",\"englishName\":\"German\",\"nativeName\":\"Deutsch\",\"hreflang\":\"de\",\"register\":\"de-DE\",\"urlPrefix\":\"/de\"},{\"code\":\"ja\",\"englishName\":\"Japanese\",\"nativeName\":\"æ¥æ¬èª\",\"hreflang\":\"ja\",\"register\":\"ja-JP\",\"urlPrefix\":\"/ja\"}],\"routesByLocale\":{\"es\":[\"/\",\"/about/\",\"/blog/\",\"/blog/dpo-vs-ppo-after-rlhf/\",\"/blog/ai-red-teaming-evaluation-data/\",\"/blog/grpo-for-reasoning-model-post-training/\",\"/blog/how-to-scope-an-rlhf-data-program/\",\"/blog/llm-judge-reliability/\",\"/blog/process-reward-models-vs-outcome-reward-models/\",\"/blog/rlaif-vs-rlhf-what-ai-feedback-can-and-cannot-replace/\",\"/blog/what-ai-training-work-actually-looks-like-for-freelancers/\",\"/blog/what-is-an-ai-trainer/\",\"/blog/ai-trainer-salary-and-hourly-pay/\",\"/blog/rlhf-explained-for-job-seekers/\",\"/blog/get-paid-to-train-ai/\",\"/blog/ai-training-jobs-with-no-experience/\",\"/blog/how-to-pass-an-ai-training-interview/\",\"/contact/\",\"/data-labeling-outsourcing-marketplace/\",\"/data-labeling-solutions/\",\"/get-a-quote/\",\"/hire-freelance-data-labelers/\",\"/how-it-works/\",\"/integrations/\",\"/list-your-data-labeling-company/\",\"/llm-agent-solutions/\",\"/managed-service/\",\"/pricing/\",\"/solutions/\",\"/integrations/argilla/\",\"/integrations/aws-sagemaker-groundtruth/\",\"/integrations/custom-tool/\",\"/integrations/cvat/\",\"/integrations/dataloop/\",\"/integrations/datasaur/\",\"/integrations/datature/\",\"/integrations/encord/\",\"/integrations/kili-technology/\",\"/integrations/label-studio/\",\"/integrations/prodigy/\",\"/integrations/roboflow/\",\"/integrations/scale-ai/\",\"/integrations/snorkel-ai/\",\"/integrations/superannotate/\",\"/integrations/supervisely/\",\"/solutions/agent-simulations/\",\"/solutions/ai-red-teaming/\",\"/solutions/code-generation-review/\",\"/solutions/computer-use-agent-training/\",\"/solutions/document-annotation/\",\"/solutions/function-calling/\",\"/solutions/hallucination-audits/\",\"/solutions/image-annotation/\",\"/solutions/llm-evaluation/\",\"/solutions/medical-imaging-annotation/\",\"/solutions/multilingual-ai-training/\",\"/solutions/point-cloud-annotation/\",\"/solutions/reasoning-problem-creation/\",\"/solutions/reasoning-step-verification/\",\"/solutions/rl-environment-design/\",\"/solutions/rlhf-and-preference-data/\",\"/solutions/satellite-imagery-annotation/\",\"/solutions/segmentation/\",\"/solutions/speech-and-audio-labeling/\",\"/solutions/supervised-fine-tuning/\",\"/solutions/text-annotation/\",\"/solutions/time-series-annotation/\",\"/solutions/video-annotation/\"],\"fr\":[\"/\",\"/about/\",\"/blog/\",\"/blog/dpo-vs-ppo-after-rlhf/\",\"/blog/ai-red-teaming-evaluation-data/\",\"/blog/grpo-for-reasoning-model-post-training/\",\"/blog/how-to-scope-an-rlhf-data-program/\",\"/blog/llm-judge-reliability/\",\"/blog/process-reward-models-vs-outcome-reward-models/\",\"/blog/rlaif-vs-rlhf-what-ai-feedback-can-and-cannot-replace/\",\"/blog/what-ai-training-work-actually-looks-like-for-freelancers/\",\"/blog/what-is-an-ai-trainer/\",\"/blog/ai-trainer-salary-and-hourly-p
846ay/\",\"/blog/rlhf-explained-for-job-seekers/\",\"/blog/get-paid-to-train-ai/\",\"/blog/ai-training-jobs-with-no-experience/\",\"/blog/how-to-pass-an-ai-training-interview/\",\"/contact/\",\"/data-labeling-outsourcing-marketplace/\",\"/data-labeling-solutions/\",\"/get-a-quote/\",\"/hire-freelance-data-labelers/\",\"/how-it-works/\",\"/integrations/\",\"/list-your-data-labeling-company/\",\"/llm-agent-solutions/\",\"/managed-service/\",\"/pricing/\",\"/solutions/\",\"/integrations/argilla/\",\"/integrations/aws-sagemaker-groundtruth/\",\"/integrations/custom-tool/\",\"/integrations/cvat/\",\"/integrations/dataloop/\",\"/integrations/datasaur/\",\"/integrations/datature/\",\"/integrations/encord/\",\"/integrations/kili-technology/\",\"/integrations/label-studio/\",\"/integrations/prodigy/\",\"/integrations/roboflow/\",\"/integrations/scale-ai/\",\"/integrations/snorkel-ai/\",\"/integrations/superannotate/\",\"/integrations/supervisely/\",\"/solutions/agent-simulations/\",\"/solutions/ai-red-teaming/\",\"/solutions/code-generation-review/\",\"/solutions/computer-use-agent-training/\",\"/solutions/document-annotation/\",\"/solutions/function-calling/\",\"/solutions/hallucination-audits/\",\"/solutions/image-annotation/\",\"/solutions/llm-evaluation/\",\"/solutions/medical-imaging-annotation/\",\"/solutions/multilingual-ai-training/\",\"/solutions/point-cloud-annotation/\",\"/solutions/reasoning-problem-creation/\",\"/solutions/reasoning-step-verification/\",\"/solutions/rl-environment-design/\",\"/solutions/rlhf-and-preference-data/\",\"/solutions/satellite-imagery-annotation/\",\"/solutions/segmentation/\",\"/solutions/speech-and-audio-labeling/\",\"/solutions/supervised-fine-tuning/\",\"/solutions/text-annotation/\",\"/solutions/time-series-annotation/\",\"/solutions/video-annotation/\"],\"de\":[\"/\",\"/about/\",\"/blog/\",\"/blog/dpo-vs-ppo-after-rlhf/\",\"/blog/ai-red-teaming-evaluation-data/\",\"/blog/grpo-for-reasoning-model-post-training/\",\"/blog/how-to-scope-an-rlhf-data-program/\",\"/blog/llm-judge-reliability/\",\"/blog/process-reward-models-vs-outcome-reward-models/\",\"/blog/rlaif-vs-rlhf-what-ai-feedback-can-and-cannot-replace/\",\"/blog/what-ai-training-work-actually-looks-like-for-freelancers/\",\"/blog/what-is-an-ai-trainer/\",\"/blog/ai-trainer-salary-and-hourly-pay/\",\"/blog/rlhf-explained-for-job-seekers/\",\"/blog/get-paid-to-train-ai/\",\"/blog/ai-training-jobs-with-no-experience/\",\"/blog/how-to-pass-an-ai-training-interview/\",\"/contact/\",\"/data-labeling-outsourcing-marketplace/\",\"/data-labeling-solutions/\",\"/get-a-quote/\",\"/hire-freelance-data-labelers/\",\"/how-it-works/\",\"/integrations/\",\"/list-your-data-labeling-company/\",\"/llm-agent-solutions/\",\"/managed-service/\",\"/pricing/\",\"/solutions/\",\"/integrations/argilla/\",\"/integrations/aws-sagemaker-groundtruth/\",\"/integrations/custom-tool/\",\"/integrations/cvat/\",\"/integrations/dataloop/\",\"/integrations/datasaur/\",\"/integrations/datature/\",\"/integrations/encord/\",\"/integrations/kili-technology/\",\"/integrations/label-studio/\",\"/integrations/prodigy/\",\"/integrations/roboflow/\",\"/integrations/scale-ai/\",\"/integrations/snorkel-ai/\",\"/integrations/superannotate/\",\"/integrations/supervisely/\",\"/solutions/agent-simulations/\",\"/solutions/ai-red-teaming/\",\"/solutions/code-generation-review/\",\"/solutions/computer-use-agent-training/\",\"/solutions/document-annotation/\",\"/solutions/function-calling/\",\"/solutions/hallucination-audits/\",\"/solutions/image-annotation/\",\"/solutions/llm-evaluation/\",\"/solutions/medical-imaging-annotation/\",\"/solutions/multilingual-ai-training/\",\"/solutions/point-cloud-annotation/\",\"/solutions/reasoning-problem-creation/\",\"/solutions/reasoning-step-verification/\",\"/solutions/rl-environment-design/\",\"/solutions/rlhf-and-preference-data/\",\"/solutions/satellite-imagery-annotation/\",\"/solutions/segmentation/\",\"/solutions/speech-and-audio-labeling/\",\"/solutions/supervised-fine-tuning/\",\"/solutions/text-annotation/\",\"/solutions/time-series-annotation/\",\"/solutions/video-annotation/\"],\"ja\":[\"/\",\"/about/\",\"/blog/\",\"/blog/dpo-vs-ppo-after-rlhf/\",\"/blog/ai-red-teaming-evaluation-data/\",\"/blog/grpo-for-reasoning-model-post-training/\",\"/blog/how-to-scope-an-rlhf-data-program/\",\"/blog/llm-judge-reliability/\",\"/blog/process-reward-models-vs-outcome-reward-models/\",\"/blog/rlaif-vs-rlhf-what-ai-feedback-can-and-cannot-replace/\",\"/blog/what-ai-training-work-actually-looks-like-for-freelancers/\",\"/blog/what-is-an-ai-trainer/\",\"/blog/ai-trainer-salary-and-hourly-p
846ay/\",\"/blog/rlhf-explained-for-job-seekers/\",\"/blog/get-paid-to-train-ai/\",\"/blog/ai-training-jobs-with-no-experience/\",\"/blog/how-to-pass-an-ai-training-interview/\",\"/contact/\",\"/data-labeling-outsourcing-marketplace/\",\"/data-labeling-solutions/\",\"/get-a-quote/\",\"/hire-freelance-data-labelers/\",\"/how-it-works/\",\"/integrations/\",\"/list-your-data-labeling-company/\",\"/llm-agent-solutions/\",\"/managed-service/\",\"/pricing/\",\"/solutions/\",\"/integrations/argilla/\",\"/integrations/aws-sagemaker-groundtruth/\",\"/integrations/custom-tool/\",\"/integrations/cvat/\",\"/integrations/dataloop/\",\"/integrations/datasaur/\",\"/integrations/datature/\",\"/integrations/encord/\",\"/integrations/kili-technology/\",\"/integrations/label-studio/\",\"/integrations/prodigy/\",\"/integrations/roboflow/\",\"/integrations/scale-ai/\",\"/integrations/snorkel-ai/\",\"/integrations/superannotate/\",\"/integrations/supervisely/\",\"/solutions/agent-simulations/\",\"/solutions/ai-red-teaming/\",\"/solutions/code-generation-review/\",\"/solutions/computer-use-agent-training/\",\"/solutions/document-annotation/\",\"/solutions/function-calling/\",\"/solutions/hallucination-audits/\",\"/solutions/image-annotation/\",\"/solutions/llm-evaluation/\",\"/solutions/medical-imaging-annotation/\",\"/solutions/multilingual-ai-training/\",\"/solutions/point-cloud-annotation/\",\"/solutions/reasoning-problem-creation/\",\"/solutions/reasoning-step-verification/\",\"/solutions/rl-environment-design/\",\"/solutions/rlhf-and-preference-data/\",\"/solutions/satellite-imagery-annotation/\",\"/solutions/segmentation/\",\"/solutions/speech-and-audio-labeling/\",\"/solutions/supervised-fine-tuning/\",\"/solutions/text-annotation/\",\"/solutions/time-series-annotation/\",\"/solutions/video-annotation/\",\"/jobs/\"]}}"; 847 848 (() => { 849 const config = JSON.parse(configJson); 850 if (!config.enabled) return; 851 852 const root = document.getElementById("ot-locale-suggestion"); 853 if (!root) return; 854 855 const botPatterns = config.botUserAgentPatternSources.map((source) => new RegExp(source, "i")); 856 const userAgent = navigator.userAgent || ""; 857 if (!userAgent || botPatterns.some((pattern) => pattern.test(userAgent.toLowerCase()))) return; 858 859 const readCookie = (name) => { 860 const match = document.cookie.match( 861 new RegExp("(?:^|; )" + name.replace(/[.$?*|{}()[\]\\/+^]/g, "\\$&") + "=([^;]*)") 862 ); 863 return match ? decodeURIComponent(match[1]) : null; 864 }; 865 866 const writeCookie = (name, value) => { 867 const host = window.location.hostname; 868 const domain = host.endsWith("opentrain.ai") ? "; Domain=.opentrain.ai" : ""; 869 const secure = window.location.protocol === "https:" ? "; Secure" : ""; 870 document.cookie = `${name}=${encodeURIComponent(value)}; Max-Age=${config.cookieMaxAgeSeconds}; Path=/; SameSite=Lax${domain}${secure}`; 871 }; 872 873 const normalizePath = (pathname) => { 874 if (!pathname.startsWith("/")) return normalizePath(`/${pathname}`); 875 if (pathname === "/") return "/"; 876 return pathname.endsWith("/") ? pathname : `${pathname}/`; 877 }; 878 879 const localeFromPath = (pathname) => { 880 const segment = pathname.replace(/^\/+/, "").split("/", 1)[0]; 881 return config.locales.some((locale) => locale.code === segment) 882 ? segment 883 : config.defaultLocale; 884 }; 885 886 const isDocumentRoute = (pathname) => { 887 if (/\.(?:avif|css|gif|ico|jpg|jpeg|js|json|map|mp4|png|svg|txt|webmanifest|webp|woff|woff2|xml)$/i.test(pathname)) return false; 888 return ![ 889 "/_astro/", 890 "/_actions/", 891 "/api/", 892 "/cdn-cgi/", 893 "/docs", 894 "/docs-media/", 895 "/favicon", 896 "/images/", 897 "/fonts/", 898 "/logos/", 899 "/monitoring", 900 "/sitemap", 901 "/robots.txt", 902 "/apple-touch-icon", 903 "/manifest.webmanifest", 904 ].some((prefix) => prefix.endsWith("/") 905 ? pathname.startsWith(prefix) 906 : pathname === prefix || pathname.startsWith(`${prefix}/`)); 907 }; 908 909 const localeTags = (locale) => [locale.code, locale.hreflang, locale.register] 910 .filter(Boolean) 911 .map((tag) => tag.toLowerCase()); 912 913 const matchLocale = () => { 914 const languages = Array.isArray(navigator.languages) && navigator.languages.length 915 ? [...navigator.languages]
916 : [navigator.language].filter(Boolean); 917 for (const language of languages) { 918 const normalized = language.toLowerCase(); 919 const exact = config.locales.find((locale) => localeTags(locale).includes(normalized)); 920 if (exact) return exact; 921 } 922 for (const language of languages) { 923 const base = language.toLowerCase().split("-", 1)[0]; 924 const baseMatch = config.locales.find((locale) => 925 localeTags(locale).some((tag) => tag.split("-", 1)[0] === base) 926 ); 927 if (baseMatch) return baseMatch; 928 } 929 return null; 930 }; 931 932 const localStorageGet = (key) => { 933 try { return window.localStorage.getItem(key); } catch { return null; } 934 }; 935 936 const localStorageSet = (key, value) => { 937 try { window.localStorage.setItem(key, value); } catch {} 938 }; 939 940 if (readCookie(config.choiceCookie) || readCookie(config.dismissedCookie) === "1") return; 941 if (localStorageGet(config.choiceStorageKey) || localStorageGet(config.dismissedStorageKey) === "1") return; 942 if (!isDocumentRoute(window.location.pathname)) return; 943 if (localeFromPath(window.location.pathname) !== config.defaultLocale) return; 944 945 const locale = matchLocale(); 946 if (!locale) return; 947 948 const basePath = normalizePath(window.location.pathname); 949 if (!config.routesByLocale[locale.code]?.includes(basePath)) return; 950 951 const href = locale.code === config.defaultLocale 952 ? `${basePath}${window.location.search}${window.location.hash}` 953 : `/${locale.code}${basePath === "/" ? "/" : basePath}${window.location.search}${window.location.hash}`; 954 955 const view = root.querySelector('[data-locale-action="view"]'); 956 const dismiss = root.querySelector('[data-locale-action="dismiss"]'); 957 const nativeName = root.querySelector("[data-locale-native]"); 958 const englishName = root.querySelector("[data-locale-english]"); 959 if (!view || !dismiss || !nativeName || !englishName) return; 960 961 view.setAttribute("href", href); 962 nativeName.textContent = locale.nativeName; 963 englishName.textContent = locale.englishName; 964 965 view.addEventListener("click", () => { 966 writeCookie(config.choiceCookie, locale.code); 967 localStorageSet(config.choiceStorageKey, locale.code); 968 }); 969 970 dismiss.addEventListener("click", () => { 971 writeCookie(config.dismissedCookie, "1"); 972 localStorageSet(config.dismissedStorageKey, "1"); 973 root.removeAttribute("data-visible"); 974 }); 975 976 const show = () => root.setAttribute("data-visible", "true"); 977 if ("requestIdleCallback" in window) { 978 window.requestIdleCallback(show, { timeout: 1800 }); 979 } else { 980 window.setTimeout(show, 800); 981 } 982 })(); 983})();</script>
983 <div class="overflow-hidden"> <section class="container"><div class="bordered-div-padding relative flex flex-col items-center gap-8 border-x border-b text-center md:gap-10 lg:gap-16 lg:!py-25"><canvas class="pointer-events-none absolute inset-0 left-full -mt-0.25 hidden !h-[calc(100%+2px)] border-b md:block"></canvas><div class="max-w-4xl space-y-6 md:space-y-8 lg:space-y-12"><h1 class="font-weight-display text-2xl leading-snug tracking-tighter md:text-3xl lg:text-5xl">Building the open platform<!-- --> <span class="block">for AI training</span></h1><p class="text-muted-foreground mx-auto max-w-[700px] text-sm leading-relaxed md:text-lg lg:text-xl">OpenTrain is a transparent talent marketplace connecting AI companies with vetted trainers and data labelers - with published pricing, live-proctored vetting, and one platform across 20+ annotation tools.</p></div><div class="flex flex-wrap items-center justify-center gap-4 md:gap-6"><a href="https://app.opentrain.ai/register" data-slot="button" class="inline-flex items-center cursor-pointer justify-center tracking-normal whitespace-nowrap rounded-md font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground hover:bg-primary/90 h-10 md:h-12 px-6 md:px-7 py-2 gap-3.5 text-sm md:text-base font-weight-display">Join OpenTrain<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right size-4" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a><a href="https://x.com/opentrainai" target="_blank" rel="noopener noreferrer" data-slot="button" class="inline-flex items-center cursor-pointer justify-center tracking-normal whitespace-nowrap rounded-md font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border bg-card hover:bg-accent hover:text-accent-foreground dark:bg-[#232222] dar
983k:border-input dark:hover:bg-[#232222] h-10 md:h-12 px-6 md:px-7 py-2 gap-3.5 text-sm md:text-base font-weight-display"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" class="size-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg>Follow us on X</a></div></div></section>
983<script>(()=>{var a=(s,i,o)=>{let r=async()=>{await(await s())()},t=typeof i.value=="object"?i.value:void 0,c={rootMargin:t==null?void 0:t.rootMargin},n=new IntersectionObserver(e=>{for(let l of e)if(l.isIntersecting){n.disconnect(),r();break}},c);for(let e of o.children)n.observe(e)};(self.Astro||(self.Astro={})).visible=a;window.dispatchEvent(new Event("astro:visible"));})();</script>
983<astro-island uid="1mpvfI" prefix="r4" component-url="/_astro/about-mission-team.DM9ljkEs.js" component-export="AboutMissionTeam" renderer-url="/_astro/client.BB2I2q6P.js" props="{"locale":[0,"en"],"localizedCopy":[0,{"missionLabel":[0,"Mission"],"missionLead":[0,"The AI training industry runs on opacity - hidden pricing, black-box vetting, and fragmented tooling."],"missionBody":[0,"We started OpenTrain because we believed the people building the world's most important AI models deserved a marketplace that was transparent, fair, and actually worked for them."],"platformPrefix":[0,"We're building one platform where AI companies can"],"platformEmphasis":[0,"find and hire vetted trainers at published prices"],"platformSuffix":[0,"and where freelancers can manage their entire career across"],"platformLink":[0,"20+ annotation platforms"],"platformTail":[0,"from a single profile."],"hiring":[0,"We're hiring!"],"teamLabel":[0,"Team"],"teamDescription":[0,"A small team building the infrastructure for AI training talent."]}],"teamMemberCopy":[0,{"westonDotson":[0,{"role":[0,"Founder & CEO"],"bio":[0,"Started OpenTrain to bring transparency to the AI training industry. Previously built marketplaces and scaled distributed teams."]}],"samSargado":[0,{"role":[0,"Human Data Lead"],"bio":[0,"Leads human data operations at OpenTrain, ensuring quality and consistency across training data pipelines."]}],"jonasLim":[0,{"role":[0,"Lead Developer"],"bio":[0,"Leads development at OpenTrain, building the platform infrastructure and product experience."]}],"shaznayLuna":[0,{"role":[0,"Lead Designer"],"bio":[0,"Leads design at OpenTrain, shaping the visual identity and user experience across the platform."]}]}]}" ssr client="visible" opts="{"name":"AboutMissionTeam","value":{"rootMargin":"160px"}}" await-children><section class="container"><div class="grid grid-cols-1 divide-y border border-t-0 md:grid-cols-2 md:divide-x md:divide-y-0"><div class="bordered-div-padding space-y-8"><div class="space-y-4 md:space-y-6"><h2 class="text-muted-foreground flex items-center gap-2 text-sm leading-snug font-medium md:text-base"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-heart size-5" aria-hidden="true"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path></svg>Mission</h2><p class="text-muted-foreground text-sm leading-relaxed md:text-base"><span class="text-foreground font-medium">The AI training industry runs on opacity - hidden pricing, black-box vetting, and fragmented tooling.</span> <!-- -->We started OpenTrain because we believed the people building the world's most important AI models deserved a marketplace that was transparent, fair, and actually worked for them.</p><p class="text-muted-foreground text-sm leading-relaxed md:text-base">We're building one platform where AI companies can<!-- --> <span class="text-foreground font-medium">find and hire vetted trainers at published prices</span> <!-- -->and where freelancers can manage their entire career across<!-- --> <a href="/" class="text-secondary font-medium hover:underline">20+ annotation platforms</a> <!-- -->from a single profile.</p></div></div><div class="bordered-div-padding relative space-y-8"><div class="bg-secondary text-secondary-foreground absolute top-0 right-0 px-3 py-2.5 text-sm leading-none font-medium">We're hiring!</div><div class="space-y-4 md:space-y-6"><h2 class="text-muted-foreground flex items-center gap-2 text-sm leading-snug font-medium md:text-base"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-users size-5" aria-hidden="true"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path><path d="M16 3.128a4 4 0 0 1 0 7.744"></path><path d="M22 21v-2a4 4 0 0 0-3-3.87"></path><circle cx="9" cy="7" r="4"></circle></svg>Team</h2><p class="text-muted-foreground text-sm leading-relaxed md:text-base">
983A small team building the infrastructure for AI training talent.</p><div class="mt-6 grid grid-cols-2 gap-6 md:grid-cols-3"><div class="space-y-3"><div class="hidden md:block"><div class="flex cursor-pointer items-center gap-3" data-state="closed" data-slot="hover-card-trigger"><img src="/images/team-weston-dotson.jpeg" alt="Weston Dotson" width="32" height="32" loading="lazy" decoding="async" fetchPriority="low" class="rounded-full"/><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Weston Dotson</p><p class="text-muted-foreground text-xs md:text-sm">Founder & CEO</p><a href="mailto:[email protected]" class="text-muted-foreground text-xs hover:underline">[email protected]</a></div></div></div><div class="space-y-2 md:hidden"><div class="flex items-center gap-3"><img src="/images/team-weston-dotson.jpeg" alt="Weston Dotson" width="24" height="24" loading="lazy" decoding="async" fetchPriority="low" class="rounded-full"/><div class="-space-y-0.5"><p class="text-sm font-medium">Weston Dotson</p><p class="text-muted-foreground text-xs">Founder & CEO</p><a href="mailto:[email protected]" class="text-muted-foreground text-xs hover:underline">[email protected]</a></div></div><div data-slot="card" class="bg-card text-card-foreground flex flex-col rounded-[6px] border py-4 gap-2"><div data-slot="card-content" class="px-4 text-muted-foreground text-sm leading-relaxed">Started OpenTrain to bring transparency to the AI training industry. Previously built marketplaces and scaled distributed teams.</div><div data-slot="card-footer" class="items-center px-4 [.border-t]:pt-4 flex justify-end gap-3"><a href="https://x.com/opentrainai" aria-label="Twitter" target="_blank" rel="noopener noreferrer"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" class="size-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg></a><a href="https://www.linkedin.com/in/westondotson/" aria-label="LinkedIn" target="_blank" rel="noopener noreferrer"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" class="size-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path></svg></a></div></div></div></div><div class="space-y-3"><div class="hidden md:block"><div class="flex cursor-pointer items-center gap-3" data-state="closed" data-slot="hover-card-trigger"><img src="/images/team-sam-sargado.png" alt="Sam Sargado" width="32" height="32" loading="lazy" decoding="async" fetchPriority="low" class="rounded-full"/><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Sam Sargado</p><p class="text-muted-foreground text-xs md:text-sm">Human Data Lead</p></div></div></div><div class="space-y-2 md:hidden"><div class="flex items-center gap-3"><img src="/images/team-sam-sargado.png" alt="Sam Sargado" width="24" height="24" loading="lazy" decoding="async" fetchPriority="low" class="rounded-full"/><div class="-space-y-0.5"><p class="text-sm font-medium">Sam Sargado</p><p class="text-muted-foreground text-xs">Human Data Lead</p></div></div><div data-slot="card" class="bg-card text-card-foreground flex flex-col rounded-[6px] border py-4 gap-2"><div data-slot="card-content" class="px-4 text-muted-foreground text-sm leading-relaxed">Leads human data operations at OpenTrain, ensuring quality and consistency across training data pipelines.</div><div data-slot="card-footer" class="items-center px-4 [.border-t]:pt-4 flex justify-end gap-3"><a href="https://x.com/opentrainai" aria-label="Twitter" target="_blank" rel="noopener noreferrer"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" class="size-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg></a></div></div></div></div><div class="space-y-3"><div class="hidden md:block"><div class="flex cursor-pointer items-center gap-3" data-state="closed" data-slot="hover-card-trigger"><img src="/images/team-jonas-lim.jpeg" alt="Jonas Lim" width="32" height="32" loading="lazy" decoding="async" fetchPriority="low" class="rounded-full"/><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Jonas Lim</p><p class="text-muted-foreground text-xs md:text-sm">Lead Developer</p></div></div></div><div class="space-y-2 md:hidden"><div class="flex items-center gap-3"><img src="/images/team-jonas-lim.jpeg" alt="Jonas Lim" width="24" height="24" loading="lazy" decoding="async" fetchPriority="low" class="rounded-full"/><div class="-space-y-0.5"><p class="text-sm font-medium">Jonas Lim</p><p class="text-muted-foreground text-xs">Lead Developer</p></div></div><div data-slot="card" class="bg-card text-card-foreground flex flex-col rounded-[6px] border py-4 gap-2">
983<div data-slot="card-content" class="px-4 text-muted-foreground text-sm leading-relaxed">Leads development at OpenTrain, building the platform infrastructure and product experience.</div><div data-slot="card-footer" class="items-center px-4 [.border-t]:pt-4 flex justify-end gap-3"><a href="https://x.com/opentrainai" aria-label="Twitter" target="_blank" rel="noopener noreferrer"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" class="size-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg></a></div></div></div></div><div class="space-y-3"><div class="hidden md:block"><div class="flex cursor-pointer items-center gap-3" data-state="closed" data-slot="hover-card-trigger"><img src="/images/team-shaznay-luna.jpeg" alt="Shaznay Luna" width="32" height="32" loading="lazy" decoding="async" fetchPriority="low" class="rounded-full"/><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Shaznay Luna</p><p class="text-muted-foreground text-xs md:text-sm">Lead Designer</p></div></div></div><div class="space-y-2 md:hidden"><div class="flex items-center gap-3"><img src="/images/team-shaznay-luna.jpeg" alt="Shaznay Luna" width="24" height="24" loading="lazy" decoding="async" fetchPriority="low" class="rounded-full"/><div class="-space-y-0.5"><p class="text-sm font-medium">Shaznay Luna</p><p class="text-muted-foreground text-xs">Lead Designer</p></div></div><div data-slot="card" class="bg-card text-card-foreground flex flex-col rounded-[6px] border py-4 gap-2"><div data-slot="card-content" class="px-4 text-muted-foreground text-sm leading-relaxed">Leads design at OpenTrain, shaping the visual identity and user experience across the platform.</div><div data-slot="card-footer" class="items-center px-4 [.border-t]:pt-4 flex justify-end gap-3"><a href="https://x.com/opentrainai" aria-label="Twitter" target="_blank" rel="noopener noreferrer"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" class="size-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg></a></div></div></div></div></div></div></div></div></section><!--astro:end--></astro-island> <astro-island uid="2purzr" prefix="r5" component-url="/_astro/about-investors-contributors.DWZAtGmE.js" component-export="AboutInvestorsContributors" renderer-url="/_astro/client.BB2I2q6P.js" props="{"locale":[0,"en"],"localizedCopy":[0,{"label":[0,"AI Trainer Earnings"],"description":[0,"Examples of what AI trainers and data labelers on OpenTrain can earn across different domains and workflows."],"specializations":[1,[[0,"Mathematics & Reasoning"],[0,"Code Generation & Review"],[0,"Multilingual NLP"],[0,"RLHF & Preference Tuning"],[0,"Medical & Life Sciences"],[0,"Legal & Policy Analysis"],[0,"Computer Vision & Image Labeling"],[0,"Red Teaming & Safety"]]]}]}" ssr client="visible" opts="{"name":"AboutInvestorsContributors","value":{"rootMargin":"240px"}}" await-children><section class="container"><div class="bordered-div-padding relative border border-t-0"><div class="absolute top-0 right-full -mt-0.25 hidden h-[calc(100%+2px)] w-[50vw] overflow-hidden border-y md:block"></div><div class="space-y-6 md:space-y-8 lg:space-y-10"><div class="space-y-4"><h2 class="text-muted-foreground flex items-center gap-2 text-sm leading-snug font-medium md:text-base"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-dollar-sign size-5" aria-hidden="true"><line x1="12" x2="12" y1="2" y2="22"></line><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path></svg>AI Trainer Earnings</h2><p class="max-w-3xl text-sm leading-relaxed text-muted-foreground md:text-base">Examples of what AI trainers and data labelers on OpenTrain can earn across different domains and workflows.</p></div><div class="relative max-h-[16rem] overflow-hidden mask-b-from-55% mask-b-to-100% md:max-h-[18rem] md:mask-b-from-60% md:mask-b-to-95%"><div class="grid grid-cols-1 gap-x-8 gap-y-6 sm:grid-cols-2 xl:grid-cols-3"><div class="flex items-start gap-3 transition-[opacity,filter] duration-300"><span data-slot="avatar" class="relative flex overflow-hidden rounded-full size-9 shrink-0 md:size-10"><span data-slot="avatar-fallback" class="bg-muted flex size-full items-center justify-center rounded-full">MG</span></span><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Maria Gonzalez</p><p class="text-muted-foreground text-xs md:text-sm">Mathematics & Reasoning</p><p class="text-secondary text-xs font-medium md:text-sm">$52,000+</p></div></div><div class="flex items-start gap-3 transition-[opacity,filter] duration-300"><span data-slot="avatar" class="relative flex overflow-hidden rounded-full size-9 shrink-0 md:size-10"><span data-slot="avatar-fallback" class="bg-muted flex size-full items-center justify-center rounded-full">WZ</span></span><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Wei Zhang</p><p class="text-muted-foreground text-xs md:text-sm">Code Generation & Review</p><p class="text-secondary text-xs font-medium md:text-sm">$48,000+</p></div></div><div class="flex items-start gap-3 transition-[opacity,filter] duration-300"><span data-slot="avatar" class="relative flex overflow-hidden rounded-full size-9 shrink-0 md:size-10"><span data-slot="avatar-fallback" class="bg-muted flex size-full items-center justify-center rounded-full">PP</span></span><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Priya Patel</p><p class="text-muted-foreground text-xs md:text-sm">Multilingual NLP</p><p class="text-secondary text-xs font-medium md:text-sm">$18,000+</p></div></div><div class="flex items-start gap-3 transition-[opacity,filter] duration-300"><span data-slot="avatar" class="relative flex overflow-hidden rounded-full size-9 shrink-0 md:size-10"><span data-slot="avatar-fallback" class="bg-muted flex size-full items-center justify-center rounded-full">
983DA</span></span><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Daniel Adeyemi</p><p class="text-muted-foreground text-xs md:text-sm">RLHF & Preference Tuning</p><p class="text-secondary text-xs font-medium md:text-sm">$35,000+</p></div></div><div class="flex items-start gap-3 transition-[opacity,filter] duration-300 opacity-80 blur-[0.2px]"><span data-slot="avatar" class="relative flex overflow-hidden rounded-full size-9 shrink-0 md:size-10"><span data-slot="avatar-fallback" class="bg-muted flex size-full items-center justify-center rounded-full">AL</span></span><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Anna Lindqvist</p><p class="text-muted-foreground text-xs md:text-sm">Medical & Life Sciences</p><p class="text-secondary text-xs font-medium md:text-sm">$27,000+</p></div></div><div class="flex items-start gap-3 transition-[opacity,filter] duration-300 opacity-80 blur-[0.2px]"><span data-slot="avatar" class="relative flex overflow-hidden rounded-full size-9 shrink-0 md:size-10"><span data-slot="avatar-fallback" class="bg-muted flex size-full items-center justify-center rounded-full">CM</span></span><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Carlos Mendoza</p><p class="text-muted-foreground text-xs md:text-sm">Legal & Policy Analysis</p><p class="text-secondary text-xs font-medium md:text-sm">$14,000+</p></div></div><div class="flex items-start gap-3 transition-[opacity,filter] duration-300 opacity-50 blur-[0.8px]"><span data-slot="avatar" class="relative flex overflow-hidden rounded-full size-9 shrink-0 md:size-10"><span data-slot="avatar-fallback" class="bg-muted flex size-full items-center justify-center rounded-full">YS</span></span><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Yuki Sato</p><p class="text-muted-foreground text-xs md:text-sm">Computer Vision & Image Labeling</p><p class="text-secondary text-xs font-medium md:text-sm">$22,000+</p></div></div><div class="flex items-start gap-3 transition-[opacity,filter] duration-300 opacity-50 blur-[0.8px]"><span data-slot="avatar" class="relative flex overflow-hidden rounded-full size-9 shrink-0 md:size-10"><span data-slot="avatar-fallback" class="bg-muted flex size-full items-center justify-center rounded-full">RM</span></span><div class="-space-y-0.5"><p class="text-sm font-medium md:text-base">Ryan Mitchell</p><p class="text-muted-foreground text-xs md:text-sm">Red Teaming & Safety</p><p class="text-secondary text-xs font-medium md:text-sm">$41,000+</p></div></div></div><div class="pointer-events-none absolute inset-x-0 bottom-0 h-28 bg-gradient-to-t from-background via-background/78 to-transparent backdrop-blur-[1.5px]"></div></div></div></div></section><!--astro:end--></astro-island> </div> </main> <astro-island uid="Z5R2Gk" prefix="r9" component-url="/_astro/footer.BnvjuWbJ.js" component-export="default" renderer-url="/_astro/client.BB2I2q6P.js" props="{"expertCount":[0,"495,000+"],"locale":[0,"en"],"hideTalentRail":[0,false],"hidePricingSection":[0,false],"hideTrustpilot":[0,false]}" ssr client="visible" opts="{"name":"Footer","value":{"rootMargin":"320px"}}" await-children><footer data-navbar-theme="dark" class="overflow-hidden dark bg-background text-foreground"><div class="container"><div class="bordered-div-padding border-x"><h2 class="lg:text-4xxl font-weight-display mt-6 text-xl md:mt-14 md:text-3xl lg:mt-40">The #1 talent network for AI training.</h2></div><div class="grid divide-y border md:grid-cols-2 md:divide-x md:divide-y-0"><div class="bordered-div-padding relative flex flex-col gap-6 md:gap-10"><canvas class="pointer-events-none h-full w-full absolute top-0 left-full -mt-0.25 hidden !h-[calc(100%+2px)] md:block"></canvas><div><h3 class="font-weight-display text-lg md:text-2xl lg:text-3xl">Self-Service</h3><p class="font-weight-display mt-6 text-base md:text-xl">10% marketplace fee</p></div><ul class="space-y-6"><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-upload size-5" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" x2="12" y1="3" y2="15"></line></svg></span><span class="text-muted-foreground font-medium">Post a job, get a curated shortlist</span></li><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search size-5" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg></span><span class="text-muted-foreground font-medium">Browse and hire from 495,000+ experts</span></li><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-users size-5" aria-hidden="true"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path><path d="M16 3.128a4 4 0 0 1 0 7.744"></path><path d="M22 21v-2a4 4 0 0 0-3-3.87"></path><circle cx="9" cy="7" r="4"></circle></svg></span><span class="text-muted-foreground font-medium">Manage your team directly on-platform</span></li><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-credit-card size-5" aria-hidden="true"><rect width="20" height="14" x="2" y="5" rx="2"></rect>
983<line x1="2" x2="22" y1="10" y2="10"></line></svg></span><span class="text-muted-foreground font-medium">Pay talent through OpenTrain</span></li></ul><a href="https://app.opentrain.ai/?key=signup&q=hire" target="_blank" rel="noopener noreferrer" data-slot="button" class="inline-flex items-center cursor-pointer justify-center tracking-normal whitespace-nowrap rounded-md font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive h-10 md:h-12 px-6 md:px-7 py-2 gap-3.5 text-sm md:text-base font-weight-display mt-auto mb-0 w-fit bg-border hover:bg-border/80 text-foreground">Post a Job</a></div><div class="bordered-div-padding relative flex flex-col gap-6 md:gap-10"><div class="bg-secondary text-secondary-foreground absolute top-0 right-0 px-3 py-2.5 text-sm leading-none font-medium">Most popular</div><div><h3 class="font-weight-display text-lg md:text-2xl lg:text-3xl">Managed Service</h3><p class="font-weight-display mt-6 text-base md:text-xl">20% management fee</p></div><ul class="space-y-6"><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-headphones size-5" aria-hidden="true"><path d="M3 14h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a9 9 0 0 1 18 0v7a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3"></path></svg></span><span class="text-muted-foreground font-medium">Dedicated program lead for your project</span></li><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-user-search size-5" aria-hidden="true"><circle cx="10" cy="7" r="4"></circle><path d="M10.3 15H7a4 4 0 0 0-4 4v2"></path><circle cx="17" cy="17" r="3"></circle><path d="m21 21-1.9-1.9"></path></svg></span><span class="text-muted-foreground font-medium">We source, vet, and onboard your team</span></li><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield-check size-5" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path><path d="m9 12 2 2 4-4"></path></svg></span><span class="text-muted-foreground font-medium">Live proctored testing and interviews</span></li><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clipboard-check size-5" aria-hidden="true"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><path d="m9 14 2 2 4-4"></path></svg></span><span class="text-muted-foreground font-medium">Ongoing QA and performance management</span></li><li class="flex items-start gap-2"><span class="flex-shrink-0"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-circle-check size-5" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg></span><span class="text-muted-foreground font-medium">Works inside your existing tools</span></li></ul><a href="/get-a-quote/" data-slot="button" class="inline-flex items-center cursor-pointer justify-center tracking-normal whitespace-nowrap rounded-md font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='
983size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground hover:bg-primary/90 h-10 md:h-12 px-6 md:px-7 py-2 gap-3.5 text-sm md:text-base font-weight-display mt-auto mb-0 w-fit">Get a Quote</a></div></div><div class="grid grid-cols-1 border md:grid-cols-3"><div class="bordered-div-padding flex items-center border-b md:border-r md:border-b-0"><p class="font-weight-display text-base leading-snug md:text-lg">Join the #1 platform for finding AI training and data labeling work.</p></div><a href="/become-freelancer/" class="bordered-div-padding group flex items-center gap-4 border-b transition-colors hover:bg-muted/50 md:border-r md:border-b-0"><div class="flex -space-x-2 shrink-0" aria-hidden="true"><span class="relative inline-flex size-8 shrink-0 overflow-hidden rounded-full ring-2 ring-background" aria-hidden="true"><span class="h-full w-full bg-cover bg-center" style="background-image:url("/images/avatars-128/avatar-44.webp")"></span></span><span class="relative inline-flex size-8 shrink-0 overflow-hidden rounded-full ring-2 ring-background" aria-hidden="true"><span class="h-full w-full bg-cover bg-center" style="background-image:url("/images/avatars-128/avatar-45.webp")"></span></span><span class="relative inline-flex size-8 shrink-0 overflow-hidden rounded-full ring-2 ring-background" aria-hidden="true"><span class="h-full w-full bg-cover bg-center" style="background-image:url("/images/avatars-128/avatar-46.webp")"></span></span><span class="relative inline-flex size-8 shrink-0 overflow-hidden rounded-full ring-2 ring-background" aria-hidden="true"><span class="h-full w-full bg-cover bg-center" style="background-image:url("/images/avatars-128/avatar-47.webp")"></span></span></div><div class="min-w-0"><p class="text-sm font-medium">Freelance AI Trainer?</p><p class="text-muted-foreground text-xs">Join<!-- --> <!-- -->495,000+<!-- --> <!-- -->freelancers<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right ml-1 inline size-3 transition-transform group-hover:translate-x-0.5" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></p></div></a><a href="/list-your-data-labeling-company/" class="bordered-div-padding group flex items-center gap-4 transition-colors hover:bg-muted/50"><div class="flex -space-x-2 shrink-0"><div class="flex size-8 items-center justify-center rounded-full ring-2 ring-background bg-blue-600"><svg viewBox="0 0 32 32" fill="none" class="size-5 text-white"><path d="M6 20c4-8 10-12 20-12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"></path><path d="M6 16c4-6 10-9 16-8" stroke="currentColor" stroke-width="2" stroke-linecap="round" opacity="0.6"></path></svg></div><div class="flex size-8 items-center justify-center rounded-full ring-2 ring-background bg-violet-600"><svg viewBox="0 0 32 32" fill="none" class="size-5 text-white"><path d="M16 4L27 10V22L16 28L5 22V10L16 4Z" stroke="currentColor" stroke-width="2"></path><circle cx="16" cy="16" r="3" fill="currentColor"></circle></svg></div><div class="flex size-8 items-center justify-center rounded-full ring-2 ring-background bg-amber-600"><svg viewBox="0 0 32 32" fill="none" class="size-5 text-white"><circle cx="12" cy="16" r="7" stroke="currentColor" stroke-width="2"></circle><circle cx="20" cy="16" r="7" stroke="currentColor" stroke-width="2"></circle></svg></div><div class="flex size-8 items-center justify-center rounded-full ring-2 ring-background bg-teal-600"><svg viewBox="0 0 32 32" fill="none" class="size-5 text-white"><rect x="6" y="6" width="8" height="8" rx="2" fill="currentColor"></rect><rect x="18" y="6" width="8" height="8" rx="2" fill="currentColor" opacity="0.6"></rect><rect x="6" y="18" width="8" height="8" rx="2" fill="currentColor" opacity="0.35"></rect><rect x="18" y="18" width="8" height="8" rx="2" fill="currentColor" opacity="0.8"></rect></svg></div></div><div class="min-w-0"><p class="text-sm font-medium">Data Labeling Company?</p><p class="text-muted-foreground text-xs">Find clients and recruit talent<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right ml-1 inline size-3 transition-transform group-hover:translate-x-0.5" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></p></div></a></div><div class="relative h-16 border-b bg-background md:h-24"><div class="absolute inset-0 mix-blend-lighten opacity-75" aria-hidden="true" data-footer-shader-strip="true"><div class="absolute inset-0 bg-[radial-gradient(ellipse_65%_85%_at_52%_50%,rgba(255,255,255,0.18),rgba(255,255,255,0.06)_34%,transparent_68%),radial-gradient(circle_at_28%_48%,rgba(69,93,255,0.14),transparent_28%),linear-gradient(90deg,rgba(255,255,255,0.08),transparent_34%,rgba(255,255,255,0.06))]"></div><div class="absolute inset-0 opacity-35 [background-image:repeating-radial-gradient(ellipse_at_center,rgba(255,255,255,0.12)_0_1px,transparent_2px_78px)]"></div></div><div class="pointer-events-none absolute inset-0 z-10 border-x border-border"></div></div><div class="border-x border-b"><div class="bordered-div-padding"><nav class="flex flex-col gap-9 lg:flex-row"><div class="flex w-full flex-col gap-6 lg:w-1/4"><a href="/" class="flex items-center gap-2"><img src="/images/opentrain-icon-white.svg" alt="OpenTrain" loading="lazy" decoding="async" class="size-6"/><span class="text-base font-semibold">OpenTrain AI</span></a><div class="flex items-center gap-2">
983<a href="https://app.opentrain.ai/?key=login" target="_blank" rel="noopener noreferrer" data-slot="button" class="inline-flex items-center cursor-pointer justify-center tracking-normal whitespace-nowrap font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5 text-xs">Log In</a><a href="https://app.opentrain.ai/?key=signup" target="_blank" rel="noopener noreferrer" data-slot="button" class="inline-flex items-center cursor-pointer justify-center tracking-normal whitespace-nowrap font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive bg-primary text-primary-foreground hover:bg-primary/90 h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5 text-xs">Create Account</a></div></div><div class="grid w-full grid-cols-2 gap-6 md:grid-cols-3 lg:grid-cols-5"><ul class="flex flex-col items-start gap-2"><li><p class="text-sm font-semibold">Platform</p></li><li><a href="/how-it-works/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">How It Works</a></li><li><a href="/pricing/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Pricing</a></li><li><a href="/solutions/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Solutions</a></li><li><a href="/integrations/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Integrations</a></li><li><a href="/managed-service/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Managed Service</a></li><li><a href="/hire-freelance-data-labelers/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Post a Job</a></li><li><a href="/get-a-quote/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Get a Quote</a></li></ul><ul class="flex flex-col items-start gap-2"><li><p class="text-sm font-semibold">LLM & Agents</p></li><li><a href="/solutions/rlhf-and-preference-data/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">RLHF & Preference Data</a></li><li><a href="/solutions/ai-red-teaming/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Red Teaming</a></li><li><a href="/solutions/llm-evaluation/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">LLM Evaluation</a></li><li><a href="/solutions/supervised-fine-tuning/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Supervised Fine-Tuning</a></li><li><a href="/solutions/hallucination-audits/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Hallucination Audits</a></li><li><a href="/llm-agent-solutions/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">View All â</a></li></ul><ul class="flex flex-col items-start gap-2"><li><p class="text-sm font-semibold">Data Labeling</p></li><li><a href="/solutions/image-annotation/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Image Annotation</a></li><li><a href="/solutions/text-annotation/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Text Annotation</a></li><li><a href="/solutions/video-annotation/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Video Annotation</a></li><li><a href="/solutions/document-annotation/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Document Annotation</a></li><li><a href="/solutions/segmentation/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Segmentation</a></li><li><a href="/data-labeling-solutions/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">View All â</a></li></ul><ul class="flex flex-col items-start gap-2"><li><p class="text-sm font-semibold">For AI Trainers</p></li><li><a href="/become-freelancer/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Become a Freelance AI Trainer</a></li><li><a href="/ai-training-careers/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">AI Training Careers</a></li><li><a href="/list-your-data-labeling-company/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">List Your Company</a></li></ul><ul class="flex flex-col items-start gap-2"><li><p class="text-sm font-semibold">Company</p></li><li><a href="/about/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">About Us</a></li><li><a href="/contact/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Contact</a></li><li><a href="/docs/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Docs</a></li><li><a href="/papers/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Paper2Code Finder</a></li><li><a href="/tools/hf-eval-papers/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">HF Eval Paper Explorer</a></li></ul></div></nav></div></div><div class="bordered-div-padding flex flex-col items-start gap-4 border-x border-b md:flex-row md:items-center md:justify-between"><div class="flex w-full flex-col items-start gap-4 sm:flex-row sm:items-center sm:gap-6 md:w-auto"><div class="box-content w-full max-w-[300px] text-left" style="min-height:24px"><div class="trustpilot-widget" data-trustpilot-loader="client" data-trustpilot-theme="dark" data-locale="en-US" data-template-id="5419b732fbfb950b10de65e5" data-businessunit-id="67db1b3ef68b69ff84c46376" data-style-height="24px" data-style-width="100%" data-theme="dark" data-token="83c1fde0-29c2-4546-9cea-4691c7a2ea91"><a href="https://www.trustpilot.com/review/opentrain.ai" target="_blank" rel="noopener noreferrer nofollow">Trustpilot</a></div></div><a href="https://x.com/OpenTrainAI" class="text-muted-foreground transition-colors hover:text-foreground" target="_blank" rel="noopener noreferrer" aria-label="Twitter"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" class="size-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg></a><a href="https://www.linkedin.com/company/opentrain/" class="text-muted-foreground transition-colors hover:text-foreground" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" class="size-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path></svg></a></div><div class="flex flex-wrap items-center gap-x-3 gap-y-2"><p class="text-muted-foreground text-sm">© <!-- -->2026<!-- --> OpenTrain AI</p>
983<span class="text-muted-foreground/40">·</span><a href="/privacy/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Privacy</a><span class="text-muted-foreground/40">·</span><probo-settings-link class="text-muted-foreground text-sm transition-colors hover:text-foreground">Cookies</probo-settings-link><span class="text-muted-foreground/40">·</span><a href="/terms-of-service/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Terms</a><span class="text-muted-foreground/40">·</span><a href="/security/" class="text-muted-foreground text-sm transition-colors hover:text-foreground">Security</a></div></div></div></footer><!--astro:end--></astro-island>
983<script src="https://cdn.jsdelivr.net/npm/@probo/[email protected]/dist/cookie-banner.iife.js" data-banner-id="AXtEUajPAAEASwAAAZ9Pg0_pItsdtOXQ" data-base-url="https://probo-c4a9.onrender.com/api/cookie-banner/v1/" data-position="bottom-right"></script>
983
983<script> 984 // Hide the SDK's hardcoded "Privacy by Probo" footer link. The SDK is MIT 985 // (attribution belongs in source/OSS notices, not the UI) and exposes no 986 // config flag for this, so we inject a style into its open shadow root once 987 // the custom element mounts. 988 (() => { 989 const hideBranding = () => { 990 const el = document.querySelector("probo-cookie-banner"); 991 if (!el || !el.shadowRoot) return false; 992 if (!el.shadowRoot.querySelector("style[data-ot-hide-branding]")) { 993 const style = document.createElement("style"); 994 style.setAttribute("data-ot-hide-branding", ""); 995 style.textContent = "[data-branding] { display: none !important; }"; 996 el.shadowRoot.appendChild(style); 997 } 998 return true; 999 }; 1000 const start = () => { 1001 if (hideBranding()) return; 1002 let tries = 0; 1003 const timer = setInterval(() => { 1004 if (hideBranding() || ++tries > 100) clearInterval(timer); 1005 }, 100); 1006 }; 1007 if (document.readyState === "loading") { 1008 document.addEventListener("DOMContentLoaded", start, { once: true }); 1009 } else { 1010 start(); 1011 } 1012 })(); 1013</script>
1013
1013<script>(function(){const trustpilotTokens = {"light":"28174596-7ea1-4f47-9370-403a79ba7198","dark":"83c1fde0-29c2-4546-9cea-4691c7a2ea91"}; 1014const trustpilotScriptId = "trustpilot-widget-script"; 1015const trustpilotScriptSrc = "https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js"; 1016 1017 (() => { 1018 const scriptId = trustpilotScriptId; 1019 const scriptSrc = trustpilotScriptSrc; 1020 const reducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false; 1021 const thirdPartyDelayMs = reducedMotion ? 12000 : 4000; 1022 const runWhenIdle = (cb) => { 1023 if ('requestIdleCallback' in window) { window.requestIdleCallback(cb, { timeout: 3000 }); return; } 1024 window.setTimeout(cb, 800); 1025 }; 1026 const runAfterThirdPartyDelay = (cb) => window.setTimeout(() => runWhenIdle(cb), thirdPartyDelayMs); 1027 const loadScript = () => { 1028 if (window.Trustpilot?.loadFromElement) return Promise.resolve(); 1029 const existing = document.getElementById(scriptId); 1030 if (existing) { 1031 return new Promise((resolve) => { 1032 existing.addEventListener('load', resolve, { once: true }); 1033 existing.addEventListener('error', resolve, { once: true }); 1034 window.setTimeout(resolve, 2500); 1035 }); 1036 } 1037 const s = document.createElement('script'); 1038 s.id = scriptId; s.src = scriptSrc; s.async = true; 1039 const loaded = new Promise((resolve) => { 1040 s.addEventListener('load', resolve, { once: true }); 1041 s.addEventListener('error', resolve, { once: true }); 1042 window.setTimeout(resolve, 2500); 1043 }); 1044 document.head.appendChild(s); 1045 return loaded; 1046 }; 1047 // Trustpilot renders inside an iframe, so light/dark is a widget token + 1048 // `data-theme` pair that has to be correct *before* the widget loads. 1049 // Several heroes ship as static (non-hydrated) markup, so the theme is 1050 // resolved here rather than in React. Returns true when it changed. 1051 const syncWidgetTheme = (widget) => { 1052 const mode = widget.dataset.trustpilotTheme || 'auto'; 1053 const theme = mode === 'light' || mode === 'dark' 1054 ? mode 1055 : (document.documentElement.classList.contains('dark') ? 'dark' : 'light'); 1056 const token = trustpilotTokens[theme]; 1057 if (widget.dataset.theme === theme && widget.dataset.token === token) return false; 1058 widget.dataset.theme = theme; 1059 widget.dataset.token = token; 1060 return true; 1061 }; 1062 const allWidgets = () => [...document.querySelectorAll('.trustpilot-widget')]; 1063 // `loadFromElement` reads `this`, so it has to stay attached to Trustpilot. 1064 const renderWidget = (widget) => { 1065 if (!window.Trustpilot?.loadFromElement) return false; 1066 try { 1067 window.Trustpilot.loadFromElement(widget, true); 1068 widget.dataset.trustpilotLoaded = 'true'; 1069 return true; 1070 } catch { 1071 // Trustpilot can throw while its internal modules are still booting. 1072 // Retrying on the next idle/window load is enough, and prevents 1073 // third-party widget internals from failing site reliability tests. 1074 return false; 1075 } 1076 }; 1077 const syncThemes = () => { 1078 allWidgets().forEach((widget) => { 1079 if (!syncWidgetTheme(widget)) return; 1080 // Rendered (or mid-render) widgets need an explicit redraw to pick up 1081 // the new token. Before the script loads there is nothing to redraw: 1082 // the pending load reads the fresh attributes on its own. 1083 if (window.Trustpilot?.loadFromElement) renderWidget(widget); 1084 }); 1085 }; 1086 const loadWidgets = (targetWidgets) => { 1087 if (!window.Trustpilot?.loadFromElement) return false; 1088 let loaded = false; 1089 targetWidgets.forEach((widget) => { 1090 if (widget.dataset.trustpilotLoaded === 'true') return; 1091 syncWidgetTheme(widget); 1092 if (renderWidget(widget)) loaded = true; 1093 }); 1094 return loaded; 1095 }; 1096 const init = () => { 1097 const widgets = allWidgets().filter((w) =>
1097 w.dataset.trustpilotLoaded !== 'true'); 1098 if (!widgets.length) return; 1099 const ensureLoaded = (targetWidgets) => { 1100 if (!targetWidgets.length) return; 1101 void loadScript().then(() => loadWidgets(targetWidgets)); 1102 }; 1103 const observer = new IntersectionObserver((entries) => { 1104 const visibleWidgets = entries.filter((e) => e.isIntersecting).map((e) => e.target); 1105 if (visibleWidgets.length) { 1106 ensureLoaded(visibleWidgets); 1107 visibleWidgets.forEach((widget) => observer.unobserve(widget)); 1108 } 1109 }, { rootMargin: '400px 0px' }); 1110 widgets.forEach((w) => observer.observe(w)); 1111 ensureLoaded(widgets.filter((w) => w.getBoundingClientRect().top < window.innerHeight + 200)); 1112 }; 1113 const schedule = () => runAfterThirdPartyDelay(init); 1114 if (document.readyState === 'complete') schedule(); 1115 else window.addEventListener('load', schedule, { once: true }); 1116 document.addEventListener('astro:page-load', schedule); 1117 1118 // Keep every widget (static, hydrated, or mounted later) on the token 1119 // that matches the active site theme, including after a theme toggle. 1120 syncThemes(); 1121 new MutationObserver(syncThemes).observe(document.documentElement, { 1122 attributes: true, 1123 attributeFilter: ['class'], 1124 }); 1125 document.addEventListener('astro:page-load', syncThemes); 1126 })(); 1127 })();</script>
1127<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"6b4ec40a2018405c963e58576cb9c525","spa":2}' crossorigin="anonymous"></script>
1127 1128</body> </html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.