Scan project
Use this skill when the user asks to "scan my project", "analyze my project", "what does my project need to run", "find all services in my project", "document how to run my project", "understand my project structure", "detect services in my codebase", "what frameworks does my project use", "analyze my codebase for deployment", or when invoked by the deploy-project orchestrator as the first step before deployment. This skill reads the project codebase, detects all services (frontend, backend, database, queues, workers), recommends free deployment platforms for each service, and writes three documentation files to DEPLOYMENT_DOCS/.From its SKILL.md
npx -y skills add AayushMS/deploy-skills --skill scan-projectAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.8 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it
scan-project
Scan the user's project codebase to detect all services, classify them, recommend free deployment platforms, and write three documentation files.
Step 1: Read Project Files (silently, do not prompt the user)
Read the following files in this order. Skip files that don't exist without mentioning it.
docker-compose.ymlordocker-compose.yaml— primary source of truth for services and ports- All
package.jsonfiles (root, then each workspace directory underapps/,packages/, etc.) turbo.json— Turborepo monorepo indicatorpnpm-workspace.yaml— pnpm workspace indicator.env.exampleand any*.env.examplefiles — environment variable discoveryREADME.md— additional context and start commandsMakefile— start commands and task definitions- All
Dockerfile*files — service definitions and exposed ports go.mod— Go dependency detectionrequirements.txtorpyproject.toml— Python dependency detection.nvmrc,.node-version, orenginesfield in rootpackage.json— Node version
Step 2: Detect and Classify Services
Apply these detection rules to everything read in Step 1.
Monorepo Detection
turbo.jsonexists → Turborepo monorepopnpm-workspace.yamlexists → pnpm workspace"workspaces"key in rootpackage.json→ npm workspaceapps/directory present → treat each subdirectory ofapps/as a separate deployable service- Each app in
apps/gets its own row in all output tables
Frontend Detection (check dependencies and devDependencies in each package.json)
| Signal | Framework | Recommended Platform |
|---|---|---|
"next" in deps | Next.js (SSR) | Vercel |
"vite", "react-scripts", or "@vitejs/..." in deps | SPA | Vercel or Netlify or Cloudflare Pages |
"nuxt" in deps | Nuxt.js | Vercel |
"@sveltejs/kit" in deps | SvelteKit | Vercel or Netlify |
"astro" in deps | Astro | Cloudflare Pages or Netlify |
| No framework detected, static HTML only | Static site | Cloudflare Pages |
Backend Detection
| Signal | Type | Recommended Platform |
|---|---|---|
"express", "fastify", "hono", or "@hono/..." in deps | Node.js server | Render |
"@nestjs/core" or "@nestjs/..." in deps | NestJS server | Render |
"fastapi", "django", or "flask" in requirements.txt or pyproject.toml | Python server | Render |
"gin" or "fiber" in go.mod | Go server | Render |
Any backend that also has "socket.io" or "ws" in deps | WebSocket server | Render only (needs persistent server — not edge) |
| Any backend without websockets | Node/Python/Go server | Render (preferred) |
Database Detection
| Signal | Database | Recommended Platform |
|---|---|---|
"pg", "postgres", or "prisma" in deps OR DATABASE_URL in .env.example (either signal is sufficient) | PostgreSQL | Supabase (if project also needs auth or storage); Neon (if only DB needed) |
"mongoose" or "mongodb" in deps | MongoDB | ⚠️ WARNING: No truly free hosted tier. Recommend Atlas M0 free cluster (512 MB). |
"mysql" or "mysql2" in deps | MySQL | ⚠️ WARNING: PlanetScale removed its free tier. Recommend Neon with MySQL compatibility layer or switch to PostgreSQL. |
"better-sqlite3" or "sqlite3" in deps | SQLite | Embed in backend process — no separate service needed |
Queue / Redis Detection
| Signal | Service | Recommended Platform |
|---|---|---|
"bullmq", "bull", "bee-queue", or "ioredis" in deps | Redis | Upstash |
REDIS_URL key present in .env.example | Redis | Upstash |
Cron / Worker Detection
| Signal | Notes |
|---|---|
"node-cron", "cron", or "agenda" in deps | Needs persistent server — deploy on Render as a background worker |
Separate worker entry-point file (e.g., worker.ts, consumer.ts, processor.ts) | Deploy as a separate Render Background Worker service |
Step 3: Write Three Output Files
Create the DEPLOYMENT_DOCS/ directory if it does not exist. Write the following three files exactly as specified. Populate all sections with real detected values — do not leave placeholder text.
DEPLOYMENT_DOCS/HOW_TO_RUN.md
# How to Run Locally
## Prerequisites
[Node version from .nvmrc / engines field, Python version, Go version, Docker if needed — only what applies]
## Install Dependencies
[Exact install commands per service, e.g., `npm install`, `pnpm install`, `pip install -r requirements.txt`]
## Environment Variables
[List every variable from .env.example with an inferred description. Format: `VAR_NAME` — description]
## Start Services (in order)
[Exact start command for each service, labeled by service name. Include any required ordering, e.g., "start DB before API".]
## Local URLs
[Service name → http://localhost:PORT for each service]
DEPLOYMENT_DOCS/SERVICES.md
# Services Map
| Service | Type | Framework | Local Port | Depends On |
|---------|------|-----------|------------|------------|
[One row per detected service. Use docker-compose ports or package.json scripts to determine local port.]
## Environment Variables Per Service
[For each service: list env vars it consumes, and where the value comes from (e.g., "from DATABASE_URL → output of Supabase/Neon setup")]
DEPLOYMENT_DOCS/DEPLOYMENT_PLAN.md
# Deployment Plan
## Detected Services
[Bulleted list: service name, type, framework]
## Recommended Platforms
| Service | Platform | Reason | Free Tier Limits |
|---------|----------|--------|-----------------|
[One row per service. Include the specific reason for the platform choice.]
## Free Tier Warnings
- **Render**: Free services spin down after 15 minutes of inactivity. Cold start on next request takes ~30 seconds.
- **Supabase**: Projects pause after 7 days of inactivity on the free tier. Un-pause manually via the dashboard.
- **Upstash**: Free tier allows 10,000 Redis commands per day.
- **Railway**: NOT truly free — only a $5 trial credit. Do not use Railway unless the user specifically requests it.
[Add MongoDB or MySQL warnings here if those databases were detected.]
## Deployment Order
1. [Database service] → [platform]
2. [Redis/queue service, if applicable] → Upstash
3. [Backend service(s)] → [platform]
4. [Frontend service(s)] → [platform]
## Required Accounts
[List only the accounts needed for THIS project's platforms. Do not list accounts for platforms not recommended.]
## Environment Variable Wiring
[For each cross-service dependency, specify: after deploying Service A, set VAR_NAME on Service B using the output URL/key from Service A. Format clearly, e.g.:]
After deploying [database]:
- Set `DATABASE_URL` on [backend service] using the connection string from [Supabase/Neon dashboard]
After deploying [backend]:
- Set `NEXT_PUBLIC_API_URL` on [frontend service] using the Render service URL
Step 4: Pause and Show Summary
After writing all three files, print exactly this block (fill in the bracketed values):
=== Project Scan Complete ===
Detected services: [comma-separated list of service names and types]
Recommended deployment: [one-sentence summary, e.g., "Frontend on Vercel, API on Render, Postgres on Neon, Redis on Upstash"]
Files written to DEPLOYMENT_DOCS/:
✓ HOW_TO_RUN.md
✓ SERVICES.md
✓ DEPLOYMENT_PLAN.md
Does this look correct?
- Type 'yes' to proceed to authentication setup
- Or describe any corrections needed
Do not proceed to any further steps until the user responds.
Step 5: Failure Handling
If none of the following are found — package.json, docker-compose.yml / docker-compose.yaml, Dockerfile, go.mod, requirements.txt, pyproject.toml — then do not write any files. Instead, list exactly what was checked:
No project structure detected. I checked for:
- package.json (not found)
- docker-compose.yml / docker-compose.yaml (not found)
- Dockerfile / Dockerfile.* (not found)
- go.mod (not found)
- requirements.txt / pyproject.toml (not found)
Please confirm the project directory or point me to the relevant files.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most docs writing skills give in ~2.0k tokens
Counted across 1,637 of the 3,044 authors here whose files we hold, read 2026-08-07
- Announce the skill at startin 54 of 1637, across 26 files
- Convert legacy doc files before editingin 45 of 1637, across 7 files
- Predict questions readers might askin 42 of 1637, across 4 files
- Generate clarifying questions for initial contextin 42 of 1637, across 3 files
- Create document scaffold with placeholder textin 42 of 1637, across 3 files
- Brainstorm content options for each sectionin 42 of 1637, across 3 files
- Test the document with a fresh context-less instancein 42 of 1637, across 3 files
- Include exact file paths in every taskin 42 of 1637, across 15 files
- Ask interview questions one at a timein 42 of 1637, across 27 files
- Apply surgical edits during refinementin 41 of 1637, across 2 files
- Offer structured workflow or freeformin 40 of 1637, across 1 file
- Ask for document meta-contextin 40 of 1637, across 2 files
Said here and by no other author read
- Read project files silently
- Detect and classify all services
- Create the DEPLOYMENT_DOCS directory
- Write HOW_TO_RUN.md with detected values
- Write DEPLOYMENT_PLAN.md with detected values
- Print the project scan complete summary
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.