Nisanth A
Open to new opportunitiesSoftware Engineer · Hyderabad, IN

Nisanth A

I build reliable frontends.
And the tools I wish existed.

Software Engineer focused on React, TypeScript, and production engineering. Currently expanding into cloud infrastructure, distributed systems, and backend architecture.

Now: Taking FoxPilot from beta to a product people can rely on, building SyncMark's cross-browser sync engine, and studying backend and distributed systems.

nisanth@portfolio: ~interactive
● connected to ~/nisanth · type help, or tap a command below
↵ run
● nisanthhyd --:-- istfetching…

It's a working terminal. Type help to start.

  • typescript
  • react
  • next.js
  • node.js
  • go
  • python
  • fastapi
  • java
  • spring boot
  • postgresql
  • sqlite
  • docker
  • playwright
  • tailwind css
  • astro
  • vite
  • turborepo
  • ollama
  • onnx runtime
  • websockets

01Projects

Selected projects. Each one started with a problem I kept running into.

Select a project to see why I built it, how it works and where it stands today.

FoxPilot

beta

Every job search tool I tried either auto-applied for me, which is risky, or dumped hundreds of unranked listings. FoxPilot matches your resume against listings with an LLM and explains the gap. You decide what to apply to.

Architecture

  1. resume → profile
  2. isolated source adapters
  3. tech-job filter
  4. canonical dedupe
  5. LLM match + gap analysis
  6. ranked shortlist

Highlights

  • Pulls from 10+ job sources, including Greenhouse, Lever, Ashby, RemoteOK and Hacker News “Who is hiring”. Each adapter is isolated, so one source failing never stalls a scan.
  • Every match comes back with a 0–100 score, an APPLY / CONSIDER / SKIP verdict, reasons and a skill-gap analysis, validated against a schema.
  • A background worker leases jobs from the database with heartbeats, retry classification and a dead-letter state.
  • Runs locally by default with Ollama. PostgreSQL and a hosted API power the web beta.

Run it locally

❯ ./scripts/bootstrap.sh❯ source .venv/bin/activate❯ foxpilot init --resume /absolute/path/to/resume.pdf❯ foxpilot migrate❯ foxpilot scan
PythonFastAPIReactTypeScriptSQLitePostgreSQLOllamaAlembicDockerRailway

SyncMark

active

I use Chrome and Arc with separate work and personal profiles. Every sync tool I tried (Floccus, xBrowserSync, Raindrop.io) treats bookmarks as one flat pile with no idea what a profile is. SyncMark is built around profile identity.

Architecture

  1. MV3 extension
  2. ingest API
  3. sync engine (LWW)
  4. SQLite canonical store
  5. apply back to browser

Highlights

  • A local Node daemon on 127.0.0.1 keeps the canonical SQLite store (WAL mode) behind a single repository interface. Nothing leaves your machine.
  • The URL normaliser strips 19 tracking parameters and canonicalises the host and query before SHA-256 hashing, with identical results in Node and the browser via Web Crypto.
  • Two-way sync: the extension ingests the browser's bookmarks, pulls the canonical state and applies creates and removes back to the tree.
  • A pnpm and Turborepo monorepo (shared, engine, dashboard, extension) with 40 Vitest tests. CI runs lint, typecheck, build and test.

Run it locally

❯ pnpm install❯ pnpm build❯ pnpm test❯ pnpm --filter @syncmark/engine start
TypeScriptNode.jsSQLiteReactViteWXTTurborepoManifest V3

Distributed Systems Lab

active

I learn distributed systems best by building a small working version, breaking it deliberately and writing down what happened. Each experiment ships with its design decisions.

Architecture

  1. build a working system
  2. inject failure
  3. observe and measure
  4. document the fix

Highlights

  • Rate limiter (TypeScript): token bucket and sliding window per IP, switchable at runtime, responding with 429, Retry-After and X-RateLimit headers.
  • Order pipeline (TypeScript): an orchestrated saga (payment, inventory, shipping, notification) that compensates in reverse when a stage fails.
  • Worker pool (Go): fan-out and fan-in over buffered channels for backpressure, with context cancellation on SIGINT and SIGTERM.
  • Every experiment has a README and a design-decisions doc covering what broke and what changed.

