<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Siddhant Singh</title>
    <description>The latest articles on DEV Community by Siddhant Singh (@siddhantwebshark).</description>
    <link>https://dev.to/siddhantwebshark</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4208870%2F22425985-4771-4a49-8c32-9dfc2277926d.jpg</url>
      <title>DEV Community: Siddhant Singh</title>
      <link>https://dev.to/siddhantwebshark</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/siddhantwebshark"/>
    <language>en</language>
    <item>
      <title>The Client Project Handover Checklist: 9 Things to Set Up on Day One</title>
      <dc:creator>Siddhant Singh</dc:creator>
      <pubDate>Mon, 26 Oct 2026 13:49:35 +0000</pubDate>
      <link>https://dev.to/siddhantwebshark/the-client-project-handover-checklist-9-things-to-set-up-on-day-one-npm</link>
      <guid>https://dev.to/siddhantwebshark/the-client-project-handover-checklist-9-things-to-set-up-on-day-one-npm</guid>
      <description>&lt;p&gt;If you build software for clients, sooner or later a project changes hands. The client hires an in-house team, switches agencies, or simply wants to be able to walk away if they need to.&lt;/p&gt;

&lt;p&gt;How that handover goes says a lot about the team that built the product. My company has delivered 580+ projects for clients across 18+ countries, many of them in the US and Canada, and one lesson keeps repeating: &lt;strong&gt;the best time to prepare for handover is day one, not the last week.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the checklist we recommend, whether you're the agency, the freelancer, or the client checking that you actually own what you paid for.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Source code lives in the client's account
&lt;/h2&gt;

&lt;p&gt;The repository should be created in the client's GitHub, GitLab or Bitbucket organization from the start, with the delivery team added as members.&lt;/p&gt;

&lt;p&gt;If a repo already lives in your org, transfer it rather than re-uploading, so history, issues and PRs come along:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# GitHub CLI: transfer a repo to the client's organization&lt;/span&gt;
gh api repos/OUR-ORG/client-app/transfer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;new_owner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CLIENT-ORG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then confirm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default branch protection rules are set in the client's org&lt;/li&gt;
&lt;li&gt;The client has at least one &lt;strong&gt;owner-level&lt;/strong&gt; account that isn't tied to your team&lt;/li&gt;
&lt;li&gt;CI/CD secrets are stored in the client's org, not in a personal account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Cloud accounts belong to the client
&lt;/h2&gt;

&lt;p&gt;Production should run in a cloud account (AWS, Azure, GCP) that the client owns and pays for. Your team gets access through roles, not root credentials.&lt;/p&gt;

&lt;p&gt;A few things to verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Billing and root/owner access sit with the client&lt;/li&gt;
&lt;li&gt;Team access uses IAM roles or groups that can be revoked in one step&lt;/li&gt;
&lt;li&gt;Infrastructure is described in code (Terraform, CloudFormation, Bicep, Pulumi) so another team can understand and reproduce it
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick sanity check: who has access in an AWS account?&lt;/span&gt;
aws iam list-users &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"Users[].UserName"&lt;/span&gt;
aws iam list-roles &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"Roles[].RoleName"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Domains, DNS and email are registered to the client
&lt;/h2&gt;

&lt;p&gt;This one causes real pain when it's wrong. Domains registered under an agency or a former employee's personal account can take weeks to recover.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain registrar account: owned by the client&lt;/li&gt;
&lt;li&gt;DNS: managed in the client's provider account&lt;/li&gt;
&lt;li&gt;Transactional email (SendGrid, SES, Postmark): client-owned, with verified sending domains&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. App store accounts are in the client's name
&lt;/h2&gt;

&lt;p&gt;For mobile apps, the &lt;strong&gt;Apple Developer&lt;/strong&gt; and &lt;strong&gt;Google Play Console&lt;/strong&gt; accounts should belong to the client's legal entity. Publishing under a vendor's account and "transferring later" is possible, but slow, and some app data does not transfer cleanly.&lt;/p&gt;

&lt;p&gt;Also check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signing keys and certificates are stored where the client can access them&lt;/li&gt;
&lt;li&gt;Push notification credentials (APNs keys, FCM projects) are in client-owned accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Secrets are documented and rotatable
&lt;/h2&gt;

&lt;p&gt;Every secret the app depends on should be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listed in one place (names and purpose, not the values)&lt;/li&gt;
&lt;li&gt;Stored in a proper secrets manager or CI/CD secret store&lt;/li&gt;
&lt;li&gt;Rotatable without a developer from the original team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple, version-controlled template helps a lot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env.example (committed): names only, never real values&lt;/span&gt;
&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;PAYMENT_GATEWAY_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;PUSH_NOTIFICATION_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;STORAGE_BUCKET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Documentation a new team can actually use
&lt;/h2&gt;

&lt;p&gt;Not a 60-page document nobody reads. Aim for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;README:&lt;/strong&gt; how to run the project locally in under 30 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture overview:&lt;/strong&gt; one diagram plus a page explaining the main services and data flow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment guide:&lt;/strong&gt; how code gets from a merged PR to production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runbook:&lt;/strong&gt; what to do when common things break&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a competent developer can't get the app running locally from the README, the handover isn't done.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Third-party services are listed with owners
&lt;/h2&gt;

&lt;p&gt;Most products depend on a dozen services: analytics, error tracking, maps, payments, AI APIs. Keep a simple table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Account owner&lt;/th&gt;
&lt;th&gt;Billing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Error tracking&lt;/td&gt;
&lt;td&gt;Crash and error reports&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Client card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payments&lt;/td&gt;
&lt;td&gt;Checkout&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI API&lt;/td&gt;
&lt;td&gt;Summarisation features&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anything where "account owner" is a person on the delivery team is a risk to fix now.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. IP ownership is clear in the contract
&lt;/h2&gt;

&lt;p&gt;This is a legal question, not a technical one, but developers should know the answer. Ideally, IP transfers to the client as work is paid for, not only at the end. If you use open-source libraries (you do), keep their licenses listed so nothing surprising shows up in a due-diligence review later.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Do a dry run before you need it
&lt;/h2&gt;

&lt;p&gt;The real test: could someone outside the original team deploy a small change to production using only the documentation and client-owned accounts?&lt;/p&gt;

&lt;p&gt;Try it once with a trivial change, like updating a text string. You'll find the missing pieces quickly, while the original team is still around to fix them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters for the people building, too
&lt;/h2&gt;

&lt;p&gt;It can feel counterintuitive for a vendor to make leaving easy. In practice, the opposite is true. Clients who know they &lt;em&gt;can&lt;/em&gt; leave tend to stay longer, because they trust the team. Clean ownership is a feature, not a risk.&lt;/p&gt;

&lt;p&gt;If you've been on the receiving end of a messy handover, what was the one thing you wish had been in place? I'd love to hear it in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Siddhant, Founder &amp;amp; CEO of &lt;a href="https://www.webshark.tech/" rel="noopener noreferrer"&gt;Webshark Web Services&lt;/a&gt;, an ISO 27001 and CMMI Level 3 certified software development company working with businesses in the US, Canada, the Middle East and India. This post was written with AI and published by the author.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>career</category>
      <category>security</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
