0.x release notes


March 2, 2017

  • Fixed potential race condition with medic-gateway. Issue: medic-projects/issues/1243
  • Bumped libphonenumber to make phone number validation more up to date. Issue: medic-projects/issues/1005


December 16, 2016

  • Bug fix for medic-gateway sending scheduled messages. Issue: #2535


October 21, 2016

  • Option to set birthdate using days old instead of weeks. Issue: #2756
  • The week/month is off by 2 in the Reporting Rates analytics dashboard. Issue: #2781
  • Remove socket limit in medic-api. Issue: #2632


July 21, 2016

  • Fixed bug in reporting rates for weekly time unit. #2429
  • Log warnings in sentinel when ID collisions happen. #1898
  • Support integration with medic-gateway for sending and receiving SMS medic-api#69


February 4, 2016

  • Security fix for leaking auth info.


Nov 16, 2015

  • Added support for Outgoing Deny List, a comma separated list of phone numbers or strings to deny outgoing service to. #750

  • Fixed bug in records export. #1273

  • Fixed bugs in uniqueWithin validation. medic-sentinel#74

  • Added link to Help page in main menu.


Aug 26, 2015

  • Fixed bug on node 0.12 in felix-couchdb. #1145

  • Improved error handling when notifications (start/stop) configs are misconfigured. #1144

  • Fixed bug in exists validation where it fails on some unicode characters. #1147

  • Fixed Reporting Rates interface that was neglected and broken. #1030

  • Fixed bug in exporting data by date, it’s now inclusive. #1104


July 14, 2015

  • Added SMS parser fixes from dev branch:

    • parse string fields with exclamation marks
    • compact textforms format handles quotes in quotes
  • Fixed export bug when using lowercase form codes. Please re-upload your forms so they are formatted correctly. #998

  • Fixed bug where exporting yields same result with or without date filter. #1059, #1031


June 16, 2015

  • Fixed ODK forms list bug when the list is empty. Issue #886

  • Fixed compact textforms parser bug with exclamation points. Issue #989

  • Fixed bug in compact textforms parser we ignored fields with uppercase letters in the key of the form definition. Issue #991

  • Fixed bug when creating record with empty message. Issue #990

  • Moved raw message to bottom of report body. Issue: #927


June 4, 2015

  • Improved boolean expression evaluation in registration configuration.


May 28, 2015


May 21, 2015

  • Added support for a new messages parser we’re calling Javarosa prefixed with the J1 format code.


February 26, 2015


  • Major UI enhancements #370

    • Inbox Style with advanced search bar
    • Admin Panels
    • Mobile device support
  • Configurable date format #577

  • Built-in ANC Analytics #586

  • Easy user feedback mechanism #19

  • Added help and tour

  • Refactored build process, added grunt, bower and jshint.

  • No forms are included by default. You must upload your forms. As usual configuration (settings and forms) persists through upgrades.

  • Added new translations

  • Default auto-replies

  • There are now two ways to export stuff: 1) from the reports screen click on export, or 2) on the Configuration > Export screen. The former is simplified and has no way of changing facility, form, or file format. The latter is functionally equivalent to 0.4.2.

Upgrade Notes

  • CouchDB Lucene >= 1.0.2

  • Gardener >= 1.1.0

  • New Nginx configuration, close or redirect port 5984, proxy all requests through medic-api.


September 4, 2014

  • Fixed bug: When searching for a patient identifier using the free-text search feature, results were not returned properly. Index the field appropriately.


July 31, 2014

  • Minor UI clean up.

  • Allow hash symbol to separate form code and data in structured textform message.

  • Modified build to bundle npm dependencies with attached node modules.


July 10, 2014

New Features

  • User interface for common settings and translations #484

  • User interface to configure basic ANC messaging workflows #487

  • Nodejs module for API calls and to handle audit transactions

  • Better language support on messages throughout configuration. e.g. you can define a reminder schedule using multiple languages and the right language will be used based on the locale of the message. #486

  • Added support to configure locales through settings screen #491

  • Added support for custom forms and uploading JSON form definitions #283

  • Supporting old/obsolete settings via migrations during restore #501

  • Support minute setting for scheduled hours configuration

  • Reduced files size of design doc by minifying javascript and combining files

  • Added support for unique validations across multiple fields. #412

  • External IDs can be added to facilities on the facility page. #503

  • Added columns query parameter to allow callers to messages and data_records exports to retrieve specific columns in a specific order. #503

  • Added Patient ID field to default data record export

  • Allow specifying of task columns in message export.

    To include the group column, include the parameter columns=["task.group"] (and any other columns you need, eg: patient_id). #432

  • Allow range searches on number fields in lucene. #481