Run it locally

❯ cd experiments/ts && npm install❯ npm run rate-limiter:dev❯ cd ../go && go run ./cmd/worker-pool
GoTypeScriptNode.jsExpressWebSockets

System Design Notes

shipped

Six notes on caching, queues, consistency, retries and idempotency, database design and API design. Each follows the same format: what it is, when to use it, a real example and a five-line summary.

Architecture

  1. CLI load / React viz
  2. Express server
  3. naive ↔ fixed mode
  4. WebSocket events
  5. animated timeline

Highlights

  • Cache stampede: after a 1-second expiry, 20 concurrent requests make 20 database calls. With request coalescing, they make one.
  • Idempotent retries: three retries charge a customer three times. With an Idempotency-Key, once. Reusing a key with a different payload returns 409.
  • Both demos switch between naive and fixed modes at runtime and stream events over WebSockets to the visualiser.

Run it locally

❯ cd experiments && npm install❯ npm run cache-stampede:naive❯ npm run cache-stampede:load
TypeScriptReactViteExpressWebSockets

Visual Retail Discovery

live

It started at an event and I kept going on my own, to see how far computer vision, embeddings and an LLM could be pushed inside a single deployable service.

Architecture

  1. upload + normalise
  2. YOLO (ONNX) detect + crop
  3. ResNet-18 embeddings
  4. cosine search
  5. top-k results
  6. stylist chat

Highlights

  • A YOLO model exported to ONNX detects 16 garment classes. Each crop is embedded with ResNet-18 (DJL) and ranked by cosine similarity against a local vector store.
  • Semantic catalogue search with all-MiniLM-L6-v2 text embeddings.
  • The stylist chat uses Groq (Llama 3.3 70B) by default. Switching to Anthropic is one config flag, via Spring's @ConditionalOnProperty.
  • Ships as one container: a three-stage Docker build running as a non-root user, serving both the React app and the REST API.

Run it locally

❯ ./mvnw spring-boot:run❯ cd frontend && npm ci && npm run dev
Java 17Spring BootONNX RuntimeDJLReactTypeScriptDocker

Engineering Journal

live

Deep dives, interview prep, experiment write-ups and build notes, covering JavaScript to Go, databases, infrastructure and Playwright. I write it while I learn, not after.

Architecture

  1. MDX content
  2. Starlight + React islands
  3. Astro build + Pagefind
  4. verify gate
  5. GitHub Pages

Highlights

  • 51 MDX pages in 12 sections, with 20 interactive React demos covering the event loop, closures, B-tree indexing, CI/CD and more.
  • npm run verify checks formatting, ESLint and astro check, builds the site (failing on an empty search index), then runs 28 Playwright tests.
  • Includes build notes from my own projects, such as how a “two sources of truth” bug hid for hours in FoxPilot.

Run it locally

❯ npm install❯ npm run dev❯ npm run verify
AstroStarlightReactTypeScriptPlaywrightPagefind

Portfolio

live

I wanted the site itself to show how I build frontends: typed content, server rendering by default, and client JavaScript only where it earns its place.

Architecture

  1. typed content modules
  2. server components
  3. client islands
  4. Vercel

Highlights

  • Next.js 16 App Router and React 19.2. Sections render on the server; the terminal, palette, tabs and heatmap are small client islands behind error boundaries.
  • Keyboard-first and accessible: command palette, single-key navigation (toggleable), focus management and reduced-motion support throughout.
  • UI sounds are synthesised with the Web Audio API (off by default), and the theme switch uses the View Transitions API.
  • GitHub data comes through cached API routes with timeouts, response validation and a fallback source. Pure logic is unit-tested with Node's test runner.

Run it locally

❯ npm install❯ npm run dev❯ npm run verify
Next.jsReactTypeScriptTailwind CSSWeb AudioVercel

02Craft

Code from my projects.

Short excerpts copied from the repos and highlighted at build time. Line numbers match the files on GitHub.

