Alan De Vaney.
All case studies
2026Sole engineerPython · FastAPI · DuckDB · React · TypeScript · Textual

HMIS-NL, reporting you can check

Ask a housing-outcome question in plain English and inspect how it was read. Compare populations or change the interpretation, then carry the result into a report-backed dashboard. I built HMIS-NL after five years running a homeless-services agency's reporting platform.

Hosted demo on public HUD test data, with web and terminal clients. The recording uses no real client records.

Problem
A board or funder needs more than a total. Staff need the counting rule and source export, plus a way to repeat the report next quarter.
Engineering decision
Keep interpretation separate from calculation. The model selects a typed request. The server computes each result and identifies whether its population was checked independently.
Result
Reporting answers with an inspectable meaning and source
My role
Sole engineer, independent analytics application
Source access
Private repository. Live demo uses public HUD sample data.
In this case study Features and engineering details

Walkthrough 2:42

Recorded October 5, 2026 against the hosted app at revision 1f9f602c. Public HUD test data only. This walkthrough shows the current interpretation controls and reporting workflow. Worklists and cited HUD sources are included. Synthetic narration with English captions.

Read the transcript
  1. 0:00 A question with inspectable evidence

    This is HMIS-NL, using public HUD test data. Each answer names its population and rule. Verified means independent population selections matched. The arithmetic code is shared.

  2. 0:18 Choose and change the reading

    Housed can mean different things. The app asks which measure staff need. The selected reading stays beside the answer, with its calculation limits. Staff can change it and rerun the question. The new answer uses that measure. Other readings stay separate from board packets.

  3. 0:45 Compare named cohorts

    Compare veterans with non-veterans in the same period. Both populations are named. Each side has its own checked request. Shared scope restrictions stay on both.

  4. 1:04 Name the exit cohort and return window

    Return questions now state the exit cohort and the follow-up window. These 2022 exits are followed for twelve months. The evidence names that rule.

  5. 1:22 Add a report-backed dashboard tile

    A chat answer can become a report-backed dashboard tile. The source must reproduce the same request and data before the tile is added. Refresh all reruns those reports when staff choose.

  6. 1:42 Staff counts and exported reports

    Signed-in staff see counts within their permitted scope. The saved report keeps those counts visible in the app. Printing requests a server-rendered export copy. It applies the agency export policy.

  7. 2:04 Review fixed checks in worklists

    Worklists show fixed checks on enrollment records. They do not predict an outcome. Authorized staff can open records behind a missing-destination count. Filters separate open work from handled items.

  8. 2:22 Open the cited HUD source

    Questions about HUD standards use cited source documents. The citation opens the original PDF with its passage highlighted. Staff can inspect that source.

Download transcript

What it does

Interpretations staff can change
See which meaning the question used. Pick a different meaning and rerun the answer, with the same checks.
Reports behind dashboard tiles
Save a chat question as a report source. A tile is added only when the report reproduces its checked scope and source export.
Cohort and period comparisons
Compare named populations with their own qualifiers. Return rates state the exit cohort and follow-up window.
Separate staff and export views
Signed-in staff see counts within their permitted scope. Files and board packets apply the agency's export masking policy.

From question to checked answer

  1. Explicit interpretation

    A typed request states the population and period. Ambiguous terms can ask for a choice.

  2. Recorded calculation checks

    Supported rules compare independently selected populations. Both paths share final arithmetic code, and the badge states the limit.

  3. Validator gate

    Ordered checks re-resolve the rule from the registry. A failure replans or refuses.

  4. Answer from evidence

    The sentence staff read is built from the evidence panel. The model never writes it.

Make the interpretation visible

Housed can mean a move-in, an exit to permanent housing or the placement measure appropriate to each program type. The current app asks staff to choose a meaning, then shows that reading beside the answer. Changing a reading reruns the question. It never relabels the existing number.

Staff can remember supported choices for their own account. Those choices apply to comparison and trend requests too. An optional Other readings panel computes alternatives as context. They stay out of board packets.

HMIS-NL shows the chosen housing interpretation beside the answer, with an Other readings panel containing separately computed alternatives

The question was clarified, then rerun with Exited to permanent housing selected. Hosted app, October 5, 2026. Public HUD test data.

View full image

State exactly what was checked

