A lightweight command-line interface for managing .at domains via the Extensible Provisioning Protocol (EPP). Built on Symfony Console and the metaregistrar/php-epp-client library, it provides 16 commands for domain and contact operations against the nic.at registry.
Distributable as a single PHAR file or a static self-contained binary (no PHP installation required) for macOS and Linux.
For running from source: PHP 8.2+ with extensions openssl, dom, mbstring.
The static binary has zero dependencies — it embeds PHP and all extensions.
Download the binary for your platform from the releases page:
| Platform | File |
|---|---|
| Linux x86_64 | epp-cli-linux-x86_64 |
| Linux ARM64 | epp-cli-linux-aarch64 |
| macOS Apple Silicon | epp-cli-macos-aarch64 |
chmod +x epp-cli-linux-x86_64
./epp-cli-linux-x86_64 server:helloDownload epp-cli.phar from the releases page (requires PHP 8.2+ on the system):
php epp-cli.phar server:hellogit clone <repository-url>
cd epp-cli
composer install
cp .env.example .envAll variants load .env from the current working directory.
composer install --no-dev
vendor/bin/box compile
# produces build/epp-cli.pharUses static-php-cli to compile a PHP micro runtime, then combines it with the PHAR into a single executable.
./build-static.sh
# produces build/epp-cli-{os}-{arch}Override PHP version: SPC_PHP_VERSION=8.3 ./build-static.sh
The first build downloads and compiles PHP from source — expect 10-30 minutes depending on your machine. Subsequent builds reuse cached sources.
Push a v* tag to trigger the GitHub Actions workflow, which builds static binaries for all platforms (linux-x86_64, linux-aarch64, macos-aarch64) and attaches them to a GitHub release. You can also trigger the workflow manually from the Actions tab.
Add your EPP credentials to .env in the working directory:
EPP_HOST=epp.nic.at
EPP_PORT=700
EPP_USERNAME=your-username
EPP_PASSWORD=your-password
EPP_SSL=true
EPP_VERIFY_PEER=true
EPP_TIMEOUT=10
EPP_LOG_DIR=| Variable | Default | Description |
|---|---|---|
EPP_HOST |
epp.nic.at |
EPP server hostname |
EPP_PORT |
700 |
EPP server port |
EPP_USERNAME |
Registry username | |
EPP_PASSWORD |
Registry password | |
EPP_SSL |
true |
Use SSL/TLS connection |
EPP_VERIFY_PEER |
true |
Verify SSL certificate |
EPP_TIMEOUT |
10 |
Connection timeout in seconds |
EPP_LOG_DIR |
Directory for EPP XML logs (disabled when empty) |
Run without arguments for an interactive command picker:
php bin/eppAll commands support --cltrid (client transaction ID, 4-64 chars) and --logdir (per-call log directory override). When required options are omitted, commands prompt interactively.
# Test connection and server capabilities
php bin/epp server:hello
php bin/epp server:hello --lang=en --ver=1.0
# Change EPP password
php bin/epp password:change --newpassword=mynewpass123
# Poll server messages
php bin/epp message:poll
php bin/epp message:poll --delete-after-poll# Check availability
php bin/epp domain:check --domain=example.at
php bin/epp domain:check --domain=one.at --domain=two.at
# Get domain info
php bin/epp domain:info --domain=example.at
# Create domain
php bin/epp domain:create \
--domain=example.at \
--nameserver=ns1.example.com \
--nameserver=ns2.example.com/1.2.3.4 \
--registrant=REG001 \
--techc=TECH001 \
--authinfo='s3cretAuth!'
# Update domain (add/remove nameservers, contacts, statuses, DNSSEC)
php bin/epp domain:update --domain=example.at --addns=ns3.example.com
php bin/epp domain:update --domain=example.at --restore
php bin/epp domain:update --domain=example.at --delsecdns-all
# Delete domain
php bin/epp domain:delete --domain=example.at --scheduledate=now
# Withdraw domain
php bin/epp domain:withdraw --domain=example.at --deletezone# Get contact info
php bin/epp contact:info --id=CONTACT001
# Create contact
php bin/epp contact:create \
--name="Jane Doe" \
--street="Main Street 1" \
--city=Vienna \
--postalcode=1010 \
--country=AT \
--email=jane@example.at \
--type=privateperson
# Create contact and capture the handle for scripting
HANDLE=$(php bin/epp contact:create \
--name="Jane Doe" \
--street="Main Street 1" \
--city=Vienna \
--postalcode=1010 \
--country=AT \
--email=jane@example.at \
--type=privateperson \
--output-handle-only)
php bin/epp domain:create --domain=example.at --registrant=$HANDLE
# Update contact
php bin/epp contact:update --id=CONTACT001 --email=new@example.at
# Delete contact
php bin/epp contact:delete --id=CONTACT001# Query transfer status
php bin/epp domain:transfer-query --domain=example.at
# Request transfer
php bin/epp domain:transfer-request --domain=example.at --authinfo=secret
# Cancel transfer
php bin/epp domain:transfer-cancel --domain=example.atA Docker Compose setup is included to run a local Namingo EPP registry for testing.
docker compose builddocker compose up -ddocker compose down -v
docker compose up -dThe -v flag removes the MariaDB data volume, so the database is re-created and re-seeded from scratch on the next start.
| Service | Port | Description |
|---|---|---|
| EPP (TLS) | 700 | EPP server |
| WHOIS | 43 | WHOIS server |
| RDAP | 7500 | RDAP server |
| DAS | 1043 | Domain Availability Service |
| Control Panel | 8080 | Web UI |
| MariaDB | 3306 | Database |
| Redis | 6379 | Cache |
The development environment is pre-seeded with:
- TLD:
.testwith pricing for create, renew, and transfer operations - Registrar:
testregistrarwith $10,000 account balance - IP whitelist:
0.0.0.0/0(all IPs allowed) - Control panel admin:
admin@test.example
| Service | Username | Password |
|---|---|---|
| EPP | testregistrar |
testpassword123 |
| Control Panel | admin@test.example |
admin123 |
| MariaDB | namingo |
namingo_password |
| MariaDB (root) | root |
namingo_root |
EPP_HOST=localhost
EPP_PORT=700
EPP_USERNAME=testregistrar
EPP_PASSWORD=testpassword123
EPP_SSL=true
EPP_VERIFY_PEER=falseCommands output structured lines for machine parsing:
SUCCESS: 1000
ATTR: name: example.at
ATTR: clTRID: abc-12345
ATTR: svTRID: srv-54321
Failed operations return a non-zero exit code:
FAILED: 2303
Domain info failed: Object does not exist
Set EPP_LOG_DIR in .env or pass --logdir=/path/to/logs to any command. Log files are named by date (2026-03-01.log) and contain the raw EPP XML request/response exchange.