foxpilotsrccareer_agentstoragedatabase.py

lease_expires = now + timedelta(minutes=lease_duration_minutes)claimed = connection.execute(    update(background_jobs_table)    .where(        background_jobs_table.c.job_id == candidate["job_id"],        background_jobs_table.c.status == candidate["status"],        background_jobs_table.c.updated_at == candidate["updated_at"],    )    .values(        status="running",        attempt=next_attempt,        lease_owner=worker_id,        lease_expires_at=lease_expires,        started_at=now if next_attempt == 1 else candidate["started_at"],        updated_at=now,    ))if claimed.rowcount != 1:    return None

ContextJobs that run out of retries move to a dead-letter state instead of looping, and a heartbeat renews the 5-minute lease every 30 seconds.

● PythonUTF-8Ln 1689–1707View on GitHub ↗

foxpilotsrccareer_agentmatching.py

missing = [field for field in MATCH_FIELDS if field not in result]score = result.get("match_score")recommendation = result.get("recommendation")valid = (    not missing    and isinstance(score, int)    and 0 <= score <= 100    and recommendation in {"APPLY", "CONSIDER", "SKIP"})if valid:    result.setdefault("gap_analysis", [])    return resultif attempt == 0:    prompt += (        "\nYour previous response violated the schema. Return every required field: "        "match_score (integer 0-100), recommendation (APPLY, CONSIDER, or SKIP), "        "reasons, matching_skills, missing_skills, experience_match, and concerns."    )    continue

ContextA match only counts if it has an integer score from 0 to 100 and an APPLY, CONSIDER or SKIP verdict.

● PythonUTF-8Ln 155–174View on GitHub ↗

distributed-systems-labexperimentsgoworker-poolpool.go

// Send tasks into the tasks channel. This is the producer.// If the buffer is full, this blocks until a worker picks one up.// That's backpressure in action.tasksSent := 0cancelled := falsefor _, task := range taskList {	// Check if the context was cancelled (e.g., Ctrl+C)	select {	case <-ctx.Done():		fmt.Printf("\n[pool] cancelled after sending %d/%d tasks\n", tasksSent, len(taskList))		cancelled = true	case p.tasks <- task:		tasksSent++	}	if cancelled {		break	}}// Close the tasks channel. This signals to workers that no more// tasks are coming. Their for-range loops will exit after processing// whatever is left in the buffer.close(p.tasks)

ContextIn testing, going from 8 to 16 workers barely helped. Buffer size mattered more.

● GoUTF-8Ln 115–137View on GitHub ↗

distributed-systems-labexperimentstsorder-pipelinesrcsaga.ts

