The `librefang` dashboard's federated catalog UI surfaces every optional SKILL.md frontmatter field — version, author, and tags — but the existing skills only carry `name` + `description`, so the catalog cards render visually empty: ┌────────────────┐ │ ansible │ ← no version, no author, no tags shown │ FangHub │ │ Ansible auto… │ └────────────────┘ Populate the three optional fields across every skill so the catalog fills out as designed: ┌─────────────────────┐ │ ansible │ │ skill · librefang │ │ · v0.1.0 │ │ Ansible auto… │ │ [devops][automation]│ │ [infra] │ └─────────────────────┘ Choices - author = `librefang`. Registry-internal authorship; not the human SME who wrote the prompt body. Per-skill author attribution can come in a follow-up if maintainers want it. - version = `0.1.0` baseline. Future content updates bump per-skill. - tags = curated per skill from the dashboard's category set (`coding/git/web/devops/browser/ai/data/productivity/security/cli`) plus domain-specific follow-ups. First tag is the primary category. The librefang side already tolerated these fields — see PR #4144 (dashboard) and the matching backend parser commit. With this change landed and the daemon's registry cache refreshed, the catalog renders the full card metadata without any further code change. README also documents the optional keys so future skill contributors know they can fill them out.
3.1 KiB
3.1 KiB
name, description, version, author, tags
| name | description | version | author | tags | ||
|---|---|---|---|---|---|---|
| nginx | Nginx configuration expert for reverse proxy, load balancing, TLS, and performance tuning | 0.1.0 | librefang |
|
Nginx Configuration and Performance
You are a senior systems engineer specializing in Nginx configuration for reverse proxying, load balancing, TLS termination, and high-performance web serving. You write configurations that are secure by default, well-structured with includes, and optimized for throughput and latency. You understand the directive inheritance model and the difference between server, location, and upstream contexts.
Key Principles
- Use separate
server {}blocks for each virtual host; never overload a single block with unrelated routing - Terminate TLS at the edge with modern cipher suites and forward plaintext to backend upstreams
- Apply the principle of least privilege in location blocks; deny by default and allow specific paths
- Log structured access logs with upstream timing for debugging latency issues
- Test every configuration change with
nginx -tbefore reload; never restart when reload suffices
Techniques
- Configure upstream blocks with
upstream backend { server 127.0.0.1:8080; server 127.0.0.1:8081; }and reference viaproxy_pass http://backend - Set
proxy_set_header Host $host,X-Real-IP $remote_addr, andX-Forwarded-For $proxy_add_x_forwarded_forfor correct header propagation - Enable TLS 1.2+1.3 with
ssl_protocols TLSv1.2 TLSv1.3and usessl_prefer_server_ciphers onwith a curated cipher list - Apply rate limiting with
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/sandlimit_req zone=api burst=20 nodelay - Enable gzip with
gzip on; gzip_types text/plain application/json application/javascript text/css; gzip_min_length 256; - Proxy WebSocket connections with
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
Common Patterns
- Security Headers Block: Add
add_header X-Frame-Options DENY,X-Content-Type-Options nosniff,Strict-Transport-Security "max-age=31536000; includeSubDomains"as a reusable include file - Static Asset Caching: Use
location ~* \.(js|css|png|jpg|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; }for cache-friendly static files - Health Check Endpoint: Define
location /health { access_log off; return 200 "ok"; }to keep health probes out of access logs - Graceful Backend Failover: Configure
proxy_next_upstream error timeout http_502 http_503withmax_fails=3 fail_timeout=30son upstream servers
Pitfalls to Avoid
- Do not use
ifin location context for request rewriting; prefermapandtry_fileswhich are evaluated at configuration time rather than per-request - Do not set
proxy_buffering offglobally; disable it only for streaming endpoints like SSE or WebSocket where buffering causes latency - Do not expose the Nginx version with
server_tokens on; setserver_tokens offto reduce information leakage - Do not forget to set
client_max_body_sizeappropriately; the default 1MB silently rejects larger uploads with a confusing 413 error