Why the handoff decides what you can do next

Picture month 3 after your firmware contractor wrapped up. A customer reports a bug, your new engineer finds the fix in an afternoon and then gets stuck for 2 weeks. The code won't build on her laptop. Nobody knows which compiler version made the image on the shelf. And the key that signs updates sits on a machine you've never seen.

That's the usual way a firmware handoff goes wrong. Nobody did anything wrong. The files you got were the files that were easy to send. Code is easy to send. A working build, a signing key and a cloud account in your company's name aren't, and those are the parts you need to ship a fix.

So the test for a good handoff is simple. Can someone who never worked on the project build the exact firmware you shipped, sign it and get it onto a device in the field? If yes, you own your product. If not, you own a folder of code.

This guide lists the 7 things that make the answer yes, what each one looks like when it's done properly and how to check it before the last invoice is paid. It's written for founders and product leads, not firmware engineers, so you can use it as a list to hand to whoever does the work.

Short looping animation of a handoff checklist: source code, build setup, signing keys, update path, factory files, release archive and accounts are ticked one by one until the bar reads 7 of 7 owned and ready to ship.
Seven items. A handoff is done when all seven are in your company's hands.

The 7 things you should own

They fall into 3 groups. Items 1 and 2 let you rebuild the firmware. Items 3 and 4 let you ship an update to devices you've already sold. Items 5 to 7 keep the factory running and let you support the product for years.

The handoff list in three columns. Rebuild it: 1 source code, your own repository with the full history, every branch and tag, and 2 build setup, a pinned toolchain, build scripts and steps a new engineer can follow. Ship an update: 3 signing keys in your custody with a backup and a key list, and 4 update path, the OTA server, release process and admin access in your name. Make and support it: 5 factory files, 6 release archive and 7 accounts owned by your company.
The handoff list. Print it and tick it off with your contractor.

1. Source code with its full history

You want the repository, not a zip file. A zip of version 1.4 tells you nothing about 1.3. The history shows why each line changed, which commit went into which release and what was tried and dropped. Without it, your next engineer has to guess, and guesses in firmware turn into field bugs. NIST's Secure Software Development Framework puts it plainly: keep all code in a repository, limit access to the people who need it and use version control to track every change.

What "owned" looks like: the repository lives in your company's account on your Git host, with every branch and every release tag. The contractor is a member you can remove, not the owner. Third-party code, the bootloader and any libraries are in the same repository or listed with exact versions.

2. A build setup someone else can repeat

Your firmware is only as useful as your ability to turn it back into the exact image you shipped. That depends on things that rarely make it into your repository: the compiler version, build flags, scripts on the contractor's laptop and the order you run them in.

The team at Interrupt, the Memfault engineering blog, shows how small this gets. They built the same code from 2 different folders and got one image that ran and one that crashed on boot. Their first fix is to make the build check the compiler version. They also point out that a repeatable build lets you rebuild an older image, such as the one your factory programs, long after the fact.

What "owned" looks like: a written build guide, a pinned toolchain version and ideally a container image or a CI job that builds a release from a clean checkout. The test is a new machine and the written steps, nothing else.

3. The signing keys

If your product checks the signature of a firmware image before it runs it, the private signing key is the most valuable file in the whole project. Interrupt's guide to code signing explains why. The device trusts only images signed with the matching key, and changing even 1 bit of the image changes the signature. That's what stops someone from loading their own firmware onto your devices. It also means that if you lose the key, devices in the field will refuse your next update as well.

What "owned" looks like: production keys generated or moved into storage your company controls, such as a hardware security module or a cloud key service under your account. Keep a backup in a separate place and a short key list that says which key signs what and who can use it. Test keys stay separate from production keys and never ship. Once the contractor is gone, remove their access and replace any credential they knew.

4. The update path

Owning a signed image doesn't help if you can't get it to devices. The update path is everything between a release on your side and a new version running on a customer's device: the update server or service, the release scripts, the device groups and the credentials that tie it together.

It isn't just good practice either. ETSI EN 303 645, the European baseline standard for consumer IoT security, says a consumer IoT device shall have a secure update mechanism unless a resource constraint makes that impossible. It also asks for best practice cryptography in that mechanism. That only works for the life of the product if someone at your company can still run it.

What "owned" looks like: the update service account belongs to your company, at least 2 of your people are admins and the release steps are written down. Your engineer has pushed a test update to a test device.

Factory files, release archive and accounts

5. Factory programming and test files

Your contract manufacturer doesn't flash firmware the way a developer does. The factory usually gets a production image, a programming script, sometimes a step that writes a unique serial number or device certificate to each unit, and the code that runs on the test fixture. If any of those live only with your contractor, the next production run stops at programming or test.

What "owned" looks like: the production image for each build, the programming and provisioning scripts with their settings, the test fixture software and its source and a short factory procedure. Store them in your repository or release archive, not in an email thread with the factory. Our EVT, DVT and PVT guide explains where these files first get used.

6. An archive of every shipped release

When a device in the field crashes, you need the exact image it runs, the debug symbols for that image and the source at that tag. NIST's framework calls this archiving each release. Keep the release files with their integrity data, such as hashes, and record the components that went into each release, for example in a software bill of materials (SBOM).

The component list matters for a second reason. Your firmware almost certainly contains open-source and third-party code, and each licence comes with its own conditions. You can't meet those conditions, or answer your customer's security questionnaire, if nobody knows what's inside version 2.1.

What "owned" looks like: one folder or release page per version with the image, the hash, the symbol file, the release notes and the component list. Access is read-only for most of the team.

7. Accounts and admin rights

This is the item most often missed, because accounts feel like admin work and not engineering. But a firmware project touches a lot of them: the Git host, the CI service, the cloud project behind your devices, the update service, the domain the devices call, any certificate authority, the app store listings and the tool licences.

