Senior and lead software engineer
Abdulkader Safi, software engineer in Kuwait and Australia
Senior and lead software engineer at dsrpt, from Lebanon, working across Kuwait and Australia. Enterprise platforms during the week, open source most weekends. This is where all of it lives.
- packages published
- 5+
- plugins and extensions
- 10+
- projects shipped
- 50+
- packages and plugins downloads
- 3600+
What I ship with
- Laravel
- .NET
- Next.js
- React Native
- Appwrite
- PostgreSQL
Selected work
Things I built and shipped
All projects
GitBasedDocs
A private docs site that reads Markdown from one GitHub repo. Write in Obsidian, push, and a few seconds later the pages are live for the people you shared them with. Each project is a folder in the repo, and a reader sees only the projects an admin linked to their account. Anyone else gets the same 404 as a project that does not exist. A webhook starts a delta sync that fetches only changed files, a timed recheck covers a missing webhook, and pages are served from SQLite, so reading never calls GitHub. It renders the Markdown Obsidian and GitHub both know: Shiki code, Mermaid diagrams, KaTeX math and Obsidian callouts, plus wikilinks and image embeds. Next.js 16, React 19, next-auth v4 and Drizzle on SQLite, about 9,200 lines of TypeScript, MIT.
MD Kanban
A kanban board where every card is a markdown file on your disk, built so you can watch what an AI coding agent is doing without asking it. Each connected folder is a project, each subfolder groups work, and each task is one `.md` file whose YAML frontmatter holds status, priority, assignee, due date and labels. Dragging a card between columns rewrites the file, and the agent edits the same files from its side. That is the whole design: Jira and Linear keep state behind an API, so an agent needs credentials and a connector before it can move a card, while a folder is something it can already write to. The repo ships the contract twice, as `AGENTS.md` for any agent and as a Claude skill, and tracks its own remaining build as task files inside itself. Vue 3, Vite, TypeScript and Tailwind v4 over the browser File System Access API, about 1,800 lines, MIT.
AI Writing Rules
A Claude Code plugin that stops Claude writing like an AI. It loads a 270-word ruleset into every session, then runs a checker after every file write that flags the tells by line number and refuses to let the model move on. The rules come from 29 documented patterns, each researched into its own file with a measurable threshold: burstiness under 0.4 where human prose sits at 0.6 to 1.2, more than 20 em dashes per 1,000 words where humans use 3.2 to 10, more than one polished three-item list per 200 words. The checker is 17 regex rules and 3 statistical ones in Python with no dependencies. Tested against a sample with 14 planted tells, it caught all 14, stayed silent on clean prose, and found a real tricolon in the research files themselves.
Services
What I take on
All services-
01
Mobile Application Development
Custom iOS and Android apps for Kuwait and the GCC. Arabic RTL and KNET built in from the start, not bolted on at the end.
-
02
Freelance Web Developer
Six years building production sites and web applications, and fourteen writing code. You work with the developer writing your code, not an account manager.
-
03
Obsidian Plugin Development
Your team runs on Obsidian and it does almost everything you need. I build the part it's missing, and I have a plugin that passed Obsidian's public review.
Writing
Things I wrote
All writing
Should a small Node script be .js or .mjs?
The rule for picking .js or .mjs when you write a quick Node script, what actually decides the module system, and why require(esm) landing in every supported Node changed the answer in 2026.
Flatmark: query your markdown files like a database
Flatmark is a Node library that indexes a folder of markdown files and gives you a chainable query API over the frontmatter. Here's what it does, where it beats Velite and Astro content collections, and the four things I'd want fixed before shipping it.
Moving from Vercel to Hetzner with Coolify: the guides are quoting dead prices
Almost every "move from Vercel to Hetzner with Coolify" guide was written in 2025. Hetzner raised cloud prices twice in 2026, and the exact server those guides name now costs 144% more. Here are the real numbers and the plan to pick instead.
Build diary
What changed this week
All devlogs
Two UI critique rounds
A UX review and a scored critique (27 out of 40) on GitBasedDocs, what each one found, and the fixes that landed as one commit per finding.
Heavy Markdown, light pages
Shiki renders code on the server, Mermaid loads only on pages with a diagram, rendered HTML is cached per blob sha, and one misplaced import that shipped the whole pipeline to the browser is gone.
The $5 problem
remark-math read "costs $5 a month, or $50" as a formula. A small remark plugin applies the Pandoc and Obsidian dollar rule so prices stay text and real math still renders.
Free
Checklists I use on real work
All resourcesFree, one email field, and I will tell you exactly what lands in your inbox.
The 17-Point Self-Hosted Security Checklist
The exact checklist I run on every server before it touches the internet. Firewall, SSH, containers, secrets, and backups, with the commands. Free PDF.
16 Moves That Make Claude Code Work in a Large Codebase
The setup order behind Claude Code deployments that stick, from CLAUDE.md files through hooks, skills, plugins and LSP to subagents, with a 19-step start-here list. Free PDF.
The 36-Point SEO, GEO and AIO Checklist
Thirty-six checks for getting found in Google and in AI answers. Each one has a plain-English line, a free way to run it, and a link to its source. Plus the eight things sold as AI SEO that do nothing. Free PDF.
About
Responsible for whether it ships. Code is the smaller part of that.
I am a senior and lead software engineer at dsrpt, an Australian company working out of Kuwait and Australia.
Outside that I ship open source: an audit engine on npm, two Obsidian plugins, a CSS library with no build step, and a training app I built because the subscription ones would not give me my data back.
Read the full storyWORK WITH ME
Got something that needs building, or something that has stopped moving?
Tell me what it is, roughly when you need it, and what you have already tried. I will tell you honestly whether I am the right person.
Replies within one business day.