1390/woofi-data/SKILL.md
Complete WOOFi integration — DEX analytics, swap quotes, swap execution with tx generation, pool states, protocol revenue across 16 chains. Updated from woonetwork/woofi-skills v1.1.
npx skillsauth add starchild-ai-agent/community-skills @1390/woofi-dataInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Fetch WOOFi DEX metrics for market analysis, reporting, and DeFi research.
Updated: 2026-03-23 — Aligned with woonetwork/woofi-skills v1.1 (2026-03-20)
v4.0.0 adds complete swap functionality:
POST /v1/quote) — Get exchange rates without executingPOST /v1/swap) — Generate on-chain transaction data with approval stepstx_steps array for sequential signing and broadcastWhat's New in v4.0.0:
POST /v1/quote — Token swap quotes with slippage protection (sapi.woofi.com)POST /v1/swap — Complete swap execution with tx step generation and approval handling/swap endpoint documentation (legacy api.woofi.com)| Detail | Value |
|--------|-------|
| Base URL | https://api.woofi.com |
| Auth | None (fully public) |
| Rate Limit | 5 requests/second |
| Chains | bsc, avalanche, polygon, arbitrum, optimism, linea, base, mantle, sonic, berachain, hyperevm, monad, solana, fantom, zksync, polygon_zkevm, sei |
/swap_supportQuery supported networks, DEXs, and tokens for WOOFi swaps.
Trigger phrases: "swap support", "supported networks", "supported tokens", "which chains"
Example:
curl "https://api.woofi.com/swap_support"
Response fields:
dexs — List of DEX integrations per chain (uni_swap, sushi_swap, curve, woofi, etc.)network_infos — Chain metadata (name, RPC URL, chain ID, explorer, bridge support)token_infos — Supported tokens with address, symbol, decimals, swap_enable flagswap_enable — Whether swapping is currently active for this token/networkbridge_enable — Whether cross-chain bridging is supported⚠️ Note: Paused networks (fantom, zksync, polygon_zkevm) have swap_enable=false for all tokens.
POST /v1/quote 🆕Get token exchange rates and expected receive amounts without executing a trade. Uses the new sapi.woofi.com API.
Base URL: https://sapi.woofi.com
Endpoint: POST /v1/quote
Content-Type: application/json
Trigger phrases: "quote", "price", "exchange rate", "token price", "how much will I get"
All parameters are passed in the JSON body.
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| chain_id | integer | Yes | — | Network chain ID (e.g., Base: 8453, Arbitrum: 42161, BSC: 56, Polygon: 137) |
| sell_token | string | Yes | — | Address or symbol of token to sell (Native ETH/BNB/etc is 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) |
| buy_token | string | Yes | — | Address or symbol of token to buy |
| sell_amount | string | Yes | — | Human-readable amount to sell (e.g., "1.5") |
| slippage_pct | float | No | 0.5 | Max allowed slippage percentage |
| woofi_only | boolean | No | false | If true, only sources quotes directly from WOOFi |
| Field | Type | Description |
|-------|------|-------------|
| chain_id | integer | Chain ID |
| sell_token | string | Sell token address |
| buy_token | string | Buy token address |
| sell_amount | string | Sell amount requested |
| buy_amount | string | Expected buy amount |
| price | string | Current execution price |
| guaranteed_price | string | Minimum guaranteed price after considering slippage |
Example:
curl -X POST "https://sapi.woofi.com/v1/quote" \
-H "Content-Type: application/json" \
-d '{
"chain_id": 42161,
"sell_token": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"buy_token": "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
"sell_amount": "1000"
}'
Response:
{
"chain_id": 42161,
"sell_token": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"buy_token": "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
"sell_amount": "1000",
"buy_amount": "0.01524300",
"price": "0.000015243",
"guaranteed_price": "0.000015167"
}
⚠️ Important:
swap execution to verify expectations0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeEPOST /v1/swap 🆕Generate blockchain-ready transaction data for swaps, including necessary token approvals.
Base URL: https://sapi.woofi.com
Endpoint: POST /v1/swap
Content-Type: application/json
Trigger phrases: "swap", "trade", "execute swap", "build transaction", "swap tokens"
This endpoint inherits all parameters from the Quote endpoint, plus execution-specific ones:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| chain_id | integer | Yes | Network chain ID (e.g., Base: 8453, Arbitrum: 42161) |
| sell_token | string | Yes | Token address/symbol to sell (Native is 0xEeeeeE...) |
| buy_token | string | Yes | Token address/symbol to buy |
| sell_amount | string | Yes | Human-readable amount to sell (e.g., "1.5") |
| to | string | Yes | The wallet address that will receive the purchased tokens |
| rebate_to | string | Yes | Rebate receiving address (typically same as to) |
| slippage_pct | float | No | Max allowed slippage percentage (default: 0.5) |
| signer_address | string | No | User's wallet address initiating the swap. Used to check if an Approve is required. |
| Field | Type | Description |
|-------|------|-------------|
| needs_approve | boolean | If true, user must approve the router contract before swapping |
| tx_steps | array | List of transaction steps to be signed and submitted on-chain |
| buy_amount | string | Expected buy amount |
| price | string | Current execution price |
| guaranteed_price | string | Minimum guaranteed price |
Each item in tx_steps represents an on-chain call:
to: Target contract address for this stepdata: Hex string representing the transaction data payloadvalue: Amount of native token to send in Weidesc: Human-readable description (e.g., "Approve USDC for WOOFi Router")Example:
curl -X POST "https://sapi.woofi.com/v1/swap" \
-H "Content-Type: application/json" \
-d '{
"chain_id": 42161,
"sell_token": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"buy_token": "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
"sell_amount": "1000",
"to": "0xYourWalletAddress",
"rebate_to": "0xYourWalletAddress",
"signer_address": "0xYourWalletAddress"
}'
Response:
{
"chain_id": 42161,
"sell_token": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"buy_token": "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
"sell_amount": "1000",
"buy_amount": "0.01524300",
"price": "0.000015243",
"guaranteed_price": "0.000015167",
"needs_approve": true,
"tx_steps": [
{
"to": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"data": "0x095ea7b3...",
"value": "0",
"desc": "Approve USDC for WOOFi Router"
},
{
"to": "0x4c4AF8DBc524681930a27b2F1Af5bcC8062E6fB7",
"data": "0x...",
"value": "0",
"desc": "Swap 1000 USDC for WBTC via WOOFi"
}
]
}
⚠️ Critical:
tx_steps contains multiple items, they MUST be submitted to the blockchain in the exact order provided (Approve must confirm before Swap)0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeEneeds_approve: If true, the approval transaction must be executed first/swapGet swap quote for token exchange using the legacy api.woofi.com endpoint. Returns routing info, expected output amount, and price impact.
Trigger phrases: "swap quote", "quote ETH to USDC", "how much USDC for 1 ETH", "swap price"
Parameters:
from_token (required): Source token contract address (or 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native ETH)to_token (required): Destination token contract addressfrom_amount (required): Amount in smallest unit (wei for ETH, 6 decimals for USDC)network (required): Chain name (e.g., "arbitrum", "bsc", "base")slippage (optional): Slippage tolerance in basis points (e.g., 50 = 0.5%, default: 50)Example:
# Quote: 0.1 ETH → USDC on Arbitrum
curl "https://api.woofi.com/swap?from_token=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE&to_token=0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8&from_amount=100000000000000000&network=arbitrum"
Response structure:
{
"status": "ok",
"data": {
"from_token": {...},
"to_token": {...},
"from_amount": "100000000000000000",
"to_amount": "245000000", # Expected output (in to_token decimals)
"price_impact": "0.15", # Price impact percentage
"routing_info": {
"sources": [
{"name": "woofi", "percentage": "60.5"},
{"name": "uni_swap", "percentage": "39.5"}
]
},
"gas_estimate": "150000"
}
}
⚠️ Important:
from_amount must be in the token's smallest unit (wei for 18-decimal tokens)to_amount will be in the destination token's decimal precision0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE/multi_total_stat, /total_stat, /cumulate_statCross-chain aggregated trading statistics.
Trigger phrases: "total volume", "total stats", "cross chain stats", "24h stats", "overall volume"
Example:
# Cross-chain total
curl "https://api.woofi.com/multi_total_stat"
# Single chain total
curl "https://api.woofi.com/total_stat?network=arbitrum"
# Cumulative stat
curl "https://api.woofi.com/cumulate_stat?network=bsc"
/statVolume, trader count, and transaction count by period and chain.
Trigger phrases: "trading stats", "trading volume", "woofi stats", "how much volume", "trader count"
Parameters:
period (required): 1d, 1w, 1m, 3m, 1y, allnetwork (required): chain name from list above⚠️ CRITICAL: volume_usd is in wei — divide by 10^18 to get USD value
Example:
curl "https://api.woofi.com/stat?period=1d&network=arbitrum"
Response:
{
"status": "ok",
"data": [
{
"timestamp": 1710892800,
"volume_usd": "1234567890123456789012",
"traders": 1523,
"txns": 8942
}
]
}
/source_statVolume breakdown by integrator/aggregator source.
Trigger phrases: "volume by source", "top integrators", "who is sending volume", "traffic source"
Parameters:
period (required): 1d, 1w, 1m, 3m, 1y, allnetwork (required): chain nameExample:
curl "https://api.woofi.com/source_stat?period=1m&network=arbitrum"
Response fields per source:
name — Source name (e.g. "1inch", "0x", "Paraswap", "WOOFi", "KyberSwap", "ODOS")volume_usd — Volume in wei (÷ 10^18 = USD)percentage — Share of total volume (string, e.g. "45.2")traders, txs — Unique wallets and tx countKnown integrators: 1inch, 0x, ODOS, KyberSwap, Paraswap, THORSwap, OKX, BitKeep, Firebird, Transit Swap, Hera Fireance, Yeti, Joy, ZetaFarm, Slingshot, unizen, 1delta, KALM, ONTO, Velora, Nativo, etc.
/token_statPer-token 24-hour trading statistics including TVL, volume, and turnover rate.
Trigger phrases: "token stats", "token volume", "token tvl", "top tokens"
Parameters:
network (required): chain nameExample:
curl "https://api.woofi.com/token_stat?network=arbitrum"
/solana_statSolana-specific raw pool statistics.
Trigger phrases: "solana stats", "solana pool", "solana trading"
Example:
curl "https://api.woofi.com/solana_stat"
/yieldVault TVL, APY, and yield composition per chain.
Trigger phrases: "earn tvl", "earn vault", "yield farming", "woofi earn", "tvl", "apy"
Parameters:
network (required): chain nameExample:
curl "https://api.woofi.com/yield?network=base"
Response structure:
auto_compounding — Map of vault address → vault data
total_deposit — TVL in wei (÷ 10^18 = USD)apy — Current APY (decimal, e.g. 0.045 = 4.5%)source_apy — Breakdown of yield sourcestotal_deposit — Chain-wide total TVL in wei/earn_summarySupercharger vault APR summary across all networks, sorted by APR.
Trigger phrases: "earn summary", "supercharger", "earn apr", "best earn vault", "vault ranking"
Example:
curl "https://api.woofi.com/earn_summary"
⚠️ Note: Paused networks (fantom, zksync, polygon_zkevm) are excluded.
/stakingv2Global WOO token staking statistics including base APR and Multiplier Point boost.
Trigger phrases: "woo staking", "staking apr", "staked woo", "multiplier points"
Example:
curl "https://api.woofi.com/stakingv2"
Response fields:
total_woo_staked — Total WOO staked in wei (÷ 10^18)avg_apr — Current average staking APRbase_apr — Base APR componentmp_boosted_apr — Multiplier-boosted APR component/user_balances, /user_supercharger_infos, /user_stakingv2_infos, /boosted_apr_infoUser portfolio data including token balances, Supercharger positions, staking info, and boosted APR status.
Trigger phrases: "user balance", "user portfolio", "my position", "user staking", "boosted apr"
Parameters:
user or user_address (required): User wallet address (checksummed for EVM)Example:
curl "https://api.woofi.com/user_balances?user_address=0x..."
curl "https://api.woofi.com/user_supercharger_infos?user_address=0x..."
curl "https://api.woofi.com/user_stakingv2_infos?user_address=0x..."
curl "https://api.woofi.com/boosted_apr_info?user_address=0x..."
/user_trading_volumes, /user_perp_volumesUser swap and perpetual trading volume history.
Trigger phrases: "user trading volume", "my volume", "user perp volume", "trading history"
Parameters:
user or user_address (required): User wallet addressperiod (required): 7d, 14d, 30d (different from stat endpoints!)Example:
curl "https://api.woofi.com/user_trading_volumes?user_address=0x...&period=30d"
curl "https://api.woofi.com/user_perp_volumes?user_address=0x...&period=7d"
/woofi_pro/perps_volumeWOOFi Pro daily perpetual trading volume.
Trigger phrases: "perps volume", "woofi pro", "woofi dex", "perpetual volume"
Example:
curl "https://api.woofi.com/woofi_pro/perps_volume"
/integration/pairs, /integration/tickers, /integration/pool_states 🆕Trading pairs, 24-hour ticker data, and pool states for third-party integrations.
Trigger phrases: "trading pairs", "ticker data", "pool state", "integration pairs", "fee rate", "pool liquidity"
Example:
curl "https://api.woofi.com/integration/pairs?network=arbitrum"
curl "https://api.woofi.com/integration/tickers?network=arbitrum"
curl "https://api.woofi.com/integration/pool_states?network=arbitrum"
Pool states response includes:
reserve — Token reserve in the WooPP poolfee_rate — Trading fee rate (in basis points)max_gamma — Maximum gamma parameter for sPMM pricingmax_notional_swap — Maximum notional swap sizecap_bal — Maximum balance cap for the tokenprice — Current oracle price (18-decimal fixed point)spread — Price spread from the oracle/analytics/daily_fee 🆕Daily net protocol revenue breakdown for WOOFi Swap and WOOFi Pro.
Trigger phrases: "protocol revenue", "daily fee", "woofi revenue", "fee breakdown"
Parameters:
start_date (required): Start date in YYYY-MM-DD formatend_date (required): End date in YYYY-MM-DD formatExample:
curl "https://api.woofi.com/analytics/daily_fee?start_date=2026-03-01&end_date=2026-03-20"
Response:
{
"status": "ok",
"data": [
{
"date": "2026-03-20",
"swap": 1732.845286, # Swap revenue (USD)
"pro": 845.123456 # Pro perps revenue (USD)
}
]
}
| Network | /stat | /source_stat | /token_stat | /yield | /earn_summary | /stakingv2 | /user_* | /integration | /swap | |---------|-------|--------------|-------------|--------|---------------|------------|---------|--------------|-------| | BSC | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Avalanche | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Polygon | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Arbitrum | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Optimism | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Linea | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Base | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Mantle | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Sonic | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | Berachain | Yes | Yes | Yes | Yes | Yes | — | Yes | Yes | Yes | | HyperEVM | Yes | Yes | Yes | No | — | — | Yes | Yes | Yes | | Monad | Yes | Yes | Yes | No | — | — | Yes | Yes | Yes | | Solana | Yes | Yes | Yes | No | — | — | No | No | Yes | | Fantom | Yes | Yes | Yes | Yes | Paused | — | Yes | Yes | Paused | | zkSync | Yes | Yes | Yes | Yes | Paused | — | Yes | Yes | Paused | | Polygon zkEVM | Yes | Yes | Yes | Yes | Paused | — | Yes | Yes | Paused | | Sei | — | — | — | — | — | — | — | — | Pro only | | (global) | — | — | — | — | — | Yes | — | — | — |
| Network | Chain ID | /v1/quote | /v1/swap | |---------|----------|-----------|----------| | BSC | 56 | Yes | Yes | | Avalanche | 43114 | Yes | Yes | | Polygon | 137 | Yes | Yes | | Arbitrum | 42161 | Yes | Yes | | Optimism | 10 | Yes | Yes | | Linea | 59144 | Yes | Yes | | Base | 8453 | Yes | Yes | | Mantle | 5000 | Yes | Yes | | Sonic | 146 | Yes | Yes | | Berachain | 80094 | Yes | Yes | | HyperEVM | 714 | Yes | Yes | | Monad | 10143 | Yes | Yes | | Fantom | 250 | Yes | Yes | | Polygon zkEVM | 1101 | Yes | Yes |
Note: v1 API uses chain_id instead of network name. Solana and Sei are not yet supported on v1 API.
import requests
# Get quote (read-only, no execution)
response = requests.post(
"https://sapi.woofi.com/v1/quote",
json={
"chain_id": 42161,
"sell_token": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", # USDC
"buy_token": "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f", # WBTC
"sell_amount": "1000",
"slippage_pct": 0.5
}
).json()
print(f"Expected receive: {response['buy_amount']} WBTC")
print(f"Price: {response['price']}")
print(f"Guaranteed price: {response['guaranteed_price']}")
import requests
# Build swap transaction
response = requests.post(
"https://sapi.woofi.com/v1/swap",
json={
"chain_id": 42161,
"sell_token": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"buy_token": "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
"sell_amount": "1000",
"to": "0xYourWalletAddress",
"rebate_to": "0xYourWalletAddress",
"signer_address": "0xYourWalletAddress"
}
).json()
# Check if approval needed
if response["needs_approve"]:
print("⚠️ Approval required first!")
approve_tx = response["tx_steps"][0]
print(f"Approve: {approve_tx['desc']}")
print(f" To: {approve_tx['to']}")
print(f" Data: {approve_tx['data']}")
# Swap transaction
swap_tx = response["tx_steps"][-1]
print(f"\nSwap: {swap_tx['desc']}")
print(f" To: {swap_tx['to']}")
print(f" Data: {swap_tx['data']}")
print(f" Expected: {response['buy_amount']} WBTC")
import requests
# First, get token addresses from swap_support
r = requests.get("https://api.woofi.com/swap_support").json()
arb_tokens = r["data"]["arbitrum"]["token_infos"]
eth_addr = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
usdc_addr = "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8"
# Get quote
r = requests.get(
"https://api.woofi.com/swap",
params={
"from_token": eth_addr,
"to_token": usdc_addr,
"from_amount": "100000000000000000", # 0.1 ETH in wei
"network": "arbitrum"
}
).json()
if r["status"] == "ok":
to_amount = int(r["data"]["to_amount"]) / 1e6 # USDC has 6 decimals
print(f"0.1 ETH → ${to_amount:,.2f} USDC")
print(f"Price impact: {r['data']['price_impact']}%")
Use the script in scripts/total_volume.py:
python skills/woofi-data/scripts/total_volume.py --period 1m
Use the script in scripts/total_tvl.py:
python skills/woofi-data/scripts/total_tvl.py
import requests
r = requests.get(
"https://api.woofi.com/analytics/daily_fee",
params={"start_date": "2026-03-01", "end_date": "2026-03-20"}
).json()
total_swap = sum(d["swap"] for d in r["data"])
total_pro = sum(d["pro"] for d in r["data"])
print(f"Swap revenue: ${total_swap:,.2f}")
print(f"Pro revenue: ${total_pro:,.2f}")
import requests
# Trading stats
r = requests.get("https://api.woofi.com/stat?period=1d&network=arbitrum").json()
volume_usd = int(r["data"][0]["volume_usd"]) / 1e18
print(f"Arbitrum 24h volume: ${volume_usd:,.0f}")
# Earn yields
r = requests.get("https://api.woofi.com/yield?network=base").json()
tvl = int(r["data"]["total_deposit"]) / 1e18
print(f"Base Earn TVL: ${tvl:,.0f}")
# WOO staking
r = requests.get("https://api.woofi.com/stakingv2").json()
woo_staked = int(r["data"]["total_woo_staked"]) / 1e18
print(f"Total WOO staked: {woo_staked:,.0f} WOO")
# Pool states
r = requests.get("https://api.woofi.com/integration/pool_states?network=arbitrum").json()
print(f"Pool data: {r['data']}")
chain_id (e.g., 42161), not network namessell_amount uses decimal format (e.g., "1.5"), NOT weitx_steps has multiple items, execute in order (approve → swap)needs_approve check — Always check this flag before attempting swap0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for ETH, BNB, etc.volume_usd, total_deposit) are in wei. Always divide by 10^18.from_amount and parse to_amount accordingly.1m returns 30 days of daily buckets, not a single aggregated value. Sum all buckets for total./stakingv2 doesn't take a network param — it's the same across all chains.trader_count across time buckets — each bucket is independently unique-per-period.1d — Returns hourly buckets. All other periods return daily buckets.7d, 14d, 30d (different from stat endpoints)./multi_total_stat and /user_trading_volumes aggregate automatically.fantom, zksync, polygon_zkevm are excluded from /earn_summary and have swap_enable=false.0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE as the token address for ETH.sell_amount is human-readable (e.g., "1.5"), NOT wei. But buy_amount in response still needs decimal parsing based on token decimals.https://api.woofi.com/llms.txthttps://learn.woo.orghttps://github.com/woonetwork/woofi-skillshttps://github.com/woonetwork/woofi-python-sdktools
TQX (tqx.trade) HK/US stock quant workflow via tqx-cli: cross-sectional factor analysis, event-driven strategy backtests on the panda_backtest engine, and agent-driven automated paper trading. Use when the user wants to run factor IC/IR analysis, backtest a Python trading strategy on Hong Kong or US stocks, or set up agent-automated trading (e.g. "backtest a moving-average strategy on AAPL", "analyze a momentum factor on HK stocks", "let the agent trade my paper account").
tools
中学物理实验教学参赛方案套件。包含四个完整实验(单摆测g、声悬浮测声速、向心力定量演示仪、电磁阻尼定量研究),每套含固件源码、3D打印图纸、教学PPT、教学文稿、采购清单、调试手册、视频分镜脚本、模拟器。Use when a teacher/student needs a complete, classroom-ready physics experiment package for competition or teaching.
development
End-to-end blog management for AI agents. Write, import, build, preview, and publish articles using the blog template. Covers draft workflow, article import, SEO, OG images, and deployment.
development
ESP8266/ESP32 + 磁簧开关/霍尔传感器 单摆测重力加速度实验套件。 硬件搭建→固件烧录→数据采集→Web仪表盘→g值计算→教学文档,一站式完成。 Use when the user wants to build a pendulum g-measurement experiment, measure gravity with a micro-controller, or needs a complete physics experiment package with hardware + firmware + dashboard + teaching materials.