Quick answer

From local Fastify project to live URL.

Set Fastify to listen on host 0.0.0.0 and Number(process.env.PORT || 3000), verify the production start script, and ZIP reviewed source plus package metadata. Upload the clean source ZIP to a Draft Sitedropper project and test a real route.

What the Free plan includes.

Sitedropper Free is a $0 plan for a small real deployment workflow. The dashboard is the source of truth for the current ZIP limit shown beside Choose ZIP.

  • Up to 3 projects
  • 30 deployments per month
  • Draft, Password protected, and Public sharing
  • Sitedropper URL

Before you build.

Run the tests and any TypeScript compilation before packaging. Start the production command and call a route from another terminal so startup and plugin registration errors appear locally.

  • fastify listed in package.json.
  • A production start script.
  • listen options that use host 0.0.0.0 and process.env.PORT.
  • All required plugins and schemas declared in the project dependencies/source.

Build and check Fastify locally.

Run these commands from the project root. Finish the local check before creating the archive so the deployment is not the first place a dependency, compile, or startup error appears.

The final server command stays running. Open the local URL in another terminal or browser, complete the checks, then stop it with Ctrl+C.

npm

Check the Fastify project with npm

Use npm when package-lock.json is the project lockfile. If the project has no lockfile yet, run npm install once instead of npm ci and keep the generated lockfile.

Check the Fastify project with npm
npm ci
npm run build --if-present
npm start

pnpm

Check the Fastify project with pnpm

Use pnpm when pnpm-lock.yaml or the packageManager field selects pnpm. Keep the lockfile and any workspace manifest with the source archive.

Check the Fastify project with pnpm
corepack enable
pnpm install --frozen-lockfile
pnpm run --if-present build
pnpm start

Yarn

Check the Fastify project with Yarn

Use Yarn only when the checked-in release accepts --frozen-lockfile, which matches Sitedropper’s current generated build. Otherwise choose the project’s npm/pnpm lockfile or an existing Dockerfile instead of changing commands only for upload.

Check the Fastify project with Yarn
corepack enable
yarn install --frozen-lockfile
# Uncomment commands that exist in package.json:
# yarn run test
# yarn run build
yarn start

Use one dependency workflow: keep the lockfile that matches the selected package manager and do not mix install commands.

Create the ZIP on your operating system.

Package reviewed source and build metadata; use the exclusions to keep local-only files out. The Windows and macOS recipes include graphical menu guidance, while the commands remain the precise archive contract.

No command line required

Directly create the ZIP in your file system.

First create and inspect a clean staging folder containing only the required source, manifest, configuration, and entry-point files. In Windows File Explorer, right-click the reviewed selection and choose Compress to → ZIP File. On macOS, Control-click the reviewed selection and choose Compress Items.

Windows File Explorer context menu with Compress to expanded and ZIP File selected.
Windows File Explorer’s Compress to → ZIP File action. Menu wording can vary by operating-system version.

Open the resulting archive before upload. If an outer folder wraps the expected files, recreate the ZIP by selecting the folder’s contents instead.

Or create and inspect the ZIP from the command line.

macOS

Compress the reviewed source in Terminal

The exclusions keep common dependencies, caches, local data, and secrets out. Finder users must first make and inspect an equivalent clean staging folder, then select its contents, Control-click, and choose Compress Items—not compress the raw project folder.

  1. Run from the project root.
  2. Inspect project-specific local files before upload.
  3. Confirm the manifest, lockfile or requirements, source, and entry point are present.
Compress the reviewed source in Terminal
if [ -e site.zip ]; then echo "site.zip already exists. Move or rename it before continuing." >&2; exit 1; fi
zip -qr site.zip . -x "node_modules/*" ".venv/*" "venv/*" ".git/*" "__pycache__/*" "*/__pycache__/*" "*.py[cod]" ".next/*" "dist/*" "build/*" "out/*" ".cache/*" ".turbo/*" ".env" ".env.*" "*/.env" "*/.env.*" ".npmrc" "*/.npmrc" "*.sqlite" "*.sqlite3" "db.sqlite3" "*.log" ".DS_Store" "*/.DS_Store" "site.zip" ".sitedropper-package/*"
unzip -l site.zip | head -60

Windows

Stage and compress the source in PowerShell

A clean staging folder prevents dependencies, caches, local databases, and secrets from entering the ZIP. For File Explorer, stop after robocopy, inspect the staging contents, select them, right-click, and choose Compress to → ZIP File; never compress the unreviewed project folder.

  1. Run from the folder containing the manifest or requirements.txt.
  2. Review the staging folder created beside the project before upload.
  3. The command intentionally leaves the staging folder in place and never deletes it automatically.
Stage and compress the source in PowerShell
$ProjectRoot = (Resolve-Path .).Path
$ProjectName = Split-Path $ProjectRoot -Leaf
$Stage = Join-Path (Split-Path $ProjectRoot -Parent) "$ProjectName-sitedropper-package"
if (Test-Path $Stage) { throw "$Stage already exists. Move or rename it before continuing." }
if (Test-Path .\site.zip) { throw "site.zip already exists. Move or rename it before continuing." }
robocopy $ProjectRoot $Stage /E /XD node_modules .venv venv .git .next dist build out .cache .turbo __pycache__ .sitedropper-package /XF .env .env.* .npmrc site.zip *.pyc *.pyo *.sqlite *.sqlite3 db.sqlite3 *.log
if ($LASTEXITCODE -ge 8) { throw "robocopy failed with exit code $LASTEXITCODE" }
Add-Type -AssemblyName System.IO.Compression.FileSystem
$Archive = Join-Path $ProjectRoot "site.zip"
[System.IO.Compression.ZipFile]::CreateFromDirectory($Stage, $Archive)
tar.exe -tf .\site.zip

