Pinme Official Template - Frontend-Backend separated architecture with Vite + React frontend and Cloudflare Workers backend.
.
├── pinme.toml # Pinme config
├── package.json # Root config
├── pnpm-workspace.yaml # pnpm workspace config
├── frontend/ # Frontend app (React + Vite)
│ ├── src/
│ │ ├── main.tsx
│ │ ├── App.tsx
│ │ ├── App.css
│ │ ├── components/
│ │ │ └── Header.tsx
│ │ ├── pages/
│ │ │ ├── Home/
│ │ │ ├── About/
│ │ │ ├── Demo/
│ │ │ └── Email/
│ │ └── utils/
│ │ └── api.ts
│ ├── index.html
│ ├── vite.config.ts
│ ├── tsconfig.json
│ └── package.json
├── backend/ # Backend Worker
│ ├── src/
│ │ └── worker.ts # <- User edits this file
│ ├── wrangler.toml # Wrangler config
│ └── package.json
├── db/ # D1 database migrations
│ └── 001_init.sql
└── README.md
pinme create <project-name>cd <project-name>
npm install# Frontend development
npm run dev:frontend
# Backend development
# Edit backend/src/worker.ts directly
npm run dev # Local previewnpm run savepinme create my-appWill call create_worker API, returns:
backend/metadata.json- Worker metadatabackend/src/worker.ts- Worker source code
Edit backend/src/worker.ts:
export default {
async fetch(request: Request, env: any) {
const url = new URL(request.url);
if (url.pathname === '/api/hello') {
return new Response('Hello World!');
}
return new Response('Not Found', { status: 404 });
}
};Local preview:
npm run devnpm run saveFlow:
wrangler deploy --dry-run --outdir- Buildbackend/src/worker.ts->dist-worker/- Upload
dist-worker/*.js+backend/metadata.jsonto platform API
npm run dev:frontendAccess http://localhost:5173
| Command | Description |
|---|---|
npm run dev |
Local preview of backend Worker |
npm run dev:frontend |
Start frontend dev server |
npm run build |
Build frontend + backend |
npm run build:worker |
Build backend Worker |
npm run build:frontend |
Build frontend |
npm run save |
One-click deploy (build + deploy frontend to IPFS + save Worker to platform) |
Edit pinme.toml:
project_name = "my-app"
[vars]
VITE_WORKER_URL = ""
[d1]
migrations_dir = "db"
# database_id = "xxx"Edit backend/wrangler.toml to configure D1, etc:
name = "my-app"
compatibility_date = "2026-03-01"
main = "src/worker.ts"
[[d1_databases]]
binding = "DB"
database_name = "my-app-db"
database_id = "xxx"| File | Description |
|---|---|
backend/src/worker.ts |
User-editable Worker source code |
backend/metadata.json |
Worker metadata (contains bindings, etc.) |
backend/wrangler.toml |
Wrangler config |
pinme.toml |
Project config |
- Frontend: Vite + React + TypeScript + React Router
- Backend: Cloudflare Workers (TypeScript)
- Database: Cloudflare D1 (SQLite)
- Deployment: Pinme Platform API
MIT