Download Latest Version openemr-8.5.0.zip (279.7 MB)
Home / v8_5_0
Name Modified Size InfoDownloads / Week
Parent folder
changelog.md 2026-10-28 62.5 kB
openemr-8.5.0.tar.gz.sha512 2026-10-27 151 Bytes
openemr-8.5.0.zip.sha256 2026-10-27 84 Bytes
openemr-8.5.0.zip.sha512 2026-10-27 148 Bytes
openemr-8.5.0.tar.gz 2026-10-27 228.7 MB
openemr-8.5.0.tar.gz.md5 2026-10-27 55 Bytes
openemr-8.5.0.tar.gz.sha256 2026-10-27 87 Bytes
openemr-8.5.0.zip 2026-10-27 279.7 MB
openemr-8.5.0.zip.md5 2026-10-27 52 Bytes
OpenEMR 8.5.0 source code.tar.gz 2026-10-27 46.1 MB
OpenEMR 8.5.0 source code.zip 2026-10-27 51.3 MB
README.md 2026-10-27 62.5 kB
Totals: 12 Items   605.9 MB 41

8.5.0 - 2026-10-26

Minimum supported versions

  • PHP 8.3+
  • MariaDB 10.11+
  • MySQL 8.4+

See the tested CI matrix for all tested version combinations.

