Hosts · 3 min read

Bulk paste hosts

Paste a list of user@host:port lines from any source — a CSV column, a Notion page, an Ansible inventory snippet, the output of a grep on your fleet — and Noxen enrols every parseable line as a host.

Open the paste form

+ menu in the sidebar → Bulk paste… A multi-line text area opens. Paste your list, hit Parse, review what was recognised, then Enrol.

Supported line formats

The parser (HostListParser) accepts any of:

paul@10.0.1.42
paul@10.0.1.42:22
paul@nuc.lan
paul@nuc.lan:2222
admin@plex.home.arpa:22
root@[2001:db8::1]
root@[2001:db8::1]:22
nuc.lan                 # implies user from System Preferences
10.0.1.42:2222          # implies user from System Preferences

One host per line. Whitespace is stripped. Lines starting with # are treated as comments and ignored, so you can paste annotated CSV content directly. Blank lines are ignored.

Parser rules

Username
The portion before @. If the line has no @, the parser falls back to your macOS short username from NSUserName().
Hostname
Everything between @ (or start of line) and : (or end of line). For IPv6, the host portion must be wrapped in square brackets so the colons inside the address aren't misread as port separators — root@[2001:db8::1]:22.
Port
The portion after the final : outside any bracket pair. Defaults to 22 when omitted. Must be an integer in 1–65535; out-of-range or non-numeric values flag the line as invalid.
Display name
The hostname becomes the display name on enrol. You can rename hosts later by clicking the name in the sidebar.

Validation pass

Parse previews what was recognised before any host is created. Each line is shown as a row in a table:

Identity selection

Bulk paste doesn't ask for an identity per line — instead, you pick one default key for the whole batch. Suitable when the same key works against every host in the list (the typical fleet pattern). For mixed-key fleets, paste in groups and pick a different key per batch.

The chosen key is copied into the macOS Keychain under the Noxen app group and applied to every enrolled host. Same Keychain path as manual add and SSH config import — see Privacy & data for storage details.

Common sources

Quick conversions from common inventory formats:

# From an Ansible inventory.ini section:
[homelab]
nuc      ansible_host=10.0.1.42 ansible_user=paul ansible_port=22
plex     ansible_host=plex.lan  ansible_user=admin

# Convert to bulk-paste format with awk:
awk '/ansible_host=/ {
    h=""; u=""; p=22;
    for (i=1; i<=NF; i++) {
        if ($i ~ /^ansible_host=/)  { sub(/.*=/,"",$i); h=$i }
        if ($i ~ /^ansible_user=/)  { sub(/.*=/,"",$i); u=$i }
        if ($i ~ /^ansible_port=/)  { sub(/.*=/,"",$i); p=$i }
    }
    if (h) print u "@" h ":" p
}' inventory.ini

Limits

The parser handles up to ~10,000 lines without hitting any artificial limit, but the host cap still applies — the free tier accepts 3, Noxen 1.x and Maintenance 25, Live Feed 100, and MSP 500. Pasting more lines than your tier allows shows them all in the preview but only the first N are enrollable. See pricing for tier limits and how the cap is enforced.