/** * Run compensation for completed stages in reverse order. * * Why reverse? Because stages often depend on earlier stages. * Shipping depends on inventory (need items to ship). Inventory * depends on payment (need payment before reserving). So when * undoing, you cancel the shipment first, then release inventory, * then refund payment. If you refunded first and then tried to * cancel the shipment, the carrier might say "too late, it shipped." */private async compensate(order: Order, completedStages: StageName[]): Promise<void> {  order.status = "compensating";  order.updatedAt = Date.now();  // Reverse the completed stages  const toCompensate = [...completedStages].reverse();  for (const stageName of toCompensate) {    const stage = this.stages.find((s) => s.name === stageName);    if (!stage) continue;

ContextA refund is its own transaction, so steps that can't be reversed, like sending an email, run last.

● TypeScriptUTF-8Ln 165–184View on GitHub ↗

system-design-notesexperimentscache-stampedeserver.ts

  const existing = inFlight.get(key);  if (existing) {    // Someone else already noticed the miss and is fetching — wait on    // their result instead of starting a second, third, fourth lookup.    broadcast({ type: "coalesced", requestId, waitingOn: existing.ownerId });    const value = await existing.promise;    broadcast({ type: "db-call-resolved", requestId });    return { value, source: "coalesced" };  }  broadcast({ type: "cache-miss", requestId });  broadcast({ type: "db-call-started", requestId });  const fetchPromise = slowDatabaseLookup(key).then((value) => {    cache.set(key, { value, expiresAt: Date.now() + TTL_MS });    inFlight.delete(key);    return value;  });  inFlight.set(key, { promise: fetchPromise, ownerId: requestId });  const value = await fetchPromise;  broadcast({ type: "db-call-resolved", requestId });  return { value, source: "database" };}

ContextMeasured with 20 concurrent requests: 20 database calls without coalescing, 1 with it.

● TypeScriptUTF-8Ln 69–91View on GitHub ↗

syncmarkpackagessharedsrcnormalizer.ts

  // For http(s), a bare path of "" or "/" both mean the root page.  if (url.protocol === 'http:' || url.protocol === 'https:') {    if (url.pathname === '') {      url.pathname = '/';    }  }  // Strip tracking parameters, keeping any genuinely useful query keys.  const kept: string[] = [];  for (const [key, value] of url.searchParams.entries()) {    const lowerKey = key.toLowerCase();    if (TRACKING_PARAMS.has(lowerKey)) continue;    kept.push(`${key}=${value}`);  }  kept.sort();  url.search = kept.length > 0 ? `?${kept.join('&')}` : '';  return url.toString();}

ContextCovered by 13 Vitest cases in normalizer.test.ts.

● TypeScriptUTF-8Ln 62–80View on GitHub ↗

03Journey

Experience as a git log

Oldest first. HEAD is where I am now, and the dashed branch is where I'm heading.

git log --graph --reverse
  1. tag: 2022feat: start career building frontend applications

    2022: Started my software engineering career building frontend applications.

  2. tag: 2024feat(uber-freight): lead frontend initiatives across production systems

    2024: Began leading frontend initiatives while working across production systems, on-call engineering, and cross-functional teams at Uber Freight.

  3. tag: 2025feat: start foxpilot, build syncmark from scratch

    2025: Started FoxPilot, a local-first job discovery tool, out of frustration with search tools that produce noise instead of signal. It's now in beta. Also started SyncMark after noticing that no bookmark sync tool understands browser profiles, and built its sync engine, URL normaliser and MV3 extension from scratch.

  4. HEAD → maintag: 2026refactor: expand into cloud, distributed systems and backend

    2026: Expanding into cloud infrastructure, distributed systems and backend architecture through side projects and study, because production work keeps asking for that system-level understanding.

  5. origin/nextwip: roles with large-scale systems and real product depth

    Next: Pursuing engineering roles and opportunities where the work involves large-scale systems, product depth, and problems worth solving.

04About

About me

I build things because I keep running into problems that don't have the right tool yet. SyncMark started because I used Chrome and Arc across separate work profiles and no sync tool understood what a profile even was. FoxPilot started because I watched a job search eat hours without producing a useful signal. Both are still in active development alongside my day-to-day production engineering work.

Primary stack
React · TypeScript · Node.js
Growing into
Cloud · distributed systems · backend design
Location
Hyderabad, Telangana, India
Experience
4+ years · since 2022

§Engineering philosophy

The most durable software I've seen is built simply enough that the next person can reason about it.

I'm expanding into backend systems, cloud infrastructure and distributed design because the problems I want to work on need an understanding of the whole stack.

4+

years building software professionally

7

projects built end to end

2

research papers · 1 in preparation

2

awards for ownership and delivery

05Now

Current focus

What I work with every day, and what I'm learning next.

  • Focus 01reacttypescriptnext.js

    Production full-stack

    Building production-ready full-stack applications.

  • Focus 02node.jsexpresspostgres

    Backend depth

    Improving backend skills with Node.js and Express.

  • Focus 03gosagasrate limiting

    Distributed systems

    Learning distributed systems and system design.

  • Focus 04awsdocker

    Cloud engineering

    Cloud engineering with AWS.

  • Focus 05projectswritingopen source

    Public proof

    Creating strong public proof through projects and writing.

    51journal pages
    20live demos
    7projects

06GitHub

GitHub activity (personal and open source)

My day-to-day work lives in private repositories, so this shows side projects only. Turn on sound and move across the grid: each weekday is a note, and busier days ring brighter.

github.com/nisanth-alla · contributionslive

This year

—

contributions

Current streak

—

days

Longest streak

—

days

Latest push

Fetching…

— contributions in 2026

Live from GitHub · contributions hourly · latest push every 5 minOpen profile ↗

07Research

Research and education

Published research on embedded automation, current work on Telugu OCR, plus my degrees and awards.

paper · 2022published

Automatic Tunnel Lighting System for Road Traffic with Auto Exhaust Fan

International Journal for Research in Applied Science & Engineering Technology (IJRASET)

Published undergraduate research exploring intelligent automation for road safety using embedded systems and sensor-based control.

paper · 2026in preparation

Deep Learning Based Telugu Optical Character Recognition using CNN and ResNet

CVIP 2026 (Under Preparation)

Current research focused on Telugu OCR using deep learning architectures with emphasis on preprocessing, feature extraction, and classification of Telugu script.

education
  • Master of Technology (M.Tech)

    2022 – 2024

    Digital Systems and Computer Electronics

    JNTUH University College of Engineering, Hyderabad

    Focused on software-oriented research, machine learning, and computer vision. Conducted research on Telugu Optical Character Recognition (OCR), strengthening skills in experimentation, technical writing, and applied deep learning.

  • Bachelor of Technology (B.Tech)

    2018 – 2022

    Electronics & Communication Engineering

    SreeNidhi Institute of Science and Technology SNIST

    Built a strong foundation in engineering mathematics, algorithms, computer architecture, networking, and problem solving, which later supported my transition into software engineering.

recognition
  • Innova Idol

    2026

    Awarded for outstanding technical contribution, project ownership, and delivery excellence.

  • Customer Champion

    2026

    Recognized by Uber Freight stakeholders for exceptional execution during enterprise migrations and infrastructure onboarding.

09Contact

Let's talk.

I'm open to new roles and collaborations. Email is the quickest way to reach me.

contact.jsonHyderabad · IST
{
  "email": "nisanth.alla@gmail.com",
  "linkedin": "in/nisanth-alla",
  "github": "nisanth-alla",
  "based_in": "Hyderabad, India",
  "timezone": "IST (UTC+5:30)",
  "open_to": "new opportunities"
}
nav/commands33 results
esc
projectsselected work, with case studiesp
craftreal code from real reposc
journeya career as a git logj
abouthow I think about softwarea
nowwhere I'm investing nextn
githublive contributionsg
researchpapers, education, recognitionr
writingnotes from the engineering journalw
contactemail is the fastest way ine
foxpilotLocal-first job discovery that ranks listings against your resume and explains every score.
syncmarkBookmark sync that understands browser profiles, so “Work” in Chrome and “Work” in Arc stay in step.
distributed systems labRate limiting, sagas and worker pools. Each one built, broken on purpose and written up.
system design notesShort notes on caching, queues, consistency and retries, plus two failures you can watch in the browser.
visual retail discoveryUpload an outfit photo, find visually similar products, then ask an AI stylist. One Java service.
engineering journal51 pages across the stack with 20 interactive demos, and a verify step that blocks broken pages.
portfolioThis site: a working terminal, command palette and hover tabs, with no UI libraries.
Compare-and-set job leasingfoxpilot · database.py
Validating LLM outputfoxpilot · matching.py
Backpressure in a Go worker pooldistributed systems lab · pool.go
Saga compensationdistributed systems lab · saga.ts
Request coalescingsystem design notes · server.ts
URL normalisationsyncmark · normalizer.ts
copy email addressnisanth.alla@gmail.com
open resumepdf, opens in a new tab
focus the terminaltype help to see what it can do
switch to dark themewith a view-transition reveal
turn sound onsynthesized ui sounds, no audio files
disable single-key shortcutsp · c · j · a · n · g · r · w · e
githubgithub.com/nisanth-alla
linkedinin/nisanth-alla
engineering journal51 pages of deep dives and demos
foxpilot.inthe live beta
source of this sitegithub.com/nisanth-alla/portfolio