{"slug":"share-project-zip-with-clients","url":"https://peerpizza.vercel.app/blog/share-project-zip-with-clients","title":"How Developers Can Share a Project ZIP With Clients Fast","description":"Share a project ZIP with clients without leaking .env files, node_modules, or secrets. A practical handoff checklist.","category":"Developer Guides","keywords":["share project zip with client","send source code zip","client handoff checklist","exclude node_modules zip","developer file delivery"],"read_minutes":8,"published_at":"2026-08-03","updated_at":"2026-08-03","content_html":"<p>A client asks for \"the code\" or \"the latest build folder\" and they want it today. You could add them to the git host, but procurement has not finished, their IT blocks GitHub, or they only need a snapshot for a contractor to review. So you make a zip. That zip is either a clean handoff or a leak waiting to be unzipped.</p>\n<p>Sharing a project archive is a <strong class=\"text-white\">delivery problem</strong>, not just a compression problem. Clients open whatever you send. They will not notice that you included `.env`, a production dump, or 400 MB of `node_modules`. This guide is a practical way to build a zip you are willing to let leave the building, plus a checklist for the message that goes with it.</p>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">Decide what the client actually needs</h2>\n<p>\"Send the project\" can mean four different artifacts:</p>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li><strong class=\"text-white\">Source snapshot</strong> for another developer to run locally.</li>\n<li><strong class=\"text-white\">Built static export</strong> (for example `dist/` or `out/`) they can host or preview.</li>\n<li><strong class=\"text-white\">Design + code sample</strong> of one feature, not the whole monorepo.</li>\n<li><strong class=\"text-white\">Handover package</strong> with docs, credentials <em>process</em> (not the secrets themselves), and run instructions.</li>\n</ul>\n<p>Ask one clarifying question before you zip: should they <strong class=\"text-white\">run it</strong>, <strong class=\"text-white\">read it</strong>, or <strong class=\"text-white\">deploy it</strong>? A reader does not need `node_modules`. A deployer needs environment variable <em>names</em>, not your production values. A reviewer may only need one service directory from a monorepo.</p>\n<p>If they can accept a git invite, prefer that. History, diffs, and access revocation are better in a real host than in a zip sitting in someone's Downloads folder for a year.</p>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">Zip hygiene: what to exclude every time</h2>\n<p>Build the archive from a clean export, not from a right-click on your working tree. A working tree contains machine-local junk and secrets you stopped seeing months ago.</p>\n<p><strong class=\"text-white\">Always exclude:</strong></p>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>`.env`, `.env.*`, `.env.local`, `.env.production`</li>\n<li>`credentials.json`, `service-account*.json`, cloud key files</li>\n<li>`<em>.pem`, `</em>.p12`, `<em>.jks`, `id_rsa`, `</em>.keystore`</li>\n<li>`.git/config` remotes that embed tokens (prefer a git bundle or a host invite if they need history)</li>\n<li>`node_modules/`, `.pnpm-store/`, `.yarn/cache/`, vendor caches</li>\n<li>`.next/`, `dist/` unless the client asked for a built preview</li>\n<li>`__pycache__/`, `.venv/`, `venv/`, `target/` for compiled languages unless they asked for binaries</li>\n<li>IDE folders they do not use (`.idea/` is optional; `.vscode/` may contain local paths)</li>\n<li>Database dumps, `*.sqlite` with real user data, `uploads/` with customer files</li>\n<li>`.DS_Store`, `Thumbs.db`, editor swap files</li>\n</ul>\n<p><strong class=\"text-white\">Usually exclude unless they asked:</strong></p>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>Large media that already lives in object storage</li>\n<li>E2E recordings and Playwright traces</li>\n<li>Internal RFCs that name other clients</li>\n</ul>\n<p>A good pattern is `git archive` from a tagged commit, then add a `HANDOFF.md` you write for humans. `git archive` will not pack ignored build artifacts if your `.gitignore` is honest. It also will not save you if you committed a secret last year. Search the tree for `API_KEY`, `BEGIN PRIVATE KEY`, and `AKIA` before you ship.</p>\n<h3 class=\"text-lg font-semibold text-white mt-8 mb-2\">Secrets are not only .env files</h3>\n<p>Clients (and whoever they forward the zip to) can find:</p>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>Hard-coded tokens in test fixtures</li>\n<li>Stripe or Twilio keys in old config samples</li>\n<li>Production URLs with embedded basic-auth</li>\n<li>Customer names in seed data</li>\n<li>Internal Slack webhook URLs in deploy scripts</li>\n</ul>\n<p>Replace real values with placeholders: `POSTGRES_PASSWORD=change-me`. List every required variable in `HANDOFF.md` with a one-line purpose. If they need working credentials, send those through a password manager or a one-time secret link, <strong class=\"text-white\">never inside the zip</strong>.</p>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">How to build a zip that opens cleanly</h2>\n<p>Small process, fewer support emails:</p>\n<ol class=\"list-decimal pl-6 space-y-2 my-4 text-zinc-300\">\n<li>Commit or stash so you know what you are exporting.</li>\n<li>Export from git or copy into a fresh folder named `client-project-YYYY-MM-DD/`.</li>\n<li>Add `HANDOFF.md` (stack, Node/Java version, how to install, how to run, what is <em>not</em> included).</li>\n<li>Add `.nvmrc`, `.python-version`, or a `runtime.txt` equivalent if you have one.</li>\n<li>Include a sample env file only: `.env.example`.</li>\n<li>Zip the folder so the archive contains one top-level directory, not 400 loose files.</li>\n<li>Note the uncompressed and compressed size. If it is huge, you left `node_modules` or a video in.</li>\n<li>Compute a checksum if the project is sensitive or large.</li>\n</ol>\n<p>On Unix-like systems, something in the spirit of `zip -r project.zip client-project-2026-08-03 -x \"<em>.env\" -x \"</em>/node_modules/*\"` is a start, but a dedicated export folder is safer than a long exclude list you will forget to update.</p>\n<h3 class=\"text-lg font-semibold text-white mt-8 mb-2\">Monorepos and \"just that app\"</h3>\n<p>Clients rarely need the whole cargo cult of packages. If they hired you for a marketing site, do not send the internal billing service. Either:</p>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>Export the one package plus the lockfile and workspace snippets it needs, or</li>\n<li>Send a minimal reproduction with the public API mocked.</li>\n</ul>\n<p>Document which workspace commands they must run. A zip of `/packages/web` without the root `package.json` is a support ticket, not a handoff.</p>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">How to deliver the archive</h2>\n<p>Project zips are often too large for email. Chat apps may accept the file and then fail on the client's guest Wi-Fi.</p>\n<p>Options that usually work:</p>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li><strong class=\"text-white\">Git host guest access</strong> with a read-only deploy key or a time-boxed collaborator seat.</li>\n<li><strong class=\"text-white\">Signed object-storage URL</strong> from the bucket you already use, expiry measured in hours or a few days.</li>\n<li><strong class=\"text-white\">A temporary browser room</strong> when the client cannot create accounts and you are both available. [PeerPizza](/) is one browser-based option: no account, room code, optional PIN, chat plus files, chunked upload without a fixed per-file size cap, and automatic cleanup after about two hours idle. Keep your own copy. Rooms are temporary on purpose.</li>\n<li><strong class=\"text-white\">Courier USB</strong> only for air-gapped or legally picky environments, with the drive encrypted.</li>\n</ul>\n<p>Tell the client how long the link or room lasts <strong class=\"text-white\">in the same message as the code</strong>. If they wait until next week, a two-hour room will be empty. That is not a failure of the zip. That is a mismatch of lifetime and expectation.</p>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">Client handoff checklist</h2>\n<p>Send this as the cover note, not as a thought in your head:</p>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>What the zip is (source vs built preview) and the date of the snapshot</li>\n<li>Git tag or commit SHA if it came from version control</li>\n<li>Runtime versions (Node, Java, Python, OS assumptions)</li>\n<li>Install and run commands that you actually ran on a clean folder</li>\n<li>Required third-party accounts (auth provider, maps key) and who pays for them</li>\n<li>Environment variable names, with secrets delivered separately</li>\n<li>What you deliberately omitted (`node_modules`, production data, keys)</li>\n<li>License and whether they may hire another vendor to modify it</li>\n<li>Who to ping for 48 hours if `npm install` fails</li>\n<li>When the download location expires</li>\n<li>Reminder that they should keep their own backup after download</li>\n</ul>\n<p>If legal ownership is unclear, do not \"just zip it.\" A contract line about deliverables is cheaper than an argument about a repo that also contains another customer's theme.</p>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">What good looks like vs a panic zip</h2>\n<p>A panic zip is your `~/code/app` folder, including `.env.production`, `node_modules`, and a database named `real-users.sql`. A good zip is a dated folder, an example env, a handoff note, and a size that makes sense for source.</p>\n<p>Review the archive yourself: unzip it into `/tmp`, install, run. If you cannot, the client cannot. Fix the handoff on your machine, not in their inbox.</p>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">Troubleshooting project zip handoffs</h2>\n<h3 class=\"text-lg font-semibold text-white mt-8 mb-2\">The client says the zip is empty or \"corrupted\"</h3>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>They double-clicked a partial download. Compare file size and checksum.</li>\n<li>macOS Archive Utility sometimes chokes on very large zips or unusual permissions. Have them try `unzip` in Terminal, or send a `.tar.gz` as a second option.</li>\n<li>You zipped a shortcut or an unsynced cloud placeholder instead of the real folder. Confirm the bytes on disk.</li>\n</ul>\n<h3 class=\"text-lg font-semibold text-white mt-8 mb-2\">`npm install` or build fails on their laptop</h3>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>You omitted the lockfile or sent the wrong package manager's lockfile.</li>\n<li>Native addons need build tools they do not have. Mention Xcode CLT, Visual Studio Build Tools, or Docker as the supported path.</li>\n<li>Your README assumes global CLIs (`poetry`, `fnm`, `java`) that are not installed. Pin versions.</li>\n<li>You accidentally shipped `node_modules` for the wrong platform. Do not ship it.</li>\n</ul>\n<h3 class=\"text-lg font-semibold text-white mt-8 mb-2\">They cannot receive the file</h3>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>Email and Slack size limits. Use a signed URL or a temporary room instead of splitting into `part1.zip` / `part2.zip` unless you have no other choice.</li>\n<li>Their IT blocks file hosts. Ask which domains are allowed before you upload.</li>\n<li>They are on a phone. A 200 MB source zip is a laptop job. Say so.</li>\n</ul>\n<h3 class=\"text-lg font-semibold text-white mt-8 mb-2\">You already sent secrets</h3>\n<ul class=\"list-disc pl-6 space-y-2 my-4 text-zinc-300\">\n<li>Rotate every credential that was in the archive. Do not debate whether they \"probably will not look.\"</li>\n<li>Invalidate the download link or abandon the room.</li>\n<li>Send a replacement zip and a short note that the previous archive is withdrawn.</li>\n<li>Check git history if that zip was built from a commit that still contains the secret.</li>\n</ul>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">Delivery options compared</h2>\n<div class=\"my-6 overflow-x-auto\"><table class=\"w-full text-sm text-left text-zinc-300 border-collapse\">\n<thead><tr><th class=\"border border-white/10 bg-white/5 px-3 py-2 font-semibold text-white\">Method</th><th class=\"border border-white/10 bg-white/5 px-3 py-2 font-semibold text-white\">Client account needed</th><th class=\"border border-white/10 bg-white/5 px-3 py-2 font-semibold text-white\">Easy to revoke</th><th class=\"border border-white/10 bg-white/5 px-3 py-2 font-semibold text-white\">Good for huge repos</th><th class=\"border border-white/10 bg-white/5 px-3 py-2 font-semibold text-white\">Typical use</th></tr></thead><tbody>\n<tr><td class=\"border border-white/10 px-3 py-2 align-top\">Git host invite</td><td class=\"border border-white/10 px-3 py-2 align-top\">Usually yes</td><td class=\"border border-white/10 px-3 py-2 align-top\">Yes</td><td class=\"border border-white/10 px-3 py-2 align-top\">Yes (they clone)</td><td class=\"border border-white/10 px-3 py-2 align-top\">Preferred when IT allows it</td></tr>\n<tr><td class=\"border border-white/10 px-3 py-2 align-top\">Signed cloud URL</td><td class=\"border border-white/10 px-3 py-2 align-top\">No</td><td class=\"border border-white/10 px-3 py-2 align-top\">Expire the URL</td><td class=\"border border-white/10 px-3 py-2 align-top\">Yes</td><td class=\"border border-white/10 px-3 py-2 align-top\">Async handoff</td></tr>\n<tr><td class=\"border border-white/10 px-3 py-2 align-top\">Temporary chat + file room</td><td class=\"border border-white/10 px-3 py-2 align-top\">No</td><td class=\"border border-white/10 px-3 py-2 align-top\">Room expires</td><td class=\"border border-white/10 px-3 py-2 align-top\">Practical for snapshots</td><td class=\"border border-white/10 px-3 py-2 align-top\">Same-day send</td></tr>\n<tr><td class=\"border border-white/10 px-3 py-2 align-top\">Email attachment</td><td class=\"border border-white/10 px-3 py-2 align-top\">No</td><td class=\"border border-white/10 px-3 py-2 align-top\">No</td><td class=\"border border-white/10 px-3 py-2 align-top\">Poor</td><td class=\"border border-white/10 px-3 py-2 align-top\">Tiny docs only</td></tr>\n<tr><td class=\"border border-white/10 px-3 py-2 align-top\">Encrypted USB</td><td class=\"border border-white/10 px-3 py-2 align-top\">No</td><td class=\"border border-white/10 px-3 py-2 align-top\">Physical</td><td class=\"border border-white/10 px-3 py-2 align-top\">Yes</td><td class=\"border border-white/10 px-3 py-2 align-top\">Air-gapped / legal</td></tr>\n</tbody></table></div>\n<h2 class=\"text-2xl font-bold text-white mt-10 mb-3\">Final thoughts</h2>\n<p>A project zip is a snapshot of trust. Exclude secrets, caches, and customer data. Export from a known commit. Write the runbook you wish every vendor had sent you. Deliver through a channel whose lifetime matches the client's calendar, and keep the canonical copy in git. If they only needed a preview, send a built folder or a staging URL instead of your entire working tree. Fast handoff is not the same as a reckless zip—and clients remember which one you chose.</p>","content_text":"A client asks for \"the code\" or \"the latest build folder\" and they want it today. You could add them to the git host, but procurement has not finished, their IT blocks GitHub, or they only need a snapshot for a contractor to review. So you make a zip. That zip is either a clean handoff or a leak waiting to be unzipped.\n\nSharing a project archive is a delivery problem, not just a compression problem. Clients open whatever you send. They will not notice that you included `.env`, a production dump, or 400 MB of `node_modules`. This guide is a practical way to build a zip you are willing to let leave the building, plus a checklist for the message that goes with it.\n\nDecide what the client actually needs\n\n\"Send the project\" can mean four different artifacts:\n\n- Source snapshot for another developer to run locally.\n- Built static export (for example `dist/` or `out/`) they can host or preview.\n- Design + code sample of one feature, not the whole monorepo.\n- Handover package with docs, credentials process (not the secrets themselves), and run instructions.\n\nAsk one clarifying question before you zip: should they run it, read it, or deploy it? A reader does not need `node_modules`. A deployer needs environment variable names, not your production values. A reviewer may only need one service directory from a monorepo.\n\nIf they can accept a git invite, prefer that. History, diffs, and access revocation are better in a real host than in a zip sitting in someone's Downloads folder for a year.\n\nZip hygiene: what to exclude every time\n\nBuild the archive from a clean export, not from a right-click on your working tree. A working tree contains machine-local junk and secrets you stopped seeing months ago.\n\nAlways exclude:\n\n- `.env`, `.env.`, `.env.local`, `.env.production`\n- `credentials.json`, `service-account.json`, cloud key files\n- `.pem`, `.p12`, `.jks`, `id_rsa`, `.keystore`\n- `.git/config` remotes that embed tokens (prefer a git bundle or a host invite if they need history)\n- `node_modules/`, `.pnpm-store/`, `.yarn/cache/`, vendor caches\n- `.next/`, `dist/` unless the client asked for a built preview\n- `__pycache__/`, `.venv/`, `venv/`, `target/` for compiled languages unless they asked for binaries\n- IDE folders they do not use (`.idea/` is optional; `.vscode/` may contain local paths)\n- Database dumps, `.sqlite` with real user data, `uploads/` with customer files\n- `.DS_Store`, `Thumbs.db`, editor swap files\n\nUsually exclude unless they asked:\n\n- Large media that already lives in object storage\n- E2E recordings and Playwright traces\n- Internal RFCs that name other clients\n\nA good pattern is `git archive` from a tagged commit, then add a `HANDOFF.md` you write for humans. `git archive` will not pack ignored build artifacts if your `.gitignore` is honest. It also will not save you if you committed a secret last year. Search the tree for `API_KEY`, `BEGIN PRIVATE KEY`, and `AKIA` before you ship.\n\nSecrets are not only .env files\n\nClients (and whoever they forward the zip to) can find:\n\n- Hard-coded tokens in test fixtures\n- Stripe or Twilio keys in old config samples\n- Production URLs with embedded basic-auth\n- Customer names in seed data\n- Internal Slack webhook URLs in deploy scripts\n\nReplace real values with placeholders: `POSTGRES_PASSWORD=change-me`. List every required variable in `HANDOFF.md` with a one-line purpose. If they need working credentials, send those through a password manager or a one-time secret link, never inside the zip.\n\nHow to build a zip that opens cleanly\n\nSmall process, fewer support emails:\n\n1. Commit or stash so you know what you are exporting.\n2. Export from git or copy into a fresh folder named `client-project-YYYY-MM-DD/`.\n3. Add `HANDOFF.md` (stack, Node/Java version, how to install, how to run, what is not included).\n4. Add `.nvmrc`, `.python-version`, or a `runtime.txt` equivalent if you have one.\n5. Include a sample env file only: `.env.example`.\n6. Zip the folder so the archive contains one top-level directory, not 400 loose files.\n7. Note the uncompressed and compressed size. If it is huge, you left `node_modules` or a video in.\n8. Compute a checksum if the project is sensitive or large.\n\nOn Unix-like systems, something in the spirit of `zip -r project.zip client-project-2026-08-03 -x \".env\" -x \"/node_modules/\"` is a start, but a dedicated export folder is safer than a long exclude list you will forget to update.\n\nMonorepos and \"just that app\"\n\nClients rarely need the whole cargo cult of packages. If they hired you for a marketing site, do not send the internal billing service. Either:\n\n- Export the one package plus the lockfile and workspace snippets it needs, or\n- Send a minimal reproduction with the public API mocked.\n\nDocument which workspace commands they must run. A zip of `/packages/web` without the root `package.json` is a support ticket, not a handoff.\n\nHow to deliver the archive\n\nProject zips are often too large for email. Chat apps may accept the file and then fail on the client's guest Wi-Fi.\n\nOptions that usually work:\n\n- Git host guest access with a read-only deploy key or a time-boxed collaborator seat.\n- Signed object-storage URL from the bucket you already use, expiry measured in hours or a few days.\n- A temporary browser room when the client cannot create accounts and you are both available. PeerPizza is one browser-based option: no account, room code, optional PIN, chat plus files, chunked upload without a fixed per-file size cap, and automatic cleanup after about two hours idle. Keep your own copy. Rooms are temporary on purpose.\n- Courier USB only for air-gapped or legally picky environments, with the drive encrypted.\n\nTell the client how long the link or room lasts in the same message as the code. If they wait until next week, a two-hour room will be empty. That is not a failure of the zip. That is a mismatch of lifetime and expectation.\n\nClient handoff checklist\n\nSend this as the cover note, not as a thought in your head:\n\n- What the zip is (source vs built preview) and the date of the snapshot\n- Git tag or commit SHA if it came from version control\n- Runtime versions (Node, Java, Python, OS assumptions)\n- Install and run commands that you actually ran on a clean folder\n- Required third-party accounts (auth provider, maps key) and who pays for them\n- Environment variable names, with secrets delivered separately\n- What you deliberately omitted (`node_modules`, production data, keys)\n- License and whether they may hire another vendor to modify it\n- Who to ping for 48 hours if `npm install` fails\n- When the download location expires\n- Reminder that they should keep their own backup after download\n\nIf legal ownership is unclear, do not \"just zip it.\" A contract line about deliverables is cheaper than an argument about a repo that also contains another customer's theme.\n\nWhat good looks like vs a panic zip\n\nA panic zip is your `~/code/app` folder, including `.env.production`, `node_modules`, and a database named `real-users.sql`. A good zip is a dated folder, an example env, a handoff note, and a size that makes sense for source.\n\nReview the archive yourself: unzip it into `/tmp`, install, run. If you cannot, the client cannot. Fix the handoff on your machine, not in their inbox.\n\nTroubleshooting project zip handoffs\n\nThe client says the zip is empty or \"corrupted\"\n\n- They double-clicked a partial download. Compare file size and checksum.\n- macOS Archive Utility sometimes chokes on very large zips or unusual permissions. Have them try `unzip` in Terminal, or send a `.tar.gz` as a second option.\n- You zipped a shortcut or an unsynced cloud placeholder instead of the real folder. Confirm the bytes on disk.\n\n`npm install` or build fails on their laptop\n\n- You omitted the lockfile or sent the wrong package manager's lockfile.\n- Native addons need build tools they do not have. Mention Xcode CLT, Visual Studio Build Tools, or Docker as the supported path.\n- Your README assumes global CLIs (`poetry`, `fnm`, `java`) that are not installed. Pin versions.\n- You accidentally shipped `node_modules` for the wrong platform. Do not ship it.\n\nThey cannot receive the file\n\n- Email and Slack size limits. Use a signed URL or a temporary room instead of splitting into `part1.zip` / `part2.zip` unless you have no other choice.\n- Their IT blocks file hosts. Ask which domains are allowed before you upload.\n- They are on a phone. A 200 MB source zip is a laptop job. Say so.\n\nYou already sent secrets\n\n- Rotate every credential that was in the archive. Do not debate whether they \"probably will not look.\"\n- Invalidate the download link or abandon the room.\n- Send a replacement zip and a short note that the previous archive is withdrawn.\n- Check git history if that zip was built from a commit that still contains the secret.\n\nDelivery options compared\n\n| Method | Client account needed | Easy to revoke | Good for huge repos | Typical use |\n| --- | --- | --- | --- | --- |\n| Git host invite | Usually yes | Yes | Yes (they clone) | Preferred when IT allows it |\n| Signed cloud URL | No | Expire the URL | Yes | Async handoff |\n| Temporary chat + file room | No | Room expires | Practical for snapshots | Same-day send |\n| Email attachment | No | No | Poor | Tiny docs only |\n| Encrypted USB | No | Physical | Yes | Air-gapped / legal |\n\nFinal thoughts\n\nA project zip is a snapshot of trust. Exclude secrets, caches, and customer data. Export from a known commit. Write the runbook you wish every vendor had sent you. Deliver through a channel whose lifetime matches the client's calendar, and keep the canonical copy in git. If they only needed a preview, send a built folder or a staging URL instead of your entire working tree. Fast handoff is not the same as a reckless zip—and clients remember which one you chose.","word_count":1691,"author":{"name":"Vishvajeet Shukla","url":"https://vishvajeetshukla.in","same_as":["https://vishvajeetshukla.in","https://twitter.com/vishu_07","https://x.com/vishu_07"]},"seo":{"canonical":"https://peerpizza.vercel.app/blog/share-project-zip-with-clients"},"citation_policy":{"attribution_required":true,"link_back_required":true,"canonical_field":"url"}}