Bug fixes

  • Fixed bug stopping district admins from being able to delete documents. #509

  • Corrected language Nepalese to Nepali

  • Fixed too many requests for app_settings #511

  • Fixed saving user password, was getting reset/wiped #509

  • Render facilities controls on all facilities tabs. #338

Deprecated and Backwards Incompatible changes

  • deprecated exclude_cols parameter for export integrations. Migrate applications to use the columns parameter instead.

  • No forms are included by default, you must upload your forms. As usual configuration (settings and forms) persists through upgrades.


June 19, 2014

  • Fixed bug where scheduled messages were out of order on Chrome #527

  • Fixed bug where app settings was ignored, and the app reverted to defaults. #524

  • Added delivery form to generic ANC forms.

  • Modified behavior of patient reports when silence_for option is empty we clear the entire schedule instead of a group.

  • Fixed notifications to add the configured response #508

  • Fixed bug and added support for multiple schedules in schedule silencing

    When silence_for is specified we should only silence/clear one group, I introduced a bug a few commits ago that would ignore the group and silence/clear based on date. Use the silence_for window to match and clear the first group.

    Also added support for comma separate string on silence_type option. In the MCH case we have two schedules that can be generated depending on the form submission/registration: ANC Reminders and ANC Reminders LMP. Now both schedules can be cleared with a single ANCV settings entry.


June 12, 2014

  • updated intrahealth-senegal forms


May 22, 2014

  • fixed a bug in settings parser, to conform to the latest app-settings changes, otherwise configs never get triggered.


May 22, 2014

  • fixed bug in messages export filters to include all data records, unstructured messages were being ignored. #502

  • added support for app-settings kanso package.

    Saving settings in dashboard was too slow for use because entire ddoc was being updated. Using app-settings API fixes that.


May 13, 2014

  • Modified KEMRI form fields to be ordered the same as KEMR form.


April 28, 2014

  • Fixed bug in updating duplicate scheduled reports #483


April 16, 2014

  • Major bug fix that was introduced in 0.3.3 where visit reports do not get processed.

    Fixed accept_patient_reports transition so it calls db for readonly actions instead of audit.

  • Allow analytics role to download messages and forms. Issue: #477

  • Updated user management to show role for analytics user. Issue: #478

  • Initial version of forms for Miraclefeet India


April 14, 2014

  • translate strings on user mgmt facilities select list #474

  • Change ordering of messages export format for better readability based on when the state is triggered. #475

    From: Received, Sent, Pending, Scheduled Cleared, Muted To: Received, Scheduled, Pending, Sent, Cleared, Muted


April 10, 2014

  • Fixed spreadsheet keyboard navigation. #448

  • Validate ‘Everyone at x’ for at least one valid phone number. #333

  • Audit support for data records and facility data #415

    Also includes support for export of audit data as XML or CSV file.

    Note: Only new records and record edits will have an audit log entry. So this means your audit log will only contain changes to records after the upgrade.

    Similarly browsing old revision will stop working for old records because they lack audit log entries. If this is a major problem for you let us know and we can add backwards compatible revision browsing in the next release.

    This has been released as a standalone re-useable module for Node and browser environments: https://github.com/medic/couchdb-audit

  • Added support for compact version of TextForms format #428

    In compact Textforms fields are delimited by spaces and determined by order. So no hashes or field keys are required like in classic TextForms format. If your field value has spaces in it then it must be surrounded by quotes unless it is the last field.


      REG 4165550000 John Smith
      REG "John Smith" 4165550000
  • Include state change timestamps and patient_id in messages export #453

    Old Columns:

    Record UUID, Reported Date, From, Clinic Contact Name, Clinic Name, Health Center Contact Name, Health Center Name, District Hospital Name, Message Type, Message State, Message Timestamp/Due, Message UUID, Sent By, To Phone, Message Body

    New Columns:

    Record UUID, Patient ID, Reported Date, Reported From, Clinic Contact Name, Clinic Name, Health Center Contact Name, Health Center Name, District Hospital Name, Message Type, Message State, Received Timestamp, Sent Timestamp, Pending Timestamp, Scheduled Timestamp, Cleared Timestamp, Muted Timestamp, Message UUID, Sent By, To Phone, Message Body

    Note: These are the default column labels and they are configurable.

  • Disable facility select and show loading message until data is loaded. #452

  • Updated font-awesome to 3.2.1 to get extra icons

  • Fixed Help button on the spreadsheet. #455

  • Fixed spreadsheet duplicate rendering when quickly switching tabs. #362 #450

  • Added permissions checks to export lists functions. #456

  • Fixed bug where facility spreadsheet update records when field value is unchanged. #457

  • Fixed bug where registrations was not using db-wide unique IDs. medic-sentinel#54

  • Fixed duplicate records on ID search #430

  • User Management UX refactor #385, #380, #462, #380, #379, #378, #377, #429

  • Fixed bug on facilities screen where delete functions would stack up and inadvertantly delete a facility. #469


