GTZenda
Enterprise document intelligence pipeline that ingests procurement data from AI agents, classifies and normalizes documents using LLM processing, and pushes structured data into a government sales intelligence platform. Built on AWS with SQS-driven async processing and OpenAI integration.
About This Project
GTZenda is a multi-stage document intelligence pipeline designed to ingest high-volume procurement data from Mozenda AI scraping agents, store raw documents in S3, decompose batch deliveries into individual records, classify and normalize them using OpenAI, and push validated data into the Government Navigator platform. The architecture emphasizes reliability through SQS-based async processing, idempotent operations, and comprehensive observability.
Key Achievements
- Designed a 5-stage document intelligence pipeline: ingress, batch decomposition, schema validation, LLM classification, and normalized data push to Navigator
- Built SQS-driven async processing with dead-letter queues, idempotent operations, and automatic retry logic for reliable high-volume document handling
- Integrated OpenAI for automated document classification, category extraction, and content summarization of procurement records
- CloudFormation-based infrastructure-as-code with modular stacks for DNS, SSL/ALB, storage, intake queues, application, CI/CD pipeline, and monitoring
- Vue 3 SPA frontend with Vuetify, TipTap rich text editing, FullCalendar integration, and Chart.js analytics dashboards
- Microsoft SSO authentication with containerized deployment on Elastic Beanstalk
Related Projects
Related Publications
Articles that cover technologies and skills used in this project

Extend Faker in Laravel 11
Sometimes it’s necessary to make your testing data appear as close to the production data as possible. In my case, I wanted more predictable and realistic looking email addresses for system users...

Software Architecture; When and How to Use the Adaptor Pattern (with examples in PHP)
In the world of electronics (at least if you’re as old as me) everyone is familiar with the solution to a cable that doesn’t fit, an adaptor! Sometimes more commonly called a ‘dongle’ in modern...

PHP8’s Nullsafe Operator or “Optional Chaining”
In JavaScript this feature is called “optional chaining” where you can reduce the amount of checks that you need to do by chaining accessors with a ?. For example const street = User.address?.street...