Clark Hiring - Hackathon Entry
Inspiration
I got tired of using Ashby and Greenhouse. These tools feel like they were designed for HR departments, not for the people actually trying to hire great candidates. I wanted an ATS that lives where engineering teams already work - Linear. No context switching, no separate dashboards, just hiring integrated into the workflow we already love.
What it does
Clark turns Linear into a full-featured applicant tracking system with AI superpowers:
- Job boards powered by Linear projects - Create a project, mark it "In Progress", and it becomes a live job listing
- AI-enhanced job descriptions - Add an
enhancelabel and Cerebras rewrites your job posting - Smart application processing - CVs and cover letters (PDF/DOCX) are parsed and attached to Linear issues
- AI candidate pre-screening - Automatically evaluates applications against job requirements and routes them to the right workflow state
- Voice screening interviews - ElevenLabs-powered conversational AI conducts initial screening calls
- Threaded email communication - Stateless email threading via Resend keeps all candidate correspondence organized
- Usage-based billing - Polar integration for monetization
How we built it
Solo build. NextJS 16 with server actions (not API routes - a hill I'll die on). Linear SDK for the core ATS functionality. Cerebras for fast AI inference. WorkOS AuthKit for authentication. Upstash Redis for cross-session state. Resend for transactional emails with header-based threading. ElevenLabs for voice AI. Polar for subscriptions.
I used Kiro (AWS's new AI coding tool) for most of the implementation - which became its own adventure.
Challenges we ran into
Kiro doesn't use the internet. This was the killer. I'd link documentation URLs in my prompts - ignored. It hallucinated Linear SDK methods that don't exist, invented Resend template APIs, and confidently used deprecated attributes. When the actual fix was replacing client.issueLabels with client.projectLabels, it instead renamed a variable and called it solved.
The infinite webhook loop. Kiro implemented label updates and content updates as separate API calls. Update triggers webhook. Webhook triggers update. Update triggers webhook. Classic beginner mistake - I expected the AI to catch it.
PDF parsing in NextJS 16. Turbopack and pdf.js workers don't play nice. Had to mark packages as external - Kiro actually handled this well, porting webpack config to turbopack on the first try.
Authentication. Kiro hand-rolled an auth system based on outdated patterns instead of just using @workos-inc/authkit-nextjs. Took me 12 minutes to delete everything and set it up correctly using the docs.
Accomplishments that we're proud of
- Stateless email threading - No database needed to track email conversations. Pure header-based threading using
In-Reply-ToandReferences. - The whole thing works - Multiple third-party integrations (Linear, Cerebras, WorkOS, Resend, ElevenLabs, Polar) all talking to each other.
- Voice screening actually works - Candidates can have a real conversation with an AI interviewer.
- Built in a hackathon - Solo. With an AI assistant that kept trying to re-implement SDKs from scratch.
What we learned
AI code review is non-negotiable. Despite all the guardrails, Kiro produced code with critical flaws - probabilistic session matching that would mix up candidates, benefit error messages shown to applicants instead of employers, any types everywhere. Every line needs review.
Planning helps, but execution still fails. I spent 50 minutes crafting a detailed design for email/voice features. Kiro still hallucinated wrong interfaces and ignored explicit instructions to use Resend's built-in templates.
Smaller tasks = better results. When tasks were well-scoped (2-3 min completion), Kiro performed reasonably. Large tasks led to over-engineering and slop.
The docs I linked were the answer. Every major bug could have been avoided if the AI had just read the URLs I provided. project.status?.name === "In Progress" instead of a probabilistic progress heuristic. initiativeId instead of projectId. It's all in the docs.
What's next for Clark Hiring
- Interview scheduling - Calendar integration for coordinating interviews
- Team collaboration - Comments and @mentions for hiring discussions within Linear
- Analytics dashboard - Pipeline metrics, time-to-hire, source tracking
- Custom screening flows - Configurable AI interview questions per role
- Offer management - Generate and track offer letters directly in Linear
Built With
- datadog
- elevenlabs
- linear
- nextjs
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.