Deploy your frontend in one command.
PinMe is a zero-config deployment CLI for static sites and PinMe full-stack projects.
Build your app, upload the output folder, and PinMe prints the best available public URL. For larger projects, PinMe can also create and deploy a template with a frontend, a Worker backend, and database migrations.
Website: https://pinme.eth.limo/
- Quick Start
- Worker and Full-Stack Projects
- Static Uploads
- For AI Agents
- Installation
- Command Reference
- Limits and Notes
- Examples
- Support
- Node.js
>= 16.13.0
Check your version:
node --versionpinme login
pinme create my-app
cd my-app
pinme saveIf you want the Worker-based project flow first, start with Worker and Full-Stack Projects.
If you only want to upload a built frontend, jump to Static Uploads.
- Install the CLI:
npm install -g pinme- Authenticate:
pinme login
# Or use an AppKey for CLI / CI usage
pinme set-appkey <AppKey>- Build your app:
npm run build- Upload the build output:
pinme upload dist
# Other common output folders
pinme upload build
pinme upload out
pinme upload publicPinMe prints the final public URL after upload. If no custom domain is bound, it can fall back to a preview URL such as https://pinme.eth.limo/#/preview/*.
This section is the low-ambiguity workflow for agents using PinMe to deploy static output.
Upload static files with PinMe and return the final public URL printed by the CLI.
- Check Node.js:
node --version- Ensure PinMe is installed:
npm install -g pinme- Authenticate before upload:
pinme login
# Or:
pinme set-appkey <AppKey>- Find the static output directory in this order:
dist/build/out/public/
Validation rules:
- the directory must exist
- it should contain
index.htmlfor website deployment - it should contain built static assets rather than source files
- Upload the directory:
pinme upload <folder>- Return only the final public URL.
URL priority:
- DNS domain
- PinMe subdomain
- short URL
- preview URL
- Do not upload
node_modules,.git,.env, or source folders such assrc/. - Do not upload config files like
package.jsonortsconfig.json. - For SPAs, hash-based routing is safer on IPFS than history mode for deep links.
- If no suitable build directory exists, ask the user for the correct upload path.
{
"tool": "pinme",
"requirements": {
"node_version": ">=16.13.0"
},
"install": "npm install -g pinme",
"login": "pinme login",
"set_appkey": "pinme set-appkey <AppKey>",
"auth_required_for_upload": true,
"upload": "pinme upload {{directory}}",
"upload_with_domain": "pinme upload {{directory}} --domain {{domain}}",
"upload_with_dns": "pinme upload {{directory}} --domain {{domain}} --dns",
"valid_directories": ["dist", "build", "out", "public"],
"required_files": ["index.html"],
"exclude_patterns": ["node_modules", ".env", ".git", "src"],
"limits": {
"single_file_default": "100MB",
"total_directory_default": "500MB"
},
"output": "public_url",
"url_priority": ["dns_domain", "pinme_domain", "short_url", "preview_url"]
}Install from npm:
npm install -g pinmeVerify installation:
pinme --versionPinMe can create and deploy a full-stack template with:
- frontend
- Worker backend
- SQL migrations
pinme login
pinme create my-app
cd my-app
pinme savecreate downloads the PinMe template and initializes the platform project. save builds and deploys the project from the current PinMe project root.
Use these when only one layer changed:
pinme update-web
pinme update-worker
pinme update-dbNotes:
- run these commands from a PinMe project root that contains
pinme.toml update-dbuploads SQL files fromdb/- the total SQL payload for
update-dbis limited to10MBper run
pinme delete
pinme delete my-app
pinme delete my-app --forceThis deletes the project on the platform. Local files remain unchanged.
upload requires authentication.
pinme login
pinme upload
pinme upload ./distDomain binding requires wallet balance.
pinme upload ./dist --domain my-site
pinme upload ./dist --domain example.com
pinme upload ./dist --domain my-site --dns
# Or use the dedicated command
pinme bind ./dist --domain my-siteDomain handling:
- domains with a dot are treated as DNS domains
- domains without a dot are treated as PinMe subdomains
--dnsforces DNS mode
import also requires authentication.
pinme import
pinme import ./site.car
pinme import ./site.car --domain my-siteexport takes a CID and writes <cid>.car into the output directory.
pinme export <CID>
pinme export <CID> --output ./exportsrm accepts several input formats, including direct CID, subname, and supported URL forms.
pinme rm
pinme rm <CID>
pinme rm <subname>
pinme rm https://<subname>.<root-domain>pinme login
pinme login --env test
pinme set-appkey
pinme set-appkey <AppKey>
pinme show-appkey
pinme appkey
pinme logoutpinme list
pinme ls
pinme list -l 5
pinme list -c
pinme my-domains
pinme domain
pinme wallet
pinme wallet-balance
pinme balance| Command | What it does |
|---|---|
pinme upload [path] |
Upload a file or directory to IPFS |
pinme bind <path> --domain <name> |
Upload and bind a domain |
pinme import [path] |
Import a CAR file |
pinme export <cid> [--output <dir>] |
Export a CID as a CAR file into a directory |
pinme rm [value] |
Remove uploaded content by CID, subname, or supported URL form |
| `pinme login [--env dev | test |
pinme set-appkey [AppKey] |
Set authentication with an AppKey |
pinme show-appkey / pinme appkey |
Show masked AppKey info |
pinme my-domains / pinme domain |
List bound domains |
pinme wallet / pinme wallet-balance / pinme balance |
Show wallet balance |
pinme create [name] |
Create a new PinMe full-stack project |
pinme save [--domain <name>] |
Build and deploy a PinMe full-stack project |
pinme update-web |
Deploy frontend only |
pinme update-worker |
Deploy Worker only |
pinme update-db |
Run SQL migrations only |
pinme delete [name] [--force] |
Delete a platform project |
pinme list / pinme ls |
Show upload history |
pinme help |
Show CLI help |
- Default upload file size limit:
100MB - Default upload directory size limit:
500MB - These defaults come from the CLI and can be overridden with environment variables
- Domain binding requires wallet balance
uploadandimportrequire authentication- PinMe subdomain root is resolved dynamically by the platform, so the CLI prints the exact final URL
This repo includes example projects and docs:
- Website: https://pinme.eth.limo/
- GitHub: https://github.com/glitternetwork/pinme