Backend Engineering · Professional
A production-style backend and React client for a data and analytics platform, covering authentication, persistence, caching, migrations, testing and API integrations.
Context
Professional
Role
Junior Software Engineer · Infometrica Strategy
Year
2025
Stack
Problem
Infometrica's analytics product needed a backend that could authenticate API consumers, persist their accounts and usage reliably, and stay simple enough for a small team to operate and extend, plus a client surface for the people using it day to day.
What I built
System
Requests hit a FastAPI router, pass through an auth dependency (JWT or API key), and are logged for usage accounting. PostgreSQL, accessed through SQLAlchemy, is the system of record for accounts, keys, plans and usage; Alembic keeps schema changes reproducible across environments. Redis holds rate-limit counters and other short-lived state. The service runs in Docker for local parity with staging, and calls out to the external systems the product's data integrations depend on.
Client
Browser or API consumer sending an authenticated request.
FastAPI
Routes the request, validates input, calls the right service logic.
Auth
JWT or API-key check before anything reaches business logic.
PostgreSQL
System of record for accounts, keys, plans and usage.
Redis
Rate limiting and short-lived state.
Data integrations
Outbound calls to the external systems Cortex pulls data from.
Key technical decisions
Chose Redis-backed token buckets over in-memory rate limiting.
Added an operational dependency, but kept limits consistent across multiple API instances instead of per-process.
Used Alembic migrations from the start instead of hand-syncing schema.
Slower for early schema churn, but removed staging-versus-production drift as a failure mode.
Result
The backend handled authentication, metering and data integrations for the product through my time on the team, with a test suite the team kept building on afterward.
What I learned
How much of a backend's reliability comes from the unglamorous parts: idempotent logging, migrations that are safe to re-run, and rate limiting that fails closed instead of open.