The model chooses a typed request. It does not calculate the value or write the answer sentence. Server code computes the result, and the sentence is built from its evidence. A failed validation check blocks the answer or triggers a bounded repair.

For supported rules, separate implementations select the population and compare the resulting calculation. The final arithmetic code is shared. Verified means those independently selected populations produced matching results. A shared population builder or an unsupported second path gets a single-engine label. Agreement alone does not prove that a request means what staff intended.

People served in 2022 with the Verified, 2 engines badge and evidence explaining the population and deduplication rule

The evidence names the rule and reporting period. Verification checks population selection while sharing final arithmetic. Public HUD test data, October 5, 2026.

View full image

Keep the cohort and follow-up window explicit

A comparison carries a request for each side. Shared program restrictions apply to both populations, while each side keeps its own group qualifier. Calendar and fiscal periods retain their stated basis.

Return questions also distinguish a report-relative HUD measure from an exit cohort. The recorded question asks about people who exited to permanent housing in 2022 and returned within 12 months. The answer names those exits and the 365-day follow-up window. It does not silently substitute a 24-month measure.

Return rate for people who exited to permanent housing during 2022, explicitly labeled with a 12-month follow-up window and its checked rule

The current answer binds the exit cohort to 2022 and states a 12-month window. Recorded October 5, 2026 on public HUD test data.

View full image

Put a report behind every dashboard tile

Add to dashboard saves the original question as a report source and runs it. The tile is added only if the report returns the same intent hash and source-export fingerprint as the chat answer. An ambiguous question or a changed scope must be resolved first.

Refresh all reruns the source reports when staff choose. The dashboard shows source dates and links each tile back to its report. Reports can be reviewed before sign-off and exported to Word. A previous sign-off is tied to its own run.

A dashboard built from current chat answers for people served and housing outcomes, with report links and an explicit Refresh all control

Both tiles were created through Add to dashboard on the hosted app. Public HUD test data, October 5, 2026.

View full image

Show staff counts and govern exports separately

Signed-in staff see every count within their permitted scope. Small-count masking applies to the export audience, including downloaded files and board packets. Print requests a server-rendered export copy before opening the browser dialog. The page does not hide cells with a separate frontend calculation.

The agency sets the export threshold and can disable export masking through an audited setting. Export disclosure checks prevent supported combinations from revealing a hidden count. Role and CoC restrictions remain separate controls.

Proof receipts retain the question and rule version with the source-export fingerprint. They are hashed and signed so a reported figure can be checked against the same inputs later.

The server-rendered print copy of a service report applies export masking to a small project-type count

The recording compares the signed-in report with its server-rendered print copy. The native print dialog is omitted. Public HUD test data, October 5, 2026.

View full image

Bring data issues into a review workflow

Worklists expose fixed checks from enrollment data. Staff can open the affected records where their role and scope permit it, then filter the list by assignment or status. A missing destination is a record to review, not a predicted housing outcome.

Submission pre-flight puts existing checks beside the HUD tables they affect. It shows the finding and its source, including unavailable inputs. It does not issue a submission-readiness verdict.

Recurring reporting uses the same engine. Saved reports can run on a schedule, and the deadline agent prepares packets for funder reports overdue or due within 45 days. It records missing results and leaves sign-off to staff.

Worklist detail for synthetic enrollments missing an exit destination, with assignment and status filters

Current hosted worklists expose record-level checks within the operator role. Public HUD test data, October 5, 2026.

View full image

Keep geographic coverage inspectable

The supply view uses project and bed-inventory facts. It groups supply by permitted geography and keeps unplaced records visible. A reconciliation shows how the displayed areas relate to the total, so an incomplete placement does not become a claim of complete coverage.

The demo labels its synthetic geography. This view does not show client locations.

Keep source documents and demo limits visible

HUD standards and an agency's own policies use separate assistants. Answers require citations, and a citation opens the source PDF at the relevant passage. Codes use exact lookup; definitions can use keyword and embedding retrieval.

The hosted demo runs on public HUD test data. The fresh recording establishes the displayed workflows and their calculation checks. It does not establish agency adoption or measured staff time savings. A verified calculation also does not establish source-data completeness or HUD acceptance of a report.

HUD standards answer beside its original PDF page with the cited annual-assessment passage highlighted

The citation opens the original HUD PDF page and highlights the source passage. Recorded October 5, 2026.

View full image