I'm building porkicoder, a coding agent that reads code, edits files, and runs commands on its own. The goal is a real engineering collaborator, not another autocomplete.
Before that I shipped resumehog, which helps job seekers tailor a resume to a specific role in minutes by matching what hiring teams actually screen for.
I work alone. Design, code, infra, support. Every part of the product runs through me. It keeps decisions fast and the product opinionated.
Born in Bangladesh, studied in Kuala Lumpur, a few years in Toronto, now in Vancouver.
AI-Native
I design around what models can actually do today, not what I wish they could.
Every decision starts from what current models reliably do today, not what a demo implies. Latency budgets, hallucination shape, and context limits drive the UX, not the other way around.
End-to-End
Design, frontend, backend, infra. One person, the whole stack, every release.
A designer's eye, a backend engineer's caution, and a founder's urgency sit on one head. Decisions land faster because no handoff queue is slowing them down.
Bias to Ship
I'd rather launch something rough this week than something pristine next quarter.
Ship, watch it fail, fix it. Feedback from real users beats a quarter of planning. Every product here only got better after strangers started using it.
Toolkit
What I Work On
The work, the focus areas, and the road that got me here.
I build with
Full-stack web
LLM agents & tooling
Product design
Backend systems
Rapid prototyping
Focus areas
Developer tools
Coding agents
Career & hiring tech
Solo SaaS
Web apps
Lived in
Vancouver, Canada
Toronto, Canada
Kuala Lumpur, Malaysia
Dhaka, Bangladesh
Work
Projects
Three products, all alive. Each one designed, built, and shipped alone.
01
porkicoder
Agentic coding assistant
A coding agent that does the work. Reads code, edits files, runs commands, spawns sub-agents in parallel. For developers who want a collaborator, not another autocomplete.
Built after a year of wrestling with coding assistants I couldn't trust unsupervised in a real repo. The loop reads files before editing, runs shell commands on its own, and spawns parallel sub-agents when a task branches. The headline isn't autocomplete; it's finishing the ticket.
CLI-first, because that's where real engineering happens. No tab-complete theater, no popup wait. The agent picks a direction, does the work, and reports what changed.
02
resumehog
Resume optimization platform
Tailors a resume to a specific job in minutes by matching what hiring teams actually screen for, instead of stuffing keywords and hoping.
Built after watching friends spend weekends tuning resumes by vibes. Hiring screeners run on keyword signals and ranked skills, and most applicants never see what's being weighted. resumehog parses the posting, extracts what recruiters score on, and rewrites without keyword-stuffing.
A minute in, a polished PDF out. Paid, profitable, and still improving every release.
03
hogmatix
X posting & scheduling platform
Schedule posts, run multiple X accounts from one place, and automate the grind, so showing up consistently doesn't eat your day.
Posting consistently on X eats real hours. hogmatix queues posts, staggers them across multiple accounts, and surfaces what landed, all from one panel.
Originally built for my own handles. Once other solo operators started asking for access, it turned into a product.
Open Source
Upstream
Patches sent upstream, currently to MLX, Apple's machine-learning framework for Apple silicon. These aren't mockups: each card types out the actual hunk from the PR, and the stream syncs itself from the GitHub API, so new contributions show up here on their own.
live · synced from the GitHub API
python/mlx/nn/losses.pyopen
nll_loss ignored its axis argument
The gather ran along axis, but the expand and squeeze were hardcoded to the last dimension, so any non-default axis either crashed with a confusing squeeze error or silently returned wrong values when the trailing dim was 1. Applied the same fix cross_entropy got, pinned down with tests against NumPy.
The factored second-moment update recombined row and column factors with a strictly 2-D matmul, so any parameter with more than two dims (a conv weight, a stacked weight) blew up. Swapped in the broadcasting outer-product form the reference implementation uses, verified against Hugging Face's Adafactor to within 4e-9.
InstanceNorm on an input with no spatial dims quietly returned all zeros. GroupNorm accepted a num_groups that doesn't divide dims, mixing channel and spatial positions into meaningless statistics. Both now raise a ValueError up front, matching PyTorch's behavior.
@@ InstanceNorm.__call__ @@+ if x.ndim < 3:+ raise ValueError(+ f"InstanceNorm expects inputs with at least 3 dimensions"+ f" (N, ..., C) but the input has {x.ndim} dimensions."+ )@@ GroupNorm.__init__ @@+ if dims % num_groups != 0:+ raise ValueError(+ f"The number of features ({dims}) must be evenly divisible"+ f" by the number of groups ({num_groups})."+ )
An endless runner starring the studio mascot. Every sprite on this screen is text: pixel grids baked to canvas at runtime. No images, no engine, no dependencies. Space, ↑, or tap to jump; hold for a higher arc. Watch for pits.