Security Fixes

  • [Critical] Chained: a Front Office clerk escalates to whole-database read, a patient identity, and approved forged clinical records (GHSA-vr7f-7c3w-49g7)
  • [Critical] OAuth scope canonicalization and containment flaws allow unauthenticated Patient read/write access (GHSA-6xh3-fmm5-jjp4)
  • [Critical] OpenEMR local file disclosure through user-controlled PDF HTML (GHSA-h4xc-pqg3-8459)
  • [Critical] Remote code execution via Stored ERA upload (GHSA-r6wm-8m2j-c3q9)
  • [Critical] SQL injection in openemr (GHSA-hrf6-qx6w-vgh9)
  • [Critical] SQL injection through CCR/CCDA approval patient-data field names (GHSA-wh28-4qcg-5hcc)
  • [High] Arbitrary Global Configuration Override via Unrestricted User Settings Injection (GHSA-v997-jphq-wvvr)
  • [High] Cross-patient C-CDA disclosure in ccdaservice/ccda_gateway.php (missing authorization) (GHSA-6fxw-69cq-m7g6)
  • [High] diagnosis_full.php exposes unauthenticated billing delete and clear operations with user-controlled ID (GHSA-r65f-fxf6-4fwr)
  • [High] Document-template renderer bypasses patient document and clinical-data permissions (GHSA-vc2h-x8xf-8jcv)
  • [High] Dynamic patient finder omits patients/demo (GHSA-79g8-hm7q-xrh4)
  • [High] Five Module Manager actions run without the admin/manage_modules check (GHSA-gpcx-xcp2-2rhx)
  • [High] Incomplete Fix for CVE-2026-33910 Stored / Second-Order SQL Injection Still Reachable via getByPatientDemographics() in library/patient.inc.php (GHSA-pc2q-9pcw-v899)
  • [High] Low-privilege core users can replace arbitrary patient portal credentials (GHSA-83hq-c876-fcwf)
  • [High] Low-privilege users can change another patient's tracker and appointment status (GHSA-cxjf-fmpw-qc34)
  • [High] Missing authorization on portal/import_template.php allows any authenticated staff to wipe document-template profiles and read template bodies (GHSA-phvv-q7m7-8mc2)
  • [High] No rate limiting or lockout on TOTP submission in web login and OAuth2 authorization code flows (GHSA-rp7c-25mm-8g74)
  • [High] OAuth2 clients not restricted to their registered grant types (GHSA-qjj7-c4m9-6f92)
  • [High] OAuth2 Password Grant bypasses MFA when mfa_token parameter is omitted (GHSA-6xc2-v6mv-w3g3)
  • [High] OpenEMR 8.3.0 - Persistent SQL Injection in ERA File Reprocessing (Second-Order via Server-Side File) (GHSA-hqjp-rcv8-7p9c)
  • [High] OpenEMR user_settings.php unauthorized global configuration override (GHSA-prmv-3m3j-9v7j)
  • [High] OpenEMR immunizations.php, diagnosis_full.php and billing_process.php skip the ACL their same-dataset siblings enforce (GHSA-xp7w-8fx3-642x)
  • [High] OpenEMR Missing ACL on custom/ export & chart-tracker scripts (PHI disclosure, chart-tracker forgery, stored XML injection) (GHSA-3h5w-672p-v4m9)
  • [High] OpenEMR Patient create and search endpoints missing ACL (GHSA-cwpg-qv34-gx8x)
  • [High] OpenEMR SMART/OAuth scope finalization can lead to unauthorized write-capable token scopes (GHSA-6cmr-r2rh-755m)
  • [High] OpenEMR SQL injection via string-concatenated user input (billing parse, reports, Zend modules) (GHSA-g7m7-pc2p-7h7q)
  • [High] OpenEMR Syndromic Surveillance Module Authenticated Error-Based SQL Injection (GHSA-w99c-jwcm-24hh)
  • [High] Path traversal in ERA (X12 835) upload allows writing attacker-controlled files outside the ERA directory (era_payments.php, sl_eob_search.php) (GHSA-mf55-7h68-r2rp)
  • [High] Procedure-order endpoint permits cross-patient disclosure and unauthorized lab-order modification (GHSA-q5c6-96vf-rx9v)
  • [High] Second-order SQL injection through the Carecoordination CCDA mapper (GHSA-8rgh-38j4-6pxf)
  • [High] SQL injection in OpenEMR patient portal OnsiteActivityView API via _BitwiseAnd Criteria attribute (GHSA-vvj8-xpx8-p293)
  • [High] SQL injection in patient portal query API via _BitwiseAnd mass-assignment (GHSA-g2xw-rvhq-x543)
  • [High] SQL injection in SLEOB::slInvoiceNumber() via the CLP01 claim identifier of an uploaded X12 835 (ERA) file (GHSA-cw3f-mhw8-44jp)
  • [High] SQL injection via form_icd_codes[] unquoted IN() clause in Syndromic Surveillance report (GHSA-q6f8-4pm7-q39r)
  • [High] SQL injection via HTTP parameter names in CcrTable::insertApprovedData(), on a CCR route with no ACL and no CSRF protection (GHSA-86hf-j825-r56h)
  • [High] SQL Injection Vulnerability in the IPPF contraceptive issue feature (OpenEMR <=8.0.0.3) (GHSA-8j6v-q545-q9q7)
  • [High] Stored XSS from patient portal into staff sessions via document template rendering (GHSA-hfpq-j3fj-cpmv)
  • [High] Stored XSS via OnsitePortalActivity tableArgs (GHSA-r4hm-frcj-qr39)
  • [Medium] 301 Incomplete CVE-2026-33299 fix leaves stored XSS in Eye Exam orders (GHSA-rgv4-6mf9-hxwx)
  • [Medium] [SECURITY] Reflected XSS in OpenEMR ACL Module (GHSA-mccm-83g2-7v57)
  • [Medium] [SECURITY] Reflected XSS in OpenEMR Application Module Auto-Suggest Endpoint (application/index/search, searchEleNo) (GHSA-pv5m-vjm7-x355)
  • [Medium] [SECURITY] Reflected XSS in OpenEMR Application Module Auto-Suggest Endpoint (application/index/search, searchMode (GHSA-8mwp-vq82-x5mr)
  • [Medium] [SECURITY] Stored XSS in OpenEMR 8.2.0 — Eye Exam Defaults (eye_mag module (GHSA-gr77-7xgh-5gwf)
  • [Medium] Billing and Carecoordination users can exhaust PHP workers through four ZIP upload paths (GHSA-pqmf-m4h6-wjh4)
  • [Medium] Billing claim downloader exposes unrelated files from the shared temporary directory (GHSA-9rw5-h7xf-57mc)
  • [Medium] C-CDA gateway bypasses patient-report authorization (GHSA-7cfr-7h7r-f2x9)
  • [Medium] CAMOS prescription printer discloses another patient's prescription by global ID (GHSA-gf9c-4hh8-gh49)
  • [Medium] CAMOS template administration authorizes everyone (GHSA-5r7f-fg5x-3gcp)
  • [Medium] Care Coordination import reassigns inaccessible documents and bypasses category ACLs (GHSA-mmpv-ph5x-x4m3)
  • [Medium] Clinician billing code causes stored XSS when EOB staff enter a payment (GHSA-v7qh-q4xq-28v3)
  • [Medium] Destroyed-drug report omits its declared ACLs (GHSA-pf2f-4xph-fhjx)
  • [Medium] Ensora eRx entry point omits patients/rx (GHSA-mcr3-5rq6-9vvj)
  • [Medium] Idle session timeout never fires while the Eye Exam form is open in read-only mode (GHSA-fc6f-f47r-j9x8)
  • [Medium] Incomplete patient-creation fix lets read-only users create charts through FaxSMS (GHSA-ppg9-2f9f-chc4)
  • [Medium] Inverted document-expiration check exposes time-limited PHI (FHIR Bulk Export / $docref) (GHSA-fp98-qfh5-xjhc)
  • [Medium] Medical-record users can exhaust PHP workers through an unbounded lab-label PDF count (GHSA-3j3r-w7q7-h9fj)
  • [Medium] Missing appointment ACL permits arbitrary Patient Flow Board status changes (GHSA-2984-qxv9-6r62)
  • [Medium] Missing authorization allows any core user to send as the clinic's Direct identity (GHSA-vf9m-wg38-vcc2)
  • [Medium] Missing Authorization Allows Front Office Users to Access Patient Vitals and PHI (GHSA-h9rv-wxcp-x85f)
  • [Medium] Missing authorization in authorizations_full.php allows any authenticated user to authorize arbitrary patients' clinical records (GHSA-j467-662w-jwvj)
  • [Medium] Missing Authorization in OpenEMR Patient Validation Module Allows Unrestricted Patient Record Disclosure (interface/modules/zend_modules/module/Patientvalidation/) (GHSA-q4jf-6gcg-m3jx)
  • [Medium] Missing authorization lets any core user e-sign and lock arbitrary patient forms (GHSA-6x2w-9gwv-mc7v)
  • [Medium] Missing authorization on the portal OnsiteActivityView API discloses every patient's demographics and Social Security number (GHSA-9f97-gqgj-wr6g)
  • [Medium] Module administration actions in InstallerController have no permission check (GHSA-32cq-gh7x-jpqw)
  • [Medium] Nation Notes configuration mutations omit nationnotes/nn_configure (GHSA-m4cw-vx96-p6fj)
  • [Medium] Observation form deletion endpoint has no CSRF check, while the sibling save action in the same controller does (GHSA-7gjr-359j-5q93)
  • [Medium] OpenEMR Carecoordination module: IDOR across CCDA/CCR/QRDA document download, preview, transmit, import, and generation (GHSA-3vxh-7hh5-vhhm)
  • [Medium] OpenEMR missing function-level ACL on reports and reminder/batch endpoints (GHSA-6h9j-m5w9-8938)
  • [Medium] OpenEMR Observation form mass assignment (authorized flag forge and cross-record tamper) (GHSA-qv6p-57wj-w55p)
  • [Medium] OpenEMR Patient Portal PDF SSRF via HTMLPurifier/mPDF external resource loading (GHSA-wc8m-q5xj-j34x)
  • [Medium] OpenEMR: MFA factors can be deleted, and a U2F key registered, without the password re-entry that TOTP registration requires (GHSA-rcrp-xxch-gxfh)
  • [Medium] Privileged billing-code editor can execute stored XSS when a clinician selects a code (GHSA-qv97-cvw6-8j53)
  • [Medium] Privileged stored SQL injection through History layout field identifiers (GHSA-fq58-jp5g-x44q)
  • [Medium] Read-only drug administration permits dispensing and inventory mutation (GHSA-hp8p-h8g8-xmg3)
  • [Medium] Read-only medical permission modifies lab-order transmission flags (GHSA-xmjf-8fc9-hh38)
  • [Medium] Read-only medical permission permits arbitrary lab-order transmission (GHSA-3xjm-656g-cfj5)
  • [Medium] Read-only medical permission permits clinical-rule result modification (GHSA-xqq3-59h5-xhmr)
  • [Medium] Restricted staff can mark another patient's clinical lists as "None known" (GHSA-924r-c6jp-67px)
  • [Medium] Second-Order Eval Injection leading to Remote Code Execution (RCE) via Database Category IDs in Tree.class.php (GHSA-55q2-3hm8-v9hp)
  • [Medium] SQL injection in the IPPF statistics report via form_facility (GHSA-p2ch-6856-w69j)
  • [Medium] Stored XSS in OpenEMR 6.1.0-8.4.0 - User external ID / view prescriptions (GHSA-w2f7-289j-92pp)
  • [Medium] Stored XSS in the Fee Sheet: the notecodes field is escaped for the wrong context (GHSA-ff55-qvf9-2fgm)
  • [Medium] Stored XSS in the printed fee sheet via appointment comments (GHSA-c997-5w2m-grrf)
  • [Low] Active Debug Code in fax_view.php Discloses Web Server Group Membership (GHSA-wc2f-fvpv-c32r)

Fixed

  • accept date search values with minutes and no seconds (#14520)
  • add assert-inputs-nonempty.sh to byte-identical manifest (G45) (#14126)
  • add Item 3 composite actions to byte-identical manifest (G47) (#14178)
  • add missing actions/checkout to acceptance-only rerun workflows (#13972)
  • add missing FROM keyword to DELETE statements (#14286)
  • Added arg for specifying custom git repo as source (#13709)
  • address patient statements to the guarantor (#14794)
  • align PRIORS tropicamide with 1% and keep legacy 2.5% checked (#14228)
  • align week-view appointments with their time-slot labels (#14266)
  • allow mode-less AJAX requests through eye_mag save whitelist (#14054)
  • appointment list endpoints return 200 for empty results (#14605)
  • archive results files before importing them (#14402)
  • ask for the retrieve key before embedding documents in the report (#14600)
  • bearer-authenticate the /api/version check (#14566)
  • bill Tests Performed drugs as the fee sheet does (#14746)
  • build Validate Only claims for the payer selected (#14552)
  • bump Docker Upgrade Process recreate wait_for_healthy from 600s to 1200s (G40) (#14081)
  • commit synthetic CHANGELOG stub so package-assemble sees clean tree (#14014)
  • convert date search values with the offset of the searched date (#14642)
  • convert scanned PDFs to TIFFs tiff2pdf can file (#14229)
  • convert uuid params to binary in appointment getOneForPatient (#14625)
  • correct inverted comparison in Document::has_expired() (#14049)
  • count a form in a signed encounter as signed on the report (#14718)
  • count a Vitals blood pressure typed with spaces (#14670)
  • count ongoing records and visits saved without an end time (#14621)
  • count prepayment distributions to any patient (#14189)
  • daylight savings time fixes for the calendar preview (#14399)
  • decouple acceptance-gate skip from dry_run in build-release.yml (G43) (#14118)
  • decouple delete refresh from SQL display (#13713)
  • decouple workflow_call gate expected_version from checkout tree (root cause of 8.4.0 ship cascade) (#13974)
  • default pc_prefcatid to 0 on portal appointment insert (#14260)
  • derive_from_version excludes to_version from candidates (#14018)
  • differentiate acceptance-docker concurrency by inputs.to_tag (G46) (#14131)
  • don't link an issue to an encounter twice (#14789)
  • don't list encounters without charges as unbilled (#14361)
  • don't mark a failed X12 SFTP upload as sent (#14336)
  • don't poll inactive procedure providers for results (#14400)
  • don't post an ERA check twice (#14619)
  • drop sparse-checkout from sync-byte-identical composite checkout (#14203)
  • enable patient selection for transmission (#13533)
  • fail the Inferno job when certification tests fail (#14482)
  • fall back instead of fataling when a global is unusable (#13950)
  • filter payment activity and align alert counts (#13961)
  • Fix bind array mismatch in patient finder count query (#14003)
  • fix module lifecycle settings and the EtherFax unread count (#14481)
  • grant SMART scopes by permission union and keep consent in the client's spelling (#14317)
  • guard find_appt_popup opener-chain + capture acceptance failure artifacts (#14491)
  • guard opener-refresh chain so appointment-save modal always closes (#14325)
  • guard window.top derefs so form init survives a transiently null top (#14486)
  • handle patients without insurance (#14356)
  • honor the provider filter in the AMC tracking report (#14240)
  • include Composer-installed modules in release image (#14638)
  • isolate sync-byte-identical composite checkout to prevent sparse-checkout leak (#14199)
  • keep checkout totals and message text readable in every theme (#14590)
  • keep fitness/referral_source defaults when creating a patient (#14620)
  • keep invoices moved back to insurance out of Due Pt (#14604)
  • keep the background-service poll from resetting the idle timeout (#14550)
  • keep the Config editor usable when a stored secret cann… (#14474)
  • keep the fee sheet on an e-signed, locked encounter (#14661)
  • keep the site when logging out a window whose session is gone (#14586)
  • keep Weno background services off while the module is disabled (#14787)
  • label each receipt payment with its own payer (#14458)
  • label the facility list's physical address column "Physical Address" (#14739)
  • leave deleted observations out of eCQM calculations (#14587)
  • leave inactive facilities out of the facility picker (#14296)
  • let copy forward through save.php again (#14611)
  • let the view page's Delete button delete the document (#14262)
  • limit available appointments to schedule hours (#13804)
  • list and save User Permissions for the same users (#14676)
  • list the forms in Patient > Visit Forms (#14446)
  • list the grants, scopes and auth methods the server accepts (#14234)
  • load the calendar helpers for Nth-weekday recurrences (#14238)
  • lower the variable.undefined cap to 467 (#14339)
  • make faxsms, ehi-exporter, and weno install SQL safe to re-run (#14230)
  • make InsuranceCompanyService::update behave as a semantic PATCH (#14688)
  • make the missing modifier work on binary columns on MySQL 8 (#14221)
  • match misc_billing_options table.sql to database.sql (#14404)
  • MFA and password grant improvements (#14110)
  • net a patient's credit encounters on statements (#14548)
  • normalize recent patient date metadata keys (#14247)
  • offer the custom fee sheet list codes as review choices again (#14395)
  • omit 2330B DTP*573 when 2430 reports the payer's lines (#14588)
  • open a provider appointment on the provider tab (#14488)
  • open Misc Billing Options for patients with no referring provider (#14460)
  • open the editor on the current policy, not one without a start date (#14534)
  • open the fee sheet from Fees menu on a locked encounter (#14674)
  • OPENEMR__ENVIRONMENT dev (#14070)
  • pass scoped CSRF token when loading portal payment card (#13951)
  • pass the forced-reset flag when creating an invitee's portal credentials (#14236)
  • pass the web root to the reason code widget unencoded (#14291)
  • pass the web root unencoded to the observation and procedure order code pickers (#14578)
  • patch pcov -std=c99 to c11 for 8.7 dev-track build (#14259)
  • patch-prep row template adds gate_with_acceptance + finalize backfills it (G44) (#14122)
  • PatchPrepReleaseTargetsMutator strips next from master row (G39) (#14075)
  • patient-compartment appointment GET must scope by pid (#14734)
  • populate the fee sheet with the code row the fee sheet uses (#14719)
  • post a reviewed portal payment to the patient who made it (#14807)
  • PostReleaseTargetsMutator strips latest from prior-patch row on same rel branch (G41) (#14111)
  • preselect the user's default warehouse on product lines (#14466)
  • preserve eid when switching Patient/Provider/Group tabs (#14263)
  • preserve master-composite/ across rel-branch checkout to stop cosmetic post-cleanup failure (#14216)
  • preserve site context in main shell URL (#14009)
  • preserve timestamps for unchanged notes (#14321)
  • prevent archive audit logging failure (#13963)
  • remove dangling LEFT JOIN in ProcedureService::getAll SQL (#14720)
  • remove dead pmsfh guard (#14311)
  • remove invalid ledger controls lookup (#13952)
  • reorder apis rewrite before portal/patient (rel-850 backport of [#14822]) (#14823)
  • repair campaign sending and make cancelled statuses configurable (#14237)
  • require ESign/SignatureIF.php so Patient Flow can load (#14265)
  • resolve PHPStan 2.2.16 findings (unprinted translations, dead duplicate conditions) (#14398)
  • REST and FHIR endpoint bugs found running a client against 8.4 (#14653)
  • restore medical history issue saves (#13971)
  • restore missing bootstrap require in dated_reminders_log.php (#14192)
  • restore query assignment swallowed by nosemgrep comment (#14052)
  • restore staff demographics review (#13965)
  • restrict secure message editor toolbar (#13967)
  • rewrite sync-byte-identical with single-checkout to end the post-cleanup failure cycle (#14226)
  • route drug/direct-message/batch senders through MyMailer (#14076)
  • run multisite services against their own site (#14359)
  • run the IPPF statistics report again, and require acct/rep_a (#14461)
  • run the Pending Followup from Results report again, and require patients/lab (#14696)
  • schedule certificate renewal on every start (#14417)
  • scope patient-compartment PUT routes by pid (#14747)
  • send CLM10 patient signature source only on workers' comp claims (#14362)
  • send each diagnosis to Ensora once and the patient's cell phone (#14239)
  • send form_pid with the card payment forms (#14709)
  • send prior payer claim control number in 837P loop 2330B (#14136)
  • send the 837P pay-to address from the facility's mailing address (#14741)
  • send the window to login when its session is gone (#14233)
  • show family medical history and stop clearing what the panel lacks (#14735)
  • show patient on payment receipts (#13969)
  • show the dispensed medications card only when there is something in it (#14541)
  • show the Modules menu to users who may manage modules (#14293)
  • show the New Patient form's section names in the Manila and Solar themes (#14740)
  • silence PHP 8.5 warnings in observation and document rendering (#14358)
  • size the billing note box on the server (#14618)
  • skip the key permission check for the public key (#14331)
  • smoketest uses current-rel shipped version + tag/Release safety gates (#14017)
  • stop emitting extensions without a url for missing performers and subjects (#14496)
  • stop sql.inc.php clobbering the $config install flag (#13429)
  • store info.txt names and categories without the newline (#14447)
  • store sent etherFax faxes as outbound (#14678)
  • store the encounter id on questionnaire responses (#14654)
  • store the payer claim control number on ERA adjustments (#14551)
  • stub CHANGELOG for synthetic recovery-path smoketest version (#14010)
  • support April 1 mid-year ICD-10 releases (#13762)
  • swap reversed SNOMED CT codes for administrative sex (#14022)
  • tie AM/PM enable state to the time input, not the duration input (#14261)
  • TransactionRestController GetPatientTransactions returns 200 for empty list (#14727)
  • type mb_is_string_equal_ci parameters as string (#14697)
  • use form->submit() + staleness gate to eliminate api-enable flake (#14290)
  • use the code system's display for HL7 category and timing codings (#14499)
  • use the ST position when keying trace-search segments (#14462)
  • validate-source-run.sh accepts comma-separated workflow paths (unblocks 8.4.0 ship bypass) (#13973)

ACL & Permissions

  • give Clinicians a single 'write' ACL again (#14707)

Database Layer

  • quote identifiers and bind values in upgrade guard checks (#14312)

Added

  • add Observation write support for vital signs (#14217)
  • add release-mode guardrail requiring upgrade-cell to run (#14215)
  • add surface assignments for questionnaire availability (#14485)
  • add the 2026 performance period measures (#14536)
  • admin unblock UI for MFA and portal-account counters (#14187) (#14288)
  • auto-merge byte-identical sync PRs on green CI (#14028)
  • count vitals from the Vitals form in eCQMs (#14656)
  • custom fee sheet list entries can name the drug for a HCPCS code (#14394)
  • default units and NDC for injection codes from inventory (#14330)
  • display client registration warnings for write scopes (#14509)
  • docker sibling for recovery-path smoketest + related docs (#14035)
  • docker sibling smoketest v2 -- dry_run mode on docker-build-release (#14037)
  • expand native runtime SDC/R4 coverage and per-instance repeats (rel-850 backport of [#14744]) (#14826)
  • fee sheet appt status prompt (#14790)
  • Fhir writes continued (#13281)
  • let a site supply its own base drawings (#14612)
  • let the release image's apache uid be set at build time (#14363)
  • nightly recovery-path smoketest workflow (#13991)
  • no_publish mode on acceptance-only + docker-acceptance-only (#13985)
  • record a reason with the checkout discount (#14583)
  • refresh the main menu without reloading OpenEMR (#14523)
  • register background_service OAuth2 scopes and add api coverage (#14749)
  • replace Node schematron service with pure PHP validator continued from [#13884] (#14005)
  • replace Node.js CCDA service with PHP service-Continued from [#12470] (#13983)
  • replace the Node CQM service with PHP (#14469)
  • show each drug's billing code, fee sheet units and NDC quantity (#14540)
  • synthea bundle importer for openemr-cmd irp --format=fhir (#14357)
  • Task create and update (part 2 of [#14521]) (#14660)
  • Task resource, read and search (part 1 of [#14521]) (#14614)

Changed

  • add /api/user coverage (#14721)
  • add api-tier consent-page render regression gates (#14633)
  • add consent-scope-narrowing regression tests (#14628)
  • add cross-session csrf_token_form replay deny-path test (#14589)
  • add DCR edge-case regression gates (#14798)
  • add DORA-aligned release performance metrics section (#13981)
  • add Drug + Immunization standard-api regression gates (batch 1) (#14675)
  • add EHR-launch CSRF + unknown-client-id regression gates (#14668)
  • add Encounter + SOAP note CRUD coverage (standard-api batch 4 slice 1) (#14722)
  • add error-path browser regression gates to SmartLaunch suite (#14666)
  • add FHIR MedicationDispense API tests (#12343) (#14038)
  • add FHIR Organization API tests (#12343) (#14034)
  • add FHIR Patient read and update API tests (#12343) (#14051)
  • add FHIR write-path smoke to oe-module-api-explorer (#14665)
  • add Followup opportunities subsection (#13984)
  • add G36 recovery-path smoketest gap + cross-doc updates (#14024)
  • add G48 entry for sync-byte-identical sparse-checkout leak arc (#14204)
  • add http-layer regression gate for /token brute-force lockout (#14577)
  • add insufficient-scope deny-path regression gates (#14759)
  • add invocation contexts reference section (Item 5) (#14186)
  • add isolated split for TokenIntrospectionRestController (#14664)
  • add missing FHIR resource read scopes to ApiTestClient ALL_SCOPES (#14762)
  • add missing permission gates on staff endpoints (#14015)
  • add missing permission gates on staff endpoints (#14231)
  • add OAuth2 audit log integrity regression gates (#14796)
  • add oe-module-api-explorer round-trip smoke (#14533)
  • add OIDC id_token claims structure regression gates (#14799)
  • add patient-compartment insurance CRUD coverage (standard-api batch 4 slice 2) (#14728)
  • add permission gates (#14270)
  • add permission gates and whitelist update column names (#14344)
  • add portal api positive-shape smoke tests (#14591)
  • add portal-api smoke to oe-module-api-explorer (#14673)
  • add positive-shape test for GET /portal/patient/encounter/{euuid} (#14603)
  • add public-client PKCE mint-level coverage (#14659)
  • add refresh-token scope-persistence regression gates (#14658)
  • add regression gates for FHIR _sort search modifier (#14667)
  • add response_type validation regression gates (#14795)
  • add SMART v2 constraint-scope end-to-end coverage (#14763)
  • add SMART-launch smoke driving oe-smart-questionnaire end-to-end (#14529) (#14532)
  • add standard-api coverage for appointment DELETE, insurance_company list/single, medication CRUD (#14680)
  • add Surgery + Dental_issue CRUD coverage, fix ListRestController empty-array-as-404 (#14681)
  • add swap-insurance operation coverage (#14732)
  • add the missing license header to AuthorizationListener (#13946)
  • add token revocation race-condition regression gates (#14797)
  • add V2 scope-set api-tier equivalence coverage (#14760)
  • add Vital CRUD + Patient Transaction CRUD api coverage (#14689)
  • apply correct output escaping (#14287)
  • apply correct output escaping (#14324)
  • array return types for billing, CDR, and common (#14351)
  • array return types for FHIR services (#14349)
  • array return types for legacy classes (#14348)
  • array return types for legacy functions (#14347)
  • array return types for services (#14350)
  • array return types for zend modules (#14354)
  • audit-PR a+b+c — insurance_type, patient-employer, appointment compartment, message CRUD (#14729)
  • audit-PR d+e+f — allergy / medical_problem CRUD + top-level reads (#14733)
  • bump binary image to OpenEMR 8.4.1 (#14346)
  • bump binary image to PHP 8.5.12 forge release (#14773)
  • bump openemr/openemr:flex digest to fc384ddecedf (#14419)
  • bump phpstan/phpstan to 2.3.1 (#14576)
  • bump rector/rector to 2.7.0 (#14582)
  • bump sabberworm/php-css-parser 9.4.0 -> 9.5.0 (#14289)
  • bump updatecli/updatecli-action from 3.6.0 to 3.7.0 (#14142)
  • bump updatecli/updatecli-action from 3.7.0 to 3.8.0 (#14366)
  • bump updatecli/updatecli-action from 3.8.0 to 3.9.0 (#14428)
  • capture api_log request bodies, redact OAuth2 fields (#14445)
  • complete AuthCodeRepository stubs + expand end-to-end tests (#14531)
  • correctness pass across grant, route, cors, and token flows (#14475)
  • cover the patient_data date column lookup (#14255)
  • deepen HttpRestRequest unconstrained-scope isolated coverage (#14662)
  • derive upgrade-cell from_tag per-row from checkout sql files (#14440)
  • document Item 4 followup release-mode guardrail in plan doc (#14227)
  • documentation for vendor hooks (#13953)
  • drop 8.4.0 row post-8.4.1 ship (#14135)
  • drop file timestamp restore step (#14405)
  • expand deny-path test gates and tighten JWKS null-guard (#14574)
  • expand oe-module-api-explorer smoke to confidential auth-code + public PKCE (#14538)
  • expand oe-module-api-explorer smoke to password grant (#14663)
  • expand SMART-launch smoke with 4 new tests (#14529 follow-up) (#14537)
  • expect the profiles the CapabilityStatement leaves out on purpose (#14492)
  • extract 3 shared scripts + BATS from recovery-path smoketest (#14045)
  • extract acceptance workflow step composites (Item 3) (#14168)
  • extract acceptance-docker inline logic into 3 scripts with unit tests (#14182)
  • fix phantom codecov/project drops from shared flags (#14388)
  • fix the screening observation and C-CDA certification failures (#14655)
  • forbid mail() and direct PHPMailer instantiation (#14077)
  • FY 2027 ICD-10-CM and ICD-10-PCS code sets (#14280)
  • G37 audit findings + preflight guards on the two publish reusables (#14050)
  • G38 + Quick-Action-2 hyphen callout + swap section order (#14073)
  • G41 outcome + G42 acknowledgements co-author bug cycle + tighten next-release framing (#14117)
  • index oe_faxsms_queue.receive_date for the fax list (#14677)
  • introduce AcceptanceContext resolver (Item 1) (#14137)
  • load Phreeze via composer classmap (#13845)
  • move gprelations.inc.php bodies into GpRelationService (#14055)
  • move patientvalidation.inc.php body into PatientValidationService (#14112)
  • move the agent development guide to AGENTS.md (#14487)
  • optimize input validation and permission gates on several AJAX and form endpoints (#14679)
  • optimize input validation and permission gates on several AJAX and form endpoints (rel-850 backport of [#14761]) (#14825)
  • optimize list-option, finder, and IPPF form handlers (#14672)
  • optimize report, portal, and transaction entry points (#14627)
  • parameterize residual concat values (#14329)
  • pin code-version via bind-mount in Docker Upgrade Process test (#13928)
  • point api-explorer smoke at openemr/oe-module-api-explorer (#14748)
  • post-8.4.0 updates to release-automation + acceptance-testing plans (#13982)
  • post-8.4.0-ship update — G35 + semi-auto merge-order note (#13977)
  • post-rel-840 update — G34 + latest-cut pointer (#13936)
  • promote 8.7 into fpm test matrix; keep 8.6/8.7 as prerelease opt-ins (#14269)
  • record Phase 4h ACL assertion + G52 gap entry for [#14707] (#14731)
  • Rector type coverage level 10 (#14364)
  • Rector type coverage level 11 (#14365)
  • Rector type coverage level 12 (#14389)
  • Rector type coverage level 13 (#14390)
  • Rector type coverage level 14 (#14392)
  • Rector type coverage level 15 (#14397)
  • Rector type coverage level 16 (#14401)
  • Rector type coverage level 17 (#14403)
  • Rector type coverage level 8 (again) (#14345)
  • Rector type coverage level 9 (#14355)
  • Rector type coverage levels 18-19 (#14409)
  • refresh stale group-name pseudocode + resolve-step wording post-refactor (#14198)
  • reorganize tests/Acceptance/ into concern-based subdirs (Item 6) (#14196)
  • require a v_database bump when upgrade SQL changes (#14501)
  • resolve docker acceptance version from version.php + fail-hard on missing (Item 4) (#14173)
  • retarget 8.6 fpm to RC image; add 8.7 dev-track build (#14257)
  • retire the Node C-CDA service (#14470)
  • retire the Node CQM calculation service (#14524)
  • retire the standalone US Core 3.1.1 Inferno test (#14498)
  • role-context symmetry regression gates across the route matrix (#14810)
  • run the v_database check when it changes; explain edits (#14519)
  • scope code-version bind-mount to the recreate step only (#13934)
  • scope document deletion to the submitted patient context (#13958)
  • set SourceForge default download after a release is published (#14539)
  • skip 3-day dependabot cooldown for our own docker images (#14425)
  • skip certification tests in the Codecov patch check (#14493)
  • split scenario/state group tags + persistence-test structural fix (Item 2) (#14141)
  • stop carrying forward retired flags; address [#14388] review (#14441)
  • stop carrying forward the remaining retired Codecov flags (#14453)
  • swap defunct ccdaservice/ fixture path in FallbackRouterTest (#14575)
  • tighten 3 weak assertions across api test suite (#14809)
  • tighten CCDA/CCR module entry points (#14579)
  • tighten CORS Allow-Origin from per-server union to per-client scope (#14527)
  • tighten patient-record access across document render paths (#14471)
  • tighten upload hygiene across ERA, ZIP, and related paths (#14530)
  • tolerate between-cycles state during daily master-row dispatch (#14416)
  • two-invocation wizard-install split for post-install-tests coverage (Item 2.5) (#14146)
  • update gaps for 8.4.1 patch cycle in-flight + G39/G40 outcomes (#14084)
  • Update PHP versions (#14771)
  • upgrade the stylelint toolchain to stylelint 17 (#14418)
  • upload only the named files to Codecov (#14465)

Documentation

  • document AI agent dev environment and LXC reference setup (#11900)

PHP

  • bump claimrevolution/oe-module-claimrev-connect from 2.1.9 to 2.2.0 (#14692)
  • bump doctrine/orm from 3.6.8 to 3.7.0 (#14000)
  • bump ergebnis/composer-normalize from 2.52.0 to 2.53.0 (#14002)
  • bump ergebnis/composer-normalize from 2.53.0 to 2.54.0 (#14306)
  • bump ezyang/htmlpurifier from 4.19.0 to 4.19.1 (#14155)
  • bump giggsey/libphonenumber-for-php from 9.0.38 to 9.0.39 (#13995)
  • bump giggsey/libphonenumber-for-php from 9.0.39 to 9.0.40 (#14305)
  • bump giggsey/libphonenumber-for-php from 9.0.40 to 9.0.41 (#14555)
  • bump google/apiclient from 2.19.4 to 2.20.0 (#14273)
  • bump google/apiclient from 2.20.0 to 2.20.1 (#14377)
  • bump justinrainbow/json-schema from 6.11.0 to 6.12.0 (#13996)
  • bump justinrainbow/json-schema from 6.12.0 to 6.13.0 (#14303)
  • bump justinrainbow/json-schema from 6.13.0 to 6.13.1 (#14376)
  • bump monolog/monolog from 3.11.0 to 3.12.0 (#13993)
  • bump monolog/monolog from 3.12.0 to 3.12.1 (#14385)
  • bump nikic/php-parser from 5.8.0 to 5.9.0 (#14163)
  • bump phpmyadmin/sql-parser from 6.0.0 to 6.0.1 (#14558)
  • bump phpoffice/phpspreadsheet from 5.9.0 to 5.10.0 (#14157)
  • bump phpstan/phpstan from 2.2.13 to 2.2.16 (#14382)
  • bump phpstan/phpstan-phpunit from 2.0.18 to 2.1.1 (#14559)
  • bump ramsey/uuid from 4.9.3 to 4.9.4 (#14160)
  • bump smarty/smarty from 4.5.7 to 4.5.8 (#14560)
  • bump the development group across 1 directory with 2 updates (#14553)
  • bump twig/twig from 3.28.0 to 3.29.0 (#14276)
  • bump twig/twig from 3.29.0 to 3.30.0 (#14387)
  • bump zircote/swagger-php from 6.10.0 to 6.15.0 (#14690)
  • bump zircote/swagger-php from 6.7.1 to 6.10.0 (#14274)

javascript

  • bump @babel/core from 7.26.10 to 7.29.7 (#14258)
  • bump autoprefixer from 10.5.4 to 10.5.6 (#14001)
  • bump autoprefixer from 10.5.6 to 10.6.1 (#14151)
  • bump body-parser from 1.20.6 to 1.20.8 in /ccdaservice (#13992)
  • bump brace-expansion from 1.1.18 to 1.1.21 (#14396)
  • bump brace-expansion in /ccdaservice (#14323)
  • bump compression from 1.8.1 to 1.8.2 in /ccdaservice (#14158)
  • bump dompurify from 3.4.14 to 3.4.15 (#13998)
  • bump dompurify from 3.4.15 to 3.4.16 (#14304)
  • bump dompurify from 3.4.16 to 3.4.17 (#14693)
  • bump eslint from 10.9.1 to 10.10.0 in /ccdaservice (#13994)
  • bump express from 4.22.2 to 4.22.3 in /ccdaservice (#14154)
  • bump ip-address from 10.5.0 to 10.7.2 in /ccdaservice (#14313)
  • bump jest-environment-jsdom from 30.5.1 to 30.5.2 in the testing group across 1 directory (#14272)
  • bump jszip from 3.10.1 to 3.10.2 (#13999)
  • bump mocha from 12.0.1 to 12.0.2 in /ccdaservice (#14153)
  • bump mocha from 12.0.2 to 12.0.3 in /ccdaservice (#14379)
  • bump moment from 2.30.1 to 2.31.0 (#14149)
  • bump moment from 2.30.1 to 2.31.0 in /ccdaservice (#14156)
  • bump postcss from 8.5.28 to 8.5.29 (#14554)
  • bump postcss from 8.5.29 to 8.5.30 (#14694)
  • bump proxy-addr from 2.0.7 to 2.0.8 in /ccdaservice (#14406)
  • bump purecss from 3.0.0 to 3.1.0 (#14380)
  • bump sass from 1.104.0 to 1.105.0 (#14275)
  • bump sass from 1.105.0 to 1.105.1 (#14383)
  • bump sass from 1.105.1 to 1.105.2 (#14695)
  • bump serialize-javascript from 7.1.1 to 7.1.2 in /ccdaservice (#14338)
  • bump source-map-js from 1.2.1 to 1.2.2 (#14407)
  • bump the build-tools group with 2 updates (#14691)
  • bump webpack from 5.110.3 to 5.111.1 in the build-tools group across 1 directory (#14147)

phpstan

  • refresh RESERVED_WORD_SUPPLEMENT (#14145)
Source: README.md, updated 2026-10-27