Skip to content
View nina-mir's full-sized avatar
:dependabot:
studying K8s exam!
:dependabot:
studying K8s exam!
  • San Francisco, CA
  • 04:50 (UTC -12:00)

Block or report nina-mir

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
nina-mir/README.md

Nina Mir — software engineer // web / data

Sept/Aug 2026

Open-source contributions

RepositoryContribution
browser-use/browser-use
#5672
merged
Stopped two LLM provider adapters from authenticating third-party endpoints with the user's OpenAI key.
ChatDeepSeek and ChatCerebras passed api_key=None into an AsyncOpenAI client pointed at api.deepseek.com and api.cerebras.ai, so the SDK fell back to OPENAI_API_KEY — sending it to a different vendor. The env vars the docs promised were never read. Audited all nine adapters to derive the discriminator (an OpenAI-SDK client at a non-OpenAI base_url), which found exactly these two and cleared the rest; reported the negative results alongside the fix.

PythonOpenAIpytest
browser-use/browser-use
#5673
merged
Repaired a model shortcut that had been returning an API error since Mistral retired the model behind it.
get_llm_by_name() mapped Pixtral Large in two separate tables, both resolving to pixtral-large-latest. Establishing that it was genuinely gone took distinguishing 400 invalid_model from 403 tier_not_allowed/v1/models is filtered by subscription tier, not a global catalogue, so the free-tier listing was misleading. Verified all five aliases against the live API in one run: four returned 200, one 400.

PythonMistral AIpytest
mdn/browser-compat-data
#30171
merged
Corrected Firefox compat data for FontFaceSet iteration methods.
Tested 11 iteration behaviors across Firefox 153 and Chrome 151 to establish which three subfeatures are broken and which work correctly — a distinction the original report never made.

