
GST Compliance & Document AI Platform
Automated Indian GST compliance, multi-way ledger reconciliation, GSTR-1/3B return filings, and an asynchronous AI-powered invoice extraction pipeline.
- NestJS
- TypeScript
- Node.js
- PostgreSQL
- TypeORM
- +12
Software Engineer jpteam · C1X Inc.
Production backends for GST compliance, document AI and real-time workflows at work. Retrieval gating, content forensics and review tooling on my own time. This site is where both get written down.
Hover or tab through a component; select it to see where it appears.
Browser clients call the services over REST with JWT auth and receive long-running results back over SSE.
NestJS services own the domain: ledgers and returns, campaign scans, marketplace admin, chat context, visit ingestion.
Results of async work reach the browser over SSE: a durable notification stream with Last-Event-ID replay, and live inventory stats.
Sessions, cache and locks. A Redis lock serialises concurrent redemptions and OTP verification so neither is granted twice.
Relational store behind the campaign platform and the marketplace admin, accessed through TypeORM entities.
Transactional source of truth: ledgers and filing state, verified visit records, and the memory tiers behind retrieval.
Queues between services: OCR results flow back to the core service, and fraud scoring and anchoring run as async jobs.
Out-of-request work: the document extraction worker, and the fraud-scoring worker that isolates flagged visits before payment.
Past interactions stored as embeddings in pgvector — one of the memory tiers retrieval may, or may not, be allowed to read.
Model calls at the edge of the system: invoice OCR, entity-grounded prompts, gated retrieval before an LLM, and forensic classifiers.
Chosen because each shows a different kind of problem — not a ranking.

Automated Indian GST compliance, multi-way ledger reconciliation, GSTR-1/3B return filings, and an asynchronous AI-powered invoice extraction pipeline.

Real-time dynamic QR campaign lifecycle engine with distributed Redis locking for atomic inventory redemptions, sponsor ad delivery, and live SSE analytics.

Behavior-adaptive retrieval for stateful conversational AI — four memory tiers behind 41 deterministic decision gates instead of always-on RAG.

Rust daemon that reviews pull requests in isolated git worktrees through a five-pass static analysis pipeline and posts evidence-anchored GitHub reviews.
NestJS services with the Repository Pattern enforced between layers, GST math on Decimal.js, and invoice edits routed through the aggregate root so totals are never computed against an intermediate state.
BullMQ pipelines between services, Redis-locked redemption under concurrent scans, and a durable SSE stream with heartbeats and Last-Event-ID replay.
ABAC at the foundation, tenant scoping centralised from 19 ad-hoc filters into one service guarded by a CI lint rule, and an IDOR test matrix across mutation routes.
Document-AI extraction with a classification guard in front of OCR, and a four-tier memory architecture where retrieval is decided by 41 deterministic gates.
Static-analysis PR gates, an E2E suite cut from 26 Testcontainer boots to 1, and a Rust PR reviewer that runs in isolated worktrees and cannot push.
jpteam / C1X Inc.
Engineered and maintained production microservices across FinTech compliance, Document AI, enterprise conversational AI, and high-concurrency dynamic media platforms.
GST return status queries went from 3,000ms+ to sub-15ms at peak load by reading a precomputed projection that filing writers keep fresh through domain events. Requirements, options and the update path.
Four ways a GST portal integration lost or corrupted data while every request succeeded — a case-sensitive parameter, an unechoed field, a delegated rule and an over-broad sum — and how each was closed.
In BARA, retrieval is three separate decisions — whether, from where and how much, then which chunks — made by deterministic rules before a vector is ever compared. A research note with the code.
Two services used the same BullMQ queue name under different Redis key prefixes, so every OCR extraction result was enqueued where nothing would ever read it. An incident write-up.
Code for the personal projects is public on GitHub. Professional work happened in employer repositories; this site describes what I built there.