Linux

Compress the reviewed source in a Linux terminal

The exclusions keep common dependencies, caches, local data, and secrets out. Install your distribution’s zip package first if needed.

  1. Run from the project root.
  2. Inspect project-specific local files before upload.
  3. Confirm the manifest, lockfile or requirements, source, and entry point are present.
Compress the reviewed source in a Linux terminal
if [ -e site.zip ]; then echo "site.zip already exists. Move or rename it before continuing." >&2; exit 1; fi
zip -qr site.zip . -x "node_modules/*" ".venv/*" "venv/*" ".git/*" "__pycache__/*" "*/__pycache__/*" "*.py[cod]" ".next/*" "dist/*" "build/*" "out/*" ".cache/*" ".turbo/*" ".env" ".env.*" "*/.env" "*/.env.*" ".npmrc" "*/.npmrc" "*.sqlite" "*.sqlite3" "db.sqlite3" "*.log" ".DS_Store" "*/.DS_Store" "site.zip" ".sitedropper-package/*"
unzip -l site.zip | head -60

Inspect before upload: compare the ZIP listing with the archive tree below and remove dependencies, caches, local data, and secrets.

Check the archive root.

Keep the source selected by the start script. Exclude node_modules, compiled output that will be rebuilt, caches, logs, and secrets.

Expected Fastify archive
site.zip
├── package.json
├── package-lock.json / pnpm-lock.yaml / yarn.lock
├── server.js / app.js / source entry
├── src/ and plugins/ (when used)
└── schemas/ or public/ (when used)

Upload the Fastify ZIP to Sitedropper.

Create a Draft project, upload site.zip, follow the deployment, and open the generated URL only after the progress reaches Ready.

The dashboard screenshots use fictional project and account data. Yellow outlines identify the documented controls.

  1. 01

    Create a project

    Open Projects, choose New project, enter a name, and select the highlighted Create project action. New projects begin as Draft.

    Sitedropper Create a project dialog with the Create project button outlined in yellow.
    Create a project in the current Sitedropper dashboard. Select the image to enlarge it.
  2. 02

    Upload the ZIP

    Open the project’s Upload and deploy card, then select the highlighted Choose ZIP control or drop the archive into the same area.

    Sitedropper project page scrolled to Upload and deploy with the Choose ZIP control outlined in yellow.
    Upload the ZIP in the current Sitedropper dashboard. Select the image to enlarge it.
  3. 03

    Open the deployed site

    Wait for Analyze, Build, and Deploy to finish. Then use the highlighted Open Sitedropper site action to review the generated URL.

    Sitedropper project page with the Open Sitedropper site button outlined in yellow.
    Open the deployed site in the current Sitedropper dashboard. Select the image to enlarge it.

Dashboard screenshot

Dashboard action

Check the Fastify result.

Use the deployed URL like a visitor rather than relying only on the successful status.

  • Call the root or health route and inspect the status/body.
  • Test one plugin-backed route.
  • Confirm static files or schemas referenced by relative paths are in the ZIP.
  • Verify the server reports no address/port error at startup.

Update Sitedropper Project settings.

Project settings are separate from framework configuration. Update the project name or description, keep Draft while reviewing, then choose Password protected or Public only when that matches the intended audience. Free does not include Private sharing by email, URL customization, or custom domains.

The dashboard screenshots use fictional project and account data. In the first settings image, the existing yellow outline marks Open site; the Project settings card is visible below and is identified by the instructions.

  1. 01

    Review Project settings

    The Project settings card is below the project header. Update the name or description, review the generated URL, and keep the first deployment Draft while you test it.

    Sitedropper project page with Open Sitedropper site outlined and the Project settings card visible below.
    Review Project settings in the current Sitedropper dashboard. Select the image to enlarge it.
  2. 02

    Choose who can open the site

    Open Visibility. Free includes Draft, Password protected, and Public. Select Public only when anonymous access is intentional, then close the menu and choose Save changes.

    Sitedropper Project settings visibility menu showing Draft, Password protected, Public, and locked Private options.
    Choose who can open the site in the current Sitedropper dashboard. Select the image to enlarge it.

Dashboard screenshot

Dashboard action

Finish the change: close the visibility menu, select Save changes, and wait for the “Changes saved” confirmation before leaving the page.

Troubleshoot this Fastify deployment.

The build succeeds but the URL is unavailable
Fastify may be listening on localhost. Set host to 0.0.0.0 in the listen options.
The server ignores the deployment port
Parse process.env.PORT and pass it to fastify.listen. Keep the fixed value only as a local fallback.
A plugin is missing
Declare it in package.json rather than relying on a global or undeclared local package, then update the lockfile.
TypeScript output is absent
Keep the build script and source/tsconfig in the ZIP. The start script must point to the output produced by that build.

Know the Free-plan boundaries.

  • The application must be stateless on its local filesystem.
  • Sitedropper does not provide an application database, cron process, or background worker in this ZIP workflow.
  • Keep credentials and local environment files out of the archive.

The generated Sitedropper URL remains available on Free. Check the dashboard for current usage and upload limits before starting another deployment.

Fastify deployment FAQ.

Why must Fastify use host 0.0.0.0?

Fastify’s local default can make the server unreachable outside its own process environment. Listening on all interfaces allows Sitedropper to reach it.

Should I ZIP the Fastify dist folder?

Upload reviewed source and build metadata for this workflow. Exclude dist when the deployment build recreates it.

Does Free include persistent Fastify file storage?

No. Treat the server filesystem as temporary and use a compatible external service for durable data.