Everything we've shipped upstream, and everything we've shipped ourselves.
The complete record behind the summary on /about — every row here is verifiable on GitHub in thirty seconds, not a number we typed.
Fixes to the platforms we implement, not just deploy.
2 merged · 29 open pull requests, read live from GitHub — not typed in.
Synced 2026-08-13
Showing all 39 contributions
- medusajs/medusa#16416
A RegExp route matcher advanced its own lastIndex on every request, so consecutive URLs alternated between matching and missing — and the wrong answer was cached for the process's lifetime.
Open - medusajs/medusa#16418
Wildcard cache invalidation compiled the key straight into a regular expression, so a key containing a dot, bracket or second asterisk matched — or deleted — the wrong entries.
Open - medusajs/medusa#16417
Same root cause reachable through CORS configuration — a /g or /y origin pattern alternates between allowing and blocking valid requests.
Filed - medusajs/medusa#16434
A workflow step still waiting out a retry interval could get invoked a second time after its transaction had already committed to unwinding everything else — the retry check looked only at the step's own status, never at the flow's.
Open - medusajs/medusa#16435
Writing off or reinstating a claimed order line validated against the item's original ordered quantity instead of what was actually left to claim or give back — letting two claims each write off the full quantity, or a reinstate push the balance negative.
Open - medusajs/medusa#16437
Moving an inventory reservation to a new location skipped the destination's availability check entirely and never decremented the source location's reserved quantity, since the code only knew how to validate a same-location quantity change.
Open - medusajs/medusa#16438
A cart's second combinable tax line for the same item silently overwrote the first on recalculation — the upsert matched existing rows by item alone, with nothing to tell two tax lines on one item apart.
Open - medusajs/medusa#16439
A buy-get promotion's max-quantity cap only checked against earlier rounds' totals, never against what its own round had already committed to — a round fragmented across several target items could blow straight past the cap.
Open - medusajs/medusa#16440
A transaction-checkpoint merge check turned out to be provably unreachable dead code — filed as an issue rather than a guess, since the fix depends on concurrent-execution semantics not confidently inferable from the surrounding code alone.
Filed - medusajs/medusa#16441
Editing an order line's price, with nothing else changed, still re-reserved its full quantity as if none of it were fulfilled — and if that failed, the workflow's own rollback resurrected reservations fulfillment had already consumed, with no ceiling.
Open - frappe/frappe#41827
A base class method's own signature didn't match the only call it ever receives — closed by the repo's contributor-vouching bot before review, not for being wrong.
Blocked — pending maintainer review - frappe/frappe#41828
A loop's exit condition was computed once and never re-checked — real, but smaller than first reported; verified by reproduction that it doesn't change what renders, only how much work it wastes getting there.
Blocked — pending maintainer review - frappe/erpnext#57705
Five yearly reports labelled their columns by a fiscal year's end date instead of its name — erpnext doesn't accept outside pull requests, so this shipped as a branch link on the issue instead.
Filed - frappe/crm#2661
A version-check call that only exists on newer Frappe threw a server-side error on every navigation on older sites — silently caught, so the failure had no diagnostic trail at all.
Open - frappe/hrms#5035
Independently verified a contributor's fix for a leave-balance miscalculation before it duplicated as a competing PR — confirmed correct and more complete than the fix we were about to write ourselves.
Open - frappe/insights#1294
A table column literally named "count" was indistinguishable from the app's own synthetic "count every row" measure, so counting it silently counted an unrelated column instead.
Open - frappe/lending#1383
A repayment schedule's date stopped advancing and every row landed on the same day whenever a Loan Product's schedule-type field was left at its blank default — a real bug, but a different one than the issue itself described.
Open - frappe/builder#745
frappe._(...) could never work inside a Page Data Script no matter where _ was assigned — the sandbox's attribute guard rejects any name starting with an underscore before it even looks at what it resolves to.
Open - frappe/lms#2667
Two rapid clicks on "Get Certificate" could both pass the not-certified-yet check before either saved, producing duplicate certificate rows — closed with a DB-level unique constraint after review caught a NULL-vs-empty-string gap in the first version.
Open - frappe/bench#1453
get-app truncated any repo name containing a dot down to whatever came before the first one — this repo restricts PR creation to existing collaborators, so the tested fix went up as a comment on the existing issue with a link to the branch instead.
Filed - n8n-io/n8n#36176
The built-in ERPNext node duplicated a row at every page boundary past 1,000 records, and crashed before making a request if Options was touched without adding a filter.
Open - n8n-io/n8n#36223
The ERPNext node's own friendly-error guard for an empty Properties field crashed instead of firing — the field's real default is {}, not the populated shape the guard assumed, so it threw a raw TypeError before its own error message could.
Open - mattermost/mattermost#37934
The import path panicked on any os.Stat failure other than "file does not exist" — a permissions error or a broken symlink took down the whole import instead of surfacing as a normal error.
Open - mattermost/mattermost#37938
Passwords were never Unicode-normalized before hashing or comparing them, so a password typed with a precomposed accent on one device could fail to verify on another device producing the decomposed form of the same character.
Open - mattermost/mattermost#37939
The webapp only suggested "first last" name matches for an @-mention, so the server's own order-independent search returned a match the client-side filter then silently dropped.
Open - chatwoot/chatwoot#15441
A Telegram error handler assumed every non-2xx response parsed to a JSON object, so a response that parsed to null, a string or an array crashed instead of marking the message failed.
Open - chatwoot/chatwoot#15442
A content-attribute validator crashed outright on a nil or malformed items list, and the crash cascaded into sibling validators that should have run independently of it.
Open - chatwoot/chatwoot#15443
A label's title validator used a regex anchor that tolerates a trailing newline — the same class of mistake already fixed once elsewhere in the codebase, on a phone-number field.
Merged - chatwoot/chatwoot#15444
A Twilio call endpoint has no guard of its own against being hit outside an active call context and 500s if it is — filed with an explicit caveat that the exact UI trigger from the report couldn't be reproduced.
Open - chatwoot/chatwoot#15445
Team, Agent and Inbox summary reports mix two different timestamp columns within the same row — filed as a finding rather than a fix, since which one is "correct" is genuinely ambiguous.
Filed - chatwoot/chatwoot#15471
An automation rule's webhook fired against a conversation's stale triggering message under a race, sending the wrong message content — root-caused after an earlier pass had only gotten as far as "plausible."
Open - twentyhq/twenty#24109
A workflow's Find Records step aborted the entire run when a filter's variable resolved to a legitimate null — an optional relation simply not being set — instead of correctly matching zero records.
Open - twentyhq/twenty#24111
Every workflow step carries a "continue on failure" setting, but the executor only ever read it inside iterator loops, so a failing step outside one aborted the whole run regardless of what it was set to.
Open - twentyhq/twenty#24163
A database-event trigger's watched-fields filter was silently ignored on upsert events, so a logic function watching one field that also wrote back other fields on the same record could re-trigger itself forever.
Open - twentyhq/twenty#24165
SSO login silently assumed every identity provider signs id_tokens with RS256 instead of reading what the provider's own discovery document actually advertised, breaking login for any provider whose default is something else.
Open - mautic/mautic#17071
Manually removing a contact from a segment deleted the membership row outright instead of flagging it, so the next segment rebuild silently re-added the same contact the removal was meant to keep out.
Open - mautic/mautic#17072
A value set in .env or .env.local was silently overridden by the derived local.php config, while an identically-named real environment variable was correctly protected from that same override.
Merged - mautic/mautic#17073
Saving a segment filter on a multiselect field with "Including ALL" or "Excluding ALL" crashed on save — the form only marked the field multi-value for the plain in/not-in operators, missing both ALL variants.
Open - mautic/mautic#17081
Sorting or paginating the Tags list re-rendered a second, nested copy of the search toolbar on every ajax refresh — the one list template in the codebase missing the same-request guard every other entity list already had.
Open
Our own repos, MIT-licensed, released for anyone to run.
- mithtech-is/Pulse
Agile project management inside Frappe/ERPNext — sprints, Kanban, epics, releases, OKRs, risks, retros and timesheets, all on native Project and Task records instead of a bolted-on app.
PythonMIT - suparikoli/medusync
Two-way sync between a Frappe/ERPNext site and a Medusa v2 backend — pick which doctypes sync from the Desk UI instead of hand-writing a payload template per doctype. Site-agnostic: no customer-specific fields baked in.
PythonMIT - suparikoli/ntfynext
Delivers Frappe notifications as ntfy push notifications alongside email, never as a replacement — per-user opt-in, escalating-backoff retries, a redacted delivery log, and a provider interface for adding Telegram or Discord later.
PythonMIT - suparikoli/polygin
Send WhatsApp template messages from ERPNext through Polyg.in, with configurable buttons and dynamic field mapping.
JavaScriptMIT - suparikoli/smartflo
Tatatelebiz Smartflo telephony integration for ERPNext.
PythonMIT
Building on ERPNext, Medusa or n8n?
We implement the same platforms we send fixes upstream to — talk to us about what you're building.