Skip to content

Laravel in Boston

Laravel development for Boston health, biotech and research

A Laravel development company for Boston health systems, biotech and universities. Removing names is not de-identification, and a cohort of four is identifiable no matter what you delete.

Boston's research and clinical software has a risk profile that most privacy engineering does not address, because the threat is not someone reading a name.

The threat is combination. A dataset with every direct identifier removed can still identify an individual when a rare condition, an age, a geography and a date of treatment appear in the same row. In a city built on academic medicine and biotech, that is the risk the review boards actually care about, and it is a property of queries rather than of columns.

Removing identifiers is not de-identification in Boston research data

The instinct is to treat this as a schema problem - drop the name, hash the identifier, truncate the date of birth - and then consider the data safe to query freely.

It is not, because the remaining attributes are often enough. A study population of a few hundred, a diagnosis held by four of them, a geography held by two, and the intersection is one person. No identifier was disclosed and somebody was identified anyway.

The protection that works is enforced where results are produced. Any aggregate has to know how many individuals contributed to each figure and suppress the ones below a threshold. The harder half is suppression by subtraction - if two cells are hidden and the total is shown, the hidden values are recoverable - so the rule has to consider the result set rather than each cell independently.

That is real work and it belongs in a single query layer that everything reports through, not reimplemented in each report. The threshold is the institution's number and lives in configuration where it can be produced on request.

The second structural requirement is one that commercial applications almost never face.

A research participant can withdraw after their data has been included in an analysis. That rarely means retracting published work, but it always means being able to say what was affected and excluding them from everything afterwards. Both are impossible if nobody recorded which participants were in which dataset snapshot.

So each analysis run records the participant set it used, by reference rather than by copy. Consent itself is a record with a date, a version and a scope rather than a boolean, because the question asked later is never whether somebody consented but what they consented to and when. A soft delete is not a delete is the related reading, and here the reverse problem matters too - some data must not be deleted, only excluded, and the schema has to express the difference.

Linkage is the Laravel schema decision to make first

In clinical and research systems, how data is linked is more consequential than how it is stored.

A single table holding clinical detail alongside identity is a dataset nobody can safely query. The same data split - identity in one place, observations in another, joined through a mapping that few processes can read - is queryable by analysts without exposure, and it is the basis of nearly every arrangement a review board approves.

That separation is close to impossible to introduce later, because by then every report, export and screen assumes the joined shape. It is a week-one decision with a decade of consequences, which is why it is the first conversation rather than an implementation detail.

A Boston study protocol changes in the middle of the work

An amendment is approved. The form gains two fields, one question's wording changes, and an answer option is removed. Enrolment continues. The application now holds data captured under two different definitions of the same variable.

Treating that as an edit to the form is how a dataset becomes unanalysable. What is needed is a versioned instrument - the form definition is itself a record, a response points at the version it was captured under, and nothing about an old version is mutable. An analyst can then ask which participants answered the question in its original wording, which is a question they will ask, and the answer is a join rather than an estimate.

Participants complicate it further, because a participant enrolled under protocol version two has a different schedule of visits from one enrolled under version one, and some amendments apply to everybody while others apply only to new enrolments. That distinction is part of the approval, not a technical choice, so it has to be representable - a participant carries the protocol version governing them, and the visit schedule is derived from it.

The cost of not doing this is paid late. Months of data arrive at analysis and cannot be pooled, because nobody can say which definition each row was captured under, and the reconstruction is guesswork against a change log.

Laravel data capture when a Boston form has to be corrected

A value was entered wrong. In an ordinary application somebody fixes it. In research data the fix is itself data.

A correction records the old value, the new value, who made it, when, and why, and the why is not optional - it is what a monitor reads. The original value remains readable, because a dataset where values changed without trace cannot support anything. This is not the same as an audit log bolted on to catch updates; it is the correction being a first-class record that the interface is built around, so the person making it is prompted for a reason rather than asked to remember to leave a note.

Discrepancies run alongside corrections and are the more useful mechanism. A value outside the expected range, a date after a date that should follow it, a missing field on a completed form - each raises a query against the record that someone answers, and the answer is retained whether or not the value changed. "The value is correct, the participant genuinely is that age" is an outcome, and it has to be recordable, or the same query is raised every month.

Range checks belong at capture, where they can ask, rather than in a nightly report, where they can only complain. The difference in data quality between those two placements is large and the implementation cost is nearly the same. What makes it work is that a check at capture must be overridable with a reason, because an unexpected value that is nonetheless true is exactly the kind of thing the study exists to find.

Commercially

Scope fixed in writing before work starts, priced per project. The country-level ground - state privacy laws, sales tax, invoicing - is on the United States market page.

Invoiced by Codefacture Yazılım A.Ş. in Türkiye, in US dollars by bank transfer, with no Turkish VAT under the export-of-services exemption and no US entity on our side.

The regulatory and commercial ground for this city is on the United States market page.

Frequently asked questions

We removed names and dates of birth. Is the dataset de-identified?
Not necessarily, and this is the most expensive misunderstanding in research software. Identification happens through combination - a postcode, an age, a rare diagnosis and a date of admission can single out one person without any direct identifier present. The protection that works is a minimum group size enforced in the query layer, so a result describing fewer than a threshold number of people is suppressed rather than returned. That is a rule in code, not a property of the schema.
What does a minimum cohort size mean in practice?
That any aggregate query has to check how many individuals contributed to each cell before returning it, and suppress the ones below the threshold - including the ones that become identifiable by subtraction when two suppressed cells and a total are visible together. It is more work than a count, and it is the difference between a reporting tool a review board will approve and one it will not. The threshold itself is the institution's decision rather than ours, and it belongs in configuration where it can be shown.
A participant withdrew consent after we published. What does the system need to have recorded?
Which outputs their data contributed to. Withdrawal does not usually require retracting published analysis, but it does require knowing the extent of what was affected and excluding the participant from everything subsequent - which is impossible retrospectively if the link between a dataset snapshot and the participants in it was never recorded. So each analysis run records the participant set it used, and consent is a dated record rather than a flag that gets flipped.
Does our review board need to see the data model?
Usually yes, in substance if not in notation, and offering it early rather than waiting to be asked shortens the process considerably. What they care about is what is collected, how it is linked, who can read it, how long each copy exists and what happens on withdrawal. Those are five answerable questions, and having them written down before submission is the difference between one review cycle and three.
Call us+1 848 272 7583WhatsApp+90 850 308 5436Emailinfo@codefacture.comContact page