agzv

I build thewhole thing.

I’m Anvar, a full-stack developer building since 2019. Applications, payment systems, APIs, cloud infrastructure: I build every layer of a product, and when something breaks, I find out why.

Every project bigger than the last

  1. 2019–2022

    Freelance

    Websites and iOS apps, built and shipped on my own.

  2. 2022–now

    Innovative Metrics

    Full-stack, end to end: frontend, Express APIs, MySQL, AWS Lambda and Step Functions, payments.

    • A pet insurance platform
    • A consumer people-search platform
  3. Personal project

    FinFlow

    A multi-tenant finance platform on Kubernetes, with every piece of infrastructure in Terraform.

At Innovative Metrics

Two consumer products, both end to end: the pages people use, the APIs behind them, and the AWS infrastructure underneath.

A consumer people-search platform

Full-stack developer, 2025–now

What I own

Frontend
Marketing and landing pages, the main site, search reports, billing, and sign-in.
Backend
An Express API with authentication, role-based authorization, and server-side validation on every request.
Cloud
Business logic on AWS Lambda, multi-step workflows on Step Functions, S3, SQS and SES, infrastructure in AWS CDK, and data in MySQL and Redis.
Payments
The full payment integration, from checkout to billing.

Making a massive report readable

Every search returns one enormous report from our data provider, with hundreds of records nested inside each other, and the structure changes from report to report. Hand-coding each section wasn’t an option, because I couldn’t know which sections a future report would contain. So I built the report page to work it out on its own: recursive functions walk the nested structure, discover whatever sections exist, and render each one, so new and changed sections appear without code changes. Formatting helpers turn raw dates, names and addresses into plain, readable text, and addresses appear on a Google Map.

Subscriptions across several payment processors

Subscriptions run on NMI, CyberSource and PayPal, with Apple Pay and Google Pay at checkout. Each processor has its own API and its own ways of failing, so the hard part was making billing behave the same everywhere: never charging anyone twice, and retrying failed renewals instead of quietly losing the subscriber.

A pet insurance platform

Full-stack developer, 2023–now

What I own

End to end
Landing pages, the main site, and the backend.
Cloud
Business logic on AWS Lambda, S3, SQS and SES, infrastructure in AWS CDK, and data in MySQL.
Payments
A single payment processor, with the same protection against duplicate charges as the people-search platform.

Live repricing

Adding or removing a pet, changing a pet’s details, or moving to a new address all change the price of a policy. Every change is recalculated, and the customer sees the new price first, then decides whether to confirm the change or cancel it.

Claims that are easy to file

A claim has a lot of moving parts: the type of injury, documents, and receipts proving what happened. I built a single claim form, split into clear visual sections, so people always know what’s left to fill in and upload. Each claim goes to the insurance provider and is saved in our own system.

Moving to a new insurance data provider

When the company had to replace its insurance data provider, I took on the migration: working from the new provider’s documentation and reworking the backend and Lambda functions around a completely different implementation, while existing customers keep full access to their policies.In progress

How FinFlow runs

  1. A private network. Everything lives in its own VPC. Public subnets face the internet; the private ones hold the app and the data, with no way in from outside.
  2. A Kubernetes cluster. EKS runs three workloads in the private subnets: the web app, the API, and background workers for reports and emails.
  3. Data, kept private. Postgres on RDS and Valkey on ElastiCache sit in private subnets, encrypted, reachable only from the cluster. Receipts go to S3, weekly digests out through SES.
  4. The way in. Visitors reach the app through Route 53, CloudFront with a WAF, and an Application Load Balancer that sends traffic straight to the pods.
  5. One command. All of it, from the network to the edge, is Terraform. A full rebuild is a single terraform apply.
VPCPublic subnetsPrivate subnetsEKS clusterwebNext.jsapiExpressworkerBullMQRDSPostgres 16ElastiCacheValkeyS3receiptsSESweekly digestsLoad balancerALBCloudFront+ WAFRoute 53DNS

How I build

The questions I’d ask a developer before hiring them, answered with real work.

Security

How do you keep sign-in secure?

In FinFlow, access tokens last 15 minutes. Refresh tokens last 7 days, live only in an httpOnly cookie, and are rotated on every use: each refresh issues a new token and kills the old one. Only a SHA-256 hash is stored, never the token itself. If an old token ever shows up again, that means it was stolen, so every session for that user is revoked and they sign in again. Google sign-in sits on top, and every company account has its own roles: owner, admin, member, viewer.

JWT, OAuth 2.0, bcrypt, Express, PostgreSQL

Multi-tenancy

How do you keep one company’s data away from another’s?

FinFlow serves many companies from one database. Every query is scoped to the company the user is acting for, and checked against their role in it. On the frontend, cached data is keyed by company too, so switching companies can never show the previous one’s numbers. Sensitive actions go to an audit log.

PostgreSQL, Drizzle ORM, TanStack Query, role-based access control

Money

How do you keep money correct?

Money is stored as whole cents, never as decimals, so totals never pick up rounding errors; it’s only formatted for display at the very end. At work, the same care goes into payments: billing behaves the same across three processors, and no customer gets charged twice.

PostgreSQL, NMI, CyberSource, PayPal

Performance

How do lists stay fast as the data grows?

FinFlow’s expense list pages with a cursor (the position of the last row seen) instead of page numbers, so a page far down the list costs the same as the first. The total count is a separate request that runs in parallel, so the list never waits for it. I measure instead of guessing: on a 250,000-row test table, EXPLAIN ANALYZE showed the right index taking the same query from 16 ms to 0.1 ms.

PostgreSQL, EXPLAIN ANALYZE, Express, React

Delivery

How does code get to production safely?

GitHub Actions builds and deploys FinFlow, and no AWS keys are stored anywhere: each run proves who it is with a short-lived token (OIDC), and AWS only trusts runs from release branches. Third-party actions are pinned to exact versions, deploys can’t overlap, and database migrations run as a Kubernetes Job inside the cluster.

GitHub Actions, OIDC, AWS IAM, Docker, Kubernetes

Debugging

What do you do when something breaks?

Start from the symptom, rule causes out one at a time, and check the real state instead of assuming. Once, tearing down FinFlow’s cluster hung for seven minutes. Listing the VPC’s network interfaces showed one left behind, still attached to a security group: the node had shut down before the networking plugin finished deleting it. I removed it, the teardown finished, and when it happened again on a later rebuild I knew it was a real race and made it a documented step.

AWS CLI, Terraform, Kubernetes, EKS

Looking for someone who builds the whole thing?

anvar@agzv.dev