Skip to content
View jjoanna2-debug's full-sized avatar

Block or report jjoanna2-debug

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
jjoanna2-debug/README.md

Jean-Claude Joanna

I work on open-source security and reliability, from native macOS apps to Node.js services and GitHub Actions. I use Rust, Swift, TypeScript, and Python to fix the details that shape whether software can be trusted: which account sends a message, where files land, who can reach a dashboard, and whether an app shuts down cleanly. I trace the cause, develop a focused fix, and test the behavior that matters.

Featured by XERJ

XERJ Corpus Hub contributor

On October 28, 2026, XERJ featured my native Mail composition work as a worked reference for coding agents facing similar problems, with attribution to me and sweetrb/apple-mail-mcp.

Selected open-source work

I've authored 37 merged pull requests across 11 open-source projects. Maintainers have also adopted and ported my work across Apple Mail, Numbers, Photos, and Notes.

  • Accurate, efficient Mail lookups: I corrected an Inbox lookup that could return a different copy from All Mail, and made missing-account errors specific enough to act on. #351 shipped in v2.20.44. I then removed repeated receiving-server queries while preserving cache expiration and provider isolation in #352, released in v2.20.45.
  • Account-scoped Mail replies: I bound replies and forwards for numeric message IDs to their source account and mailbox, rejecting ambiguous scopes and changed message identities. #350 shipped in v2.20.43.
  • Native Mail composition: I added opt-in native-editor composition to the existing send, draft, reply, and forward tools, keeping new text outside native quotations and preserving reply history. #337 shipped in v2.20.37.
  • Mail delivery and privacy: I fixed silent SMTP fallback, ambiguous sender selection, and literal template substitution while preserving Bcc privacy in #329.
  • Reliable shutdown: I moved blocking gateway validation off the session thread in Retransmission #256, preserving ownership and diagnostic status.
  • Safer defaults: I made the TokenTelemetry dashboard loopback-only by default, with explicit remote access still available, in #299.
  • Native macOS apps: I kept Quick Look's rewritten image reads inside the document's directory in Markdown Preview #152 and distinguished invalid URLs from network load failures in IINA #6189.
  • Developer tools: I fixed nested batch-output paths in the Rust CLI and Python binding of liteparse #313, restored fresh-install initialization for LinkedIn MCP in #854, and added its opt-in Codex plugin in #863.
More contribution details and release evidence

The work below includes authored merges and, where identified, maintainer-led continuations and credited ports. The latter are not counted as my authored merges.

