{"id":2910,"date":"2026-11-04T13:31:58","date_gmt":"2026-11-04T12:31:58","guid":{"rendered":"https:\/\/extendsclass.com\/blog\/?p=2910"},"modified":"2026-11-04T13:24:32","modified_gmt":"2026-11-04T12:24:32","slug":"onboarding-outside-developer","status":"publish","type":"post","link":"https:\/\/extendsclass.com\/blog\/onboarding-outside-developer","title":{"rendered":"Onboarding an outside developer in week one: access, repos, reviews"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">By Alexander Rocket, founder of Rocketech<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An outside developer starts on Monday. By Wednesday they&#8217;re still waiting for a repo invite, the staging password is in somebody&#8217;s DMs, and you&#8217;re paying for all of it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Most of that goes away if you plan the week ahead of time. Set one goal: by Friday, a reviewed pull request from the new person is merged and running on staging. The rest of this plan works back from that goal.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_47_1 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"ez-toc-toggle-icon-1\"><label for=\"item-6aeb9b40195ca\" aria-label=\"Table of Content\"><span style=\"display: flex;align-items: center;width: 35px;height: 30px;justify-content: center;direction:ltr;\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/label><input  type=\"checkbox\" id=\"item-6aeb9b40195ca\"><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/extendsclass.com\/blog\/onboarding-outside-developer\/#The_week_before\" title=\"The week before\">The week before<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/extendsclass.com\/blog\/onboarding-outside-developer\/#Monday_the_clean_setup_test\" title=\"Monday: the clean setup test\">Monday: the clean setup test<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/extendsclass.com\/blog\/onboarding-outside-developer\/#Tuesday_repo_rules\" title=\"Tuesday: repo rules\">Tuesday: repo rules<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/extendsclass.com\/blog\/onboarding-outside-developer\/#Wednesday_a_real_task_kept_small\" title=\"Wednesday: a real task, kept small\">Wednesday: a real task, kept small<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/extendsclass.com\/blog\/onboarding-outside-developer\/#Thursday_the_first_review\" title=\"Thursday: the first review\">Thursday: the first review<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/extendsclass.com\/blog\/onboarding-outside-developer\/#Friday_ship_it_then_talk\" title=\"Friday: ship it, then talk\">Friday: ship it, then talk<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/extendsclass.com\/blog\/onboarding-outside-developer\/#Plan_the_last_day_now\" title=\"Plan the last day now\">Plan the last day now<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_week_before\"><\/span>The week before<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sign the paperwork first. The contract, the NDA and the clause on who owns the code all come before any invite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then start on access early, because the person may arrive sooner than your process is ready. <a href=\"https:\/\/rocketech.it\/staff-augmentation\">IT staff augmentation<\/a> moves fast by design. At Rocketech, someone already on our staff or in our pool starts in 3-5 days, and a new hire within 2 weeks. If your IT tickets take a week, you lose the time you were paying to save.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Name two people. The lead sets tasks and answers questions, and the new developer reports to them. The reviewer owns the first pull requests. These can be the same person, but it can&#8217;t be nobody. If no one has time to lead, hold off on adding people, because outside developers still need a manager.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now the access list. Follow least privilege, which NIST defines as the minimum needed for the assigned tasks.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>System<\/th><th>Day one<\/th><th>Not yet<\/th><\/tr><tr><td>Git hosting<\/td><td>Write on the repos they&#8217;ll touch<\/td><td>Admin, org owner<\/td><\/tr><tr><td>CI<\/td><td>Read logs, re-run jobs<\/td><td>Edit pipeline secrets<\/td><\/tr><tr><td>Staging<\/td><td>Deploy through CI, test data<\/td><td>Direct superuser access<\/td><\/tr><tr><td>Production<\/td><td>Nothing<\/td><td>Everything, at least this week<\/td><\/tr><tr><td>Tracker and chat<\/td><td>Member of the team&#8217;s spaces<\/td><td>Finance and HR spaces<\/td><\/tr><tr><td>Secrets<\/td><td>Dev-only keys<\/td><td>The shared production <code>.env<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">On GitHub you don&#8217;t have to make them an org member. An outside collaborator gets only the repos you choose, and has to turn on 2FA first if your org requires it. Give them the Write role, which GitHub recommends for contributors who actively push.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Give them their own accounts. Shared logins make your audit logs useless, and removing one person later means changing the password for everyone. If you use a VPN, test the invite from outside the office before Monday.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Write each grant into one file as you go. You&#8217;ll want it on their last day.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Monday_the_clean_setup_test\"><\/span>Monday: the clean setup test<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start with a 20-minute call: what the product does, who pays for it, which parts break most often. Then get out of the way. Don&#8217;t pair through setup. Let them follow the README and note each place it breaks.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone git@github.com:acme\/shop-api.git &amp;&amp; cd shop-api\ncp .env.example .env\ndocker compose up -d\nnpm ci &amp;&amp; npm run db:seed &amp;&amp; npm test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If this takes all day, that&#8217;s useful news, and it&#8217;s better to hear it now. Their first pull request should fix the README. It carries little risk and walks them through your whole path from branch to merge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keep only fake values in <code>.env.example<\/code>. The Twelve-Factor App offers a good test: could you open-source this code right now without leaking a credential? Check the Git history as well, because a new contributor gets all of it, including that key someone deleted last year.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tuesday_repo_rules\"><\/span>Tuesday: repo rules<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let the rules do the policing, so nobody has to feel awkward about it. Put a branch protection rule on <code>main<\/code> that requires a pull request, a passing status check and at least one approval. GitHub turns off force pushes and branch deletion on protected branches by default.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then add a CODEOWNERS file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># .github\/CODEOWNERS\n*            @acme\/backend-leads\n\/billing\/    @acme\/payments\n\/infra\/      @acme\/devops<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Code owners get asked for review automatically when a pull request touches their files, and you can make their approval required. They need write permission on the repo, or this won&#8217;t work. The new developer can now work anywhere, and the risky folders still get the right eyes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Write your house rules on one page: branch names, commit style, how migrations run, what &#8220;done&#8221; means. People read one page.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Wednesday_a_real_task_kept_small\"><\/span>Wednesday: a real task, kept small<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pick a real bug or a small feature from the backlog. A made-up exercise wastes everyone&#8217;s time, and payment code is too risky for a first task. Look for something that touches one area, has a clear finish line and needs a test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Say the size out loud. Google&#8217;s review guide calls 100 lines a reasonable change and 1,000 lines usually too large. A big first pull request often means the person got stuck and kept going alone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">From today they&#8217;re in your standups and your tracker, like anyone else on the team. Agree on the hours you overlap and write them down. If you&#8217;re six hours apart, decide which hours you share and where questions go for the rest of the day.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Thursday_the_first_review\"><\/span>Thursday: the first review<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Google&#8217;s guide also sets one business day as the longest you should take to respond to a review request. Beat that on a first pull request. A slow first review teaches a new person to save up big batches and wait.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Look for these things:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Does the change follow the patterns already in the code?<\/li>\n\n\n\n<li>Did a new dependency sneak in, and is there a reason for it?<\/li>\n\n\n\n<li>Is there a test that fails without the fix?<\/li>\n\n\n\n<li>Did they ask when the ticket was vague? Someone who guesses in silence costs more than someone who asks.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mark each comment as blocking or optional. A newcomer can&#8217;t tell your firm rule from a passing thought.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Friday_ship_it_then_talk\"><\/span>Friday: ship it, then talk<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Merge it and deploy to staging through CI, never from a laptop. Then take 15 minutes for three questions:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>What took longest?<\/li>\n\n\n\n<li>What did you have to ask that should be written down?<\/li>\n\n\n\n<li>What would you change about the setup?<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Fix the top answer next week. Then go through the access file. Remove anything they didn&#8217;t use, and add only what next week&#8217;s task needs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Plan_the_last_day_now\"><\/span>Plan the last day now<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">People move on, and this is where the access file pays off. Remove the collaborator, revoke their tokens and deploy keys, and close their chat account. Then change every secret they could read. OWASP&#8217;s cheat sheet on secrets points out that rotating keys by hand leads to mistakes, so automate it if you can.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Save this plan as a file in the repo. The next person you bring in starts from a list that&#8217;s been tested once.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Alexander Rocket, founder of Rocketech An outside developer starts on Monday. By Wednesday they&#8217;re still waiting for a repo invite, the staging password is in somebody&#8217;s DMs, and you&#8217;re paying for all of it. Most of that goes away if you plan the week ahead of time. Set one goal: by Friday, a reviewed [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2911,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"categories":[5],"tags":[],"class_list":["post-2910","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-break"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/posts\/2910","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/comments?post=2910"}],"version-history":[{"count":3,"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/posts\/2910\/revisions"}],"predecessor-version":[{"id":2918,"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/posts\/2910\/revisions\/2918"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/media\/2911"}],"wp:attachment":[{"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/media?parent=2910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/categories?post=2910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/extendsclass.com\/blog\/wp-json\/wp\/v2\/tags?post=2910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}