REMITT (Electronic Medical Information Translation and Transmission) — Go rewrite of the J2EE 0.5.x SOAP backend, targeting 100% feature parity against the same MySQL schema. Runs against a valid REMITT 0.5.x database with no modifications.
| Layer | Technology |
|---|---|
| Language | Go 1.25 |
| Web framework | Echo v5 (migrated from Gin) |
| ORM | GORP + supplementary sqlc query layer |
| Database | MySQL (same schema as REMITT 0.5.x — tables, stored procedures, column names are a fixed contract) |
| Auth | Stateless HTTP BasicAuth (MD5 hashes — legacy 0.5.x compatibility) |
| Config | YAML (config.yaml) |
| Plugin model | Registry + factory pattern (init() self-registration) |
Every plugin type follows a uniform registry/factory pattern with init()
self-registration:
| System | Interface | Implementations | Status |
|---|---|---|---|
| Eligibility | EligibilityChecker |
Dummy, Gateway EDI (SOAP+PGP), NC Medicaid (SFTP+PGP), SFTP (optional PGP), Optum (Change Healthcare OAuth2 REST), Stedi (OAuth2 REST), BCBS FHIR (1upHealth), Medicare HETS (CMS SOAP/X12 270/271) | 8/8 done |
| Transport | Transporter |
Script (otto JS), SFTP, StoreFile, StoreFilePdf, ClaimLogic, Gateway EDI, ScriptedHttp | 7/7 done |
| Parser | Parser |
X12 envelope (ISA/GS/ST/SE/GE/IEA), X12 835 remittance, X12 271 eligibility response, X12 997 functional ack | 4/4 done |
| Translation | Translator |
X12Xml (XML→EDI text), X12Passthrough (raw bytes), FixedFormXml (XML→fixed-width), FixedFormPdf (XML→PDF via gofpdf+gofpdi) | 4/4 done |
| Render | Renderer |
XsltPlugin (ratago or xsltproc), PreRenderedPlugin (passthrough) | 2/2 done |
| Callback | CallbackSender |
SOAP callback to originating systems (WS-Security UsernameToken, fires non-blocking post-pipeline) | 1/1 done |
| Validation | Validator |
X12Validator (otto JS engine, scripts in resources/scripts/validation/) |
1/1 done |
| Scooper | Scooper |
SftpScooper, GatewayEdiSftpScooper (SFTP + PGP decrypt) | 2/2 done |
Render → Translation → Transport → Callback
- Render — produces intermediate output (XSLT transform or passthrough)
- Translation — resolves format bridge (e.g. X12Xml → X12 EDI text, FixedFormXml → PDF)
- Transport — delivers the result (SFTP, script, HTTP, local file store)
- Callback — non-blocking SOAP notification to originating systems with job result
Jobs are dispatched through a channel-based worker pool (jobqueue/). Scheduled
tasks (eligibility checks, scooper runs) are driven by task/scheduler.go.
All 20 endpoints from the Java 0.5.x API surface are implemented:
- Authentication & users:
changePassword,getCurrentUsername,addRemittUser,listRemittUsers - Config:
getConfigValues,setConfigValue - Payloads:
insertPayload,resubmitPayload,getStatus,getBulkStatus - Files:
getFile,getFileList,getOutputMonths,getOutputYears - Eligibility:
getEligibility,batchEligibilityCheck - Keyring:
addKeyToKeyring - Plugins:
getPlugins,getPluginOptions - Protocol:
getProtocolVersion - Validation:
validatePayload - Parsing:
parseData
Access control is role-based (admin / user) via BasicAuth middleware.
- Language: Java/J2EE → Go with Echo v5 web framework
- Framework: Apache CXF SOAP → RESTful JSON API + SOAP 1.1 compatibility layer (
soap/) for legacy Java clients - ORM: Hibernate → GORP with supplementary sqlc query layer for type-safe generated queries
- Plugin model: Spring beans → registry/factory pattern with
init()self-registration - Job execution: Thread-per-job → channel-based worker pool (
jobqueue/) - Scheduling: Quartz → lightweight in-process scheduler (
task/scheduler.go) - Auth: Container-managed security → stateless HTTP BasicAuth with MD5 password hashing (legacy DB compatibility)
- Eligibility: Expanded from 4 to 8 checkers — added OAuth2 REST (Optum, Stedi), FHIR R4 (BCBS via 1upHealth), and CMS HETS SOAP/X12 270/271 (Medicare)
- X12: Full envelope + 835/271/997 parsers with 22 DTO structs
- PGP/GPG: Native Go armoring (
crypto/pgp.go) — encrypt, decrypt, detect - Testing: E2E pipeline test suite (
test/e2e/) with testdata fixtures + per-plugin unit tests
- Echo v5 — web framework
- GORP — database access layer
- sqlc — type-safe generated queries (
internal/db/) - Go-MySQL-Driver — MySQL driver
- otto — JavaScript engine (script transports, X12 validation)
- goquery — HTML scraping (scripted HTTP transport)
- pkg/sftp — SFTP client
- gofpdf + gofpdi — PDF generation (FixedFormPdf translation)
- ratago — native Go XSLT processor
- gokogiri — native Go XML/DOM/XPath support
- golang-migrate — database migrations
- prometheus/client_golang — metrics instrumentation
The server exposes standard HTTP metrics at /metrics in Prometheus text format:
http_requests_total— counter by method, path, statushttp_request_duration_seconds— histogram by method, path, statushttp_requests_in_flight— gauge of concurrent requests
docker build -t remitt-server .
docker run -p 3000:3000 -v ./remitt.yml:/etc/remitt/remitt.yml remitt-serverThe multi-stage Dockerfile produces a minimal Debian-slim image with xsltproc
for external XSLT transforms. All SSH/SFTP connections use Go's
golang.org/x/crypto/ssh — no system SSH client required.
cp config.yaml.example config.yaml
# edit config.yaml with your MySQL credentials
go run ./cmd/remitt-server/The server starts on the port configured in config.yaml (default: 8080).
Code in this repository runs against a valid REMITT 0.5.x series database with no modifications.
Full migration task list: TODO.md

