HFS + HTS
SkillSearchStart the HFS FHIR server and HTS terminology server together for local development, wired via HFS_TERMINOLOGY_SERVER/FHIRPATH_TERMINOLOGY_SERVER so HFS's terminology-backed features (search :in modifier, FHIRPath memberOf()/subsumes()) work against a locally-seeded HTS. Composes run-hfs-server and run-hts-server.
Use HFS + HTS in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add HFS + HTS and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the HFS + HTS skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; Ahel provides instructions and does not run this skill.
No other account needed.
Add Ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
What this skill tells your AI
The instructions your AI receives, as published by heliossoftware/hfs in .claude/skills/run-hfs-and-hts/SKILL.md and read by Ahel’s review.
Use this when you need both servers running together — e.g. to exercise
HFS features that delegate to HTS, or to develop crates/ui terminology
pages that proxy through HFS. This skill only covers the combined startup;
see run-hfs-server and
run-hts-server for each server's full
env-var reference.
Running both
Start hts first, seeded from the bundled terminology data, then start
hfs pointed at it:
# Terminal 1 — HTS, seeded with the bundled terminology set, admin UI on
HTS_BOOTSTRAP_DIR=./crates/hts/terminology-data cargo run --bin hts
# binds 127.0.0.1:8090, admin UI at /ui/hts
# Terminal 2 — HFS, wired to use HTS for terminology operations
HFS_TERMINOLOGY_SERVER=http://127.0.0.1:8090 \
FHIRPATH_TERMINOLOGY_SERVER=http://127.0.0.1:8090 \
cargo run --bin hfs
# binds 127.0.0.1:8080, UI at /ui
# Terminal 1 — HTS
$env:HTS_BOOTSTRAP_DIR = ".\crates\hts\terminology-data"
cargo run --bin hts # binds 127.0.0.1:8090, admin UI at /ui/hts
# Terminal 2 — HFS
$env:HFS_TERMINOLOGY_SERVER = "http://127.0.0.1:8090"
$env:FHIRPATH_TERMINOLOGY_SERVER = "http://127.0.0.1:8090"
cargo run --bin hfs # binds 127.0.0.1:8080, UI at /ui
Start HTS first — HFS only reads HFS_TERMINOLOGY_SERVER at request time,
not at boot, but there's nothing to look up until HTS has finished its
bootstrap import.
Note there are two distinct /ui surfaces once both are running: HFS's own
UI at http://127.0.0.1:8080/ui, and HTS's administrative UI at
http://127.0.0.1:8090/ui/hts (both on by default; set HTS_UI_ENABLED=false
to opt out of the latter — see
run-hts-server).
Sanity checks
curl http://localhost:8090/health
curl "http://localhost:8090/metadata?mode=terminology" # TerminologyCapabilities once seeded
curl http://localhost:8080/health
curl -o /dev/null -w "%{http_code}\n" http://localhost:8090/ui/hts # 200 unless HTS_UI_ENABLED=false
What this enables
With both wired together:
- FHIR search
:inmodifier on HFS (ValueSet expansion filtering). - FHIRPath
memberOf()andsubsumes()on HFS, delegated throughFHIRPATH_TERMINOLOGY_SERVER. crates/uiterminology-proxy handlers (e.g./ui/editor/expand), which read HTS throughWebState.terminologyrather than calling it directly from the browser.
Without HFS_TERMINOLOGY_SERVER set, these features degrade gracefully
(no terminology-backed filtering / proxy handlers return empty) rather
than erroring.
Signals
- GitHub stars
- 53
- Forks
- 21
- Last commit
- Oct 2026
Advanced
- Item type
- skill
- Key
run-hfs-and-hts- Source
- github.com/heliossoftware/hfs