Inspiration

The ceiling starts dripping on a Tuesday. You text the landlord. Nothing.

On Thursday, a reply: “We’ll look into it.”

You understand the words. What you need to know is whether anyone is coming—and what to do if no one does.

Versions of this story kept coming from my friends who moved to the United States for university. Repairs were delayed, forms were unfamiliar, and getting help meant navigating a system they had never used before.

The repair was only part of the problem. Managing the process became another burden.

Photos lived in one app, messages in another, and complaint numbers in a screenshot somewhere. Weeks later, it was difficult to reconstruct what had been promised, what had changed, and what still needed to happen.

Our friends turned to tools like ChatGPT for guidance, but worried about inaccurate legal references and procedures they could not independently verify. Alongside classes and deadlines, they were becoming their own translators, researchers, and case managers.

We built Dwell to bring that work into one continuous process.

Dwell is a multilingual AI case agent that helps renters document housing problems, navigate follow-ups, and assess repair outcomes—with a case history that develops as new evidence arrives.


What it does

Dwell helps renters understand their situation and take the next step through Deaver, our conversational case assistant.

The following example illustrates the workflow:

  1. Report the problem. A renter uploads a ceiling photo and writes, in their own language, “Water has been dripping since yesterday.” The visual observation suggests Medium severity, but the description indicates an active problem. Dwell combines both inputs, raises the assessment to High, and explains why.

  2. Prepare the request. Deaver drafts a clear, formal English repair message with a translation the renter can review before sending.

  3. Record the response. The renter shares a landlord’s reply: “I’ll come by Friday.” Dwell extracts the case update so the conversation becomes part of the case’s progress.

  4. Add new evidence. The renter uploads another photo of the same location. Dwell compares the new observations with earlier evidence to assess whether the condition is worsening, unchanged, or improving.

  5. Review the repair. After-repair photos enter the verification workflow. Dwell explains what the comparison supports, identifies when the evidence is inconclusive, and guides the next action.

  6. Export the history. The renter can generate a PDF case report that brings together the timeline, evidence, correspondence, and relevant housing-law references.

The case develops as the evidence does

A new upload becomes part of the existing record. Deaver uses the accumulated context to update the assessment and next steps as appropriate.

That continuity matters when a repair takes several attempts, a landlord changes their plan, or the same problem returns.

Every update should help answer the renter’s next question: “What do I do now?”


How we built it

Dwell uses three clearly defined responsibilities:

Visual observation. Contextual reasoning. Server-enforced policy.

Component Technology Responsibility
Inspector Fine-tuned Gemini 3.1 Flash-Lite on Google Vertex AI Produces structured observations from visual evidence.
Case Agent NVIDIA Nemotron 3 Nano on Nebius Token Factory Combines observations with case context and generates assessments, explanations, and language outputs.
Application server Java 21 and Spring Boot Coordinates the workflow, persists case history, and enforces application rules.

The Inspector: structured visual evidence

We fine-tuned Gemini using 831 labeled indoor ceiling and wall images: 706 for training and 125 for validation, covering leaks, mold, and cracks.

We developed a severity-labeling guide, drawing on NYC Housing Maintenance Code thresholds for mold categories.

The Inspector returns structured observations such as defect type, apparent severity, visible signs, active water, and extent. We reuse it for:

  • Case analysis.
  • Evidence quality checks before upload.
  • Before-and-after repair comparisons.

The Case Agent: reasoning in context

NVIDIA Nemotron 3 Nano (nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B) runs through live Nebius Token Factory API calls.

It supports seven parts of Dwell:

  1. Final severity assessment.
  2. Deaver’s multilingual conversations.
  3. Case-event detection.
  4. Repair-verification explanations.
  5. Landlord messages and translations.
  6. Personalized checklists.
  7. Report narratives.

The server gives Nemotron structured observations alongside the renter’s description, earlier evidence, case history, and dates. This allows an assessment to account for information a camera cannot capture.

Reasoning configured for the task

A case generates repeated interactions, from substantive judgments to short summaries. We configure the model accordingly.

  • Judgment tasks: Reasoning stays enabled for severity assessments and case updates.
  • Short writing tasks: We disable reasoning through chat_template_kwargs: {enable_thinking: false}.
  • Observed improvement: During development, report-narrative generation fell from approximately 15–30 seconds to 2–5 seconds after disabling reasoning for that task.
  • Streaming: Token Factory responses feed our SSE workflow, followed by cards, actions, and quick replies.
  • Configuration: Model selection is externalized through environment variables. Our deployed configuration uses Nano for both chat and assessment.

Application rules enforced in code

We designed explicit boundaries around model output.

  • Controlled severity changes. SeverityPolicy allows increases but limits reductions to one level, with a stated reason.
  • Conditions beyond the camera. Heating-season heat and hot-water outages receive High severity under our application policy.
  • Unclear evidence. Inconclusive images can trigger a retake request, while descriptions of danger can raise urgency.
  • User-confirmed follow-up windows. High: 24 hours, Medium: 72 hours, and Low: 7 days are proposed response windows, distinct from statutory repair deadlines.
  • Curated legal references. The server selects relevant material from 26 stored NYC and New York State housing-law entries. Citation labels and links come from the database.
  • Traceable assessments. Assessment outputs and reasons are stored as JSON.
  • Defined fallback behavior. Parsing failures and certain model-response failures are handled with templates, default checklists, or inconclusive results, depending on the feature.