_March 11, 2014 _

  • fixed facilities spreadsheet bug #451 in Chrome

  • minor user interface tweaks on deletion of facilities modal


_March 3, 2014 _

  • Fixed a bug where the facilities spreadsheet was holding focus so sending a message doesn’t work. #440

  • Added Bulk Messaging support, so you can send messages to multiple recipients. #333

  • Fixed bug to include incoming messages in messages export. #436

  • Fixed bug where it is possible to send a message twice by double clicking the submit button

  • Fixed bug where we failed to retrieve settings on port 80 #438

    This was experienced when proxying to couchdb because http proxying will decode the URL including docid of the show parameter, so the show returns 404. Solution is to always double URL encode if the show docid contains special characters.

  • Confirm with user before deleting facility so they can’t be deleted by accident. #371

  • Added unique Patient ID validation support. #411 medic-sentinel/pull/50

    Use unique(‘patient_id’) in your registration validation rules to validate new form submissions that are setting the patient ID values via forms.

    Validation rules may consist of Pupil.js rules and custom rules. These cannot be combined as part of the same rule.

    Not OK:

      rule: "regex('[0-9]{5}') && unique('patient_id')"


      rule: "regex('[0-9]{5}') && max(11111)"

    If for example you want to validate that patient_id is 5 numbers and it is unique (or some other custom validation) you need to define two validation configs/separate rules in your settings. Example validation settings:

        property: "patient_id",
        rule: "regex('[0-9]{5}')",
        message: "Invalid: Patient ID {{patient_id}} must be 5 numbers."
        property: "patient_id",
        rule: "unique('patient_id')",
        message: "Invalid: Patient ID {{patient_id}} must be unique."
  • Added Conditional Alerts feature. #437 medic-sentinel/issue/52

    Configure the Alerts section of the App Settings to send a message when an incoming message meets the configured condition.

0.3.0-beta.39 (bugfix)

February 25, 2014

  • Fixed textforms whitespace parser bug when using form list field types. #431

    Textforms parser wasn’t trimming space correctly on a field value, so if you had a list defined using those values they would never get matched.

    Textforms was only matching numeric values of length 2 or more, so if you submitted a one digit number you would not get a numeric match.

    Also if the value didn’t match numeric or a date format then the whitespace was not being trimmed correctly.

0.3.0-beta.38 (debug)

February 13, 2014

  • added logging calls to help debug and identify whitespace parsing bug #431


