Hi,I'mEbrahim
Full Stack Engineer · NestJS · Next.js · TypeScript · PostgreSQL
IbuildCRMandcommerceplatformswithNestJS,Next.jsandPostgreSQL—andshipmergedfixestotheopen-sourcetoolsotherteamsbuildon.


About Me
I'm a full stack engineer on a large-scale CRM and e-commerce platform — the catalogue, inventory, order and auth paths a business actually runs on.
What I care about is the seams: the transaction boundary, the schema that has to survive the next feature, the assumption nobody wrote down until it broke something. When I'm not on that, I'm usually deep in someone else's codebase tracking a bug back to its cause.
Currently Full Stack Engineer at RemoteIntegrity·Jun 2026 - Present
Read the full background →Toolkit
Grouped by where it sits in the stack, not scored out of a hundred — the merged pull requests and the projects below are the evidence.
Languages
- TypeScript
- JavaScript
- Python
- SQL
Backend
- NestJS
- Node.js
- Express.js
- Django
Frontend
- Next.js
- React
- Tailwind CSS
- Framer Motion
Data
- PostgreSQL
- Prisma ORM
- MongoDB
- Redis
Infrastructure
- Docker
- CI/CD
- Git & GitHub
Open Source
Bugs I tracked down and fixed in production codebases used by thousands of teams — each one reviewed and merged by the project’s own maintainers.
5
Merged PRs
3
Upstream Projects
92.9k+
Combined Stars
1250
Lines Shipped
Twenty
★ 55.8k+Mergedtwentyhq/twenty · The open-source alternative to Salesforce, designed for AI.
fix(mcp): echo the client's progressToken instead of fabricating one
PR #24582 · merged Aug 2026
The Problem
Twenty's Model Context Protocol endpoint invented its own progress token for every tool call and streamed a progress notification whether or not the client had asked for one. The MCP spec only allows notifications that reference a token from an active request, so a fabricated token could never be matched by a client — one reporter hit 157 protocol errors in a single Cursor session, after which the client marked the transport failed and left the server permanently red in its MCP list.
What I Did
Read the client's own `params._meta.progressToken` and echo it back, sending nothing when no token was supplied — which the spec explicitly permits. A Zod schema does the extraction, so a token of the wrong JSON type, or a fractional number, is treated as absent rather than echoed as a notification no client could match. Shipped with integration tests over the real HTTP path plus unit coverage for the edge tokens a truthiness check would silently drop.
+95 / −11 · 5 files changed
TypeScriptNestJSMCPZodSSEJestView Merged PR →Medusa
★ 36.1k+Mergedmedusajs/medusa · The world's most flexible commerce platform for agents and developers.
fix(auth): await the OAuth state cache write
PR #16571 · merged Aug 2026
The Problem
`setState` on the auth identity provider service wrote OAuth state to the cache fire-and-forget, while its own contract documented "resolves when the state is stored". All four providers — Google, GitHub, OIDC and Medusa Cloud — await it and then immediately redirect, so a user could be sent to the identity provider before the state was actually persisted. Worse, the unhandled rejection meant a transient cache error during login took the whole process down instead of surfacing as a failed sign-in.
What I Did
Awaited the cache write, bringing the method in line with the contract its four callers were already written against. Traced the inconsistency to the analogous MFA challenge write in the same file, which already awaited — evidence this was an oversight rather than a deliberate choice. Verified both failure modes by hand, and removed the accompanying test at the reviewer's request rather than claim coverage the PR did not ship.
+6 / −1 · 2 files changed
TypeScriptNode.jsOAuthCachingJestView Merged PR →Saleor Dashboard
★ 1k+Mergedsaleor/saleor-dashboard · The GraphQL-powered dashboard for the Saleor commerce platform.
Stop lists crashing on a selection that outlived its rows
PR #6873 · merged Aug 2026
The Problem
Selecting rows and then shrinking the list replaced the entire view with an error page across six different lists — products, collections, models, draft orders, shipping zones and gift cards. The data grid tracks its selection by row index, independently of the data behind it, and reported those indices verbatim; the list views then resolved them straight onto arrays that no longer had rows at those positions.
What I Did
Fixed the cause rather than the reported symptom: the grid is the authority on how many rows exist, so it no longer reports rows past the last one it renders. Index-to-id resolution moved into a shared helper, because the clamp alone was insufficient — the row count is not always the length of the data behind it. That also settled three divergent behaviours spread across nine lists, two of which had been leaking `undefined` into the bulk actions.
+579 / −109 · 39 files changed
TypeScriptReactGlide Data GridGraphQLVitestView Merged PR →
Featured Projects

Zyplo - Team Workspace & Resource Management Platform
A collaborative workspace platform designed to help teams create and manage workspaces, organize resources, maintain structured documentation, and monitor activity through a unified dashboard. Zyplo focuses on improving team collaboration by centralizing workflows, resources, and communication in one platform.

VELANO Fashion - Premium Fashion Ecommerce Platform
A full-stack fashion ecommerce platform for a Bangladesh-based premium clothing brand, combining a polished storefront, integrated admin operations, localized checkout, and membership-driven customer retention flows.
2+
Years Building
8
Projects Shipped
19
Technologies
5
Upstream PRs Merged