Take-home review desk that runs candidate code in a sandbox

See every take-home waiting on a verdict, read the code in the app, and have it built and tested in a throwaway machine instead of on your laptop.

App
DaytonaGreenhouseGitHubSlackHR & PeopleEngineeringAI ReportsNotifications & Alerts
PromptCreate

I want an app that my engineering hiring panel opens to review take-home submissions, instead of everyone cloning candidate code onto their own laptops. It has three surfaces: a review queue, a submission reader, and a per-role compare view.

The review queue is the landing page. It lists every candidate currently sitting at the take-home stage. Pull the open roles with the Greenhouse List Jobs action, then pull their applications with List Applications, and keep the ones whose current stage is the take-home or assignment stage. For each of those, call Get Candidate and read the embedded attachments and custom fields to find the submission repository link the candidate provided. Each row shows the candidate, the role, how many days they have been waiting since they entered the stage, and the state of the automated run: never run, running, or finished with a headline result. Sort the longest waiters to the top, let reviewers filter by role, and flag rows where no repository link could be found on the candidate record so a recruiter can chase it.

Opening a row shows the submission next to its run report. On the left, render the repository from GitHub: Get a Repository for the basics such as default branch, primary language and last push, List Files in a Directory to walk the tree, and Get a File to load the contents of whatever file the reviewer clicks. Decode the base64 file contents and display them with syntax highlighting and line numbers. Preload the README, the dependency manifest and the test directory so a reviewer lands on something readable rather than an empty pane. On the right, show the run report for this submission if one exists, and a Run button if it does not.

The Run this submission button kicks off a background agent. It creates a fresh Daytona sandbox with Create Sandbox, then polls Get Sandbox until the state is started, because sandbox creation is async and toolbox calls fail before then. It clones the candidate repository with Git Clone Repository and does the rest of its work with Execute Command in Sandbox, falling back to Create Session and Execute Command in Session for anything long running like a dependency install or a full build. It reads the README and follows the candidate's documented setup steps exactly as written rather than guessing at a better path, then installs dependencies, runs the build, runs the test suite, and runs the linter. It also inspects the commit history by running git log inside the sandbox after the clone, since there is no GitHub list-commits action to call. When the work is done, or the time cap is hit, it deletes the sandbox with Delete Sandbox.

The agent writes a structured scorecard back into the app so the reader and the compare view can both display it. The scorecard records whether the project builds, whether the candidate's own documented instructions actually worked end to end and exactly where they broke if they did not, which tests passed and which failed with the failing output attached, what the linter reported, what the commit history suggests about how the work was done, and a short list of notable strengths and notable risks. Every claim cites the command that produced it, and the raw command output is expandable so a reviewer can check the agent's reading rather than take it on trust.

Underneath the report, the reviewer writes their own verdict, picks pass or no pass, and presses File to Greenhouse. That posts the combined writeup, meaning the reviewer's verdict plus a summary of the run, as a note on the candidate with Add Candidate Note. On a pass it also moves the candidate forward with Advance Application. Then it announces the outcome in the hiring channel using the Slack Send a Message action, naming the candidate, the role, the verdict and the reviewer who made the call.

Bake in these rules. Candidate code only ever executes inside the Daytona sandbox and never on a reviewer's machine, so the app should never offer a local clone or a download of the submission. Every run is time capped, and the sandbox is disposed of when the run ends or the cap is reached, whether it succeeded, failed or hung. The agent's scorecard is advisory only: the app never files anything on its own, and a human always presses the decision button. The rubric is stored per role and the same one is applied to every candidate on that role, so two submissions for the same job are always scored against the same list. And there is a side by side compare view of all the runs for one role, with build result, test results, setup-instructions result and reviewer verdict in a row per candidate, so the panel can calibrate against each other instead of grading in isolation.