January 21, 2014

  • Fixes to user roles (@marc)

    Matches Transitional V2 in https://docs.google.com/a/medicmobile.org/spreadsheet/ccc?key=0Ao9l2yegOFn7dEJRTEw1Z3RmZm0wTEo4Nk92NjVocnc

  • Added support for Kemri Muvuku Form (KEMR)

  • Added exclude_cols query param to csv/xml form exports. #421

    For example inlude exclude_cols=1,5 in your query parameters to remove the first and fifth column of an export.

  • bugfix on export query params and UX adjustments

    Made English CSV export default. SpreadsheetML can be a little buggy because we’re using HTML entities (not valid XML).

    Disabled default month value in exports screen since record count does not reflect the export row totals displayed. It’s probably better UX to have the user set the date knowing they are doing something than having a default that doesn’t make sense with the totals on the screen and having to guess why that is.

  • Added timezone support to exports #394

    Render page contents first and then load the fields data since that was holding up the page load.

    Indexing _id as uuid in field index so you can search for uuid:10366976d62ab9a31257b2fad16113ee now and it shows up in avaialble fields index. For some reason I think underscore prefixed fields do show up in fields listing on Lucene for some reason.

  • Fixed poor loading on search help #422

  • added timezone support to exports #394

    Now dates in the exported spreadsheet should include your locale timezone. Controlled by the tz query param.

  • Added new Messages Export and removed message data from Forms Export

    New http endpoint /export/messages to get messages export. Records are always latest first (reverse cronological). Message export will include all records (valid and invalid), the point of the messages export is to give you access to all your message data, including outgoing error messages.

    Warning: the following URLs are no longer supported:


    Use /export/forms/{form} path instead.

    Warning: Existing form data export format has changed. Included UUID of the related record so data among the two spreadsheets (messages and form data) can be correlated if need be. Also removed the message data/columns from form data export. A record can be found via UUID by using uuid:<the uuid string> in the search box.

    Changed default column name of “From” to “Reported From”. Note if this shouldn’t change if you have an existing install since it is generated based on your translation settings.

    The NEW columns (added UUID column and removed message data):

    Record UUID
    Reported Date
    Reported From
    Clinic Contact Name
    Clinic Name
    Health Center Contact Name
    Health Center Name
    District Hospital Name
    [columns for form fields data depending on form]

    The OLD columns:

    Reported Date
    Clinic Contact Name
    Clinic Name
    Health Center Contact Name
    Health Center Name
    District Hospital Name
    [columns for form fields data depending on form]
    Incoming Message
    Outgoing Messages
    Scheduled Tasks


  • Major improvements in scheduled reminder support in Sentinel.
  • Support for Twilio in Sentinel.
  • Minor refactor of records screen:
    • added counters to show sent/scheduled messages in records rows.
    • displaying scheduled tasks in records expanded view
    • added RC Code column
    • combined facility data into one column
    • improved contact info column, made more prominent by moving clinic contact info and phone together and into second column.
  • Removed auto-reply messages from form submission that use sentinel/scheduler so only one response is sent on a new form submission.
  • Fixed bug: Only update records of type ‘data_record’ on records screen
  • Preserve css (expando visibility) when row is replaced in records.
  • Use serial_number instead of patient_id for ohw_registration.
  • Fixed bug in textforms parser where 01234 was parsed as 1234 and added test.
  • Fixed unit tests for ONOT and ORPT form updates.
  • Fixed/Added tests for ohw emergency report (OEMR) responses.
  • Added PNC test for ohw emergency report (OEMR).
  • Fixed ohw notifications transition to set correct muted value.
  • Fixed OHW birth report (OBIR) logic and added tests.


  • Fixed bug: regression from error handling refactor where assigning a record a new facility did not clear facility_not_found errors.
  • Fixed bug: months based reporting valid value was not being passed through view.
  • Fixed regression: returning form_invalid response when form_invalid_custom error is found.
  • Fixed NYAA form custom validation.
  • Added ability to do bulk deletes and facility updates.
  • Fixed bug where record is created as valid if callback request is not completed due to disconnection or phone running out of battery. Records are initialized as invalid.


  • HTTP callbacks refactor, now records are created on first HTTP POST.
  • Tests refactor, replaced some redundant/large tests with more specific ones.
  • Error handling refactor, now clients should not get system messages.
  • Updated JSON forms to include Carlos Slim test forms.
  • SMSSync 2.0 support: parsing of new timestamp format.
  • Bundled SMSSync 2.0.1-hcb (http-callbacks) build.
  • ’null’ form key in filters to find records without a form definition.

