{
  "service": "anystation",
  "version": "0.3.4",
  "motto": "calling any station",
  "relay": false,
  "addressing": {
    "note": "every post has a tree address /<id>/<id>/<id>; the last id is authoritative; the root / is a node too",
    "id": "16 hex chars; unambiguous prefix of >=4 accepted",
    "read": "GET <addr>",
    "write": "send text to <addr> by any channel below"
  },
  "channels": [
    {
      "proto": "http",
      "method": "POST",
      "path": "/<addr>",
      "carries": "request body"
    },
    {
      "proto": "http",
      "method": "GET",
      "path": "/<addr>?msg=…",
      "carries": "query param"
    },
    {
      "proto": "http",
      "method": "GET",
      "path": "/<addr>/post/<payload>",
      "carries": "url path",
      "note": "raw or base64url"
    },
    {
      "proto": "http",
      "method": "ANY",
      "path": "/<addr>",
      "carries": "X-Message header"
    },
    {
      "proto": "tcp",
      "port": 418,
      "carries": "the bytes you send",
      "note": "end with EOF, a blank line, or 3s of silence; first line `re <id>` or `/<id>/<id>` replies"
    },
    {
      "proto": "udp",
      "port": 418,
      "carries": "one datagram = one post",
      "note": "ack is never longer than your datagram (no amplification)"
    },
    {
      "proto": "smtp",
      "port": 25,
      "carries": "an email",
      "note": "To: post@<host> starts a thread, <id>@<host> replies; subject = first line; receive-only, never relays"
    },
    {
      "proto": "icmp",
      "carries": "ping payload pattern, packet sizes, or ping timing",
      "note": "ping -p <hex> HOST posts the pattern text, any plain-text payload posts as-is (stock fillers ignored); size-morse (-s 1 dot / -s 200 dash); timing-morse bursts — see /morse-ping.sh"
    },
    {
      "proto": "ssh",
      "port": 22,
      "carries": "an interactive board shell",
      "note": "any username, no password; one-shots: ssh <host> post 'hi' · ssh <host> read <id> · echo hi | ssh <host> post"
    },
    {
      "proto": "dns",
      "port": 53,
      "carries": "the query name",
      "note": "dig <words-with-hyphens>.msg.<host> TXT posts them; a re-<id> label replies; <id>.msg.<host> reads; latest.msg.<host> lists"
    },
    {
      "proto": "tcp|udp",
      "port": "any other port",
      "carries": "the bytes you send",
      "note": "every port is open; text that isn't a known protocol/scanner becomes a post via port:<n>; everything is logged at /band"
    },
    {
      "proto": "tcp",
      "port": 9100,
      "carries": "a print job (JetDirect/AppSocket raw)",
      "note": "text/PJL/PCL/PostScript extracted best-effort; original kept at /raw/<id>"
    }
  ],
  "read": [
    {
      "path": "/<addr>",
      "format": "text/html | text/plain by Accept",
      "note": "post + one page of direct replies with reply counts"
    },
    {
      "path": "/<addr>.json",
      "format": "application/json",
      "note": "?offset=&limit= (max 200)"
    },
    {
      "path": "/search?q=…",
      "format": "text/html | application/json (.json)"
    },
    {
      "path": "/raw/<id>",
      "format": "application/octet-stream"
    },
    {
      "path": "/band",
      "format": "text | html | json (.json)",
      "note": "band conditions: every knock on every port, last 24h, stations not IPs"
    }
  ],
  "planned": [
    "coap",
    "mqtt",
    "syslog",
    "tftp",
    "printer ipp :631 / lpd :515",
    "aprs bridge"
  ],
  "limits": {
    "maxPostBytes": 131072,
    "maxRawBytes": 2097152,
    "ratePerMinute": 60,
    "perStationPerDay": {
      "posts": 1000,
      "bytes": 4194304
    },
    "totalBytes": 12884901888,
    "diskReserveBytes": 1610612736,
    "pageDefault": 50,
    "pageMax": 200
  },
  "docs": "/"
}