Persist runs, scorecards, per-role rubrics and reviewer verdicts inside the app, so the queue and the compare view keep working long after a sandbox is gone. Keep a record of who filed which verdict and when, and show on each row when the last run happened so nobody reruns a submission that was already reviewed this morning.

What does this prompt do?

  • One board with every candidate sitting at the take-home stage, the role they applied for, how many days they have been waiting, and whether their submission has been checked yet.
  • Read the submission inside the app: the file tree and the important files sit right next to the automated report, so nobody has to download a stranger's project.
  • Press Run and a background helper spins up a disposable machine, follows the candidate's own setup instructions, builds the project, runs the tests and the linter, looks at how the work was committed, and writes up what held together and what did not.
  • Add your own verdict and file it in one click: the writeup lands on the candidate record, a pass moves them to the next stage, and your hiring channel gets the news.

What do I need to use this?

  • A Greenhouse account with permission to read jobs and candidates and to add notes and move applications forward
  • A GitHub login that can see the repositories your candidates submit, including private ones
  • A Daytona account, which provides the disposable machines the candidate code runs on
  • A Slack workspace and the channel where your hiring updates go

How can I customize it?

  • Set the rubric per role so everyone applying for the same job is measured the same way, and adjust what the report has to answer
  • Change the time cap on a run and what happens when a submission blows past it
  • Choose which files load automatically in the reader, such as the README, the dependency file, and the test folder
  • Pick the Slack channel that hears about filed verdicts and how much of the writeup gets shared there

FAQs

Does candidate code ever run on my computer?
No. Every submission is cloned, built and tested inside a throwaway machine in the cloud, and that machine is destroyed when the run ends. Reviewers read the code in the browser and never clone it locally, which is the whole point of the setup.
Does the automated report decide who passes?
No. The report is advisory. A person reads it, writes their own verdict, and presses the button that files the decision. Nothing moves a candidate forward on its own.
How do we keep the bar the same for every candidate on a role?
The rubric is set per role, so every submission for that job is checked against the same list. There is also a side by side view of all the runs for one role, so reviewers can calibrate against each other rather than grading in isolation.
What happens if a candidate's setup instructions do not work?
That gets recorded rather than quietly worked around. The helper follows the README exactly as written and reports where it broke, which is often the most useful signal in the whole review.
Where does the repository link come from?
It is read off the candidate record in Greenhouse, from their attachments and custom fields, so you keep collecting submissions the way you already do.
What gets written back into our hiring system?
The reviewer's verdict plus a summary of the run is posted as a note on the candidate. On a pass, the candidate is also moved forward to the next stage, and the outcome is announced in your hiring channel.

Related templates

Browse and shortlist creators without burning audit credits

Search creators for free, shortlist the best with your team, and spend an audit credit only when you decide someone is worth a closer look.

HypeAuditor
Airtable
Slack
App
Hiring funnel dashboard for every open Hireflix role

One screen showing invited, completed, and shortlisted counts for every open role, plus the stalled invites that have quietly gone nowhere.

Hireflix
Slack
App
Global operations exposure map for your sites and suppliers

Open one board each morning to see which of your facilities, suppliers and shipping lanes are sitting near trouble in the news right now.

GDELT
Airtable
Slack
App
Compare creators on post performance before you pay them

Pick creators from your saved list and see their best and worst Instagram posts side by side, so your brief is built on what actually lands.

HypeAuditor
Google Docs
Slack
App
Review every Hireflix video interview from one daily queue

One screen where your hiring team watches every unscored candidate, reads the transcript alongside each answer, and scores and shortlists on the spot.

Hireflix
Slack
App
Deal sourcing kanban board for your Harmonic saved searches

Drag every new company from your Harmonic saved searches through New, Tracking, Meeting and Passed, with a one click diligence brief on every card.

Harmonic
Airtable
Slack
App

Stop cloning strangers' code onto your laptop.

Give your hiring panel one screen where every take-home is read, run and decided on.