Inspiration
We kept thinking about how unfair it is that knowing the right legal language basically determines whether a housing complaint gets taken seriously. A tenant who writes "I have mold" gets ignored. A tenant who writes "Violation of VMC Section 305.1 with timestamped photographic evidence" gets a response. That gap has nothing to do with how serious the problem is and everything to do with who has access to legal knowledge. We wanted to close that gap for the 44 million renter households in the US who have no idea what their rights are or how to document them.
What it does
Witness lets a tenant photograph a housing problem on their phone and get back a formal, code-cited complaint letter in seconds. You upload a photo, enter your address, and the system identifies what it sees in the image, cross-references those observations against a real Virginia housing code database, and generates a letter with exact code section numbers, legal language, and local enforcement contacts ready to copy, download, or file.
How we built it
The whole backend runs as a three-stage AI pipeline on AWS. Stage one sends the photo to Claude Haiku 4.5 on Bedrock with a vision prompt that returns structured observations about what is physically visible. Stage two takes those observations, asks the model to suggest relevant housing code sections, and then verifies every single suggested code against a DynamoDB table before it moves forward. Stage three fetches local enforcement contacts from a second DynamoDB table and generates the final complaint letter. The three Lambda functions run as a synchronous Step Functions Express Workflow so the browser gets back one clean JSON response. The frontend is three plain HTML files with no framework, a WebGL particle animation on the upload page, and a custom complaint letter renderer that parses the letter into structured visual sections.
Challenges we ran into
The biggest one was getting Bedrock working. The model ID for Claude Haiku 4.5 requires a cross-region inference prefix that is not obvious from the AWS console, and every call was silently failing until we traced the error through the Step Functions execution history. We also had to build the anti-hallucination layer from scratch because early versions of the pipeline were generating code citations that looked real but did not exist. The fix was to treat every suggested citation as untrusted until DynamoDB confirmed it. Lambda deployment without the AWS CLI meant bundling TypeScript with esbuild into single zip files and uploading through the console, which took longer than expected but forced us to really understand what was in each bundle.
Accomplishments that we're proud of
The citation verification system genuinely works. Every code section that appears in the output has been confirmed against a real database before it reaches the user. We are proud of that because it is the thing that separates this from just asking an AI chatbot, and it is the thing that makes the output actually usable in a real complaint. We are also proud of the cost. The entire pipeline runs for under a cent per analysis, which means this could realistically be deployed as a free public tool.
What we learned
We learned that the hardest part of building an AI product is not the AI. The model worked on the first real test. The hard parts were IAM permissions, CORS headers, environment variable names, and making sure the output format was consistent enough to render correctly in the browser. We also learned that spec-driven development with Kiro actually changed how we approached the project. Writing requirements before writing code forced us to make decisions early that would have caused painful rewrites later.
What's next for Witness
Right now Witness only covers Blacksburg, Virginia housing codes. The most important next step is expanding the database to cover other cities and states, which is mostly a data problem rather than an engineering one. We also want to add email delivery so a tenant can send the complaint directly to the enforcement agency without leaving the page. Longer term, we want to add a case tracking feature so tenants can follow up on filed complaints and document whether the landlord took action, creating a timestamped record that strengthens any future legal case.
Built With
- amazon-claude-haiku-4.5
- amazon-web-services
- aws-api-gateway
- aws-bedrock
- aws-dynamodb
- aws-iam
- aws-lambda
- aws-step-functions
- claude
- css
- esbuild
- html
- iam
- javascript
- kiro
- node.js
- typescript
- webgl
Log in or sign up for Devpost to join the conversation.