Solo founder · Vancouver

Ishtiaque
Hossain

Maker of fine Porcine Software.

3 Products live
0 Co-founders
3 Upstream contributions
4 Cities, 3 countries

Background

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.

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

Projects

Three products, all alive. Each one designed, built, and shipped alone.

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.py open

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.

@@ def nll_loss(inputs, targets, axis=-1, reduction="none") @@
-    loss = -mx.take_along_axis(inputs, targets[..., None], axis).squeeze(-1)
+    loss = -mx.take_along_axis(inputs, mx.expand_dims(targets, axis), axis).squeeze(
+        axis
+    )
+23 −1 2 files Jun 10, 2026 PR #3651 ↗
python/mlx/optimizers/optimizers.py open

Adafactor crashed on conv-shaped parameters

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.

@@ def _approximate_exp_moving_avg(self, exp_avg_sq_row, exp_avg_sq_col) @@
         c_factor = mx.rsqrt(exp_avg_sq_col)
-        return mx.matmul(
-            mx.expand_dims(r_factor, axis=-1), mx.expand_dims(c_factor, axis=0)
-        )
+        return mx.expand_dims(r_factor, axis=-1) * mx.expand_dims(c_factor, axis=-2)
+22 −3 2 files Jun 10, 2026 PR #3652 ↗
python/mlx/nn/layers/normalization.py open

Norm layers accepted garbage silently

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})."
+            )
+31 −0 2 files Jun 10, 2026 PR #3653 ↗

What I'm Doing

Operating & iterating
Designing, coding, and shipping every part of it alone. Currently the active focus.
porkicoder ↗
Building & shipping
Queues posts, staggers them across accounts, and surfaces what landed. Used daily.
hogmatix ↗
Launched & live
Founded, built, and launched it alone. Live and used by job seekers today.
resumehog ↗

Where I've Lived

Vancouver, Canada
Home base. Where I build today.
Toronto, Canada
First years in Canada. Then I headed west.
Kuala Lumpur, Malaysia
Studied here. Stayed for a decade.
Dhaka, Bangladesh
Where it started.

Porkfall

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.

Porkfall HI 0 Score 0