1コマンドでフロントエンドをデプロイ。Claude Code Skillsサポート付き。
Deploy your site in one command.
PinMe is a zero-config frontend deployment tool. No servers. No accounts. No setup.
Build a static site, generate a page with AI, export your frontend, or import CAR files — then deploy instantly with a single command.
PinMe publishes your site as verifiable content, making silent tampering and accidental breakage far harder than traditional hosting.
You don’t manage servers, regions, or uptime. PinMe handles availability and persistence for you.
Website: https://pinme.eth.limo/
# Check your Node.js version
node --version
npm install -g pinme
# For Vite/React/Vue projects
npm run build
# For Next.js (static export)
npm run build
# Upload the dist directory (most common)
pinme upload dist
# Or upload build directory
pinme upload build
That's it! You'll get a preview URL like https://pinme.eth.limo/#/preview/*
This section provides AI-specific instructions for deploying websites using PinMe CLI.
Goal: Use PinMe CLI to upload static files to server.
Check Environment Requirements
# Check Node.js version (requires 16.13.0+)
node --version
Install PinMe CLI (if not installed)
npm install -g pinme
Identify the Static File Directory Priority order to check:
dist/ - Default output directory for Vue/React/Vite projectsbuild/ - Output directory for Create React Appout/ - Output directory for Next.js static exportpublic/ - Pure static file projectsValidation Rules:
index.html file (for website deployment)If no suitable folder is found, ask the user to specify the upload path.
Router Mode Check:
/#/about)/about) will cause 404 on sub-routes when deployed to IPFSHashRouter instead of BrowserRoutercreateHashHistory() instead of createWebHistory()Execute Deployment Command
pinme upload <folder_path>
Return Result
https://pinme.eth.limo/#/preview/*node_modules, .env, .git directoriessrc/)For easy AI tool parsing:
{
"tool": "pinme",
"requirements": {
"node_version": ">=16.13.0"
},
"install": "npm install -g pinme",
"upload": "pinme upload {{directory}}",
"upload_with_domain": "pinme upload {{directory}} --domain {{domain}}",
"validDirectories": ["dist", "build", "out", "public"],
"requiredFiles": ["index.html"],
"excludePatterns": ["node_modules", ".env", ".git", "src"],
"limits": {
"single_file": "200MB",
"total_directory": "1GB"
},
"output": "preview_url",
"preview_url_format": "https://pinme.eth.limo/#/preview/*",
"fixed_domain_format": "https://*.pinit.eth.limo",
"other_commands": {
"version": "pinme --version",
"list": "pinme list",
"import": "pinme import <car-file>",
"export": "pinme export <cid>",
"set_appkey": "pinme set-appkey",
"show_appkey": "pinme show-appkey",
"my_domains": "pinme my-domains",
"remove": "pinme rm <hash>",
"logout": "pinme logout",
"help": "pinme help"
}
}
Deployment Request: Please read the PinMe documentation, then use PinMe CLI to deploy the specified website (upload static files) to server.
Operation Steps:
- Check Node.js version (requires 16.13.0+)
- Check if pinme is installed, install if not
- Identify the static file directory for the website to deploy
- Execute deployment command
- Return preview page link:
https://pinme.eth.limo/#/preview/*
npm install -g pinme
yarn global add pinme
# Check PinMe version
pinme --version
# Interactive upload
pinme upload
# Specify path directly
pinme upload /path/to/file-or-directory
# Upload and bind to a domain (auto-detected: Pinme subdomain or DNS domain)
pinme bind <path> --domain <name>
pinme bind <path> -d <name>
Smart Auto-Detection:
example.com) → DNS domainmy-site) → Pinme subdomainExamples:
# Bind to a Pinme subdomain (auto-detected)
pinme bind ./dist --domain my-site
# Bind to a DNS domain (auto-detected by the dot)
pinme bind ./dist --domain example.com
# Force DNS mode if needed
pinme bind ./dist --domain my-site --dns
# Interactive CAR import
pinme import
# Specify CAR file path directly
pinme import /path/to/car-file.car
# Import CAR file and bind to a domain
pinme import /path/to/car-file.car --domain <name>
pinme import /path/to/car-file.car -d <name>
# Interactive CAR export
pinme export
# Specify CID directly
pinme export <CID>
# Export with custom output path
pinme export <CID> --output /path/to/output.car
pinme export <CID> -o /path/to/output.car
Note: By default, exported CAR files are saved to your system's Downloads directory.
# Show the last 10 upload records
pinme list
# Or use the shorthand command
pinme ls
# Limit the number of records shown
pinme list -l 5
# Clear all upload history
pinme list -c
# Interactive removal
pinme rm
# Remove a specific file by hash
pinme rm <IPFS_hash>
# Set AppKey for login and domain binding
pinme set-appkey
# View current AppKey info (masked)
pinme show-appkey
pinme appkey
# Log out
pinme logout
# View your domains
pinme my-domains
pinme domain
# Display help information
pinme help
PinMe automatically detects these common output directories (in priority order):
| Directory | Framework/Tool | Description |
|---|---|---|
dist/ | Vite, Vue CLI, Angular | Default output directory |
build/ | Create React App | CRA output directory |
out/ | Next.js | Static export output |
public/ | Static sites | Pure static file projects |
The selected directory must meet:
index.html file (for website deployment)node_modules/ - Dependency folder.git/ - Version control.env - Environment configurationsrc/ - Source code directorypackage.json, tsconfig.json - Config filesbindUpload files and bind them to a custom domain. Domain binding requires VIP membership.
pinme bind <path> [options]
Options:
path: Path to the file or directory to upload (optional, interactive if not provided)-d, --domain <name>: Domain name to bind (required)--dns: Force DNS domain mode (optional, auto-detected from domain format)Examples:
# Interactive mode (will prompt for path and domain)
pinme bind
# Bind to a Pinme subdomain (auto-detected: no dot in domain)
pinme bind ./dist --domain my-site
# Bind to a DNS domain (auto-detected: contains dot)
pinme bind ./dist --domain example.com
# Force DNS mode with --dns flag
pinme bind ./dist --domain my-site --dns
Auto-Detection:
example.com) are automatically treated as DNS domainsmy-site) are automatically treated as Pinme subdomains--dns or -D flag to force DNS domain mode when neededRequirements:
pinme set-appkey <AppKey>)URL Formats:
https://<name>.pinit.eth.limohttps://<your-domain>DNS Setup: After successful DNS domain binding, visit the DNS Configuration Guide to complete DNS setup.
uploadUpload a file or directory to the IPFS network.
pinme upload [path] [--domain <name>]
Options:
path: Path to the file or directory to upload (optional, interactive if not provided)-d, --domain <name>: Pinme subdomain to bind after upload (optional, requires VIP)Examples:
# Upload dist directory
pinme upload dist
# Upload only (no domain binding)
pinme upload dist
# Upload a specific file
pinme upload ./example.jpg
Note: Domain binding during upload requires VIP. Use the bind command for domain binding.
importImport CAR (Content Addressable aRchive) files to the IPFS network. This command is specifically designed for importing CAR files while maintaining their original structure. Supports binding to a Pinme subdomain after import.
pinme import [path] [--domain <name>]
Options:
path: Path to the CAR file to import (optional, if not provided, interactive mode will be entered)-d, --domain <name>: Pinme subdomain to bind after import (optional)Examples:
# Interactive CAR import
pinme import
# Import a specific CAR file
pinme import ./my-archive.car
# Import CAR file and bind to a domain
pinme import ./my-archive.car --domain my-archive
pinme import ./my-archive.car -d my-archive
Key Differences from upload:
uploadexportExport IPFS content as a CAR (Content Addressable aRchive) file.
pinme export [CID] [--output <path>]
Options:
CID: IPFS content identifier (CID) to export (optional, interactive if not provided)-o, --output <path>: Output file path for the CAR file (optional, defaults to Downloads directory)Examples:
# Interactive CAR export
pinme export
# Export a specific CID
pinme export bafybeiakzpeep2jw5cvsyfa66nqxmjurmarw3a34moxpgrbz7s75v7nune
# Export with custom output path
pinme export bafybeiakzpeep2jw5cvsyfa66nqxmjurmarw3a34moxpgrbz7s75v7nune --output ./my-export.car
pinme export bafybeiakzpeep2jw5cvsyfa66nqxmjurmarw3a34moxpgrbz7s75v7nune -o ./my-export.car
Features:
~/Downloads on macOS/Linux, %USERPROFILE%\Downloads on Windows)Note: Export is an asynchronous process. The command will:
rmRemove a file from the IPFS network.
pinme rm [hash]
Note: This unpins content from our IPFS node and deletes the ENS subdomain record. It does not guarantee removal from the entire IPFS network.
list / lsDisplay upload history.
pinme list [options]
Options:
-l, --limit <number>: Limit the number of records displayed-c, --clear: Clear all upload historyset-appkeySet AppKey for authentication and automatically merge anonymous upload history to the current account.
pinme set-appkey [AppKey]
Note: Fixed domain binding requires AppKey and Plus membership. Get your AppKey from PinMe website.
show-appkey / appkeyDisplay current AppKey information with masked sensitive data.
logoutLog out and clear authentication information from local storage.
my-domains / domainList all domains owned by the current account.
VIP membership provides access to premium features including domain binding and custom DNS support.
| Feature | Free | VIP |
|---|---|---|
| Upload files to IPFS | ✅ | ✅ |
| Preview URL | ✅ | ✅ |
| Pinme subdomain binding | ❌ | ✅ |
| Custom DNS domain binding | ❌ | ✅ |
| Priority support | ❌ | ✅ |
Domain binding (both Pinme subdomains and custom DNS domains) requires VIP membership.
Before using domain binding:
Upgrade to VIP
Set AppKey
pinme set-appkey <AppKey>
Bind your domain
# Bind to a Pinme subdomain
pinme bind ./dist --domain my-site
# Bind to a custom DNS domain
pinme bind ./dist --domain example.com --dns
If you attempt to bind a domain without VIP, you'll see an error message. You can check your VIP status on the PinMe website.
Error: Node.js version not supported
Solution: Upgrade to Node.js 16.13.0 or higher
Error: command not found: pinme
Solution: Run npm install -g pinme
Error: No such file or directory
Solution: Check if path is correct, or use ls command to view available directories
Error: Permission denied
Solution: Check folder permissions, or use sudo (only when necessary)
<address>-<jwt>pinme show-appkey to check current status| Type | Free Plan |
|---|---|
| Single file | 200MB |
| Total directory | 1GB |
Uploaded files are stored on the IPFS network and accessible through the Glitter Protocol's IPFS gateway.
After successful upload, you receive:
https://pinme.eth.limo/#/preview/*https://*.pinit.eth.limo~/.pinme/%USERPROFILE%\.pinme\https://pinme.eth.limo/#/preview/*https://*.pinit.eth.limoWhen uploading projects built with Vite, ensure proper asset path resolution:
// vite.config.js
export default {
base: './',
// other configurations...
};
PinMe supports both importing and exporting CAR (Content Addressable aRchive) files:
When using the import command for CAR files:
.car extension and follow the IPFS CAR specificationWhen using the export command:
--output or -o to specify a custom output locationQm) and CIDv1 (starting with bafy, bafk, or bafz)# Export IPFS content to CAR file
pinme export <CID>
# Later, import the CAR file back to IPFS
pinme import ~/Downloads/<CID>.car
Pre-upload Checks
Security
Performance Optimization
Verify Deployment
/#/path instead of /path)PinMe can be integrated with GitHub Actions for automated CI/CD deployment.
Add workflow file to your repository:
.github/workflows/deploy.ymlConfigure GitHub Secrets:
PINME_APPKEY with your PinMe AppKeyPINME_DOMAIN for custom domainPush to trigger deployment:
main or master branchname: Deploy to PinMe
on:
push:
branches: [main, master]
workflow_dispatch:
inputs:
domain:
description: 'PinMe domain name'
required: true
build_dir:
description: 'Build directory'
default: 'dist'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: npm ci
- run: npm run build
- run: npm install -g pinme
- run: pinme set-appkey "${{ secrets.PINME_APPKEY }}"
- run: pinme upload dist --domain "${{ secrets.PINME_DOMAIN }}"
dist/build/out/ (with output: 'export')dist/dist/public/Build directory not found:
Authentication failed:
PINME_APPKEY secret is correct<address>-<jwt>Domain binding failed:
MIT License - See the LICENSE file for details
If you have questions or suggestions, please contact us through:
Developed and maintained by the Glitter Protocol team
互換性
トピック