diff --git a/infrastructure_and_operations/njalla.myco b/infrastructure_and_operations/njalla.myco
new file mode 100644
index 0000000..9e95269
--- /dev/null
+++ b/infrastructure_and_operations/njalla.myco
@@ -0,0 +1,700 @@
+NJALLA API Documentation
+
+Copy pasted from njal.la because they require you to login to view the docs and that is dumb.
+
+API Endpoint: https://njal.la/api/1/Requests follow the JSON-RPC 2.0 protocol.You can use session cookies or token based authentication.POST JSON body to the API Endpoint:
+
+{
+ "jsonrpc": "2.0",
+ "method": "...",
+ "params": {...},
+ "id": "123"
+}
+
+ and you will get a JSON response. Success:
+
+{
+ "jsonrpc": "2.0",
+ "result": {}.
+ "id": "123"
+}
+
+ or error:
+
+{
+ "jsonrpc": "2.0",
+ "error": {
+ "code": 0
+ "message": ""
+ },
+ "id": "123"
+}
+
+ Example using python requests
+
+import requests
+
+def njalla(method, **params):
+ url = 'https://njal.la/api/1/'
+ token = '<your-api-token>'
+ headers = {
+ 'Authorization': 'Njalla ' + token
+ }
+ response = requests.post(url, json={
+ 'method': method,
+ 'params': params
+ }, headers=headers).json()
+ if 'result' not in response:
+ raise Exception('API Error', response)
+ return response['result']
+
+
+print(njalla('list-domains'))
+print(njalla('get-domain', domain='example.com'))
+
+
+ Example using curl
+
+NJALLA_TOKEN='<your-api-token>'
+curl -s \
+ -H "Accept: application/json" \
+ -H "Content-Type: application/json" \
+ -H "Authorization: Njalla ${NJALLA_TOKEN}" \
+ --data '{"method":"get-domain", "params": {"domain": "exampe.com"}}' \
+ https://njal.la/api/1/
+
+
+api
+
+add-token
+
+Add a new API token
+
+params: {
+ comment: string (optional)
+ from: [string] (optional) array of IPv4 or IPv6 IPs or networks
+ that are allowed to use the token.
+ i.e.: ['8.8.8.8', '192.168.0.0/24']
+}
+returns: {
+}
+
+check-task
+
+Check status of a long running task
+
+params: {
+ id: string
+}
+returns: {
+ id: string
+ status: object
+}
+
+edit-token
+
+Edit API token
+
+params: {
+ key: string
+ comment: string (optional)
+ from: [string] (optional) array of IPv4 or IPv6 IPs or networks
+ that are allowed to use the token.
+ i.e.: ['8.8.8.8', '192.168.0.0/24']
+}
+returns: {
+}
+
+list-tokens
+
+List existing API autorization tokens.
+
+params: {
+}
+returns: {
+ tokens: [...]
+}
+
+remove-token
+
+Remove an existing API token
+
+params: {
+ key: string
+}
+returns: {
+}
+
+domain
+
+add-dnssec
+
+Add DNSSEC record for domain
+
+params: {
+ domain: string
+ algorithm: integer
+
+ digest: string
+ digest_type: integer
+ key_tag: integer
+
+ or
+
+ public_key: string
+}
+returns: {
+}
+
+add-forward
+
+Add email forward
+
+params: {
+ domain: string
+ from: string
+ to: string
+}
+returns: {
+ domain: string
+ from: string
+ to: string
+}
+
+add-glue
+
+Add glue record for the domain, name is the subdomain
+
+params: {
+ domain: string
+ name: string
+ address4: string
+ address6: string
+}
+returns: {
+}
+
+add-record
+
+Add new DNS Record to domain
+
+params: {
+ domain: string
+ name: string
+ content: string
+ ttl: int
+ type: string
+ ...
+}
+returns: {
+ id: int
+ content: string
+ domain: string
+ name: string
+ ttl: int
+ type: string
+}
+
+edit-domain
+
+Edit domain configuration
+
+params: {
+ domain: string
+ ...
+}
+possible keys:
+ mailforwarding: boolean
+ dnssec: boolean
+ lock: boolean
+ contacts: custom whois contact ids
+ nameservers: list of custom nameservers or empty list to use our nameservers
+
+returns: {
+ name: string,
+ ...
+}
+
+edit-glue
+
+Edit glue record
+
+params: {
+ domain: string
+ name: string
+ address4: string
+ address6: string
+}
+returns: {
+}
+
+edit-record
+
+Edit DNS Record
+
+params: {
+ domain: string
+ id: int
+ content: string
+}
+returns: {
+}
+
+find-domains
+
+Find new domains
+
+params: {
+ query: string
+}
+returns: {
+ domains: [
+ {price: int, status: string, name: string}
+ ]
+}
+
+get-domain
+
+Get information about one of your domains
+
+params: {
+ domain: string
+}
+returns: {
+ name: string,
+ ...
+}
+
+get-tlds
+
+Get list of supported TLDs
+
+params: {
+}
+returns: {
+ tld: {price: int, max_year: int, dnssec: boolean},
+}
+
+import-zone
+
+Import BIND zone file
+
+params: {
+ domain: string
+ zone: string
+}
+returns: {
+}
+
+list-dnssec
+
+List DNSSEC records for domain
+
+params: {
+ domain: string
+}
+returns: {
+ dnssec: list
+}
+
+list-domains
+
+Get list of your domains
+
+params: {
+}
+returns: {
+ domains: list
+}
+
+list-forwards
+
+List existing email forwards
+
+params: {
+ domain: string
+}
+returns: {
+ forwards: list
+}
+
+list-glue
+
+List glue records for domain
+
+params: {
+ domain: string
+}
+returns: {
+ glue: list
+}
+
+list-records
+
+List DNS records for given domain
+
+params: {
+ domain: string
+}
+returns: {
+ records: list
+}
+
+register-domain
+
+Register a new domain
+
+params: {
+ domain: string
+ years: int (default: 1)
+}
+returns: {
+ task: string
+}
+use check-task for response
+
+remove-dnssec
+
+Remove DNSSEC record from domain
+
+params: {
+ domain: string
+ id: string
+}
+returns: {
+}
+
+remove-forward
+
+Remove email forward
+
+params: {
+ domain: string
+ from: string
+ to: string
+}
+returns: {
+}
+
+remove-glue
+
+Remove glue record
+
+params: {
+ domain: string
+ name: string
+}
+returns: {
+}
+
+remove-record
+
+Remove DNS Record
+
+params: {
+ domain: string
+ id: int
+}
+returns: {
+}
+
+renew-domain
+
+Renew one of your domains
+
+params: {
+ domain: string
+ years: int (default: 1)
+}
+returns: {
+ task: string
+}
+use check-task for response
+
+server
+
+add-server
+
+Create a new server with the given name, type, os and ssh_key. Returns an id of the newly created server
+
+params: {
+ name: string,
+ type: string
+ os: string
+ ssh_key: string
+}
+returns: {
+ id: string
+ ...
+}
+
+edit-server
+
+Edit an existing server identified by id
+
+params: {
+ id: string
+ name: string,
+ type: string
+ ssh_key: string
+ reverse_name: string
+}
+returns: {
+ ...
+}
+
+get-server
+
+Returns information about one of your servers
+
+params: {
+ id: string
+}
+returns: {
+ ...
+}
+
+list-server-images
+
+Returns a list of server images that can be used for new servers
+
+params: {
+}
+returns: {
+ images: list
+}
+
+list-server-types
+
+Returns a list of server types that can be used for new servers
+
+params: {
+}
+returns: {
+ types: list
+}
+
+list-servers
+
+Retuns a list of your servers
+
+params: {
+}
+returns: {
+ servers: list
+}
+
+remove-server
+
+Remote an existing server, your server will be stopped and all data deleted.
+
+params: {
+ id: string
+}
+returns: {
+ ...
+}
+
+renew-server
+
+Renew an existing server identified by id, your wallet must have enough credit to complete this operation.
+
+params: {
+ id: string
+ months: int
+}
+returns: {
+ ...
+}
+
+reset-server
+
+Reset existing server and reinstall the given os. All data will be lost. Required field: id
+
+params: {
+ id: string
+ os: string
+ ssh_key: string
+}
+returns: {
+ ...
+}
+
+restart-server
+
+Restart existing server
+
+params: {
+ id: string
+}
+returns: {
+ ...
+}
+
+start-server
+
+Start existing server
+
+params: {
+ id: string
+}
+returns: {
+ ...
+}
+
+stop-server
+
+Stop existing server
+
+params: {
+ id: string
+}
+returns: {
+ ...
+}
+
+user
+
+login
+
+Login into an existing account (cookie based session). Consider using API tokens instead
+
+params: {
+ email: string [or] xmpp: string
+ password: string
+}
+returns: {
+}
+
+logout
+
+Logout and end your current session
+
+params: {
+}
+returns: {
+}
+
+vpn
+
+add-vpn
+
+Add a new VPN client Returns an id
+
+params: {
+ name: string,
+ autorenew: boolean
+}
+returns: {
+ id: string
+ ...
+}
+
+edit-vpn
+
+Edit an existing VPN identified by id
+
+params: {
+ id: string
+ name: string,
+ autorenew: boolean
+ backend: wireguard|openvpn
+ publickey: WireGuard PublicKey, set to your public key or null to genrate a new one
+}
+returns: {
+ ...
+}
+
+get-vpn
+
+Returns information about VPN
+
+params: {
+ id: string
+}
+returns: {
+ ...
+}
+
+list-vpns
+
+Retuns a list of your VPNs
+
+params: {
+}
+returns: {
+ vpns: list
+}
+
+remove-vpn
+
+Remote an existing VPN
+
+params: {
+ id: string
+}
+returns: {
+ ...
+}
+
+renew-vpn
+
+Renew an existing VPN identified by id, your wallet must have enough credit to complete this operation.
+
+params: {
+ id: string
+ months: int
+}
+returns: {
+ ...
+}
+
+wallet
+
+add-payment
+
+Refill your wallet
+
+params: {
+ amount: int (5 or multiple of 15, max: 300)
+ via: string (options: paypal, bitcoin, litecoin, dash, monero, zcash, bitcoin-cash, ethereum, lightning-btc, transferwise-eur, transferwise-usd)
+}
+returns: {
+ amount: int
+ address: string (payment address)
+ url: string (paypal url to process payment)
+}
+
+get-balance
+
+params: {
+}
+returns: {
+ balance: int (in euros)
+}
+
+get-payment
+
+Get details about a payment
+
+params: {
+ id: string
+}
+returns: {
+ id: string
+ amount: int
+ status: string
+ address: string
+ url: string
+}
+
+list-transactions
+
+List transactions (payments, registrations, renewals, etc..) of the last 90 days
+
+params: {
+}
+returns: {
+ transactions: list
+}
+