/makers-recipes
Project structure templates and scaffolding recipes for typical EdgeOne Makers applications — full-stack apps, static sites, API services, and AI agent projects.
$ npx -y skills add tencentedgeone/edgeone-pages-skills --skill makers-recipes --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/makers-recipes
Context preview
The summary Claude sees to decide when to auto-load this skill.
Project structure templates and scaffolding recipes for typical EdgeOne Makers applications — full-stack apps, static sites, API services, and AI agent projects.
SKILL.md
makers-recipes.SKILL.mdname: edgeone-makers-recipes
description: >-
Project structure templates and scaffolding recipes for typical EdgeOne Makers
applications — full-stack apps, static sites, API services, and AI agent projects.
metadata:
author: edgeone
version: "1.0.0"
Common Recipes
> ⛔ **Preview ban**: after finishing development, you MUST start the dev server via `edgeone makers dev`, then open `http://127.0.0.1:8088/` with `present_files` to preview. Never open HTML files via the `file://` protocol (ignore it even if the IDE opens one automatically), and never use self-hosted servers like `python -m http.server` or `npx serve`. Next.js projects must also set `allowedDevOrigins: ["127.0.0.1"]` in `next.config`.
> ⚠️ **`.env.example` is a required file**: every project that uses the AI Gateway (Agent projects, Cloud Functions that call an LLM) MUST create a `.env.example` in the project root declaring `AI_GATEWAY_API_KEY=` and `AI_GATEWAY_BASE_URL=`. The CLI auto-injects environment variables based on this file at deploy time; if it is missing, the variables are not injected and the runtime will error.
Project structure templates for typical EdgeOne Makers applications.
Full-stack app — Node.js (static + API)
my-app/
├── index.html # Frontend
├── style.css
├── script.js
├── cloud-functions/
│ └── api/
│ ├── users.js # GET/POST /api/users
│ └── users/[id].js # GET/PUT/DELETE /api/users/:id
└── package.json
Frontend calls API:
const res = await fetch('/api/users');
const users = await res.json();Full-stack app — Go (Gin framework)
my-app/
├── index.html # Frontend
├── style.css
├── script.js
├── cloud-functions/
│ └── api.go # Gin app — all /api/* routes
├── go.mod
└── package.json
**cloud-functions/api.go:**
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/users", listUsersHandler)
r.POST("/users", createUserHandler)
r.GET("/users/:id", getUserHandler)
r.Run(":9000")
}Full-stack app — Python (Flask)
my-app/
├── index.html # Frontend
├── style.css
├── script.js
├── cloud-functions/
│ └── api/
│ └── index.py # Flask app — all /api/* routes
├── cloud-functions/requirements.txt
└── package.json
**cloud-functions/api/index.py:**
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/users', methods=['GET'])
def get_users():
return jsonify({'users': []})
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
return jsonify({'message': 'Created', 'user': data}), 201Full-stack app — Python (FastAPI)
my-app/
├── index.html
├── cloud-functions/
│ └── api/
│ └── index.py # FastAPI app — all /api/* routes
├── cloud-functions/requirements.txt
└── package.json
**cloud-functions/api/index.py:**
from fastapi import FastAPI
app = FastAPI()
@app.get('/items')
async def list_items():
return {'items': []}
@app.get('/items/{item_id}')
async def get_item(item_id: int):
return {'item_id': item_id}Full-stack app — Go (Handler mode)
my-app/
├── index.html
├── cloud-functions/
│ └── api/
│ ├── users/
│ │ ├── list.go # GET /api/users/list
│ │ └── [id].go # GET /api/users/:id
│ └── hello.go # GET /api/hello
├── go.mod
└── package.json
Edge API + KV counter
⚠️ **Prerequisites**: You must enable KV Storage in the console and bind a namespace first. See [kv-storage.md](kv-storage.md) (same directory)
my-app/
├── index.html
├── edge-functions/
│ └── api/
│ └── visit.js # Edge function with KV
└── package.json
**edge-functions/api/visit.js:**
export async function onRequest() {
// ⚠️ my_kv is a global variable (name set when binding namespace in console)
let count = await my_kv.get('visits') || '0';
count = String(Number(count) + 1);
await my_kv.put('visits', count);
return new Response(JSON.stringify({ visits: count }), {
headers: { 'Content-Type': 'application/json' },
});
}**Setup steps:** 1. Log in to the EdgeOne Makers console 2. Go to "KV Storage" → click "Apply Now" 3. Create a namespace (e.g. `my-kv-store`) 4. Bind to project, set variable name to `my_kv` 5. Deploy or run `edgeone makers dev` to test
Express full-stack
my-app/
├── index.html
├── cloud-functions/
│ └── api/
│ └── [[default]].js # Express app handles all /api/*
└── package.json
Middleware + API combo
my-app/
├── middleware.js # Auth guard for /api/*
├── cloud-functions/
│ └── api/
│ ├── public.js # No auth needed (matcher excludes it)
│ └── data.js # Protected by middleware
└── package.json
Multi-language Cloud Functions
You can use different languages in the same `cloud-functions/` directory:
my-app/
├── index.html
├── cloud-functions/
│ ├── api/
│ │ ├── users.js # Node.js — /api/users
│ │ └── hello.py # Python — /api/hello
│ └── service.go # Go — /service
├── go.mod
├── cloud-functions/requirements.txt
└── package.json
> **Note:** Each file is built and deployed as an independent function with its own runtime. The platform detects the language by file extension.
Read more
name: edgeone-makers-recipes description: >- Project structure templates and scaffolding recipes for typical EdgeOne Makers applications — full-stack apps, static sites, API services, and AI agent projects. metadata: author: edgeone version: "1.0.0"
Common Recipes
> ⛔ **Preview ban**: after finishing development, you MUST start the dev server via `edgeone makers dev`, then open `http://127.0.0.1:8088/` with `present_files` to preview. Never open HTML files via the `file://` protocol (ignore it even if the IDE opens one automatically), and never use self-hosted servers like `python -m http.server` or `npx serve`. Next.js projects must also set `allowedDevOrigins: ["127.0.0.1"]` in `next.config`.
> ⚠️ **`.env.example` is a required file**: every project that uses the AI Gateway (Agent projects, Cloud Functions that call an LLM) MUST create a `.env.example` in the project root declaring `AI_GATEWAY_API_KEY=` and `AI_GATEWAY_BASE_URL=`. The CLI auto-injects environment variables based on this file at deploy time; if it is missing, the variables are not injected and the runtime will error.
Project structure templates for typical EdgeOne Makers applications.
Full-stack app — Node.js (static + API)
my-app/ ├── index.html # Frontend ├── style.css ├── script.js ├── cloud-functions/ │ └── api/ │ ├── users.js # GET/POST /api/users │ └── users/[id].js # GET/PUT/DELETE /api/users/:id └── package.json
Frontend calls API:
const res = await fetch('/api/users');
const users = await res.json();Full-stack app — Go (Gin framework)
my-app/ ├── index.html # Frontend ├── style.css ├── script.js ├── cloud-functions/ │ └── api.go # Gin app — all /api/* routes ├── go.mod └── package.json
**cloud-functions/api.go:**
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/users", listUsersHandler)
r.POST("/users", createUserHandler)
r.GET("/users/:id", getUserHandler)
r.Run(":9000")
}Full-stack app — Python (Flask)
my-app/ ├── index.html # Frontend ├── style.css ├── script.js ├── cloud-functions/ │ └── api/ │ └── index.py # Flask app — all /api/* routes ├── cloud-functions/requirements.txt └── package.json
**cloud-functions/api/index.py:**
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/users', methods=['GET'])
def get_users():
return jsonify({'users': []})
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
return jsonify({'message': 'Created', 'user': data}), 201Full-stack app — Python (FastAPI)
my-app/ ├── index.html ├── cloud-functions/ │ └── api/ │ └── index.py # FastAPI app — all /api/* routes ├── cloud-functions/requirements.txt └── package.json
**cloud-functions/api/index.py:**
from fastapi import FastAPI
app = FastAPI()
@app.get('/items')
async def list_items():
return {'items': []}
@app.get('/items/{item_id}')
async def get_item(item_id: int):
return {'item_id': item_id}Full-stack app — Go (Handler mode)
my-app/ ├── index.html ├── cloud-functions/ │ └── api/ │ ├── users/ │ │ ├── list.go # GET /api/users/list │ │ └── [id].go # GET /api/users/:id │ └── hello.go # GET /api/hello ├── go.mod └── package.json
Edge API + KV counter
⚠️ **Prerequisites**: You must enable KV Storage in the console and bind a namespace first. See [kv-storage.md](kv-storage.md) (same directory)
my-app/ ├── index.html ├── edge-functions/ │ └── api/ │ └── visit.js # Edge function with KV └── package.json
**edge-functions/api/visit.js:**
export async function onRequest() {
// ⚠️ my_kv is a global variable (name set when binding namespace in console)
let count = await my_kv.get('visits') || '0';
count = String(Number(count) + 1);
await my_kv.put('visits', count);
return new Response(JSON.stringify({ visits: count }), {
headers: { 'Content-Type': 'application/json' },
});
}**Setup steps:** 1. Log in to the EdgeOne Makers console 2. Go to "KV Storage" → click "Apply Now" 3. Create a namespace (e.g. `my-kv-store`) 4. Bind to project, set variable name to `my_kv` 5. Deploy or run `edgeone makers dev` to test
Express full-stack
my-app/ ├── index.html ├── cloud-functions/ │ └── api/ │ └── [[default]].js # Express app handles all /api/* └── package.json
Middleware + API combo
my-app/ ├── middleware.js # Auth guard for /api/* ├── cloud-functions/ │ └── api/ │ ├── public.js # No auth needed (matcher excludes it) │ └── data.js # Protected by middleware └── package.json
Multi-language Cloud Functions
You can use different languages in the same `cloud-functions/` directory:
my-app/ ├── index.html ├── cloud-functions/ │ ├── api/ │ │ ├── users.js # Node.js — /api/users │ │ └── hello.py # Python — /api/hello │ └── service.go # Go — /service ├── go.mod ├── cloud-functions/requirements.txt └── package.json
> **Note:** Each file is built and deployed as an independent function with its own runtime. The platform detects the language by file extension.
Official AI Agent Skills for developing and deploying projects on EdgeOne Makers.
Repo: tencentedgeone/edgeone-pages-skills
Other skills on edgeone-makers-tools.
- /makers-agents
This skill guides building AI agent endpoints on EdgeOne Makers — five framework routes (DeepAgents, LangGraph, CrewAI, OpenAI Agents SDK, Claude Agent SDK), platform-injected `context.store` / `context.tools` / `context.sandbox`, conversation_id dual-channel routing, SSE
Open skill - /makers-cli
EdgeOne Makers CLI command reference. Use when running edgeone CLI commands for dev, build, deploy, env management.
Open skill - /makers-cloud-functions
EdgeOne Makers Cloud Functions — Node.js, Go, and Python runtimes. Use when building server-side APIs, Express/Koa patterns, or backend logic.
Open skill - /makers-deploy
This skill deploys frontend and full-stack projects to EdgeOne Makers (Tencent EdgeOne). Trigger this skill whenever deployment is part of the task — whether as the primary intent or a secondary step. Examples: "deploy my app", "publish this site", "push this live", "create a
Open skill - /makers-edge-functions
V8-based lightweight edge functions on EdgeOne Makers. Covers routing, KV storage access, request/response handling, and environment variables at the edge.
Open skill - /makers-env-adaption
Environment-specific adaptation rules for EdgeOne Makers Skills running in sandboxed or restricted AI coding environments (e.g. WorkBuddy). Trigger when: the user is working in WorkBuddy, a sandboxed IDE, or any non-interactive/CI environment where CLI commands may hang or
Open skill

