207 lines
12 KiB
HTML
207 lines
12 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Start a lab — Shkor Labs</title>
|
|
<meta name="description" content="Apply to start a lab at Shkor Labs: tell us about your business, verify your identity (and your company), and get the autopilot, shared infrastructure and a community of founders.">
|
|
<meta property="og:title" content="Start a lab — Shkor Labs">
|
|
<meta property="og:description" content="Apply, verify once, and start building on the autopilot.">
|
|
<meta name="theme-color" content="#050506">
|
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'><rect width='64' height='64' rx='14' fill='%23050506'/><circle cx='32' cy='32' r='20' fill='none' stroke='%23c6ff4d' stroke-width='3' stroke-dasharray='4 6'/><circle cx='32' cy='32' r='7' fill='%23c6ff4d'/></svg>">
|
|
<link rel="preload" href="../assets/space-grotesk-latin.woff2" as="font" type="font/woff2" crossorigin>
|
|
<link rel="stylesheet" href="../styles.css">
|
|
<link rel="stylesheet" href="apply.css">
|
|
</head>
|
|
<body>
|
|
<a class="skip" href="#main">Skip to content</a>
|
|
|
|
<header class="nav">
|
|
<div class="wrap nav-in">
|
|
<a class="brand" href="../" aria-label="Shkor Labs — home">
|
|
<svg viewBox="0 0 32 32" aria-hidden="true"><circle cx="16" cy="16" r="12" fill="none" stroke="currentColor" stroke-width="2" stroke-dasharray="3 4"/><circle cx="16" cy="16" r="4.5" fill="currentColor"/></svg>
|
|
<span>Shkor<b>Labs</b></span>
|
|
</a>
|
|
<nav aria-label="Main">
|
|
<a href="../#labs">Labs</a>
|
|
<a href="../#method">Method</a>
|
|
<a class="btn btn-sm btn-ghost" href="../">Back to site</a>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<main id="main" class="apply">
|
|
<div class="grid-bg" aria-hidden="true"></div>
|
|
<div class="wrap apply-in">
|
|
|
|
<aside class="apply-side">
|
|
<p class="kicker">Lab · $999/month + revenue share</p>
|
|
<h1>Bring a business.<br><span class="hl">Leave with an autopilot.</span></h1>
|
|
<p class="lead">A lab is a founder plus their AI agents on shared infrastructure. Apply once, verify once — and your application lands on the cooperative's desk already trusted.</p>
|
|
|
|
<ol class="flow" aria-label="How it works">
|
|
<li><span>1</span><div><b>Tell us about the lab</b><small>5 minutes. What you're building and for whom.</small></div></li>
|
|
<li><span>2</span><div><b>Verify your identity</b><small>ID + selfie with our partner Didit. About 2 minutes, free for you.</small></div></li>
|
|
<li><span>3</span><div><b>Verify your company</b><small>Only if you have one: registry check and the people behind it.</small></div></li>
|
|
<li><span>4</span><div><b>Board decision</b><small>Verified applications are reviewed first. You'll hear back by email.</small></div></li>
|
|
</ol>
|
|
|
|
<div class="why">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3 4 6v6c0 4.5 3.4 8.3 8 9 4.6-.7 8-4.5 8-9V6l-8-3Z M9 12l2 2 4-4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
|
<p><b>Why verify?</b> Labs share infrastructure, payments and revenue inside a cooperative. Knowing who's who up front is what lets us move fast — and lets every member trust every lab.</p>
|
|
</div>
|
|
<div class="why alt">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h12M13 6l6 6-6 6" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
|
<p><b>Want to start today?</b> <a href="../start/">Autopilot</a> gives you your own server, agent and workspace for $99/month right away — you can apply for the lab at the same time.</p>
|
|
</div>
|
|
</aside>
|
|
|
|
<section class="apply-card" aria-labelledby="form-h">
|
|
<h2 id="form-h" class="sr">Application form</h2>
|
|
<div class="steps-bar" aria-hidden="true"><i data-s="1" class="on"></i><i data-s="2"></i><i data-s="3"></i></div>
|
|
|
|
<form id="apply" novalidate>
|
|
<!-- step 1 -->
|
|
<fieldset class="step-pane" data-step="1">
|
|
<legend><span class="kicker">Step 1 of 3</span>About you</legend>
|
|
<div class="row2">
|
|
<div class="field"><label for="f-name">Full name <em>*</em></label><input id="f-name" name="name" autocomplete="name" required maxlength="120"></div>
|
|
<div class="field"><label for="f-email">Email <em>*</em></label><input id="f-email" name="email" type="email" autocomplete="email" required maxlength="254"></div>
|
|
</div>
|
|
<div class="field"><label for="f-role">Your role</label><input id="f-role" name="role" placeholder="Founder, CEO, solo builder…" maxlength="120"></div>
|
|
<div class="field"><label for="f-links">Links</label><input id="f-links" name="links" placeholder="Website, LinkedIn, GitHub, Telegram" maxlength="400"><small>Anything that helps us understand you and your work.</small></div>
|
|
</fieldset>
|
|
|
|
<!-- step 2 -->
|
|
<fieldset class="step-pane" data-step="2" hidden>
|
|
<legend><span class="kicker">Step 2 of 3</span>Your lab</legend>
|
|
<div class="row2">
|
|
<div class="field"><label for="f-pname">Lab / project name <em>*</em></label><input id="f-pname" name="project_name" required maxlength="80"></div>
|
|
<div class="field"><label for="f-stage">Stage</label>
|
|
<select id="f-stage" name="stage">
|
|
<option value="">Choose…</option>
|
|
<option>Idea</option><option>Prototype</option><option>First customers</option><option>Revenue</option><option>Established business</option>
|
|
</select></div>
|
|
</div>
|
|
<div class="field"><label for="f-project">In one sentence, what does it do? <em>*</em></label><input id="f-project" name="project" required maxlength="300" placeholder="We turn podcasts into vertical clips for creators"></div>
|
|
<div class="field"><label for="f-market">Who is it for?</label><textarea id="f-market" name="b_market" rows="2" maxlength="600" placeholder="Your customer, and the problem they pay to solve"></textarea></div>
|
|
<div class="field"><label for="f-need">What would you put on autopilot first?</label><textarea id="f-need" name="b_need" rows="2" maxlength="600" placeholder="Leads, support, content, reporting, operations…"></textarea></div>
|
|
<div class="field"><label for="f-mission">Why you, why now?</label><textarea id="f-mission" name="b_mission" rows="2" maxlength="600"></textarea></div>
|
|
</fieldset>
|
|
|
|
<!-- step 3 -->
|
|
<fieldset class="step-pane" data-step="3" hidden>
|
|
<legend><span class="kicker">Step 3 of 3</span>Company & verification</legend>
|
|
<div class="field">
|
|
<span class="label">Is there a registered company behind the lab?</span>
|
|
<div class="seg" role="radiogroup" aria-label="Registered company">
|
|
<label><input type="radio" name="has_company" value="no" checked><span>Not yet</span></label>
|
|
<label><input type="radio" name="has_company" value="yes"><span>Yes, we have a company</span></label>
|
|
</div>
|
|
</div>
|
|
<div id="company" class="company" hidden>
|
|
<div class="field"><label for="f-cname">Legal company name <em>*</em></label><input id="f-cname" name="company_name" maxlength="160" autocomplete="organization"></div>
|
|
<div class="row2">
|
|
<div class="field"><label for="f-ccountry">Country of registration <em>*</em></label><input id="f-ccountry" name="company_country" maxlength="60" autocomplete="country-name"></div>
|
|
<div class="field"><label for="f-creg">Registration number</label><input id="f-creg" name="company_reg" maxlength="60"></div>
|
|
</div>
|
|
<p class="note">We'll also verify the company (KYB): registry lookup, sanctions screening and the people behind it.</p>
|
|
</div>
|
|
|
|
<div class="consent">
|
|
<label class="check"><input type="checkbox" name="consent" required><span>I agree that Shkor Labs and its verification partner <a href="https://didit.me" target="_blank" rel="noopener">Didit</a> process my identity documents and selfie to verify who I am{{company}}. Data is used only for this application.</span></label>
|
|
</div>
|
|
<input type="text" name="company_hp" class="hp" tabindex="-1" autocomplete="off" aria-hidden="true">
|
|
</fieldset>
|
|
|
|
<p class="form-err" role="alert" aria-live="assertive"></p>
|
|
|
|
<div class="actions">
|
|
<button type="button" class="btn btn-ghost" id="back" hidden>
|
|
<svg viewBox="0 0 20 20" aria-hidden="true"><path d="M16 10H5M9 5l-5 5 5 5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg><span>Back</span></button>
|
|
<button type="submit" class="btn" id="next"><span>Continue</span>
|
|
<svg viewBox="0 0 20 20" aria-hidden="true"><path d="M4 10h11M11 5l5 5-5 5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></button>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
</main>
|
|
|
|
<footer class="foot">
|
|
<div class="wrap foot-in">
|
|
<p>© 2026 Shkor Labs LLC</p>
|
|
<nav aria-label="Footer"><a href="https://cil.by" rel="noopener">Cooperative 42</a><a href="mailto:hello@shkor.com">hello@shkor.com</a></nav>
|
|
</div>
|
|
</footer>
|
|
|
|
<script>
|
|
(function () {
|
|
var form = document.getElementById('apply'), step = 1, last = 3;
|
|
var panes = form.querySelectorAll('.step-pane'), bars = document.querySelectorAll('.steps-bar i');
|
|
var back = document.getElementById('back'), next = document.getElementById('next'), err = form.querySelector('.form-err');
|
|
var company = document.getElementById('company');
|
|
var consentText = form.querySelector('.consent span');
|
|
var consentBase = consentText.innerHTML;
|
|
|
|
function syncCompany() {
|
|
var yes = form.has_company.value === 'yes';
|
|
company.hidden = !yes;
|
|
form.company_name.required = yes; form.company_country.required = yes;
|
|
consentText.innerHTML = consentBase.replace('{{company}}', yes ? ' and my company' : '');
|
|
}
|
|
form.querySelectorAll('input[name=has_company]').forEach(function (r) { r.addEventListener('change', syncCompany); });
|
|
syncCompany();
|
|
|
|
function show(s) {
|
|
step = s;
|
|
panes.forEach(function (p) { p.hidden = +p.dataset.step !== s; });
|
|
bars.forEach(function (b) { b.classList.toggle('on', +b.dataset.s <= s); });
|
|
back.hidden = s === 1;
|
|
next.querySelector('span').textContent = s === last ? 'Submit & verify identity' : 'Continue';
|
|
err.textContent = '';
|
|
var first = form.querySelector('.step-pane[data-step="' + s + '"] input:not([type=radio]), .step-pane[data-step="' + s + '"] textarea');
|
|
if (first && s > 1) first.focus();
|
|
}
|
|
|
|
function valid(s) {
|
|
var pane = form.querySelector('.step-pane[data-step="' + s + '"]'), bad = null;
|
|
pane.querySelectorAll('input, textarea, select').forEach(function (el) {
|
|
if (el.closest('[hidden]') && el.closest('[hidden]') !== pane) return;
|
|
var ok = el.checkValidity();
|
|
el.setAttribute('aria-invalid', ok ? 'false' : 'true');
|
|
if (!ok && !bad) bad = el;
|
|
});
|
|
if (bad) {
|
|
err.textContent = bad.type === 'checkbox' ? 'Please confirm consent to identity verification.'
|
|
: bad.type === 'email' ? 'Please enter a valid email.' : 'Please fill in the required fields.';
|
|
bad.focus();
|
|
}
|
|
return !bad;
|
|
}
|
|
|
|
back.addEventListener('click', function () { show(step - 1); });
|
|
|
|
form.addEventListener('submit', function (e) {
|
|
e.preventDefault();
|
|
if (!valid(step)) return;
|
|
if (step < last) return show(step + 1);
|
|
var data = {};
|
|
new FormData(form).forEach(function (v, k) { data[k] = v; });
|
|
data.consent = form.consent.checked;
|
|
if (data.has_company !== 'yes') { data.company_name = data.company_country = data.company_reg = ''; }
|
|
next.disabled = true; next.querySelector('span').textContent = 'Submitting…';
|
|
fetch('/api/lab/apply', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) })
|
|
.then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })
|
|
.then(function (res) {
|
|
if (!res.ok) throw new Error(res.j.error || 'Something went wrong.');
|
|
location.href = 'status/?t=' + encodeURIComponent(res.j.token) + '&new=1';
|
|
})
|
|
.catch(function (x) {
|
|
err.textContent = x.message || 'Network error — please try again.';
|
|
next.disabled = false; next.querySelector('span').textContent = 'Submit & verify identity';
|
|
});
|
|
});
|
|
})();
|
|
</script>
|
|
</body>
|
|
</html>
|