Satvik ReddyParvathareddy.
Full stack engineer.
Database schema, API layer, React UI, Docker deployment — shipped as one working product, not isolated features.
01 / About
I own features
start to finish.
I design the database schema, write the FastAPI routes, build the React UI, wire Docker Compose, and deploy — as one cohesive system. Not just code features in isolation.
Most of my projects involve LLMs in some meaningful way. Not just API wrappers — I've built evaluation frameworks, structured output pipelines, and context management systems that behave predictably under real load.
Looking for a backend or full stack role where I can own real features, ship fast, and learn from engineers who care about the fundamentals. Based in Dallas, TX and open to remote.
02 / Projects
01 / 04Scores job postings against a resume in real time — so job seekers stop applying blind.
CareerCompass
AI career guidance platform
// async · typed · 24 tests passing
@router.post("/match")
async def match_jobs(
profile: UserProfile,
db: Session = Depends(get_db)
) -> list[JobMatch]:
jobs = await fetch_active_jobs(db)
# Score each job against the user profile
matches = await asyncio.gather(*[
score_job_match(profile, job)
for job in jobs
])
return sorted(
matches,
key=lambda m: m.score,
reverse=True
)Run test cases across multiple models at once. GPT-4o judges every response on accuracy, relevance, and hallucination risk.
EvaluateAI
LLM evaluation platform
// json_object · parallel · zero-setup DB
async def evaluate_response(
model_output: str,
expected: str,
) -> EvalScores:
result = await openai.chat.completions.create(
model="gpt-4o",
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": JUDGE_PROMPT},
{"role": "user", "content": build_prompt(
model_output, expected
)},
],
)
data = json.loads(
result.choices[0].message.content
)
return EvalScores(**data)Reviews pull requests with full repo context — so suggestions are relevant to your codebase, not generic.
CodePilot
AI code review tool
// streaming · token-budgeted · diff-aware
export async function reviewPR(
pr: PullRequest
): Promise<Review> {
const [diff, context] = await Promise.all([
fetchDiff(pr.number),
buildRepoContext(pr.baseSha, {
maxTokens: 4000,
}),
])
const { choices } = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "system", content: REVIEW_PROMPT },
{ role: "user", content: buildPrompt(diff, context) },
],
})
return parseReview(choices[0].message.content)
}Pulls vendor inventory and order data into one view and flags disruptions before they become stockouts.
SupplyChainSync
Supply chain visibility dashboard
// no N+1 · weighted alerts · healthchecked
export async function getVendorStatus(
vendorIds: string[]
): Promise<DashboardData> {
const [inventory, orders, alerts] = await Promise.all([
db.query.inventory.findMany({
where: inArray(inventory.vendorId, vendorIds),
with: { vendor: true, product: true },
}),
fetchPendingOrders(vendorIds),
checkDisruptionAlerts(vendorIds),
])
return {
stockHealth: calcStockHealth(inventory),
reorderFlags: inventory.filter(
i => i.qty < i.reorderPoint
),
activeAlerts: alerts.filter(
a => a.severity === "high"
),
}
}03 / Stack
How I build
systems.
Every project follows the same request lifecycle. Each layer has a clear job and hands off with a typed contract.
Browser
Next.js SSR
API Route
Server component
FastAPI
Async handler
Pydantic
Validation
SQLAlchemy
ORM / raw SQL
PostgreSQL
Source of truth
API Design
Auto-generated docs
FastAPI generates OpenAPI from type annotations. The spec is always in sync because it comes from the code itself.
Async by default
Route handlers are async throughout. asyncio.gather runs independent queries in parallel, not sequentially.
Typed response models
Every route declares its response model. FastAPI validates outgoing data the same way it validates incoming.
Structured errors
Error responses follow a consistent shape. Clients never parse free-form strings to understand what failed.
Type Safety
Pydantic as source of truth
Schema and validation live in one place. The model is the contract between the DB, the API, and the client.
Zod on the frontend
API responses are validated at runtime before they touch React state. Type errors surface at the boundary.
TypeScript strict mode
No implicit any, no loose nulls. Types flow from Pydantic models through Zod to the UI layer without gaps.
Shared contracts
Backend response shapes are mirrored as Zod schemas. If the API changes, the frontend type error tells you.
Deployment
Docker Compose for everything
API, web, and database start with one command. Dev environment matches production exactly.
Healthchecks before startup
The API container waits for the database healthcheck to pass. No race conditions on cold start.
Vercel for the frontend
Deploys on every push to main. Preview URLs for every pull request. Zero config for Next.js.
Environment parity
Same Compose file runs locally and in CI. No separate dev config to drift out of sync with production.