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, or export your frontend — 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/
npm install -g pinmeyarn global add pinme# Interactive upload
pinme upload
# Specify path directly
pinme upload /path/to/file-or-directory
# Upload and bind to a domain
pinme upload /path/to/file-or-directory --domain <name>
pinme upload /path/to/file-or-directory -d <name># Interactive removal
pinme rm
# Remove a specific file by hash
pinme rm <IPFS_hash># 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 AppKey setup
pinme set-appkey
# Set AppKey directly
pinme set-appkey <AppKey># List all domains owned by current account
pinme my-domains
# Or use the shorthand command
pinme domain# Display help information
pinme helpUpload a file or directory to the IPFS network. Supports binding to a Pinme subdomain after upload.
pinme upload [path] [--domain <name>]Options:
path: Path to the file or directory to upload (optional, if not provided, interactive mode will be entered)-d, --domain <name>: Pinme subdomain to bind after upload (optional)
Examples:
# Interactive upload
pinme upload
# Upload a specific file
pinme upload ./example.jpg
# Upload an entire directory
pinme upload ./my-website
# Upload and bind to a domain
pinme upload ./my-website --domain my-site
pinme upload ./my-website -d my-siteRemove a file from the IPFS network.
pinme rm [hash]Options:
hash: IPFS content hash to remove (optional, if not provided, interactive mode will be entered)
Examples:
# Interactive removal
pinme rm
# Remove a specific file by hash
pinme rm bafybeifdwyoz66u5czbbjvmmais5fzrzrolxbyiydqsbrxessndt3s6zdiNote: This action unpins the content from our IPFS node and deletes the ENS subdomain record. It does not ensure that the file is removed from the IPFS network.
Display upload history.
pinme list [options]
pinme ls [options]Options:
-l, --limit <number>: Limit the number of records displayed-c, --clear: Clear all upload history
Examples:
# Show the last 10 records
pinme list
# Show the last 5 records
pinme ls -l 5
# Clear all history records
pinme list -cSet AppKey for authentication and automatically merge anonymous upload history to the current account.
pinme set-appkey [AppKey]Options:
AppKey: Your AppKey for authentication (optional, if not provided, interactive mode will be entered)
Examples:
# Interactive AppKey setup
pinme set-appkey
# Set AppKey directly
pinme set-appkey your-app-key-hereNote: After setting the AppKey, your anonymous upload history will be automatically merged to your account.
List all domains owned by the current account.
pinme my-domains
pinme domainExamples:
# List all domains
pinme my-domains
# Shorthand command
pinme domainThis command displays information about each domain including:
- Domain name
- Domain type
- Bind time
- Expire time
Display help information.
pinme help [command]Options:
command: The specific command to view help for (optional)
Examples:
# Display general help
pinme help- Single file size limit: 200MB (free plan)
- Total directory size limit: 1GB (free plan)
Uploaded files are stored on the IPFS network and accessible through the Glitter Protocol's IPFS gateway. After a successful upload, you will receive:
- IPFS content hash
- Accessible URL link
Logs and configuration files are stored in:
- Linux/macOS:
~/.pinme/ - Windows:
%USERPROFILE%\.pinme\
MIT License - See the LICENSE file for details
When uploading projects built with Vite, please note:
- Vite Configuration: Add
base: "./"to your Vite configuration file to ensure proper asset path resolution:
// vite.config.js
export default {
base: "./",
// other configurations...
}PinMe can be integrated with GitHub Actions to automatically deploy your project when you push code to GitHub. This enables a fully automated CI/CD workflow.
-
Add the workflow file to your repository:
- Copy
.github/workflows/deploy.ymlfrom the PinMe repository to your project - Or create
.github/workflows/deploy.ymlin your repository
- Copy
-
Configure GitHub Secrets:
- Go to your repository → Settings → Secrets and variables → Actions
- Add a new secret named
PINME_APPKEYwith your PinMe AppKey - (Optional) Add
PINME_DOMAINto specify a custom domain name
-
Push to trigger deployment:
- Push code to
mainormasterbranch to trigger automatic deployment - Or manually trigger via Actions tab → "Deploy to PinMe" → Run workflow
- Push code to
The GitHub Actions workflow automatically:
- ✅ Detects and installs project dependencies
- ✅ Builds your project (if a build script exists)
- ✅ Installs PinMe CLI
- ✅ Sets up authentication using your AppKey
- ✅ Auto-detects build output directory (
dist,build,public, orout) - ✅ Uploads to IPFS and binds to your domain
- ✅ Provides deployment summary with access URL
You can configure the following secrets in your repository:
-
PINME_APPKEY(Required): Your PinMe AppKey for authentication- Format:
<address>-<jwt> - Get your AppKey from PinMe website
- Format:
-
PINME_DOMAIN(Optional): Default domain name to bind- If not set, the workflow will generate a domain from your repository name
- Example:
my-awesome-project→https://my-awesome-project.pinit.eth.limo
You can also manually trigger the workflow with custom parameters:
- Go to Actions tab in your repository
- Select "Deploy to PinMe" workflow
- Click "Run workflow"
- Enter:
- Domain: Your desired PinMe domain name
- Build Directory: Your build output directory (default:
dist)
name: 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 }}"The workflow automatically detects and supports:
- Vite: Builds to
dist/ - Create React App: Builds to
build/ - Next.js: Builds to
out/(withoutput: 'export') - Vue CLI: Builds to
dist/ - Angular: Builds to
dist/ - Static sites: Uses root directory or
public/
Build directory not found:
- Ensure your build script outputs to a standard directory (
dist,build,public, orout) - Or set
PINME_DOMAINsecret and use manual workflow dispatch to specify custom directory
Authentication failed:
- Verify your
PINME_APPKEYsecret is correctly set - Ensure the AppKey format is correct:
<address>-<jwt>
Domain binding failed:
- Check if the domain name is available
- Ensure you have permission to bind the domain
- Try a different domain name
If you have questions or suggestions, please contact us through:
- GitHub Issues: https://github.com/glitternetwork/pinme/issues
- Email: pinme@glitterprotocol.io
Developed and maintained by the Glitter Protocol team