MDNJSON Schema
python-visualization/folium
#2263
merged
Root-caused a bug open since 2021: GeoJSON tooltips came up empty on multi-geometry features.
The feature never reached the child layers Leaflet wraps in a FeatureGroup (issue #1520). Fix verified against all eight geometry types plus nested GeometryCollections, with a Selenium regression test.

PythonSelenium
python-visualization/folium
#2274
merged
Upgraded Leaflet 1.9.3 → 1.9.4 at a maintainer’s request, repairing a notebook test red on main.
Leaflet 1.9.3 calls layer.getElement() unguarded and throws on nested FeatureGroups; because the failing test skipped verify_js_logs(), the uncaught error lingered in the session-scoped driver log and surfaced in whichever later test read it first — not the page CI blamed.

PythonLeaflet
docling-project/docling
#4129
in review
Root-caused why an entire class of Word document converts with no headings at all — open since April, six comments, no diagnosis.
Docling read w:outlineLvl only from a paragraph's style; 3GPP specification documents set it as direct formatting with no w:pStyle, so the style resolves to Normal, which carries no level (issue #3312). Every heading fell through to body text — and became a list item, since the same paragraphs carry outline numbering. Resolving the paragraph before the style per OOXML precedence took the reported document from 0 markdown headings to 6 at correct depth, with zero reference-test outputs changed.

PythonOOXMLpytest
traceroot-ai/traceroot
#1968
in review
Rewrote the Vercel AI integration docs after proving the documented telemetry hook emits nothing on SDK v7.
The page documented experimental_telemetry, which on ai 7.x silently produces no spans (issue #1966, which I filed). Its own example produced 1 span; changing only that line to @ai-sdk/otel produced 5 — including the chat and execute_tool spans the page’s own table promises.

OpenTelemetryTypeScript
jupyterlab/jupyterlab
#19257
in review
milestone 4.6.x
Fixed 2.43:1 contrast text in the Debugger Variables panel — open since 2023.
A CodeMirror syntax token was styling UI chrome text below even the 3:1 large-text floor of WCAG SC 1.4.3. Swapping it for an existing --jp- theme token brings it to 8.49:1; tracing the background to a .positioning-region element inside the jp-tree-item shadow root explained why Dark High Contrast never helped.

TypeScriptCSS
jupyterlab/jupyterlab
#19303
in review
Fixed Alt+W not closing the current tab when focus sat outside the main area — open since 2018, zero comments.
The application:close keybinding was scoped to .jp-Activity, so it never fired unless focus was in a main-area widget, while File ▸ Close Tab worked from anywhere. A one-line selector change, plus a repro widened past the original report and five scenarios verified against main.

TypeScriptJSON Schema
Also this month

July 2026

Save Image 'n Context — Manifest V3 Chrome extension

A research tool: right-click any web image to download it and log a local citation record of its source — page URL/title, canonical URL, Open Graph metadata, alt text, figure caption, plus the nearest heading/paragraph/link via deterministic DOM heuristics.

  • Privacy-first architecture — a service worker paired with an on-demand content script using activeTab + scripting permissions; zero background access to browsing data.
  • Handles real-world messiness — lazy-loaded image attributes, duplicate-capture detection, retry logic, graceful fallbacks on restricted pages.
  • Local & exportable — up to 5,000 records live entirely in chrome.storage.local, reviewable on an options page and exportable as JSON/CSV (CSV hardened against spreadsheet formula injection).

Chrome ExtensionManifest V3JavaScript

Get it on the Chrome Web StoreSource


June 2026 — Snarp Profanity Index


Snarp Profanity Index — interactive dashboard

Visualizes how often different categories of profanity appear across 52 college-sports YouTube videos by a popular creator — to find out which collegiate rivalries are the most controversial linguistically.

  • The workflow — scrape audio via the YouTube API ➜ transcribe with the Whisper neural network on Hugging Face ➜ analyze transcripts to categorize terms.
  • Interactive — charts built with SVG & D3.js, plus full-text search across all transcripts.

Google ColabYouTube APIWhisperHugging FaceD3.js

Live demoSource

Spring 2026 — Kopani


Kopani — discovery infrastructure for independent literature

An MVP platform that indexes literary and art pieces published by independent journals without republishing copyrighted material.

  • Data pipeline — scraping, ingestion & metadata-modeling workflows normalize journal content into structured, searchable records: titles, journals, authors, translators, visual artists, genres, keywords & reading time (Gemini AI / Colab notebook).
  • Discovery experience — helps readers browse real pieces, return to the original journal sources, and (future) explore a contributor graph linking writers, artists, institutions, journals & publications.

AstroTailwind CSSSQLiteNetlify

[!TIP] Presented at the Perplexity AI Billion Dollar Pitch competition.

Live demo

October 2025 — SF Film Locations RAG


NLP-to-GeoPandas RAG pipeline

A full-stack RAG pipeline to chat with the Film Locations in San Francisco dataset. Completed during a DigitalOcean / Auth0 hackathon in San Francisco on Oct 18, 2025.

GeminiPythonStreamlitGeoPandasSQLiteFolium

Live demoSource

2025 — WindBorne constellation data pipeline


Live constellation visualizations

A full-stack project ingesting data from WindBorne Systems' live constellation API, feeding two D3.js plots:

  • A world map displaying each flight trajectory over a 24-hour interval.
  • A Sankey chart showing the start/end region of each trajectory (via geonames.org and nominatim.openstreetmap.org APIs).

The project runs an automated pipeline that fetches and processes new data hourly on an Ubuntu cloud server, and uses Cloudflare Workers to edge-cache the data files.

D3.jsCloudflare WorkersUbuntu

Live demo

Summer 2025 — Taschen-Dolmetcher.Revisited


Multilingual language-learning web game

A web game for people learning Russian / English / German. Inspired by real events on the Eastern Front from 1941–1945, it educates users about Holocaust history through historical materials and witnesses' artworks.

ReactTypeScriptTailwind CSSStorybook

Play it

[!NOTE] Suggestions welcome — open an issue or email nina@sfsu.edu.

Spring 2025 — The Hell of Treblinka


Modern responsive typesetting

Typeset an important essay by Vasily Grossman — "The Hell of Treblinka" — so readers could have a modern, responsive reading experience.

Read it

Pinned Loading

  1. patient-botpatient-botPublic

    Automated QA pipeline for voice agents

    Python

  2. taschen-dolmetchertaschen-dolmetcherPublic

    An open-source web-based language learning game showcasing the resilience and sacrifice of enormous number of ordinary people during the Holocaust and fighting the onslaught of German Nazi fascist …

    TypeScript

  3. save-image-n-contextsave-image-n-contextPublic

    A Chrome extension for researchers who save images from the web and need to remember where they came from.

    JavaScript

  4. kopanikopaniPublic

    kopani.ai

    HTML