Skip to content

Herzliya, Israel

Rani.

Rust and web developer.

I write Rust and TypeScript. I contribute to rustc, Zed and Next.js, and I build Skarn, affected and Hativon.

Contributions per week, last 12 months merged upstream
SepOctNovDecJanFebMarAprMayJunJulAugZed #43872Next.js #88199Zed #58510rustc #159232
0
contributions, last 12 months
0
active days of 365
0
commits
0
repos committed to

Upstream

Merged into the projects other developers build on.

Every entry is a pull request I authored that maintainers reviewed and merged, with a real excerpt of the diff.

  • Next.js 142k
  • rustc 116k
  • Zed 89k

+700 208 across 4 merged PRs

  1. rustc#159232·

    Don't list escaping bound regions in nested `for<...>` binders of E0308 notes

    E0308 “one type is more general than the other” notes printed lifetimes from an outer binder inside nested for<…> lists — syntactically invalid types. Fixed the pretty-printer so only the regions each binder actually introduces are listed.

    merged+63324 filesrust-lang/rust
    compiler/rustc_middle/src/ty/print/pretty.rs+6 3
    @@ -2731,8 +2726,13 @@ impl TypeFolder for RegionFolder
    fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
    let region = match r.kind() {
    - ty::ReBound(Bound(db), br) if db >= self.current_index => {
    - *self.region_map.entry(br)
    - .or_insert_with(|| name(Some(db), self.current_index, br))
    + // Only name regions bound by the binder being named. Regions bound by an
    + // enclosing binder that merely escape through this one keep their name
    + // and their index, and must not end up in `region_map`, which callers
    + // use to build `for<...>` lists (#102392, #134410).
    + ty::ReBound(Bound(db), br) if db == self.current_index => {
    + *self.region_map.entry(br).or_insert_with(|| name(br))
    }
  2. Zed#58510·

    editor: Speed up multi cursor editing

    Multi-cursor editing hung at high cursor counts. Profiled handle_input, found several O(N)-per-keystroke phases, and rewrote them so typing with a thousand cursors stays interactive.

    merged+57517214 fileszed-industries/zed
    crates/editor/src/selections_collection.rs+10 1
    @@ -317,14 +324,30 @@ impl SelectionsCollection
    pub fn first<D>(&self, snapshot: &DisplaySnapshot) -> Selection<D>
    {
    - self.all(snapshot).first().unwrap().clone()
    + // Without a pending selection, the first disjoint selection is also the
    + // first resolved selection, so avoid resolving every selection.
    + if self.pending.is_none()
    + && let Some(first) = self.disjoint.first()
    + {
    + return resolve_selections_wrapping_blocks([first], snapshot)
    + .next()
    + .unwrap();
    + }
    + self.all_iter(snapshot).next().unwrap()
    }
  3. Next.js#88199·

    fix: support TypeScript `noUncheckedSideEffectImports` for CSS imports

    Projects enabling TypeScript’s noUncheckedSideEffectImports failed on plain CSS imports. Added ambient module declarations for *.css, *.sass and *.scss.

    merged+2648 filesvercel/next.js
    packages/next/types/global.d.ts+5 0
    @@ -39,6 +39,13 @@
    declare module '*.module.scss' {
    export default classes
    }
    +// CSS side-effect imports (non-modules)
    +// These are needed for `noUncheckedSideEffectImports` support
    +declare module '*.css' {}
    +declare module '*.sass' {}
    +declare module '*.scss' {}
    // We implement the behavior of `import 'server-only'` and `import 'client-only'`
  4. Zed#43872·

    extensions_ui: Add upsell banners for integrated extensions

    When users search for Basedpyright, Ruff or Ty in the extensions panel, a banner now explains the functionality is built into Zed and links to the docs.

    merged+3601 filezed-industries/zed
    crates/extensions_ui/src/extensions_ui.rs+15 0
    @@ -1364,6 +1371,23 @@ impl ExtensionsPage
    +if let Some(id) = search.strip_prefix("id:") {
    + self.upsells.clear();
    +
    + let upsell = match id.to_lowercase().as_str() {
    + "ruff" => Some(Feature::ExtensionRuff),
    + "basedpyright" => Some(Feature::ExtensionBasedpyright),
    + "ty" => Some(Feature::ExtensionTy),
    + _ => None,
    + };
    +
    + if let Some(upsell) = upsell {
    + self.upsells.insert(upsell);
    + }
    + return;
    +}

Projects

Projects.

RustMIT / Apache-2.0

Skarn

An OS-sandboxed MCP gateway in one Rust binary.

AI coding agents pump raw build logs and hundreds of tool schemas into the context window, and running their code is remote code execution by design. Skarn puts every downstream MCP server behind a three-tool Code Mode surface, compresses shell output by 70–90% while guaranteeing errors survive, and sandboxes everything with kernel primitives — Seatbelt, Landlock + seccomp, AppContainer. No Docker, no daemon, no VM.

  • Code Mode: search · read_tool_docs · execute
  • Sandboxes verified in CI on macOS and Linux
  • QuickJS isolate for model-written scripts
cargo install skarn
RustMIT

affected

Run only the tests that matter.

Every monorepo team hacks together git diff | grep to avoid running everything on every PR. affected is a single binary that detects your project type, builds the dependency graph and figures out which packages a change touches — transitively — then runs any command on just those. Thirteen ecosystems, zero config.

  • Cargo, npm, pnpm, Yarn, Bun, Go, Python, Maven, Gradle, .NET, Swift, Dart, Elixir, sbt
  • --explain shows the dependency chain
  • CI matrices for GitHub, GitLab, CircleCI, Azure
brew install Rani367/tap/affected
TypeScriptMIT

Hativon

My school’s newspaper, built for Hebrew.

A publishing app for a school newspaper where every page reads right-to-left. Students write drafts that autosave and recover, teachers review and publish from an admin dashboard, and issues are grouped by month. Next.js on Postgres, deployed on Vercel, with a lint–typecheck–test–build gate on every push.

  • Full RTL layout and Hebrew typography
  • Draft autosave and recovery
  • Teacher review dashboard

Activity

Most days, something ships.

3,475 commits, 77 pull requests and 17 issues in the last twelve months. Busiest day: April 6, 2026, 107 contributions.

SepOctNovDecJanFebMarAprMayJunJulAug4 on August 24, 202514 on August 25, 202522 on August 26, 202515 on August 27, 202552 on August 28, 20257 on August 29, 20254 on August 30, 20259 on August 31, 202517 on September 1, 202570 on September 2, 202518 on September 3, 202518 on September 4, 202523 on September 5, 202513 on September 6, 202511 on September 7, 202516 on September 8, 202523 on September 9, 202513 on September 10, 202521 on September 11, 202514 on September 12, 20257 on September 13, 20252 on September 14, 202515 on September 15, 202515 on September 16, 202519 on September 17, 202561 on September 18, 202521 on September 19, 20256 on September 20, 20259 on September 21, 202514 on September 22, 202525 on September 23, 202520 on September 24, 202511 on September 25, 202513 on September 26, 20252 on September 27, 20255 on September 28, 202516 on September 29, 202519 on September 30, 202516 on October 1, 202517 on October 2, 202513 on October 3, 20252 on October 4, 20259 on October 5, 202513 on October 6, 202512 on October 7, 20256 on October 8, 20253 on October 9, 20258 on October 10, 20255 on October 11, 20254 on October 12, 20256 on October 13, 20255 on October 14, 20256 on October 15, 20257 on October 16, 202510 on October 17, 20255 on October 18, 20254 on October 19, 20256 on October 20, 20255 on October 21, 20254 on October 22, 20255 on October 23, 20254 on October 24, 20254 on October 25, 20258 on October 26, 20257 on October 27, 20251 on October 28, 20259 on October 29, 20257 on October 30, 20252 on October 31, 202514 on November 1, 20258 on November 2, 20256 on November 3, 202511 on November 4, 20259 on November 5, 202511 on November 6, 202534 on November 7, 20259 on November 8, 202579 on November 9, 20259 on November 10, 202526 on November 11, 20254 on November 12, 20257 on November 13, 202511 on November 14, 20253 on November 15, 20259 on November 16, 20258 on November 17, 20255 on November 18, 202514 on November 19, 20252 on November 20, 20252 on November 21, 20250 on November 22, 20255 on November 23, 202513 on November 24, 202518 on November 25, 202517 on November 26, 202529 on November 27, 202516 on November 28, 202516 on November 29, 202515 on November 30, 202510 on December 1, 202513 on December 2, 202524 on December 3, 202512 on December 4, 20259 on December 5, 202512 on December 6, 202513 on December 7, 20259 on December 8, 202521 on December 9, 202513 on December 10, 202520 on December 11, 202533 on December 12, 202579 on December 13, 202531 on December 14, 202511 on December 15, 202515 on December 16, 202511 on December 17, 202513 on December 18, 202510 on December 19, 202540 on December 20, 20259 on December 21, 202537 on December 22, 202515 on December 23, 202515 on December 24, 202514 on December 25, 20257 on December 26, 20256 on December 27, 20258 on December 28, 202512 on December 29, 20257 on December 30, 202510 on December 31, 202519 on January 1, 202632 on January 2, 202623 on January 3, 20265 on January 4, 202620 on January 5, 202629 on January 6, 202627 on January 7, 202611 on January 8, 202620 on January 9, 20265 on January 10, 20267 on January 11, 202613 on January 12, 202636 on January 13, 202623 on January 14, 202627 on January 15, 202616 on January 16, 202618 on January 17, 202624 on January 18, 202626 on January 19, 20269 on January 20, 202638 on January 21, 202618 on January 22, 202630 on January 23, 202614 on January 24, 202625 on January 25, 202657 on January 26, 202614 on January 27, 202610 on January 28, 20264 on January 29, 202631 on January 30, 202629 on January 31, 202623 on February 1, 202621 on February 2, 20267 on February 3, 20266 on February 4, 202617 on February 5, 202622 on February 6, 202614 on February 7, 20262 on February 8, 202611 on February 9, 20269 on February 10, 202624 on February 11, 202625 on February 12, 202618 on February 13, 202617 on February 14, 20267 on February 15, 202618 on February 16, 202621 on February 17, 202625 on February 18, 202633 on February 19, 202631 on February 20, 20266 on February 21, 20266 on February 22, 202626 on February 23, 202617 on February 24, 202631 on February 25, 202641 on February 26, 202621 on February 27, 202618 on February 28, 202614 on March 1, 202642 on March 2, 202626 on March 3, 202641 on March 4, 202649 on March 5, 202638 on March 6, 202614 on March 7, 20261 on March 8, 202647 on March 9, 202634 on March 10, 202619 on March 11, 202622 on March 12, 202627 on March 13, 202615 on March 14, 202611 on March 15, 202631 on March 16, 202656 on March 17, 202625 on March 18, 202625 on March 19, 202631 on March 20, 202610 on March 21, 20264 on March 22, 202638 on March 23, 202642 on March 24, 202637 on March 25, 202653 on March 26, 202639 on March 27, 202622 on March 28, 202616 on March 29, 202665 on March 30, 202621 on March 31, 202645 on April 1, 202628 on April 2, 202634 on April 3, 202617 on April 4, 202616 on April 5, 2026107 on April 6, 202631 on April 7, 202635 on April 8, 202644 on April 9, 202650 on April 10, 202613 on April 11, 202610 on April 12, 202629 on April 13, 202643 on April 14, 202639 on April 15, 202622 on April 16, 202633 on April 17, 202619 on April 18, 202627 on April 19, 202631 on April 20, 202628 on April 21, 202636 on April 22, 202623 on April 23, 202623 on April 24, 202621 on April 25, 202621 on April 26, 202637 on April 27, 202626 on April 28, 202625 on April 29, 202640 on April 30, 202637 on May 1, 202613 on May 2, 202613 on May 3, 202624 on May 4, 202662 on May 5, 202635 on May 6, 202634 on May 7, 202632 on May 8, 202612 on May 9, 202620 on May 10, 202630 on May 11, 202645 on May 12, 202642 on May 13, 202640 on May 14, 202645 on May 15, 202613 on May 16, 20269 on May 17, 202615 on May 18, 202621 on May 19, 202625 on May 20, 202611 on May 21, 202618 on May 22, 202629 on May 23, 202631 on May 24, 202611 on May 25, 202642 on May 26, 202622 on May 27, 202622 on May 28, 202624 on May 29, 20265 on May 30, 202612 on May 31, 202624 on June 1, 202629 on June 2, 202618 on June 3, 202622 on June 4, 202646 on June 5, 20268 on June 6, 20264 on June 7, 202627 on June 8, 202610 on June 9, 202619 on June 10, 202631 on June 11, 202612 on June 12, 202631 on June 13, 202624 on June 14, 202615 on June 15, 202614 on June 16, 202630 on June 17, 202628 on June 18, 202612 on June 19, 20263 on June 20, 20260 on June 21, 202614 on June 22, 202633 on June 23, 202619 on June 24, 20260 on June 25, 20260 on June 26, 20261 on June 27, 20260 on June 28, 20260 on June 29, 20260 on June 30, 20263 on July 1, 202611 on July 2, 20263 on July 3, 20262 on July 4, 20262 on July 5, 20265 on July 6, 202611 on July 7, 20261 on July 8, 20260 on July 9, 20265 on July 10, 20261 on July 11, 20268 on July 12, 20264 on July 13, 20260 on July 14, 20260 on July 15, 20260 on July 16, 20260 on July 17, 20260 on July 18, 20260 on July 19, 20263 on July 20, 20260 on July 21, 20263 on July 22, 20261 on July 23, 20260 on July 24, 20261 on July 25, 20260 on July 26, 20260 on July 27, 20260 on July 28, 20263 on July 29, 20263 on July 30, 20261 on July 31, 20260 on August 1, 20260 on August 2, 20261 on August 3, 202621 on August 4, 20260 on August 5, 20264 on August 6, 20260 on August 7, 20261 on August 8, 20260 on August 9, 20261 on August 10, 20260 on August 11, 20260 on August 12, 20260 on August 13, 20260 on August 14, 20260 on August 15, 20260 on August 16, 20260 on August 17, 20260 on August 18, 20260 on August 19, 20260 on August 20, 20260 on August 21, 20260 on August 22, 20260 on August 23, 20260 on August 24, 20260 on August 25, 20260 on August 26, 20266 on August 27, 2026

Contributions per calendar year since joining GitHub in June 2023. 2026 is year to date.

  • 2023
    124
  • 2024
    284
  • 2025
    3,419
  • 2026
    4,413

Refreshed from GitHub daily.