Skip to main content

Modern CLI for XNAT neuroimaging server administration

Project description

xnatctl

A modern command-line interface for XNAT neuroimaging server administration.

What is xnatctl?

xnatctl is a command-line tool for managing neuroimaging data on XNAT servers. It lets you browse projects and subjects, download and upload imaging sessions, run processing pipelines, and perform administrative tasks -- all from your terminal. Whether you are a researcher downloading data for analysis or a system administrator managing hundreds of subjects, xnatctl provides a consistent, scriptable interface to your XNAT server.

Features

  • Resource-centric commands -- interact with XNAT the way you think about it: xnatctl project list, xnatctl session download, xnatctl scan show. Every command follows the pattern xnatctl <resource> <action> [args].

  • Profile-based configuration -- manage multiple XNAT servers with named profiles and switch between them instantly. Keep separate profiles for production, development, and collaboration servers in a single config file.

  • Consistent output formats -- every command supports --output json|table and --quiet (IDs only), so you can pipe results into scripts or read them in a human-friendly table without changing your workflow.

  • Parallel operations -- batch uploads and downloads run across multiple workers with real-time progress tracking. Large transfers stay fast without extra scripting.

  • Session authentication -- log in once with xnatctl auth login and your session token is cached locally. Expired tokens are refreshed automatically, so you stay authenticated without repeated prompts.

  • Pure HTTP -- xnatctl talks directly to the XNAT REST API using httpx. There is no dependency on pyxnat or any Java bridge, which keeps the install lightweight and the behavior predictable.

Installation

Standalone Binary (no Python required)

If you do not have Python installed or prefer a single executable, download a pre-built binary. On Linux and macOS, the install script auto-detects your OS and architecture:

# One-line install (Linux/macOS only, auto-detects platform)
curl -fsSL https://github.com/rickyltwong/xnatctl/raw/main/install.sh | bash

# Install a specific version
XNATCTL_VERSION=v0.1.0 curl -fsSL https://github.com/rickyltwong/xnatctl/raw/main/install.sh | bash

# Custom install directory (default: ~/.local/bin)
XNATCTL_INSTALL_DIR=/usr/local/bin curl -fsSL https://github.com/rickyltwong/xnatctl/raw/main/install.sh | bash

Or download manually from GitHub Releases:

Platform Asset
Linux (x86_64) xnatctl-linux-amd64.tar.gz
macOS (x86_64) xnatctl-darwin-amd64.tar.gz
Windows (x86_64) xnatctl-windows-amd64.zip

Linux / macOS:

tar -xzf xnatctl-<platform>-amd64.tar.gz
chmod +x xnatctl
mv xnatctl ~/.local/bin/

Windows (PowerShell):

Expand-Archive xnatctl-windows-amd64.zip -DestinationPath .
New-Item -ItemType Directory -Force -Path "$env:LOCALAPPDATA\bin"
Move-Item xnatctl.exe "$env:LOCALAPPDATA\bin\"

Note: On Windows, make sure %LOCALAPPDATA%\bin is on your PATH. You can add it via Settings > System > About > Advanced system settings > Environment Variables, or see the Installation guide for a PowerShell command.

Python Package

If you already have Python 3.11+ and want to install xnatctl as a package, use pip or uv:

# From PyPI (recommended)
pip install xnatctl

# With uv
uv pip install xnatctl

# For DICOM utilities (optional -- adds pydicom and pynetdicom)
pip install "xnatctl[dicom]"

# From source
pip install git+https://github.com/rickyltwong/xnatctl.git

Docker

For containerized environments or CI pipelines where you want to avoid local installation entirely:

docker run --rm ghcr.io/rickyltwong/xnatctl:main --help

For full installation instructions including shell completion and troubleshooting, see the Installation guide.

Quick Start

Once installed, you can be up and running in four steps.

1. Create a configuration file. This stores your XNAT server URL and default settings so you do not have to pass them on every command:

xnatctl config init --url https://xnat.example.org

2. Authenticate. Log in with your XNAT credentials. The session token is cached locally, so subsequent commands authenticate automatically:

xnatctl auth login

3. Browse your data. List the projects you have access to and inspect their contents:

xnatctl project list

4. Download a session. Pull imaging data to your local machine for analysis. Use an experiment accession number or, if you have a default project set, a session label:

xnatctl session download -E XNAT_E00001 --out ./data

For a detailed walkthrough, see the Quick Start guide.

Commands