Security and trust boundaries

  • Apple Mail composition: I fixed silent SMTP fallback, ambiguous sender selection, and literal template substitution in #329, released in v2.20.30. My changes preserve Bcc in private drafts and Sent copies without exposing it in delivered messages. Rob Sweet confirmed the routing and substitution bugs, added a README clarification, and merged the fixes after all seven applicable checks passed.

  • Apple Mail schema security: I migrated the vulnerable Zod 3 dependency to patched Zod 4 while preserving all 52 tools' schema contracts, integer validation, and string-valued template records. Rob Sweet carried my #326 forward unchanged in #327, which merged with co-author credit for my work. He verified a byte-identical rebuild and live IMAP parity; Node 20, 22, and 24 checks, IMAP integration, the version guard, and CodeQL passed. The change shipped in v2.20.29.

  • Zod migration across the Apple MCP projects: Rob Sweet adapted my approach for Apple Numbers #106, Apple Photos #114, and Apple Notes #307. All three merged on October 24, with each PR crediting my original work. The ports preserve the existing schemas and integer behavior across 26 Numbers tools, 21 Photos tools, and 89 Notes tools. Numbers shipped in v1.2.11, Photos in v2.1.22, and Notes in v2.15.11.

  • Apple Mail SMTP delivery: I fixed IMAP reply and forward routing in #214, released in v2.17.8. My changes preserve reply-thread headers, reject unrelated sending identities, and prevent silent transport fallback and lost forward content. The maintainer's review explains the cross-account sending issue and the regression tests.

  • Apple Mail MCP: I hardened account-scoped mail operations, sender authorization, attachment limits, and file creation in #97. The maintainer verified 392 unit tests, 47 integration tests, and a reproducible bundle before it shipped in v2.8.10.

  • Dependency security: I addressed the brace-expansion vulnerability across the legacy CommonJS and current paths in #119 and #123. I included a 10,000-character reproduction to demonstrate the performance problem and kept the fix compatible with existing callers.

  • Apple Mail hardening: my August contributions covered a repository threat model (#158), atomic batch source pairing (#159), ambiguous message IDs (#160), exclusive attachment creation (#161), bounded IMAP attachment reads (#162), disabled-by-default mail rules (#164), the Codex MCP runtime pin (#166), constrained outbound attachment reads (#168), and shared validation schemas (#169). These changes shipped in v2.10.31.

  • Markdown Preview: I fixed Quick Look asset containment in #152 and added native trackpad pinch zoom in #156, both credited in v0.0.29. I also repaired large-document selection in read mode with #185, released in v0.0.34.

  • Downstream dependency fixes: Rob Sweet credited my original dependency finding in his fixes for Apple Notes #113, Apple Numbers #49, and Apple Photos #60.

Reliability and product behavior

  • Efficient Mail lookups: I cached receiving-server lookups alongside mailbox names, sharing their expiration and invalidation while preserving literal Inbox scope when the host cannot be read. I also completed the scoped-error documentation in #352, merged on October 30. Rob confirmed that both #351 follow-ups are complete. The change is included in v2.20.45.

  • Apple Mail Inbox routing: I fixed a Gmail workaround that also matched Proton because both expose an All Mail folder. Search, listing, and recent-mail statistics now check the receiving server before applying that workaround, preserving the requested Inbox for other providers. I also distinguished a missing account from a missing mailbox without relaxing explicit scope. #351 merged on October 30 and shipped in v2.20.44. Live checks confirmed Proton Inbox routing and retained Gmail behavior; missing-account handling has regression-test coverage. All seven applicable upstream checks passed. This fixes source lookup, not the separate loss of reply relationships during cross-client draft synchronization.

  • Apple Mail scoped replies and forwards: I added explicit source-account and mailbox selection in #350, merged on October 30. The fix rejects ambiguous or changed source messages, preserves exact mailbox selection, and gives Mail's native editor a bounded time to become available. Rob Sweet independently reran all 1,462 unit tests and reproduced the build before merging. The change shipped in the v2.20.43 plugin release.

  • Apple Mail native-editor composition: I added an opt-in mode to the existing send, draft, reply, and forward tools in #337, released in v2.20.37. It bypasses the AppleScript body setter that put new text inside quotations, preserves native reply history, and checks sender selection and editor focus. Clipboard recovery respects newer clipboard owners and checks its size budget before capturing data. I verified local draft save–close–reopen behavior, retained reply headers, quotation separation, and exact clipboard restoration. Rob Sweet independently verified all 1,340 unit tests and the rebased CI checks before merging; he did not repeat the live Mail UI tests. Provider-side conversation identity after a fresh server import remains unverified. XERJ's Apple Mail MCP corpus covers the whole repository at this merged revision, not only the files changed in the selected commit.

  • Apple Mail plugin and native composition: I built a self-contained plugin archive and an HTML renderer that keeps new text consistent with Mail's native font size while preserving paragraph spacing. Rob Sweet combined my work from #333 and #334 in #336, with co-author credit, and released it in v2.20.33. The release includes guarded packaging, optional artwork, portable plugin manifests, and update guidance. The later #337 release adds native-editor composition directly to the existing MCP tools as an opt-in mode.

  • Apple Mail reply quotations: I prevented unreadable originals from silently disappearing from replies in #331, merged on October 25. The fix recovers text from raw MIME where possible and stops an incomplete reply when recovery fails. Rob Sweet independently verified a live cross-account reply with its original quotation and thread headers; all seven applicable checks passed. The fix shipped in v2.20.31. Outer quotation styling and the separately reported historical Proton thread failures remain outside this fix.

  • Apple Mail plugin setup: I wrote the Codex setup guide and provider OAuth design in #330, now merged. The guide distinguishes plugin installation, macOS permissions, and mailbox authentication. The merged design documents provider sign-in requirements; it does not implement a sign-in service.

  • GoalBuddy: I aligned runtime receipt contracts (#28), exposed residual Codex state (#29), added deterministic reset cleanup (#30), and fixed local-board rendering for multiple active tasks (#34).

  • liteparse: I fixed batch-output paths for nested input directories in both the Rust CLI and Python binding in #313.

  • Snapzy: I removed Quick Access dismissal lag by separating immediate UI removal from deferred cleanup in #256.

  • Impeccable: I fixed a stale callback race that could let an older toast animate or remove a newer one in #271.

  • Make Interfaces Feel Better: I contributed licensing and interface polish in #1.

  • IINA: I separated malformed URL input from valid network URLs that fail while opening in #6189. My Swift fix merged into develop and closed #6134.

  • Retransmission: I moved blocking UPnP gateway validation off the session thread during shutdown in #256, preserving miniupnpc ownership and diagnostic status while handling empty discovery results explicitly. Both core maintainers approved the final revision, and the full CodeQL and cross-platform Sanity matrix passed before merge. The squash commit credits me as its author.

  • TokenTelemetry: I made the default dashboard loopback-only while preserving explicit remote access in #299. I also corrected the Node 20.9 minimum, updated vulnerable frontend dependencies, and resolved existing lint failures. The maintainer independently reproduced the LAN exposure and verified both launch modes before merging; #300 landed first so lockfile-only dependency updates also reach existing installs. The merged change includes all three of my contributed commits.

  • LinkedIn MCP: I restored fresh-install initialization in #854 by keeping FastMCP below v4 while tool registrations still depended on the removed exclude_args argument. I aligned project, lock, and wheel metadata and added a regression test. It shipped in v4.23.3, whose notes feature #854 under Bug Fixes and name me as a new contributor.

  • LinkedIn MCP plugin and tests: I added the opt-in Codex plugin in #863, released in v4.24.0, whose release notes credit me. The plugin keeps its MCP package pin synchronized with releases and can be enabled independently. In #865, I isolated terminal and Python startup-hook tests from host settings without changing production behavior. Both merged with all 14 checks on their final revisions passing and closed their linked issues.

Current upstream work

I have four open upstream pull requests as of October 30, 2026.

  • Transmission #8984: my shutdown fix remains open. The same fix has already merged in Retransmission #256.

  • IINA #6190 and #6191: I proposed fixes for portable playlist paths and plugin default-branch updates. Both remain open. #6190 is mergeable against develop, with path compatibility still under discussion; #6191 has merge conflicts and awaits plugin-maintainer review. Their CI and spelling workflows failed before any jobs ran, so neither fix has been validated by those hosted checks.

  • Daytona #181: I wrote a Sapat provider guide covering endpoint control, credentials, generated-artifact cleanup, registry contracts, and bounded async polling. The PR is open and mergeable with a passing DCO check.

Featured repository

test-project-tbd is my Rust 2024 lab for repository tooling and automation. It has no runtime dependencies, uses Rust 1.97.1, and requires its Repository smoke test check.

I developed its repository doctor through 19 focused changes in PRs #8–#26, all now merged. It supports:

  • bounded repository traversal and bounded text reads, with content-aware handling for text, binary files, and misleading extensions;
  • provider-specific credential signatures, calibrated generic secret detection, and internal quality thresholds for precision, recall, F1, and average precision;
  • GitHub Actions checks for permissions, triggers, checkouts, and immutable references, plus deterministic text, JSON, and native GitHub annotation output;
  • checks that defend the repository's own CI and Dependabot guarantees from silent regression.

The Basic Checks run for the current main revision passed.

Bug reports

My report on Proton Mail's iOS regressions remains open.

I closed my Codex reports on the desktop configuration reset and the stuck security scan.

What I work on

My work spans:

  • focused security review, threat modeling, and fail-closed repository or filesystem boundaries;
  • Rust tooling, Swift and native macOS defects, and TypeScript, Node.js, and Python maintenance;
  • concurrency, lifecycle, race-condition, dependency, and CI/CD fixes;
  • technical documentation and release evidence checked against the implementation.

How I work

I keep patches focused, include a reproduction when I can, and test the behavior I'm changing. I update the documentation alongside the implementation so the next person doesn't have to reconstruct what happened.

Sponsorship and engineering work

I'm available for security reviews, difficult bug fixes, repository maintenance, CI improvements, and technical writing for developer tools. Sponsorship helps me spend more time on open-source work.

You can reach me on LinkedIn.

Updated October 30, 2026.

Popular repositories Loading

  1. test-project-tbd test-project-tbd Public

    Rust-first staging lab for learning GitHub, automation, tooling, and future app ideas.

    Rust

  2. jjoanna2-debug jjoanna2-debug Public

    GitHub profile README for Jean-Claude.

  3. content content Public

    Forked from daytona/content

    Daytona Content Programme for Technical Writers

  4. awsome-gpt-image-2-prompts awsome-gpt-image-2-prompts Public

    Forked from moosl/awsome-gpt-image-2-prompts

  5. markdown-preview markdown-preview Public

    Forked from pluk-inc/markdown-preview

    A simple Markdown viewer for reading .md files

    Swift

  6. impeccable-toast-race-repro impeccable-toast-race-repro Public

    Minimal repro for the Impeccable live toast requestAnimationFrame race

    HTML