Technology stack

Layer Technology
Frontend Flutter, Dart, Riverpod
Web deployment Vercel
Backend Java 21, Spring Boot, Spring Security, Spring Data JPA
Database PostgreSQL + pgvector, Flyway
Case reasoning NVIDIA Nemotron 3 Nano via Nebius Token Factory
Visual analysis Fine-tuned Gemini via Google Vertex AI
Public data NYC Open Data
Backend infrastructure Docker, GitHub Actions, AWS EC2
Evidence storage Amazon S3

Challenges we ran into

1. Connecting visual observations to a real-world case

A photo is one piece of evidence. Its significance depends on what the renter describes, when the problem started, and how the condition has changed.

We separated visual observation from contextual judgment and used the server to assemble the relevant information. This makes it possible to inspect what the visual model observed and how that information contributed to the final assessment.

2. Checking repairs with incomplete evidence

A freshly painted ceiling can look better while leaving the underlying cause uncertain.

We built an explicit inconclusive path into verification. The system needs to explain what the images support and when further evidence or inspection is needed.

3. Balancing reasoning depth and response time

Enabling reasoning for every task introduced unnecessary waiting during short writing operations.

We configured reasoning per task, preserving it for judgments while reducing report-generation latency. This gave us a concrete way to improve responsiveness without applying the same settings to every feature.

4. Grounding legal references

Our users need sources they can review.

We supply selected housing-law entries to the model and render citation labels and links directly from the database. This gives us control over the references shown while keeping their relevance and interpretation within our evaluation priorities.

5. Maintaining continuity across weeks of updates

A housing case can outlast any single conversation.

We built around a persistent record so new evidence and messages can be interpreted in the context of earlier events. Users can return with an update and continue working on the same problem.


Accomplishments that we're proud of

A connected product workflow

We implemented reporting, contextual assessment, multilingual communication, case updates, repair-verification explanations, and report generation around a shared case record.

The evidence a renter contributes remains useful as the case develops.

A substantive role for NVIDIA and Nebius

Seven application features use live Nemotron inference through Nebius Token Factory. The model is involved in the decisions and explanations that carry the case forward.

Deliberate engineering around model behavior

We implemented server-enforced policies, structured outputs with stored reasons, database-backed citation links, and feature-specific fallback handling.

We also identified a latency bottleneck and improved it by configuring reasoning at the task level.

An accessible demonstration

Our preloaded demo account includes cases and building records. Simulated time progression and HPD events let judges explore developments that would normally take days within one session.


What we learned

Useful assistance depends on understanding where the person is in the process.

A useful next step accounts for what has happened, what was promised, what the evidence shows, and what remains unresolved.

Language support includes interpretation. A renter may understand “We’ll look into it” and still need help recognizing that no repair date has been agreed.

Continuity reduces the work users must repeat. When someone returns with another photo, the existing record should make that update more useful.

Reasoning settings belong at the task level. Severity assessment and a short report summary have different requirements, even when they use the same model.

Explicit boundaries make an AI workflow easier to inspect and improve. Separating observations, judgments, and server policies gives us clearer places to evaluate failures and make changes.


What's next for Dwell

Validate the experience with renters

We plan to pilot Dwell with first-time renters and tenant-support organizations. We will measure whether users can prepare clearer requests, complete follow-ups, and assemble useful evidence with less effort.

Evaluate the decisions that matter

We will assess severity judgments and repair comparisons against expert-reviewed cases, including ambiguous evidence and recurring problems.

We also plan to measure latency and cost per case and strengthen multilingual quality.

Evaluate NVIDIA vision models

We will compare NVIDIA vision models with our current Inspector on assessment quality, uncertainty handling, latency, and cost.

Our goal is to simplify the architecture while preserving the reliability renters need.

Build a focused path to adoption

We will start in NYC, where our legal references and public-data integrations are grounded, and expand with locally validated guidance.

Universities, relocation programs, and tenant-support organizations offer a practical path to reaching people who are new to a housing system. Dwell can help renters prepare their cases and give support teams a clearer history to work from.


Moving to a new country is hard enough. Getting help with your home should not require mastering an unfamiliar system alone.

Dwell gives renters a place to start, a record that grows with their case, and support through the next step.

Built With

  • amazonec2
  • amazons3
  • dart
  • dio
  • docker
  • flchart
  • flutter
  • flutterhooks
  • fluttersecurestorage
  • fquery
  • gemini
  • githubactions
  • googlevertexai
  • gorouter
  • java
  • nebiustokenfactory
  • nvidianemotron
  • nycopendata
  • pgvector
  • postgresql
  • riverpod
  • springboot
  • springdatajpa
  • springsecurity
  • vercel
Share this project:

Updates

Submission history