What "owned" looks like: every account is registered to a company email address, not a personal one. Your company holds the billing and at least 2 admin seats. The contractor's access is removed on the last day and every shared password or token they knew is changed.

Table of what each missing item costs after the contractor is gone. Source code: no bug fixes and a rewrite from scratch. Build setup: code you cannot turn into the shipped image. Signing keys: devices that check signatures refuse your new updates. Update path: no way to reach units already with customers. Factory files: the next production run stops at programming or test. Release archive: no way to match a field crash to its code. Accounts: lockout, expired certificates and a store listing you cannot edit.
What each gap costs you once the contractor has moved on.

Firmware handoff checklist

Use this table in the last 2 weeks of the engagement. The right-hand column is how you check each item without reading a line of code.

#ItemOwned whenHow to check it
1Source codeRepository in your company account, full history, all tagsRelease tags match the versions you shipped
2Build setupWritten guide, pinned toolchain, clean build script or CI jobA new engineer builds the latest release on a new machine
3Signing keysProduction keys in your custody, backed up, listedYour engineer signs a test image without the contractor
4Update pathUpdate service in your account, 2 admins, written stepsA test update reaches a test device
5Factory filesProduction image, programming and provisioning scripts, fixture codeThe factory confirms it has everything for the next run
6Release archiveImage, hash, symbols, notes and component list per releasePick an old version and find all 5 files in a minute
7AccountsCompany email, company billing, 2 admins eachThe contractor's access is removed and tokens are changed

2 extras are worth asking for while the contractor is still around. One is a short architecture note: a block diagram of the firmware, how it boots, how it stores data and how it updates. 4 hours of the original author's time here can save a new engineer 2 or 3 weeks. The other is a list of known issues and open work, because every project has a few.

Run the rebuild test before the last invoice

A checklist tells you the files exist. The rebuild test tells you they work. It takes your engineer 1 or 2 days, and it's the single best check you can run on a firmware handoff.

The rebuild test in five steps: 1 clean machine with no files from the contractor, 2 build from a release tag following only the written steps, 3 compare the result with the image you shipped, 4 sign it with your key by your own engineer, 5 push it over the air to a test unit and check it boots. Pass means someone who never worked on the project shipped a signed update.
If someone new can do all five steps, the handoff worked.
  1. Start clean. Use a new laptop, a fresh virtual machine or a CI runner with nothing from the contractor on it.
  2. Build from a tag. Check out the tag of your latest release from your own repository and follow the written build steps. Nothing else is allowed, no messages to the contractor and no copied folders.
  3. Compare. Check that the version string and size match the shipped image. If the build is fully reproducible the hash matches too. If it doesn't, ask the contractor to explain the difference while they still can.
  4. Sign. Have your own engineer sign the image with your production key or, if your process uses one, a staging key that mirrors it.
  5. Update a device. Push the update to a test device through your update service and confirm it boots and reports the new version.

If any step fails, you've found the gap while the person who can close it is still on the project. That's the whole point. Make the rebuild test a written acceptance step for the final milestone, so it's part of the plan and not a favour you have to ask for.

Put it in the contract before work starts

The best time to agree on a handoff is before the first line of code. You'll want 3 points in a firmware contract.

  • Ownership. Paying for firmware doesn't automatically make it yours. Under US copyright law a commissioned work counts as "made for hire" only in 9 listed categories, and only with a signed written agreement. That's from Circular 30 of the US Copyright Office. Software usually isn't in those categories, so you need a written assignment of the code and files to your company. Have your lawyer check the wording.
  • The deliverables list. Attach the 7 items from this guide, or your version of them, to the statement of work. Then "handoff" means a list, not a mood.
  • Acceptance. Make the rebuild test the acceptance step for the final milestone.

Ask about background code too. Many firms bring their own libraries and templates to a project. That's normal and often saves you time, but you need a licence to whatever ends up inside your product. Our guide on how to choose an electronic product development company covers ownership and file formats as questions 7 to 9.

If your contractor has already left

It happens, and it's fixable more often than you'd think. A freelancer takes a full-time job, a firm stops answering or the relationship just ended badly. Here's the order we'd work in. You can do steps 1 to 3 yourself this week.

  1. Take stock. Go through the 7 items and write down what you have, what you don't have and who might have it. Check old emails, shared drives and the factory. Factories often hold the last production image.
  2. Ask once, in writing. Send a short, polite list of the missing items. If your contract assigns the work to you, quote that clause. Most people will send files when you're specific about what you need.
  3. Lock down accounts. Take ownership of every account you can, remove old access and change shared passwords and tokens.
  4. Check the signing situation first. If the signing key is gone and your devices check signatures, a normal update may no longer be possible. Whether there's a way out depends on how the bootloader handles keys, so get an engineer to read the boot and update code before you promise customers a fix.
  5. Rebuild what's missing. A missing build setup can usually be recreated from the source in a few days, because you've still got the code to work from. Missing source code is a much bigger job, and it's often a redesign decision, not a recovery task.

How Electuni handles a firmware handoff

Handoff is the sixth and last step of our process, after Discovery, Architecture, Design, Review and Prototype. We plan it at the start. That way the deliverables list is agreed before any firmware is written.

  • Ownership. You own the designs, source code and files we deliver. That includes the firmware repository, schematics, PCB layouts, documentation and the production files.
  • The handoff package. Source code, documentation and production files are delivered together in one package, along with the hardware design files when we've done the board.
  • Your checklist. Bring this list to the first call. We'll go through all 7 items with you and agree in writing which ones are part of the project.

Electuni LLC is a US company founded in 2016, with 500+ PCB designs delivered since then. See firmware development, IoT systems and hardware design, or read the full process with the deliverables at each step on How we work.