Skip to content

sct

A fast, local-first SNOMED CT toolkit written in Rust. Convert a SNOMED CT RF2 release into queryable formats in seconds. Almost ridiculously fast on modern hardware. Free and open source. No Java. No Elasticsearch. Docker optional.

New to SNOMED CT? Start here · Full walkthrough · Get your own terminology server · Why build this? · Benchmarks


Install

Prebuilt binaries are published for Linux (x86_64, aarch64), macOS (Apple Silicon, Intel), and Windows (x86_64) on every release, each with a SHA-256 checksum you can verify against the SHA256SUMS file on the Releases page. Pick your platform:

Homebrew (recommended)

brew tap pacharanero/tap
brew install sct

Shell installer - auto-detects your chip, verifies the checksum, installs to ~/.local/bin:

curl -fsSL https://raw.githubusercontent.com/pacharanero/sct/main/install.sh | sh

Disk image - download the .dmg for your Mac, open it, and drag sct onto a folder on your PATH:

Apple Silicon (.dmg) Intel (.dmg)

Unsigned for now

The .dmg is not yet notarized. On first run, right-click sct → Open, or clear the quarantine flag: xattr -d com.apple.quarantine ./sct.

Debian / Ubuntu (.deb)

curl -fLO https://github.com/pacharanero/sct/releases/latest/download/sct-linux-x86_64.deb
sudo apt install ./sct-linux-x86_64.deb        # aarch64: sct-linux-aarch64.deb

Fedora / RHEL / openSUSE (.rpm)

curl -fLO https://github.com/pacharanero/sct/releases/latest/download/sct-linux-x86_64.rpm
sudo dnf install ./sct-linux-x86_64.rpm        # aarch64: sct-linux-aarch64.rpm

Homebrew

brew tap pacharanero/tap
brew install sct

Arch Linux (AUR)

yay -S sct-rs-bin

Shell installer - auto-detects your architecture, verifies the checksum, installs to ~/.local/bin:

curl -fsSL https://raw.githubusercontent.com/pacharanero/sct/main/install.sh | sh

One-line installer (recommended - the least fuss). Open PowerShell (Start menu → type "PowerShell" → Enter), paste this line, and press Enter:

iwr -useb https://raw.githubusercontent.com/pacharanero/sct/main/install.ps1 | iex

It downloads sct, verifies its checksum, installs it to %LOCALAPPDATA%\sct\bin, and offers to add that folder to your PATH (just press Enter to accept) - no manual PATH editing. Open a new terminal afterwards and run sct --version.

Scoop - if you already use the Scoop package manager (handy for one-command updates later):

scoop bucket add pacharanero https://github.com/pacharanero/scoop
scoop install sct

Manual .exe (advanced) - download sct-windows-x86_64.exe, put it in a folder that is already on your PATH, and run sct from a terminal. The one-line installer above handles this PATH step for you.

Unsigned for now

sct is not yet Authenticode-signed, so Windows SmartScreen may warn on first run - choose More info → Run anyway. (Code-signing and a winget package are planned.)

With a Rust toolchain (stable 1.88+):

cargo install sct-rs          # compile from crates.io

Or grab a prebuilt binary without compiling, via cargo-binstall:

cargo binstall sct-rs

Build from a clone. sct serve and sct tui are included by default; add optional extras (gui, dmwb, diagram-svg, or full) as needed:

git clone https://github.com/pacharanero/sct && cd sct
cargo install --path . --features full

Verify the install:

sct --version

Then turn a SNOMED CT RF2 release into queryable data in three commands:

sct ndjson  --rf2 ~/path-to-your-SNOMED-RF2.zip
sct sqlite  --ndjson snomed.ndjson
sct lexical "heart attack"

Full walkthrough


  • Build the pipeline


    Convert an RF2 snapshot into SQLite, Parquet, Markdown, or Arrow embeddings in a single command. 837,930 concepts in under a minute on a laptop.

    Walkthrough

  • Search


    Full-text search via FTS5 for keywords and phrases. Typo-tolerant fuzzy and prefix search via a mmap'd FST index. Semantic vector search via local Ollama embeddings. All offline.

    sct lexical · sct fst · sct semantic

  • Code lists & ECL


    Build version-controllable clinical code lists, and populate them with SNOMED CT Expression Constraint Language - sct codelist add --ecl "<<73211009" expands a query into concrete concepts.

    sct codelist

  • Connect to AI


    A local MCP server exposes SNOMED CT as tools for Claude, Cursor, and any other MCP-compatible client. Ask questions about concepts, hierarchies, and relationships directly in your AI assistant.

    sct mcp

  • Run a terminology server


    Start a FHIR R4 SNOMED CT terminology server on a clean VPS with Docker Compose. First boot downloads from TRUD, builds snomed.db, and serves $lookup, $expand, $subsumes, and $translate.

    Get your own server · sct serve

  • Explore


    A keyboard-driven terminal UI and a local web GUI for browsing concepts, navigating hierarchies, and inspecting relationships - no browser extension or remote service needed.

    sct tui · sct gui

Command-line contracts

Commands reserve stdout for data and stderr for diagnostics and human-facing hints. A completed command exits 0; an unresolved single-item lookup exits 1; and command-line usage errors exit 2. A search with no matches is still successful: text and ID output leave stdout empty while the hint goes to stderr, and structured formats emit an empty collection. Commands with domain-specific status codes document their exceptions, such as sct trud check using 2 when a newer release is available.