FastAPI backends and data pipelines, built to be tested and explained.
Python · APIs · data pipelines · open-source stat-arb research
Strongest fit: FastAPI backends, data pipelines, API integrations. Also worked with: RAG and agent prototypes, React/Next.js front ends, TimescaleDB, Docker. I also run CorrelateX, my own product studio.
Systems & Proof of Work
Selected work, each labelled by how mature it is. Figures marked self-reported come from private repositories.

VI Engine
AI-assisted social content workflows with human approval
HedgeVision (open source)
Open-source statistical-arbitrage research platform in Python/FastAPI and React
Live previewFinancial News Crawler
Async Python pipeline that reads financial news RSS feeds and scores sentiment
Mangal Murti Jeweller — Diamond E-Commerce Platform
Diamond e-commerce site with a large faceted catalog (launching)
Code Snippets
Small excerpts from real systems — the kind of details that make products reliable.
LangGraph agentic workflow with conditional tool routing
Multi-step LLM agent that routes between RAG retrieval, code execution, and human handoff based on intent classification.
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
class AgentState(TypedDict):
messages: list[BaseMessage]
intent: str
tool_results: dict
needs_human: bool
def classify_intent(state: AgentState) -> AgentState:
prompt = ChatPromptTemplate.from_messages([
("system", "Classify: rag | code_exec | human_escalate"),
("human", "{query}")
])
result = llm.invoke(prompt.format(query=state["messages"][-1].content))
state["intent"] = result.content.strip().lower()
return state
def route_by_intent(state: AgentState) -> str:
routes = {"rag": "retrieve", "code_exec": "execute",
"human_escalate": "handoff"}
return routes.get(state["intent"], "retrieve")
def retrieve_context(state: AgentState) -> AgentState:
query = state["messages"][-1].content
embedding = embeddings.embed_query(query)
docs = vector_store.similarity_search_by_vector(embedding, k=8)
reranked = reranker.rerank(query, docs, top_k=3)
state["tool_results"]["retrieved"] = [d.page_content for d in reranked]
return state
def execute_code(state: AgentState) -> AgentState:
sandbox = Sandbox(timeout=15, allow_imports=["numpy", "pandas"])
result = sandbox.run(state["tool_results"].get("code", ""))
state["tool_results"]["exec_output"] = result.stdout or result.stderr
return state
graph = StateGraph(AgentState) \
.add_node("classify", classify_intent) \
.add_node("retrieve", retrieve_context) \
.add_node("execute", execute_code) \
.add_node("handoff", human_handoff) \
.add_conditional_edges("classify", route_by_intent, {
"retrieve": "retrieve", "execute": "execute",
"handoff": "handoff"
}) \
.add_edge("retrieve", END) \
.add_edge("execute", END) \
.compile()Async event pipeline — Redis Streams with backpressure
High-throughput event ingestion: async generator → Redis Streams → consumer group with explicit backpressure and dead-letter queue.
import asyncio
from redis.asyncio import Redis
from typing import AsyncGenerator
class EventPipeline:
def __init__(self, redis: Redis, stream: str, group: str,
consumer: str, max_pending: int = 500):
self.redis = redis
self.stream = stream
self.group = group
self.consumer = consumer
self.max_pending = max_pending
self.dlq = f"{stream}:dead"
async def ingest(self, events: AsyncGenerator[dict, None]) -> int:
count = 0
batch = []
async for event in events:
batch.append(("event", event))
if len(batch) >= 50:
await self.redis.xadd(self.stream, dict(batch))
count += len(batch); batch = []
if batch:
await self.redis.xadd(self.stream, dict(batch))
count += len(batch)
return count
async def consume(self, handler) -> None:
await self._ensure_group()
while True:
pending = await self.redis.xpending(self.stream, self.group)
if pending["pending"] >= self.max_pending:
await asyncio.sleep(0.5); continue # backpressure
messages = await self.redis.xreadgroup(
self.group, self.consumer, {self.stream: ">"},
count=10, block=2000
)
for msg_id, data in messages:
try:
await handler(data)
await self.redis.xack(self.stream, self.group, msg_id)
except Exception as exc:
await self.redis.xadd(self.dlq, {
"original_id": msg_id, "data": str(data),
"error": str(exc), "ts": str(time.time())
})
await self.redis.xack(self.stream, self.group, msg_id)
async def _ensure_group(self):
try:
await self.redis.xgroup_create(
self.stream, self.group, id="0", mkstream=True
)
except ResponseError:
pass # group already existsStack I actually use.
These are the tools in the projects above — Python, FastAPI, LangGraph, React/Next.js, PostgreSQL, Redis, Docker, and the surrounding ecosystem.
AI & LLM
16 skillsLLM orchestration, RAG pipelines, agentic workflows, and applied ML.
Backend & Data
12 skillsAPIs, async pipelines, real-time streams, and data persistence.
Frontend
9 skillsProduction UIs and interactive dashboards.
Infra & DevOps
12 skillsEnd-to-end deployment, cloud infrastructure, and observability.
Security & Ethical Hacking
12 skillsOffensive security, hardening, and infrastructure defense.
IT Support & Systems
11 skillsSystems administration, networking, and technical support.
Low-Code & No-Code
10 skillsRapid delivery platforms and workflow automation (2025–2026).
Quant & Data Systems
8 skillsMarket data pipelines, strategy tooling, and financial infrastructure.
How I Work
I handle architecture, backend, and delivery myself, with Docker for deployment. If a scope needs a skill I do not have, I will say so before we start. You deal with one person throughout.
Client feedback
You can read client reviews on Upwork.
Frequently Asked Questions
I aim for explicit APIs, clear state, retries and tests, and I label every project by how mature it actually is. Common questions about how I work and what to expect.
Let's Build Something Great
I'm always interested in working on exciting projects and collaborations.
