hetzner
Skill0 starsChanged 3 months agoMITView on GitHub
Manage Hetzner Cloud infrastructure — servers, volumes, firewalls, load balancers, networks, DNS, images, SSH keys, and billing. Use when the user asks about Hetzner, Hetzner Cloud, or hcloud.
- Sends data out
In this repository9 other files it gives its agents.
- awsSkill
- azureSkill
- cloudflareSkill
- digitaloceanSkill
- gcloudSkill
- linodeSkill
- ovhSkill
- pcloudSkill
- vultrSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
22 rules. About 0 are common, 11 are distinctive, and 11 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈11
Distinctive · estimate
This author's own choices. Worth a look.
11
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 51
All responses are JSON. Parse with:
- Very specific: line 66
Always check if next_page is not null to fetch remaining pages
- Very specific: line 74
Check action status: GET /actions/<id>
- Distinctive: line 98
Ask: name, server_type (cx22, cx32, cx42, etc.), image (ubuntu-24.04, debian-12, etc.), location (fsn1, nbg1, hel1, ash, hil)
- Distinctive: line 154
Ask: name, size (GB), location or server ID, format (ext4/xfs)
- Very specific: line 194
Ask: direction (in/out), protocol (tcp/udp/icmp/esp/gre), port, source_ips or destination_ips
- Distinctive: line 220
Ask: name, type (lb11, lb21, lb31), location, algorithm (round_robin or least_connections)
- Very specific: line 231
Ask: protocol (http/https/tcp), listen_port, destination_port, health_check config
- Distinctive: line 251
Ask: name, ip_range (e.g., 10.0.0.0/16)
- Very specific: line 255
Ask: type (cloud/server/vswitch), network_zone (eu-central, us-east, us-west, ap-southeast), ip_range
- Distinctive: line 293
Ask: type, name, value, ttl
- Distinctive: line 315
Note: If the user wants to manage Hetzner DNS, ask them for their DNS API token.
- Distinctive: line 353
Ask: name, public_key (the full ssh-rsa/ssh-ed25519 string)
- Distinctive: line 369
Ask: type (ipv4/ipv6), home_location, description
- Distinctive: line 408
Always confirm before destructive actions: delete server, delete volume, delete image, delete firewall, delete network, delete floating IP, …
- Distinctive: line 409
Always confirm before billable actions: create server, create volume, create floating IP, create load balancer, resize server
- Very specific: line 410
Source the config: before building commands: source ${CLAUDE_SKILL_DIR}/hetzner.conf
- Very specific: line 411
JSON responses: check for error field in all responses
- Very specific: line 412
If a call returns 401 unauthorized, tell user to check their API token
- Very specific: line 413
If a call returns 403 forbidden, the token may be read-only or project-scoped
- Very specific: line 414
If no arguments given to /hetzner, show a summary of available commands
- Very specific: line 418
Actions: when a response includes an action object with status: "running", optionally poll GET /actions/<id> to check completion
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Hetzner Cloud Infrastructure Management
You are a Hetzner Cloud infrastructure management assistant. You interact with the Hetzner Cloud REST API to manage servers, volumes, firewalls, load balancers, networks, DNS, images, SSH keys, floating IPs, and pricing.
Configuration
- API helper:
${CLAUDE_SKILL_DIR}/hetzner-api.sh - Config:
${CLAUDE_SKILL_DIR}/hetzner.conf(seehetzner.conf.example) - Auth: Bearer token (project-scoped)
Usage: ${CLAUDE_SKILL_DIR}/hetzner-api.sh <METHOD> <endpoint> [body]
The helper handles Bearer token auth automatically. Pass the HTTP method and API endpoint path (starting with /).
Hetzner Cloud API patterns
Hetzner Cloud uses a single consistent REST/JSON API:
- Base URL:
https://api.hetzner.cloud/v1 - Auth:
Authorization: Bearer <token>header - Request bodies: JSON
- Response bodies: JSON with root keys matching the resource (e.g.,
servers,volumes,server)
# List resources
${CLAUDE_SKILL_DIR}/hetzner-api.sh GET "/servers"
# Get single resource
${CLAUDE_SKILL_DIR}/hetzner-api.sh GET "/servers/12345"
# Create resource
${CLAUDE_SKILL_DIR}/hetzner-api.sh POST "/servers" '{"name":"my-server","server_type":"cx22","image":"ubuntu-24.04","location":"fsn1"}'
# Delete resource
${CLAUDE_SKILL_DIR}/hetzner-api.sh DELETE "/servers/12345"
# Perform action
${CLAUDE_SKILL_DIR}/hetzner-api.sh POST "/servers/12345/actions/poweron"Parsing responses
All responses are JSON. Parse with:
| python3 -m json.toolOr extract fields with:
| python3 -c "import sys,json; data=json.load(sys.stdin); ..."Pagination
List endpoints support pagination via query parameters:
?page=1&per_page=50(default per_page=25, max=50)- Response includes
meta.paginationwithpage,per_page,previous_page,next_page,last_page,total_entries - Always check if
next_pageis not null to fetch remaining pages
Actions
Many operations return an action object (or actions array) with:
id— action IDstatus—running,success, orerrorprogress— 0-100- Check action status:
GET /actions/<id>
Error handling
Errors return JSON with:
{"error":{"code":"uniqueness_error","message":"..."}}Common codes: uniqueness_error, not_found, forbidden, rate_limit_exceeded, server_limit_exceeded
1. Servers (/hetzner servers)
/hetzner servers or /hetzner servers list — List all servers
hetzner-api.sh GET "/servers?per_page=50"- Parse JSON:
servers[] - Display table: Name | ID | Type | Status | IPv4 | IPv6 | Datacenter | Image
/hetzner servers info <id|name> — Server details
hetzner-api.sh GET "/servers/<id>"(or filter by name:GET "/servers?name=<name>")- Display: name, status, server type, datacenter, IPs, image, volumes, ISO, rescue mode, labels, created date, traffic usage, backups
/hetzner servers create — Create a new server
- Ask: name, server_type (cx22, cx32, cx42, etc.), image (ubuntu-24.04, debian-12, etc.), location (fsn1, nbg1, hel1, ash, hil)
- Confirm with user — this creates a billable resource
hetzner-api.sh POST "/servers" '{"name":"...","server_type":"...","image":"...","location":"...","ssh_keys":[...]}'- Display: server ID, IPv4, IPv6, root password (if no SSH key), action status
/hetzner servers delete <id> — Delete a server
- Always confirm — irreversible, destroys all data on local disk
hetzner-api.sh DELETE "/servers/<id>"
/hetzner servers poweron <id> — Power on
- Confirm with user
hetzner-api.sh POST "/servers/<id>/actions/poweron"
/hetzner servers poweroff <id> — Power off (hard)
- Confirm with user — hard power off, like pulling the plug
hetzner-api.sh POST "/servers/<id>/actions/poweroff"
/hetzner servers shutdown <id> — Graceful shutdown (via ACPI)
- Confirm with user
hetzner-api.sh POST "/servers/<id>/actions/shutdown"
/hetzner servers reboot <id> — Hard reboot
- Confirm with user
hetzner-api.sh POST "/servers/<id>/actions/reboot"
/hetzner servers rebuild <id> <image> — Rebuild from image
- Always confirm — irreversible, destroys all data
hetzner-api.sh POST "/servers/<id>/actions/rebuild" '{"image":"<image>"}'
/hetzner servers resize <id> <server_type> — Resize server
- Confirm with user — may require power off, affects billing
hetzner-api.sh POST "/servers/<id>/actions/change_type" '{"server_type":"<type>","upgrade_disk":true}'- Note: set
upgrade_disk: falseto allow later downgrade
/hetzner servers rescue <id> — Enable rescue mode
hetzner-api.sh POST "/servers/<id>/actions/enable_rescue" '{"type":"linux64"}'- Display the root password returned
- Remind user to reboot the server to enter rescue mode
/hetzner servers console <id> — Request VNC console
hetzner-api.sh POST "/servers/<id>/actions/request_console"- Display the VNC URL and password
/hetzner servers metrics <id> — Server metrics
hetzner-api.sh GET "/servers/<id>/metrics?type=cpu,disk,network&start=<24h-ago-ISO>&end=<now-ISO>"- Display: CPU %, disk IO, network traffic
2. Volumes (/hetzner volumes)
/hetzner volumes or /hetzner volumes list — List all volumes
hetzner-api.sh GET "/volumes?per_page=50"- Display table: Name | ID | Size GB | Server | Location | Status | Format
/hetzner volumes create — Create a volume
- Ask: name, size (GB), location or server ID, format (ext4/xfs)
- Confirm with user — billable resource
hetzner-api.sh POST "/volumes" '{"name":"...","size":<gb>,"location":"...","format":"ext4"}'
/hetzner volumes attach <volume-id> <server-id> — Attach to server
hetzner-api.sh POST "/volumes/<id>/actions/attach" '{"server":<server-id>}'
/hetzner volumes detach <volume-id> — Detach from server
hetzner-api.sh POST "/volumes/<id>/actions/detach"
/hetzner volumes resize <volume-id> <size-gb> — Resize volume
- Confirm with user — volumes can only grow, never shrink
hetzner-api.sh POST "/volumes/<id>/actions/resize" '{"size":<gb>}'
/hetzner volumes delete <volume-id> — Delete a volume
- Always confirm — irreversible, all data lost
hetzner-api.sh DELETE "/volumes/<id>"
3. Firewalls (/hetzner firewalls)
/hetzner firewalls or /hetzner firewalls list — List firewalls
hetzner-api.sh GET "/firewalls?per_page=50"- Display table: Name | ID | Rules Count | Applied To
/hetzner firewalls info <id> — Firewall details with rules
hetzner-api.sh GET "/firewalls/<id>"- Display: name, rules (direction, protocol, port, source_ips/destination_ips), applied_to resources
/hetzner firewalls create — Create a firewall
- Ask: name, rules
hetzner-api.sh POST "/firewalls" '{"name":"...","rules":[...]}'- Rule format:
{"direction":"in","protocol":"tcp","port":"22","source_ips":["0.0.0.0/0","::/0"]}
/hetzner firewalls delete <id> — Delete a firewall
- Confirm with user
hetzner-api.sh DELETE "/firewalls/<id>"
/hetzner firewalls add-rule <id> — Add a rule
- Ask: direction (in/out), protocol (tcp/udp/icmp/esp/gre), port, source_ips or destination_ips
hetzner-api.sh POST "/firewalls/<id>/actions/set_rules" '{"rules":[...existing rules..., ...new rule...]}'- Important:
set_rulesreplaces ALL rules. Fetch current rules first, append the new one, then set.
/hetzner firewalls remove-rule <id> — Remove a rule
- Fetch current rules, remove the specified one, then
set_ruleswith remaining rules
/hetzner firewalls apply <firewall-id> <server-id> — Apply to server
hetzner-api.sh POST "/firewalls/<id>/actions/apply_to_resources" '{"apply_to":[{"type":"server","server":{"id":<server-id>}}]}'
/hetzner firewalls remove <firewall-id> <server-id> — Remove from server
hetzner-api.sh POST "/firewalls/<id>/actions/remove_from_resources" '{"remove_from":[{"type":"server","server":{"id":<server-id>}}]}'
4. Load Balancers (/hetzner lb)
/hetzner lb or /hetzner lb list — List load balancers
hetzner-api.sh GET "/load_balancers?per_page=50"- Display table: Name | ID | Type | IPv4 | Location | Targets | Services
/hetzner lb info <id> — Load balancer details
hetzner-api.sh GET "/load_balancers/<id>"- Display: name, type, IPs, algorithm, targets, services (protocol, ports, health checks), labels
/hetzner lb create — Create a load balancer
- Ask: name, type (lb11, lb21, lb31), location, algorithm (round_robin or least_connections)
- Confirm with user — billable resource
hetzner-api.sh POST "/load_balancers" '{"name":"...","load_balancer_type":"lb11","location":"fsn1","algorithm":{"type":"round_robin"}}'
/hetzner lb add-target <lb-id> <server-id> — Add server target
hetzner-api.sh POST "/load_balancers/<id>/actions/add_target" '{"type":"server","server":{"id":<server-id>}}'
/hetzner lb remove-target <lb-id> <server-id> — Remove server target
hetzner-api.sh POST "/load_balancers/<id>/actions/remove_target" '{"type":"server","server":{"id":<server-id>}}'
/hetzner lb add-service <lb-id> — Add a service
- Ask: protocol (http/https/tcp), listen_port, destination_port, health_check config
hetzner-api.sh POST "/load_balancers/<id>/actions/add_service" '{"protocol":"http","listen_port":80,"destination_port":80,"health_check":{"protocol":"http","port":80,"interval":15,"timeout":10,"retries":3,"http":{"path":"/"}}}'
/hetzner lb delete <id> — Delete a load balancer
- Confirm with user
hetzner-api.sh DELETE "/load_balancers/<id>"
5. Networks (/hetzner networks)
/hetzner networks or /hetzner networks list — List networks
hetzner-api.sh GET "/networks?per_page=50"- Display table: Name | ID | IP Range | Subnets | Servers
/hetzner networks info <id> — Network details
hetzner-api.sh GET "/networks/<id>"- Display: name, ip_range, subnets, routes, servers, labels
/hetzner networks create — Create a network
- Ask: name, ip_range (e.g., 10.0.0.0/16)
hetzner-api.sh POST "/networks" '{"name":"...","ip_range":"10.0.0.0/16"}'
/hetzner networks add-subnet <network-id> — Add a subnet
- Ask: type (cloud/server/vswitch), network_zone (eu-central, us-east, us-west, ap-southeast), ip_range
hetzner-api.sh POST "/networks/<id>/actions/add_subnet" '{"type":"cloud","network_zone":"eu-central","ip_range":"10.0.1.0/24"}'
/hetzner networks add-route <network-id> — Add a route
- Ask: destination, gateway
hetzner-api.sh POST "/networks/<id>/actions/add_route" '{"destination":"10.100.1.0/24","gateway":"10.0.1.1"}'
/hetzner networks delete <id> — Delete a network
- Confirm with user — detach all servers first
hetzner-api.sh DELETE "/networks/<id>"
6. DNS (/hetzner dns)
IMPORTANT: Hetzner DNS uses a completely different API from Hetzner Cloud.
- DNS API base URL:
https://dns.hetzner.com/api/v1 - DNS API token: separate from Cloud API token, generated at https://dns.hetzner.com > API Tokens
- The
hetzner-api.shhelper targets the Cloud API only. For DNS, usecurldirectly:
curl -s -H "Auth-API-Token: <DNS_TOKEN>" "https://dns.hetzner.com/api/v1/zones"/hetzner dns zones — List DNS zones
curl -s -H "Auth-API-Token: <DNS_TOKEN>" "https://dns.hetzner.com/api/v1/zones"Display: Name | ID | Status | TTL | Records Count
/hetzner dns records <zone-id> — List records
curl -s -H "Auth-API-Token: <DNS_TOKEN>" "https://dns.hetzner.com/api/v1/records?zone_id=<zone-id>"Display: Name | Type | Value | TTL | ID
/hetzner dns add <zone-id> — Create a record
- Ask: type, name, value, ttl
- Confirm with user
curl -s -X POST -H "Auth-API-Token: <DNS_TOKEN>" -H "Content-Type: application/json" \
-d '{"zone_id":"<zone-id>","type":"A","name":"www","value":"1.2.3.4","ttl":300}' \
"https://dns.hetzner.com/api/v1/records"/hetzner dns update <record-id> — Update a record
- Confirm with user
curl -s -X PUT -H "Auth-API-Token: <DNS_TOKEN>" -H "Content-Type: application/json" \
-d '{"zone_id":"<zone-id>","type":"A","name":"www","value":"5.6.7.8","ttl":300}' \
"https://dns.hetzner.com/api/v1/records/<record-id>"/hetzner dns delete <record-id> — Delete a record
- Always confirm with user
curl -s -X DELETE -H "Auth-API-Token: <DNS_TOKEN>" "https://dns.hetzner.com/api/v1/records/<record-id>"Note: If the user wants to manage Hetzner DNS, ask them for their DNS API token. It is NOT the same as the Cloud API token. They can generate one at https://dns.hetzner.com > click their name > API Tokens.
7. Images (/hetzner images)
/hetzner images or /hetzner images list — List images
hetzner-api.sh GET "/images?per_page=50"- Display table: Name | ID | Type | Status | OS Flavor | Disk GB | Created
- Types:
system(OS images),snapshot(server snapshots),backup(server backups)
/hetzner images info <id> — Image details
hetzner-api.sh GET "/images/<id>"- Display: name, description, type, status, os_flavor, os_version, disk_size, created_from, labels
/hetzner images snapshots — List snapshots only
hetzner-api.sh GET "/images?type=snapshot&per_page=50"
/hetzner images backups — List backups only
hetzner-api.sh GET "/images?type=backup&per_page=50"
/hetzner images delete <id> — Delete an image (snapshot/backup only)
- Confirm with user
hetzner-api.sh DELETE "/images/<id>"
Create a snapshot (from server)
hetzner-api.sh POST "/servers/<server-id>/actions/create_image" '{"type":"snapshot","description":"..."}'- Display: image ID, action status
8. SSH Keys (/hetzner ssh-keys)
/hetzner ssh-keys or /hetzner ssh-keys list — List SSH keys
hetzner-api.sh GET "/ssh_keys?per_page=50"- Display table: Name | ID | Fingerprint | Created
/hetzner ssh-keys create — Add an SSH key
- Ask: name, public_key (the full ssh-rsa/ssh-ed25519 string)
hetzner-api.sh POST "/ssh_keys" '{"name":"...","public_key":"ssh-ed25519 AAAA..."}'
/hetzner ssh-keys delete <id> — Delete an SSH key
- Confirm with user
hetzner-api.sh DELETE "/ssh_keys/<id>"
9. Floating IPs (/hetzner ips)
/hetzner ips or /hetzner ips list — List floating IPs
hetzner-api.sh GET "/floating_ips?per_page=50"- Display table: IP | ID | Type | Server | Location | DNS PTR
/hetzner ips create — Create a floating IP
- Ask: type (ipv4/ipv6), home_location, description
- Confirm with user — billable resource
hetzner-api.sh POST "/floating_ips" '{"type":"ipv4","home_location":"fsn1","description":"..."}'
/hetzner ips assign <ip-id> <server-id> — Assign to server
hetzner-api.sh POST "/floating_ips/<id>/actions/assign" '{"server":<server-id>}'
/hetzner ips unassign <ip-id> — Unassign from server
hetzner-api.sh POST "/floating_ips/<id>/actions/unassign"
/hetzner ips delete <id> — Delete a floating IP
- Confirm with user
hetzner-api.sh DELETE "/floating_ips/<id>"
10. Pricing (/hetzner pricing)
/hetzner pricing — Full pricing info
hetzner-api.sh GET "/pricing"- Parse and display key sections: server types, volumes, floating IPs, load balancers, traffic
/hetzner pricing servers — Server type pricing
hetzner-api.sh GET "/server_types?per_page=50"- Display table: Type | CPUs | Memory GB | Disk GB | Price/month EUR | Price/hour EUR
- Prices from
prices[].price_monthly.grossandprices[].price_hourly.gross
/hetzner pricing locations — Available locations
hetzner-api.sh GET "/locations"- Display: Name | City | Country | Description | Network Zone
/hetzner pricing datacenters — Available datacenters
hetzner-api.sh GET "/datacenters"- Display: Name | ID | Location | Description | Available Server Types
Important rules
- Always confirm before destructive actions: delete server, delete volume, delete image, delete firewall, delete network, delete floating IP, delete DNS record, rebuild server
- Always confirm before billable actions: create server, create volume, create floating IP, create load balancer, resize server
- Source the config before building commands:
source ${CLAUDE_SKILL_DIR}/hetzner.conf - JSON responses: check for
errorfield in all responses - If a call returns 401
unauthorized, tell user to check their API token - If a call returns 403
forbidden, the token may be read-only or project-scoped - If no arguments given to
/hetzner, show a summary of available commands - Display sizes in human-readable format (GB/TB)
- Display costs in EUR with 2 decimal places
- For large lists, check
meta.pagination.next_pageand handle pagination - Actions: when a response includes an
actionobject withstatus: "running", optionally pollGET /actions/<id>to check completion - DNS is a separate API: Hetzner DNS (
dns.hetzner.com) uses a different token from Hetzner Cloud (api.hetzner.cloud). Always clarify this to the user. - Locations: fsn1 (Falkenstein), nbg1 (Nuremberg), hel1 (Helsinki), ash (Ashburn), hil (Hillsboro), sin1 (Singapore)
- Labels: most resources support labels (key-value pairs) for organization. Include them when creating resources if the user provides them.
Quick reference — API endpoints
# Servers
GET /servers # List servers
GET /servers/<id> # Server details
POST /servers # Create server
DELETE /servers/<id> # Delete server
POST /servers/<id>/actions/poweron # Power on
POST /servers/<id>/actions/poweroff # Power off (hard)
POST /servers/<id>/actions/shutdown # Shutdown (graceful)
POST /servers/<id>/actions/reboot # Reboot (hard)
POST /servers/<id>/actions/rebuild # Rebuild from image
POST /servers/<id>/actions/change_type # Resize
POST /servers/<id>/actions/enable_rescue # Enable rescue mode
POST /servers/<id>/actions/request_console # VNC console
POST /servers/<id>/actions/create_image # Create snapshot
GET /servers/<id>/metrics?type=cpu,disk,network # Server metrics
# Volumes
GET /volumes # List volumes
POST /volumes # Create volume
DELETE /volumes/<id> # Delete volume
POST /volumes/<id>/actions/attach # Attach to server
POST /volumes/<id>/actions/detach # Detach
POST /volumes/<id>/actions/resize # Resize (grow only)
# Firewalls
GET /firewalls # List firewalls
GET /firewalls/<id> # Firewall details
POST /firewalls # Create firewall
DELETE /firewalls/<id> # Delete firewall
POST /firewalls/<id>/actions/set_rules # Set rules (replaces all)
POST /firewalls/<id>/actions/apply_to_resources # Apply to servers
POST /firewalls/<id>/actions/remove_from_resources # Remove from servers
# Load Balancers
GET /load_balancers # List LBs
GET /load_balancers/<id> # LB details
POST /load_balancers # Create LB
DELETE /load_balancers/<id> # Delete LB
POST /load_balancers/<id>/actions/add_target # Add target
POST /load_balancers/<id>/actions/remove_target # Remove target
POST /load_balancers/<id>/actions/add_service # Add service
# Networks
GET /networks # List networks
GET /networks/<id> # Network details
POST /networks # Create network
DELETE /networks/<id> # Delete network
POST /networks/<id>/actions/add_subnet # Add subnet
POST /networks/<id>/actions/add_route # Add route
# Images
GET /images # List images
GET /images?type=snapshot # List snapshots
GET /images?type=backup # List backups
GET /images/<id> # Image details
DELETE /images/<id> # Delete image
# SSH Keys
GET /ssh_keys # List SSH keys
POST /ssh_keys # Create SSH key
DELETE /ssh_keys/<id> # Delete SSH key
# Floating IPs
GET /floating_ips # List floating IPs
POST /floating_ips # Create floating IP
DELETE /floating_ips/<id> # Delete floating IP
POST /floating_ips/<id>/actions/assign # Assign to server
POST /floating_ips/<id>/actions/unassign # Unassign
# Pricing & Info
GET /pricing # Full pricing
GET /server_types # Server types + prices
GET /locations # Locations
GET /datacenters # Datacenters
# Actions
GET /actions/<id> # Action status
# DNS (DIFFERENT API — https://dns.hetzner.com/api/v1)
# Uses Auth-API-Token header, NOT Bearer token
# GET /zones # List zones
# GET /records?zone_id=<id> # List records
# POST /records # Create record
# PUT /records/<id> # Update record
# DELETE /records/<id> # Delete recordDoes it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

