Document Management System
Full-stack delivery for a US housing authority: resident workflows, caseworker tools, document processing, and property-management integrations.
The product and my contribution
A housing recertification platform connecting resident forms, document intake, AI-assisted processing, caseworker review, and property-management integrations. My contribution spans React and Next.js interfaces, Django APIs and business rules, testing, and the delivery work needed to keep these parts working together.
- TypeScript
- React
- Next.js
- Python
- Django
- Celery
- PostgreSQL
- Redis
- OpenAI API
- Azure
- Docker
- Tailwind
- pytest
- Playwright
My role
Full-stack engineer on a long-running client engagement. I work across the resident portal in React and Next.js, Django APIs and business rules, caseworker-facing tools, and external integrations. My work includes clarifying requirements, following a feature across application boundaries, and verifying how the finished flow behaves.
- Built resident questionnaire and expense-reporting flows, including conditional navigation, summaries, validation, and translations
- Connected those screens to backend models, migrations, API responses, and submission rules
- Improved document uploads, duplicate notices, failed-upload recovery, and mobile feedback
- Extended property-management exports and the mappings between household, income, and asset records
- Developed caseworker approval flows, dashboard metrics, and AI-generated reporting
- Added regression coverage across backend behavior and browser journeys, with supporting build and pipeline changes
The workflow
Annual and interim housing recertifications involve residents, caseworkers, supporting documents, financial rules, signatures, and a property-management system. A change to one part can affect several others. The product connects document intake, extraction, validation, review, and approval so that staff can follow a case and residents can understand what they still need to provide.
One feature across the stack
The zero-income workflow is a useful example of my contribution. On the backend, I added the date and business rules that determine when a household must provide an expense sheet, exposed that decision through the API, and validated the answers. In the portal, I built the questionnaire screens, conditional navigation, and summaries. The work also covered generated documents, caseworker approval, translations, and regression tests. The useful result is a connected workflow, rather than an isolated screen or endpoint.
Application architecture
The platform combines a Django backend and REST APIs with a separate React and Next.js resident portal. Caseworker tools also use Django templates, HTMX, Tailwind, and Django Unfold. PostgreSQL stores the application data; Celery and Redis handle background work. My changes cross these boundaries when a feature requires it, while fitting the conventions of the existing codebase.
AI within the product
Document processing is part of the wider platform: OCR services read uploaded files, and Azure OpenAI workflows classify and extract structured information using domain-specific tools and validation. Langfuse traces model calls alongside application monitoring. Within this team-built platform, my contribution connects validation, reporting, and document handling to the interfaces that let people act on the results.
Data and integrations
The backend uses schema-per-tenant PostgreSQL through django-tenants, with tenant-aware background tasks and Azure Blob Storage for documents. Property-management integrations need consistent meanings across different data models. I work on exports, field mappings, validation, and change highlighting, including the details that determine whether a record can be reviewed and synchronized correctly.
Delivery and operation
The application runs in Docker-based environments with Azure Pipelines supporting builds, checks, and deployment. My work includes supporting configuration and pipeline changes when needed to deliver a feature. Sentry, Datadog, Langfuse, and Flower provide different views into application failures, background jobs, and model calls.
Checking the whole flow
Backend tests cover business rules, migrations, API behavior, generated documents, and approval states. Portal tests exercise navigation, forms, uploads, and summaries with Playwright. I add coverage around the behavior that can regress, including partial failures and the boundary between a saved answer and its supporting document. A passing endpoint is only part of the check; the user must also be able to finish the task.
How I work
I stay involved beyond the initial implementation: discussing requirements, tracing their implications through the system, addressing review feedback, and checking the finished behavior. That includes user-facing copy and error states as well as database rules and integration payloads. The scope varies by task, but the aim stays the same: make the feature fit the client workflow and the existing product.
Technologies
- TypeScript, React, Next.js, Playwright
- Python, Django, Django REST Framework, pytest
- PostgreSQL, django-tenants, Celery, Redis
- HTMX, Tailwind, Django Unfold
- Azure OpenAI, Azure Document Intelligence, Azure Blob Storage
- Docker, Azure Pipelines, Sentry, Datadog, Langfuse, Flower