Upgrade Notes

  • If you upgrade the gateway without upgrading Kujua the timestamps from the messages will not get parsed. So messages will get a timestamp assigned to them by Kujua, which reflect the time the record was created in Kujua rather than the actual time the report/message was sent.


  • Fixed wifi lock bug in SMSSync #54.
  • Updated docs with new SMSSync build instructions
  • Fixed labels names and stat placement on Health Center and District reporting screens.
  • Added help panel to spreadsheet to explain key bindings.
  • Form revisions for OHW and CDC Nepal


  • Fixed bug in records screen where 1 row was not getting rendered until a scroll.
  • Refactored messaging, supporting messages_task in json forms.
  • Fixed bug where non-districts showing up in districts filter.
  • Keep Kujua Reporting files in-tact so it can be activated with config.
  • Added validations, messages and ref id labels to forms on gateway testing doc.
  • Added autocomplete=off to error missing phone form in records screen.
  • Added css for pointer hover to icon-exclamation-sign.
  • Renamed use-sentinel to use_sentinel to be consistent in JSON forms.
  • Added basic unstructured message support.
  • Fixed bug in records during edit row function where reported date get munged.
  • Added spreadsheet feature so children get updated when a parent facility is changed.
  • Fixed bug where using wrong label on main analytics screen.
  • Always create records, even on empty or unstructured messages.
  • SMS response messaging refactor, added response messages to gateway testing doc.
  • Fixed hard coded URL paths in reporting tests.


  • Renamed reference_field property on forms to facility_reference.
  • Allow phone number to match on any facility type not just clinics.


  • Tell user to login on 403 template.
  • Added record detail to analytics screen expand div.
  • Added configuration entries for reporting rates/analytics.
  • Made labels more configurable.
  • Added Kujua Sentinel support for reminders and alerts.
  • Updated spreadsheet columns to use config for labels.
  • Added support for form_invalid_custom error codes.
  • Introduced reference_field on forms.
  • Fixed kujua reporting views to better handle undefined clinic object in facility data.
  • Make it clear in HC reporting screen that contact name/phone is undefined.
  • Use __dirname in sentinel so it can be launched from any directory.
  • Added page for reminder logs.
  • Fixed district filtering support.
  • Added lockRows option to spreadsheet.
  • Fixed bug in XML spreadsheet output where true boolean value shows as 0.
  • Added support in sentinel to update children when a facility is edited.
  • Fixed bug on delete and editRow modal window.
  • Hide all nav items except docs when logged out.
  • Removed console references and added JSON.stringify to logger call.


  • Saving responses to record and displaying in records screen.
  • Added timezone offset to reported date in exports and data records screen.
  • Added datepicker to filter exports by date.
  • Added support for custom form validation functions
  • Show better error message for other codes like missing_fields
  • Fixed buttons in data records screen
  • Added Kujua Reporting package for easy switching of analytics features
  • Improved test coverage for missing fields, cleaned/fixed up tests.
  • Fixed form parsing for fields defined as sub-objects and boolean parsing.
  • Added cases for sms responses when form is undefined
  • Display tooltip on input element focus in spreadsheet
  • Added delete on facilities spreadsheet
  • Make en/xls default export format
  • Custom labels via config.js configuration doc
  • Support for records to key on any facility
  • Nepalese responses
  • VPD field updates
  • added additional form definitions


  • Parsing refactor to allow for better unstructured and textforms support, #106, #79
  • Add validation to spreadsheet with first cut of phone validation. fixes #104
  • Direct support for json-form definitions #76
  • Added textforms support for tiny labels in form definition
  • Generating example messages automatically in Gateway Testing doc
  • Fixed textforms parser for Couchbase on OSX #46
  • Using complete field keys instead of tiny labels in textforms data record creation #79
  • Better generic localized message handling #79
  • Added delete feature to spreadsheet rows #97
  • Updated install docs to include require_valid_user steps
  • Various spreadsheet fixes #103, #98
  • Better localized string support in form definitions
  • Include national office data to districts on save


  • Added Quick Install Doc
  • Renamed kujua-export to kujua-base #88
  • Added dropdown health centers and districts to spreadsheet #99, #66
  • Various facilities spreadsheet bug fixes #92, #91, #94
  • Added CouchDB security steps to intall doc #88, #66
  • Fixed authorization passthrough for tasks pending #87
  • Various data records screen fixes #84, #83, #56
  • Updated gateway/SMSSync binary and added S3 link to install docs
  • Removed Export branding
  • Started on functional tests using zombie.js and vows
  • Added health centers and districts spreadsheet
  • Added facilties section and spreadsheet editor #63
  • Assert forms that pass validation gets saved #78, #75, #46
  • Fixed bug where form submission fails if it has extra fields #75
  • Fixed 24-hour time display bug
  • Added close button to login window #70
  • Fixed bug with scroll listener binding to other pages #69


  • Better textforms support including validation #46
  • Added optional required field to form defs, all field definitions are required by default.
  • Close dropdown menus when clicking anywhere on the site #53
  • Stream export data instead of collecting it in memory #57
  • Added validation step to all new form submissions #73
  • Added records filtering by form #56
  • Moved data records code to module #69


  • added facility columns to export formats #54
  • added fr translations for facility names. #54
  • The server will not send a response unless a form is recognized.
  • Filtering on Districts support
  • Added Records section
  • Fixed reported date on re-imports, so the dates are preserved based on sent timestamp in sms message.
  • Added infinite scroll for viewing records on one page instead of paging.
  • Marking empty fields with question marks.
  • Marking errors on records that have referral tasks with no recipient defined.
  • Real-time updates via changes feed