Command Description
xnatctl config Manage configuration profiles
xnatctl auth Authentication (login/logout/status)
xnatctl project Project operations (list/show/create)
xnatctl subject Subject operations (list/show/rename/delete)
xnatctl session Session operations (list/show/download/upload)
xnatctl scan Scan operations (list/show/delete/download)
xnatctl resource Resource operations (list/upload/download)
xnatctl prearchive Prearchive management (list/archive/delete/move)
xnatctl pipeline Pipeline execution (list/run/status/cancel)
xnatctl admin Administrative operations (users/catalogs/audit)
xnatctl api Raw API access (escape hatch for any endpoint)
xnatctl local Offline operations (extract downloaded ZIPs)
xnatctl dicom DICOM utilities (requires xnatctl[dicom])

For complete usage and examples, see the CLI Reference.

Configuration

Config file location: ~/.config/xnatctl/config.yaml

default_profile: production
output_format: table

profiles:
  production:
    url: https://xnat.example.org
    username: myuser          # optional -- can also use env vars
    password: mypassword      # optional -- can also use env vars
    verify_ssl: true
    timeout: 30
    default_project: MYPROJECT

  development:
    url: https://xnat-dev.example.org
    verify_ssl: false

Working with Profiles

Profiles let you store connection details for each XNAT server you work with. You can create, add, and switch profiles from the command line:

# Create an initial config (prompts for URL and optional defaults)
xnatctl config init --url https://xnat.example.org

# Add additional profiles
xnatctl config add-profile dev --url https://xnat-dev.example.org --no-verify-ssl

# Switch the active profile
xnatctl config use-context dev

# Show the active profile and config
xnatctl config show

Authentication Flow

Log in once and your session token is cached. xnatctl reuses the cached token and refreshes it automatically when it expires:

# Login and cache a session token
xnatctl auth login

# Check current user and session context
xnatctl whoami

Credential priority (highest to lowest):

  1. CLI arguments (--username, --password)
  2. Environment variables (XNAT_USER, XNAT_PASS)
  3. Profile config (username, password in config.yaml)
  4. Interactive prompt

Session tokens are cached at ~/.config/xnatctl/.session and used automatically until they expire.

Environment Variables

You can override any profile setting with environment variables. This is especially useful for CI pipelines and non-interactive scripts:

Variable Description
XNAT_URL Server URL
XNAT_USER Username
XNAT_PASS Password
XNAT_TOKEN Session token (highest auth priority)
XNAT_PROFILE Config profile name

Notes:

  • XNAT_TOKEN takes precedence over cached sessions and username/password credentials. Use it when you already have a valid token from another tool.
  • XNAT_URL and XNAT_PROFILE override values from config.yaml for the current shell session.
  • Use XNAT_USER and XNAT_PASS for non-interactive authentication in CI jobs and automated scripts.

Documentation

Complete documentation is available in the docs/ directory. Topics include installation, key concepts, configuration, CLI reference, downloading, uploading, workflows, and XNAT compatibility.

Development

# Clone and install
git clone https://github.com/rickyltwong/xnatctl.git
cd xnatctl
uv sync --dev

# Run tests
uv run pytest tests/ -v

# Lint and format
uv run ruff check xnatctl scripts
uv run ruff format xnatctl scripts

# Type check
uv run mypy xnatctl

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xnatctl-0.1.2.tar.gz (263.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xnatctl-0.1.2-py3-none-any.whl (116.7 kB view details)

Uploaded Python 3

File details

Details for the file xnatctl-0.1.2.tar.gz.

File metadata

  • Download URL: xnatctl-0.1.2.tar.gz
  • Upload date:
  • Size: 263.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xnatctl-0.1.2.tar.gz
Algorithm Hash digest
SHA256 1dc072050ba91d3e71e97cef74e44e4f5d88478d5a9c6b06d51de56ee98ab116
MD5 70fa6c31b563f6eced46a7e226a74cd8
BLAKE2b-256 a8c413fa1602fc16c5d8256b3aed23ca046d2f0672f10aadffbeb73cee965d31

See more details on using hashes here.

Provenance

The following attestation bundles were made for xnatctl-0.1.2.tar.gz:

Publisher: ci.yml on rickyltwong/xnatctl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xnatctl-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: xnatctl-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 116.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xnatctl-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7e104025b966a46aeba1040e958dbf97e38355feb2e469a620f000bbf3188c09
MD5 d669ba6057b546728ab58ce8b1d4bf98
BLAKE2b-256 6a1fc2f0a63e7459d9844c8861ec806cc6629ce2902635cd2adb2c01e08d2a65

See more details on using hashes here.

Provenance

The following attestation bundles were made for xnatctl-0.1.2-py3-none-any.whl:

Publisher: ci.yml on rickyltwong/xnatctl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page