Hi — I'm
Mohamed Yahia
Full-Stack Developer
Full-stack developer working in TypeScript, React and Node.js. I spent 15 months inside GrapesJS, the 26k-star open-source editor, rewriting its drag and drop engine and building the data binding its paid SDK runs on.
Experience
6 rolesUX Pilot · Senior JS Developer
Jun 2025 — 2026New York, USA (Remote) | Contract
- Built the front-end editor for UX Pilot, an AI interface design tool at $5.3M ARR.
- Added selection-scoped editing, so a user can highlight part of a generated design and describe the change in words. The model rewrites only that region.
- Extended the generation model's output to synced HTML components, so a generated screen arrives as editable elements rather than a flat export.
Habitat AI Inc. · Contract Engineer
Dec 2025 — Apr 2026New York, USA (Remote) | Contract
- Built myself a tool that automated the labelling through LLM API calls, instead of working through the datasets by hand.
- Annotated labelled datasets directly for the annotation pipeline.
GrapesJS · Full Stack Engineer
Aug 2024 — Nov 2025California, USA (Remote) | Full-time
- Merged 55 pull requests into the open-source editor framework, which has 26k stars and is the base for the commercial product.
- Rewrote the drag and drop sorter, replacing a single file with a node tree and a separate drop-location resolver across 26 files.
- Added data binding to the framework over 19 PRs, then built the same feature for the paid SDK and the B2C editor and co-wrote its reference documentation.
- Shipped template import for Mustache, EJS, Handlebars, Nunjucks and Liquid, letting teams bring existing templates into the editor.
- Built global styles in the SDK with a teammate, where one change propagates to every page in a project.
Documentation I wrote:SDK data sources →SDK global styles →
Rebuilding drag and dropThe sorter was one file that most people avoided touching. I pulled it apart into a proper node tree with a separate drop-location resolver, then spent the next year fixing what the rewrite surfaced in Firefox and in the layer manager.17 PRs+3,373 / -1,954Sep 2024 – Sep 2025— show all
Split a single Sorter file into a node tree, a drop-location resolver and a placeholder renderer across 26 files. Everything below this line is a consequence of it.
Sep 2024+2,278 / -1,46226 filesdiff →
Public API so host apps can drive dragging themselves rather than faking mouse events.
Oct 2024+184 / -5011 filesdiff →
The rewrite made drop targets recalculate far too often. This caches the geometry instead.
Oct 2024+500 / -17313 filesdiff →
Jun 2025+90 / -716 filesdiff →
Oct 2024+130 / -267 filesdiff →
Dec 2024+112 / -505 filesdiff →
Firefox reports drag coordinates differently mid-drag. Took a while to find.
Oct 2024+2 / -542 filesdiff →
Oct 2024+6 / -412 filesdiff →
Jun 2025+11 / -141 filediff →
- #6382Fix resizer on absolute drag mode when the parent is positioned ( position: relative | absolute | .... )
Feb 2025+20 / -21 filediff →
Oct 2024+9 / -53 filesdiff →
Sep 2024+2 / -22 filesdiff →
Dragging text into a symbol duplicated the text node on every pass. One line, reported by a user.
Sep 2025+12 / -11 filediff →
Sep 2024+8 / -11 filediff →
Oct 2024+5 / -01 filediff →
Sep 2024+3 / -11 filediff →
Nov 2024+1 / -11 filediff →
Data sources and data bindingThe framework had no way to bind a component to external data. Nineteen merged PRs later it has data variables, conditional rendering and collection components that repeat over a dataset. Most of it is still undocumented upstream, which is part of why I wrote the SDK docs for the paid version.19 PRs+12,133 / -4,822Oct 2024 – Oct 2025— show all
Collection components: repeat a component over a dataset. Largest single PR I merged there, 48 files.
Feb 2025+3,084 / -64745 filesdiff →
Apr 2025+1,076 / -1,28124 filesdiff →
Mar 2025+777 / -48425 filesdiff →
Dec 2024+1,053 / -68515 filesdiff →
Mar 2025+1,326 / -49832 filesdiff →
Conditional variables, so a component can render based on the data rather than on a hardcoded flag.
Nov 2024+899 / -8118 filesdiff →
A batch of data binding bugs found once real projects started using the feature.
Aug 2025+920 / -23920 filesdiff →
Data sources scoped per page rather than per project.
Oct 2025+458 / -18912 filesdiff →
Apr 2025+675 / -40325 filesdiff →
Oct 2024+839 / -014 filesdiff →
May 2025+244 / -949 filesdiff →
Nov 2024+117 / -8618 filesdiff →
Oct 2024+353 / -236 filesdiff →
Nov 2024+99 / -458 filesdiff →
Generalised the data variable listeners so conditionals and collections could reuse them.
Oct 2024+70 / -516 filesdiff →
Jul 2025+120 / -114 filesdiff →
Jun 2025+16 / -33 filesdiff →
Oct 2024+3 / -01 filediff →
Apr 2025+4 / -21 filediff →
Scrollable canvasOn a long page you could not reach anything below the fold while dragging. I made the canvas scroll, then made it scroll on its own when a dragged component gets near the edge.4 PRs+258 / -95Feb 2025— show all
Internals, types and performanceThe unglamorous half of the job. Type coverage for managers that had none, plus a render performance pass and the lint and typecheck script the repo was missing.18 PRs+1,274 / -388Sep 2024 – Oct 2025— show all
Render performance pass on the editor.
Oct 2025+174 / -617 filesdiff →
Jun 2025+260 / -20710 filesdiff →
Apr 2025+200 / -226 filesdiff →
The device manager had no types at all.
Jun 2025+68 / -243 filesdiff →
Sep 2024+86 / -12 filesdiff →
Unit tests for the CLI utils, which had none.
Sep 2024+359 / -14 filesdiff →
Nov 2024+47 / -22 filesdiff →
Jul 2025+25 / -63 filesdiff →
Jan 2025+8 / -82 filesdiff →
Sep 2024+25 / -402 filesdiff →
Jan 2025+5 / -21 filediff →
Oct 2024+4 / -41 filediff →
Sep 2024+2 / -22 filesdiff →
Jun 2025+3 / -21 filediff →
Feb 2025+2 / -21 filediff →
Added a single check script wiring lint, format and typecheck together.
Sep 2025+1 / -01 filediff →
Jul 2025+4 / -31 filediff →
Windows path separators broke the SCSS build. Nobody on the team was on Windows.
Mar 2025+1 / -11 filediff →
Datopian · Full-Stack Developer
Nov 2023 — Jul 2024California, USA (Remote) | Full-time
- Maintained MarkdownDB and Flowershow across 37 merged PRs, working in the open with outside contributors.
- Designed and built the onboarding flow for DataHub Cloud, which took over 60 users through setup.
- Added computed fields and document types with schema validation to MarkdownDB, plus the hot reload that made it usable while writing.
- Shipped analytics for 4 providers in Flowershow behind a single config key.
- Set up CI, integration tests and unit tests for the projects I maintained.
MarkdownDBTurning a folder of markdown files into something you can run SQL against. I wrote the link and tag extraction, then computed fields, document types with validation and the hot reload that made it usable while writing.28 PRs+4,028 / -1,069Nov 2023 – Mar 2024— show all
Merged the v2 rewrite into main.
Nov 2023+730 / -22615 filesdiff →
Nov 2023+200 / -2308 filesdiff →
Mar 2024+379 / -2710 filesdiff →
Nov 2023+146 / -77 filesdiff →
Nov 2023+123 / -1796 filesdiff →
Nov 2023+273 / -011 filesdiff →
Pushed computed fields down into the SQL layer instead of computing them per query.
Dec 2023+74 / -304 filesdiff →
Jan 2024+377 / -188 filesdiff →
Dec 2023+117 / -198 filesdiff →
Nov 2023+231 / -642 filesdiff →
Nov 2023+178 / -02 filesdiff →
Document types with schema validation on parse.
Dec 2023+97 / -02 filesdiff →
Dec 2023+282 / -654 filesdiff →
Jan 2024+134 / -137 filesdiff →
Computed fields, so a document can derive values from its own frontmatter.
Dec 2023+65 / -68 filesdiff →
Hot reloading, which is what made it usable while you write.
Dec 2023+75 / -44 filesdiff →
Nov 2023+98 / -973 filesdiff →
Nov 2023+84 / -155 filesdiff →
Dec 2023+37 / -01 filediff →
Dec 2023+63 / -411 filediff →
Nov 2023+22 / -03 filesdiff →
Dec 2023+38 / -33 filesdiff →
Nov 2023+54 / -01 filediff →
Nov 2023+54 / -01 filediff →
Dec 2023+30 / -92 filesdiff →
It fell over past 500 files in one directory.
Dec 2023+41 / -41 filediff →
Nov 2023+22 / -93 filesdiff →
Nov 2023+4 / -31 filediff →
Flowershow and PortalJSAnalytics that worked across four providers without the site author having to pick one at build time. Also hot reloading for the publishing pipeline, and image sizing for wiki links in PortalJS.9 PRs+855 / -92Dec 2023 – May 2024— show all
Image sizing syntax for wiki links in remark-wiki-link.
Apr 2024+164 / -796 filesdiff →
Jan 2024+239 / -19 filesdiff →
May 2024+159 / -03 filesdiff →
Dec 2023+206 / -04 filesdiff →
Analytics for Plausible, Simple Analytics, Google and PostHog behind one config key.
Jan 2024+12 / -72 filesdiff →
Hot reloading for the site builder.
Feb 2024+4 / -21 filediff →
Jan 2024+3 / -01 filediff →
Jan 2024+26 / -02 filesdiff →
Jan 2024+42 / -31 filediff →
Independent Contractor · Full-Stack Developer
Nov 2022 — Oct 2023Remote | Contract
- Built a price comparison app on Google Cloud, with a Google Shopping scraper feeding it competitor pricing.
- Shipped a Chrome extension and a VSCode extension.
- Wrote a textbook management app for organising course material, and a time tracking tool with note-taking and switchable themes.
- Smaller one-off builds: a word cloud generator, a landing page and a Trachtenberg arithmetic trainer.
Rechat Inc · Full-Stack Developer
Oct 2021 — Feb 2023Texas, USA (Remote) | Full-time
- Cut contract preparation time by 50% for the data entry team, which is what let Rechat take on more regions.
- Traced broken e-signature forms to fillable fields embedded as JavaScript inside the PDF files, which the document pipeline was not detecting.
- Repaired hundreds of contract and disclosure PDFs that customers could not sign or complete online.
- Built the contract and signing endpoints behind the client apps, plus an internal tool that turns an uploaded PDF into a signable one.
- Rebuilt document search and the signing page itself.
Stack
17 backed by evidence- Languages
- JavaScript
- Frontend
- Backend
- PostgreSQLPrisma
- Infrastructure & Tooling
- GitFigmaAWS(basics)Docker(basics)
- Practice
- Open-source maintenance
- Maintainer duties
- Issue triagePull request reviewCommunity feedbackContribution guidelines
- Communication
- Asynchronous communicationCross-timezone collaborationWritten technical updates
Chips with an outline have evidence behind them. Click one — most open merged pull requests here, the ↗ ones open a live GitHub search.
Open Source
5 projectsProjects I maintain or contribute to, used by teams outside the ones I built them in.
GrapesJS
26k★Editor framework · Core Contributor
Host applications embed it to give their own users a drag-and-drop page builder.
TypeScriptRefactoringPerformanceAPI designMarkdownDB
Datopian · 500★Content database · Maintainer
Turns a folder of markdown files into something you can run SQL against.
Next.jsTypeScriptReactPostgreSQLResponsive designFlowershow
Datopian · 1.1k★Static site builder · Maintainer
Publishes markdown notes, docs and wikis as a website.
Next.jsTypeScriptReactResponsive designDataHub
Datopian · 2.3k★Data portal framework · Contributor
Scaffolds a portal for publishing and exploring datasets. Formerly PortalJS.
Next.jsTypeScriptReactCKANPanora
1k★API integration platform · Contributor
Unifies third-party SaaS APIs behind one interface. The same integration engine Panora's product runs on.
TypeScriptReactHTML/CSSRefactoring