Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/components/Footer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const footer = {
company: [
{ name: "Cloud Pricing", href: "/cloud#pricing" },
{ name: "Enterprise", href: "/enterprise" },
{ name: "Careers", href: "/careers" },
{ name: "Sales", href: "/sales" },
{ name: "Talk to an engineer", href: "/talk-to-an-engineer" },
{ name: "YC & Speedrun Deal", href: "/startups" },
Expand Down
273 changes: 273 additions & 0 deletions src/pages/careers.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
---
import MarketingLayout from '@/layouts/MarketingLayout.astro';
import {
HERO_H1_CLASS,
PRIMARY_INK_BUTTON_CLASS,
SECTION_H2_CLASS,
} from '@/components/marketing/typography';

const workAreas = [
{
title: 'Control plane',
body: 'Actor orchestration with Pegboard, durable execution with Gasoline, traffic routing with Guard, multi-region KV on EPaxos with Epoxy, and our SQLite engine.',
},
{
title: 'RivetKit',
body: 'The TypeScript SDK and its bindings into the Rust core.',
},
{
title: 'agentOS',
body: 'A computer inside every actor, with a filesystem, networking, Bash, Python, and Node.js.',
},
{
title: 'Workflows',
body: 'Durable automation that sleeps, retries, and survives restarts.',
},
{
title: 'Dynamic Apps',
body: 'Backends generated by agents, with a 22 MB footprint per app and the ability to scale to zero or to millions.',
},
{
title: 'Rivet Cloud',
body: 'Multi-tenancy, edge routing, autoscaling, and observability for running Rivet in production.',
},
];

const aiPolicy = [
{
area: 'Core control plane',
policy: 'No or limited AI for mission-critical and “off-rails” code.',
},
{
area: 'SDKs and frontend',
policy: 'Reviewed AI for routine and “on-rails” code.',
},
{
area: 'Website',
policy: 'Use AI; test the output.',
},
];

const benefits = [
'Health, dental, and vision insurance',
'401(k)',
'Unlimited PTO',
];
---

<MarketingLayout
title="Careers at Rivet"
description="Join Rivet and help build open-source infrastructure for AI agents. Explore the systems we work on and view current roles."
canonicalUrl="https://rivet.dev/careers/"
>
<div class="paper-grain min-h-screen font-sans text-ink-soft">
<main id="main-content">
<!-- Hero -->
<section class="depth-wash relative overflow-hidden px-6 pb-0 pt-32 md:pt-44">
<div class="career-grid absolute inset-0 opacity-60" aria-hidden="true"></div>
<div class="relative mx-auto w-full max-w-7xl">
<div class="flex min-h-[32rem] items-center justify-center pb-20 text-center lg:pb-24">
<div class="mx-auto max-w-4xl">
<h1 class={HERO_H1_CLASS}>Help us build infrastructure for AI agents.</h1>
<div class="mt-8 flex flex-col items-center justify-center gap-4 sm:flex-row">
<a href="#open-positions" class={PRIMARY_INK_BUTTON_CLASS}>See open positions</a>
<a
href="https://github.com/rivet-dev"
target="_blank"
rel="noreferrer"
class="group inline-flex items-center gap-2 text-sm font-medium text-pine transition-colors hover:text-ink"
>
See what we’re building
<span aria-hidden="true" class="transition-transform group-hover:translate-x-0.5">↗</span>
</a>
</div>
</div>
</div>
</div>
</section>

<!-- Work -->
<section class="border-t border-ink/10 px-6 py-20 md:py-32">
<div class="mx-auto grid w-full max-w-7xl gap-12 lg:grid-cols-[0.38fr_0.62fr] lg:gap-20">
<div class="max-w-md">
<h2 class={SECTION_H2_CLASS}>What we build.</h2>
<p class="mt-4 text-base leading-relaxed text-ink-soft">
Everything builds on actors. Use Rivet as a library in development and a
platform in production: run it on Rivet Cloud, self-host the Apache 2.0
control plane, or deploy fully air-gapped in your VPC.
</p>
<p class="mt-4 text-sm font-medium text-ink">Almost everything you write is public.</p>
</div>

<div class="border-t border-ink/15">
{workAreas.map((item) => (
<div class="grid gap-2 border-b border-ink/15 py-6 sm:grid-cols-[10rem_1fr] sm:gap-8">
<h3 class="text-base font-medium text-ink">{item.title}</h3>
<p class="text-sm leading-relaxed text-ink-soft">{item.body}</p>
</div>
))}
<p class="pt-6 font-mono text-xs leading-relaxed text-ink-faint">
Rust · TypeScript · FoundationDB · Postgres · ClickHouse · NATS · SQLite
</p>
</div>
</div>
</section>

<!-- AI policy -->
<section class="border-y border-ink/10 bg-paper-deep/35 px-6 py-20 md:py-28">
<div class="mx-auto grid w-full max-w-7xl gap-12 lg:grid-cols-[0.38fr_0.62fr] lg:gap-20">
<div class="max-w-md">
<h2 class={SECTION_H2_CLASS}>How we use AI.</h2>
<p class="mt-4 text-base leading-relaxed text-ink-soft">
The policy depends on the risk and predictability of the code.
</p>
</div>

<div class="border-t border-ink/15">
{aiPolicy.map((item) => (
<div class="grid gap-2 border-b border-ink/15 py-6 sm:grid-cols-[10rem_1fr] sm:gap-8">
<h3 class="text-sm font-medium text-ink">{item.area}</h3>
<p class="text-sm leading-relaxed text-ink-soft">{item.policy}</p>
</div>
))}
</div>
</div>
</section>

<!-- Benefits -->
<section class="px-6 py-20 md:py-28">
<div class="mx-auto grid w-full max-w-7xl gap-12 lg:grid-cols-[0.38fr_0.62fr] lg:gap-20">
<h2 class={SECTION_H2_CLASS}>Benefits.</h2>
<ul class="border-t border-ink/15">
{benefits.map((benefit) => (
<li class="border-b border-ink/15 py-5 text-sm font-medium text-ink">
{benefit}
</li>
))}
</ul>
</div>
</section>

<!-- Open roles -->
<section id="open-positions" class="scroll-mt-24 border-t border-ink/10 px-6 py-20 md:py-32">
<div class="mx-auto w-full max-w-5xl">
<div class="max-w-3xl">
<h2 id="open-positions-heading" class={SECTION_H2_CLASS}>Open positions.</h2>
<p class="mt-4 text-base leading-relaxed text-ink-soft">
Current openings are published here. Select a role to learn more and apply.
</p>
</div>

<div class="mt-12 min-w-0">
<waas-job-board
company="rivet"
action-color="#d63e00"
aria-labelledby="open-positions-heading"
></waas-job-board>
</div>
</div>
</section>
</main>
</div>

<script is:inline data-astro-rerun>
(() => {
const scriptSrc = 'https://www.workatastartup.com/embed/script.js';
const jobCardStyle = `
.job-card,
:host([layout="grid"]) .job-card {
border-left: 0 !important;
border-radius: 0 !important;
}

.job-card:hover,
.job-card:focus-visible,
:host([layout="grid"]) .job-card:hover {
border-left-color: transparent !important;
border-radius: 0 !important;
}
`;

const loadJobBoard = () => {
if (!document.querySelector('waas-job-board') || customElements.get('waas-job-board')) {
return;
}

if (document.querySelector(`script[src="${scriptSrc}"]`)) return;

const script = document.createElement('script');
script.src = scriptSrc;
script.defer = true;
script.dataset.waasJobBoardLoader = '';
script.addEventListener('error', () => script.remove(), { once: true });
document.head.append(script);
};

const removeJobCardRail = () => {
const observedRoots = new WeakSet();

const observe = (root) => {
if (observedRoots.has(root)) return;
observedRoots.add(root);

const scan = () => {
root.querySelectorAll('*').forEach((element) => {
if (element.localName === 'waas-job-card' && element.shadowRoot) {
if (!element.shadowRoot.querySelector('style[data-rivet-job-card-style]')) {
const style = document.createElement('style');
style.dataset.rivetJobCardStyle = '';
style.textContent = jobCardStyle;
element.shadowRoot.append(style);
}
}

if (element.shadowRoot) observe(element.shadowRoot);
});
};

new MutationObserver(scan).observe(root, { childList: true, subtree: true });
scan();
};

document.querySelectorAll('waas-job-board').forEach((board) => {
if (board.shadowRoot) observe(board.shadowRoot);
});
};

const prepareJobBoard = () => {
loadJobBoard();
customElements.whenDefined('waas-job-board').then(removeJobCardRail);
};

prepareJobBoard();
document.addEventListener('astro:page-load', prepareJobBoard, { once: true });
})();
</script>
</MarketingLayout>

<style>
.career-grid {
background-image:
linear-gradient(rgb(27 25 22 / 0.045) 1px, transparent 1px),
linear-gradient(90deg, rgb(27 25 22 / 0.045) 1px, transparent 1px);
background-size: 44px 44px;
mask-image: linear-gradient(to bottom, black, transparent 92%);
}

waas-job-board {
display: block;
width: 100%;
--waas-font: 'Manrope', sans-serif;
--waas-primary: #d63e00;
--waas-bg: #efefef;
--waas-bg-subtle: rgb(27 25 22 / 4%);
--waas-text: #1b1916;
--waas-text-color: #1b1916;
--waas-text-secondary: #56524a;
--waas-text-tertiary: #8a8478;
--waas-border: rgb(27 25 22 / 15%);
--waas-border-focus: #d63e00;
--waas-radius: 0.375rem;
}

</style>
Loading