PinMe - Zero-Config Frontend Deployment
Deploy static websites to IPFS network with a single command. No servers, no accounts, no setup.
When to Use
Use this skill when:
- User asks to "deploy", "upload", or "publish" a frontend project
- User wants to get a preview URL for their built site
- User mentions PinMe or IPFS deployment
- Project has built static files (dist/, build/, out/, public/)
Quick Start
# Install PinMe
npm install -g pinme
# Deploy (auto-detects static directory)
pinme upload dist
# Get preview URL
# https://pinme.eth.limo/#/preview/*
Core Workflow
1. Check Prerequisites
# Check Node.js version (requires 16.13.0+)
node --version
# Verify pinme is installed
pinme --version
2. Identify Static Directory
PinMe auto-detects directories in priority order:
| Directory |
Framework/Tool |
dist/ |
Vite, Vue CLI, Angular |
build/ |
Create React App |
out/ |
Next.js (static export) |
public/ |
Static sites |
Validation rules:
- ✅ Folder must exist
- ✅ Must contain
index.html
- ✅ Must have actual static files (CSS, JS, images)
3. Execute Deployment
# Deploy dist directory (most common)
pinme upload dist
# Deploy specific directory
pinme upload build
# Upload and bind to custom domain (requires Plus)
pinme upload dist --domain my-site
4. Return Result
Return ONLY the preview URL: https://pinme.eth.limo/#/preview/*
Commands Reference
| Command |
Description |
pinme upload <dir> |
Upload static files to IPFS |
pinme upload <dir> --domain <name> |
Upload + bind domain |
pinme import <car-file> |
Import CAR files |
pinme export <CID> |
Export IPFS content as CAR |
pinme list |
Show upload history |
pinme rm <hash> |
Remove files from IPFS |
pinme set-appkey |
Set AppKey for authentication |
pinme my-domains |
List owned domains |
pinme --version |
Show version |
Upload Limits
| Type |
Free Plan |
| Single file |
200MB |
| Total directory |
1GB |
Error Handling
| Error |
Solution |
| Node.js version too low |
Upgrade to 16.13.0+ |
| Command not found |
Run npm install -g pinme |
| Folder does not exist |
Check path, use ls |
| Upload failed |
Check network, retry |
| Authentication failed |
Run pinme set-appkey |
AI Execution Protocol
For programmatic deployment:
- Check environment:
node --version (needs >=16.13.0)
- Install if needed:
npm install -g pinme
- Detect directory: Check
dist/, build/, out/, public/
- Validate: Must contain
index.html
- Execute:
pinme upload <directory>
- Return: Only the preview URL
Prohibited operations:
- ❌ Upload node_modules, .env, .git
- ❌ Upload source directories (src/)
- ❌ Upload config files (package.json, etc.)
- ❌ Upload non-existent/empty folders
GitHub Actions Integration
Example workflow:
name: Deploy to PinMe
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: npm ci && npm run build
- run: npm install -g pinme
- run: pinme set-appkey "${{ secrets.PINME_APPKEY }}"
- run: pinme upload dist --domain "${{ secrets.DOMAIN }}"
Machine-Readable Config
{
"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"
}
Resources
1---2name: pinme3description: Deploy static websites to IPFS with a single command using PinMe CLI. Use when: (1) User wants to deploy a built frontend project, (2) Need to upload static files (dist/build/out/public) to IPFS, (3) Requesting preview URL for a deployed site. Supports: Vite, React, Vue, Next.js, Angular, Create React App, and static sites. Output: Preview URL (https://pinme.eth.limo/#/preview/*) after successful upload.4---5
6# PinMe - Zero-Config Frontend Deployment
7
8Deploy static websites to IPFS network with a single command. No servers, no accounts, no setup.
9
10## When to Use
11
12Use this skill when:
13- User asks to "deploy", "upload", or "publish" a frontend project
14- User wants to get a preview URL for their built site
15- User mentions PinMe or IPFS deployment
16- Project has built static files (dist/, build/, out/, public/)
17
18## Quick Start
19
20```bash
21# Install PinMe
22npm install -g pinme
23
24# Deploy (auto-detects static directory)
25pinme upload dist
26
27# Get preview URL
28# https://pinme.eth.limo/#/preview/*
29```
30
31## Core Workflow
32
33### 1. Check Prerequisites
34```bash
35# Check Node.js version (requires 16.13.0+)
36node --version
37
38# Verify pinme is installed
39pinme --version
40```
41
42### 2. Identify Static Directory
43PinMe auto-detects directories in priority order:
44
45| Directory | Framework/Tool |
46|-----------|---------------|
47| `dist/` | Vite, Vue CLI, Angular |
48| `build/` | Create React App |
49| `out/` | Next.js (static export) |
50| `public/` | Static sites |
51
52**Validation rules:**
53- ✅ Folder must exist
54- ✅ Must contain `index.html`
55- ✅ Must have actual static files (CSS, JS, images)
56
57### 3. Execute Deployment
58```bash
59# Deploy dist directory (most common)
60pinme upload dist
61
62# Deploy specific directory
63pinme upload build
64
65# Upload and bind to custom domain (requires Plus)
66pinme upload dist --domain my-site
67```
68
69### 4. Return Result
70Return ONLY the preview URL: `https://pinme.eth.limo/#/preview/*`
71
72## Commands Reference
73
74| Command | Description |
75|---------|-------------|
76| `pinme upload <dir>` | Upload static files to IPFS |
77| `pinme upload <dir> --domain <name>` | Upload + bind domain |
78| `pinme import <car-file>` | Import CAR files |
79| `pinme export <CID>` | Export IPFS content as CAR |
80| `pinme list` | Show upload history |
81| `pinme rm <hash>` | Remove files from IPFS |
82| `pinme set-appkey` | Set AppKey for authentication |
83| `pinme my-domains` | List owned domains |
84| `pinme --version` | Show version |
85
86## Upload Limits
87
88| Type | Free Plan |
89|------|----------|
90| Single file | 200MB |
91| Total directory | 1GB |
92
93## Error Handling
94
95| Error | Solution |
96|-------|----------|
97| Node.js version too low | Upgrade to 16.13.0+ |
98| Command not found | Run `npm install -g pinme` |
99| Folder does not exist | Check path, use `ls` |
100| Upload failed | Check network, retry |
101| Authentication failed | Run `pinme set-appkey` |
102
103## AI Execution Protocol
104
105For programmatic deployment:
106
1071. **Check environment**: `node --version` (needs >=16.13.0)
1082. **Install if needed**: `npm install -g pinme`
1093. **Detect directory**: Check `dist/`, `build/`, `out/`, `public/`
1104. **Validate**: Must contain `index.html`
1115. **Execute**: `pinme upload <directory>`
1126. **Return**: Only the preview URL
113
114**Prohibited operations:**
115- ❌ Upload node_modules, .env, .git
116- ❌ Upload source directories (src/)
117- ❌ Upload config files (package.json, etc.)
118- ❌ Upload non-existent/empty folders
119
120## GitHub Actions Integration
121
122Example workflow:
123
124```yaml
125name: Deploy to PinMe
126on: [push]
127jobs:
128 deploy:
129 runs-on: ubuntu-latest
130 steps:
131 - uses: actions/checkout@v4
132 - uses: actions/setup-node@v4
133 with:
134 node-version: '18'
135 - run: npm ci && npm run build
136 - run: npm install -g pinme
137 - run: pinme set-appkey "${{ secrets.PINME_APPKEY }}"
138 - run: pinme upload dist --domain "${{ secrets.DOMAIN }}"
139```
140
141## Machine-Readable Config
142
143```json
144{
145 "tool": "pinme",
146 "requirements": {
147 "node_version": ">=16.13.0"
148 },
149 "install": "npm install -g pinme",
150 "upload": "pinme upload {{directory}}",
151 "upload_with_domain": "pinme upload {{directory}} --domain {{domain}}",
152 "validDirectories": ["dist", "build", "out", "public"],
153 "requiredFiles": ["index.html"],
154 "excludePatterns": ["node_modules", ".env", ".git", "src"],
155 "limits": {
156 "single_file": "200MB",
157 "total_directory": "1GB"
158 },
159 "output": "preview_url",
160 "preview_url_format": "https://pinme.eth.limo/#/preview/*",
161 "fixed_domain_format": "https://*.pinit.eth.limo"
162}
163```
164
165## Resources
166
167- **Website:** https://pinme.eth.limo/
168- **GitHub:** https://github.com/glitternetwork/pinme
169- **AppKey:** https://pinme.eth.limo/ (get from dashboard)