$ cd ~/work && ls -la
Things I've built & shipped
Open-source contributions, personal hardware & tooling projects, and platforms I've led at work — serving from a handful of e-ink pixels to millions of users.
// open source
Open Source
Merged pull requests across ClickHouse, axios, mobx, vue, pinot and grafana.
ClickHouse - PR #123403
Fixed use_skip_indexes = 0 also turning off part pruning by the partition-key min-max index, a regression since 26.5. Queries that set it to bypass a bloom_filter index stopped pruning parts by the partition key and read every part; the reporting issue saw a production query go from ~55 to ~2,400 selected parts and p99 latency from ~4 s to ~48 s. The part min-max index is not a data-skipping index, so the PR removes the use_skip_indexes gate from ReadFromMergeTree::buildPartitionPruningIndexes and MergeTreeData::getMinMaxCountProjectionBlock, leaving it gated on use_partition_pruning as before. It also tightens force_index_by_date so a condition only on _block_number / _block_offset no longer counts as using the partition key, and makes the Division-by-zero reproducer from #115271 return 0 again. On a 226-part benchmark table, use_skip_indexes = 0 goes from 226 parts / 1.8M rows back to 1 part / 8,192 rows. Closes #123363. Merged on 2026-10-12.
c++ · clickhouse · mergetree · query optimization · open source
ClickHouse - PR #123677
Fixed incorrect `ORDER BY` results when read-in-order compared a `String` sorting-key column with a `FixedString` constant. Zero-padded equality can match several strings that sort differently, but the optimizer treated the column as fixed and skipped the required sort; `LIMIT 1` could return the wrong row. The fix keeps that column in the sort, including through `Nullable`, `LowCardinality` and nested `Tuple` comparisons, while preserving the optimization for byte-identical comparisons. Added regression coverage for result ordering, limits and query plans. Merged on 2026-10-11.
c++ · clickhouse · mergetree · query optimization · open source
ClickHouse - PR #123834
Fixed `bloom_filter` indexes silently skipping matching rows for floating-point zero. Although `-0.0` equals `0.0`, their bit patterns hash differently, so the index could exclude granules containing the other signed zero. Zero lookups now check both hashes for affected equality, array and map predicates, without rewriting existing index data. `hasAll` with a zero element bypasses the index to preserve correctness, while bitwise `IN` semantics remain unchanged. Regression coverage verifies correct results and continued pruning for supported predicates. Closes #123744. Merged on 2026-10-07.
c++ · clickhouse · bloom filters · query correctness · open source
ClickHouse - PR #123369
Fixed refreshable materialized views with REFRESH DEPENDS ON (and no REFRESH EVERY) re-running without limit after a failing refresh used up refresh_retries, instead of waiting for their dependencies' next refresh as documented. The default refresh_retries = 2 was affected, and an APPEND view could insert the same partial rows again on every attempt. When retries ran out, the timeslot advanced as if the refresh succeeded but last_success_dependencies did not, so the triggering dependency refresh still looked new and the view rescheduled itself immediately. The fix stores the dependency states the exhausted attempt started from (also written to the coordination znode for replicated views) and pulls the check into a shared retriesExhausted helper. On unfixed master the new test saw ~50,000 attempts per view within a minute; with the fix it sees 1, 3 and 1. Closes #123360. Merged on 2026-10-03.
c++ · clickhouse · materialized views · scheduling · open source
ClickHouse - PR #120615
Extended the no-materialization path for bitmap intersection cardinality to 64-bit element types. bitmapAndCardinality and bitmapHasAny were counting overlaps by allocating the whole intersection and then counting it, because Roaring64Map had no and_cardinality or intersect and the earlier optimization was gated on sizeof(T) < 8. CRoaring 5.2.0 added both, so the PR bumps contrib/croaring v5.1.1 -> v5.2.1, drops the gate, and names the representation choice once as use_roaring64 so the condition selecting Roaring64Map and the condition guarding the call cannot drift apart. Five SQL functions benefit for UInt64/Int64, the width these functions are most often used with: bitmapAndCardinality and bitmapHasAny directly, and bitmapOrCardinality, bitmapXorCardinality and bitmapAndnotCardinality by inclusion-exclusion. Library-level benchmarks show 10-39x on and_cardinality and up to three orders of magnitude on the early-exiting intersect. Approved by ClickHouse co-founder and CTO Alexey Milovidov. Merged on 2026-10-01.
c++ · clickhouse · roaring bitmaps · performance · open source
Grafana Loki - PR #23175
Fixed sharded approx_topk queries failing to parse on the querier in Grafana Loki. When approx_topk is sharded, the shard mapper rewrites it into downstream __count_min_sketch__ sub-queries that the query-frontend serializes to LogQL and re-parses on the querier — but __count_min_sketch__ was never registered in the LogQL lexer or grammar, so the querier rejected it with a syntax error surfacing as an HTTP 400. Registered __count_min_sketch__ as a vector operation in the lexer (functionTokens) and grammar (vectorOp), regenerated syntax.y.go with the pinned goyacc, and added a regression test asserting every downstream sub-query round-trips through String() → ParseExpr(). Fixes #23150.
go · grafana loki · logql · goyacc · open source
MobX - PR #4659
Fixed a regression introduced by the lazy @computed work in #4639: isComputedProp returned false for a lazily-decorated computed property before its first read, because the ComputedValue is no longer created until the getter is first accessed. The check now also consults the admin's lazyComputedKeys_ so a decorated computed reports correctly as a computed property even before it has been materialized.
typescript · mobx · decorators · open source
MobX - PR #4658
Extended the lazy-decorator work from #4639 to the 2022.3 @observable accessor decorator (requested by the maintainer). The accessor init callback no longer eagerly constructs an ObservableValue for every decorated field on every instance; instead it registers a factory on the admin's new lazyObservableKeys_ map, and materializeLazyObservable_ instantiates the ObservableValue on first read/write/observe via getObservablePropValue_, setObservablePropValue_, and getAtom. isObservableProp checks lazyObservableKeys_ so fields still report as observable before first read, and the post-read hot path stays a single Map lookup. Benchmarks on a 50k-instance × 10-field class show construction allocation roughly halved (~224 MB → ~119 MB) for sparse-access workloads. Full suite green (1043 passing) and type checks clean. Closes #4616.
typescript · mobx · decorators · performance · open source
MobX - PR #4639
Made the 2022.3 @computed decorator lazy in MobX core. ComputedValue is now created on first read of the decorated getter instead of eagerly during instance construction, so getters that are never accessed on a given instance no longer allocate. Threaded the laziness through getObservablePropValue_, setObservablePropValue_, getAtom, and isObservableProp so existing call sites Just Work. Closes #4616.
typescript · mobx · decorators · open source
Axios - PR #10822
Fixed the Node http adapter clobbering a user-supplied Host header when forwarding through a proxy. axios was unconditionally rewriting options.headers.host to the request URL's hostname:port, making it impossible to route a proxy to a virtual host that differed from the request URL. The fix only sets the default Host header when the caller has not already provided one (case-insensitive match on host/Host/HOST). Closes #10805.
javascript · node.js · http · axios · open source
Vue DevTools - PR #1094
Fixed an overlay-injection crash in the Vue DevTools Vite plugin under strict Trusted Types CSP. With `require-trusted-types-for 'script'` enforced, assigning a plain string to script.src (a Trusted Types sink) was blocked before the app's own default policy could register, since the overlay is injected via head-prepend and runs ahead of the entry module. The fix wraps the overlay URL through a named vue-devtools TrustedScriptURL policy when window.trustedTypes is available, with a plain-string fallback otherwise. Closes #1086.
javascript · vue · vite · trusted types · csp · open source
Vue Core - PR #14758
Fixed silent dropping of valid runtime prop types in defineProps when a Vue ref-wrapper type appears in a union and the vue import cannot be resolved by the SFC compiler (e.g. the type lives in a separately-built consumed package). resolveTypeReference was throwing inside inferRuntimeType, the top-level catch collapsed the whole branch to UNKNOWN_TYPE, and the resulting filtering dropped real types like Array — producing "Invalid prop: type check failed" warnings at runtime for valid values. The fix catches the resolution failure locally inside the TSTypeReference case and adds built-in fallbacks for Ref, ShallowRef, ComputedRef, WritableComputedRef, MaybeRef<T>, and MaybeRefOrGetter<T>, mirroring existing handling for Promise / Date / Map. Closes #14729.
typescript · vue · compiler-sfc · open source
Vue Core - Issue #14729
Reported a regression in defineProps<T>() runtime type inference after upgrading Vue from 3.5.21 to 3.5.31: a union involving MaybeRef<OptionItem[]> lost its Array branch in the generated runtime props, so passing arrays triggered "Invalid prop: type check failed" warnings even though the source TS type allowed them. Provided a minimal reproduction and isolated the regression to SFC type-to-runtime inference for ref-wrapper unions; tracked and fixed by PR #14758.
vue · compiler-sfc · typescript · bug report · open source
LilyGo EPD47 - PR #183
Fixed an infinite loop bug in the LilyGo EPD47 font renderer caused by invalid UTF-8 bytes (e.g. bare 0xB0). next_cp() would stall forever when utf8_len() returned 0 for a continuation byte. Added a guard to skip bad bytes and return U+FFFD, preventing the hang and undefined behaviour.
c · esp32 · utf-8 · embedded · open source
LilyGo EPD47 - PR #181
Fixed ESP32 Arduino core 3.x (IDF 5.x) compatibility for the LilyGo 4.7" e-paper display library. Resolved 5 build/runtime issues: missing esp_attr.h and gpio_struct.h includes, RMT TX driver rewrite for IDF 5 driver_ng API, JPEG feed_buffer type mismatch, and uninitialized LCD clock source causing runtime panic.
c · esp32 · esp-idf · embedded · open source
Grafana Backup Tool - PR #5
Open source contribution to Grafana Backup Tool, for backing up and restoring Grafana dashboards, datasources, and other configurations. Contributed improvements and enhancements to the project.
grafana · backup tool · open source
Grafana - PR #118246
Open source contribution to Grafana, the open source analytics and monitoring platform. Contributed improvements and enhancements to the project.
grafana · go · typescript · open source
Grafana Backup Tool - PR #302
Open source contribution to Grafana Backup Tool, a tool for backing up and restoring Grafana dashboards, datasources, and other configurations. Contributed improvements and enhancements to the project.
grafana · backup tool · open source
Apache Pinot - PR #14663
Open source contribution to Apache Pinot, a real-time distributed OLAP datastore. Contributed improvements and enhancements to the project.
java · apache pinot · open source
// personal — hardware & tooling
Personal Projects
Hardware firmware and developer tooling I build on the side.
LilyGo EPD47 Property Display
Custom firmware for LilyGo 4.7" e-paper display (EPD47-S3) that shows property information with Hindi date, moon phase, and touch-triggered jokes. Built with C for ESP32-S3.
c · esp32 · e-paper · embedded
Grafana Backup DB
Schema-agnostic MySQL/SQLite backup tool — auto-discovers tables, exports rows as JSON, compresses into timestamped archives. Works for Grafana or any MySQL database. Multi-database support, batch row fetching, and manifest file in every archive.
python · mysql · sqlite · backup
// at work — angel one · betterworks · mygate
At Work
Platforms I designed, architected and led at Angel One, BetterWorks and MyGate.
Research Analyst (RA) Marketplace
Designed, documented, and launched the Research Analyst Marketplace, leading a team of 8+ engineers. Onboarded 30+ RAs with a user base of 60 lakh clients; scaled to millions of concurrent users.
go · vue.js · vuetify · mongodb · aws · microservices
Sub-Broker Admin Dashboard
Architected and delivered the Sub-Broker Admin Dashboard (Vue.js, Vuetify, Go backend) for 3+ lakh users, owning design, scalability, and release. Reduced repo bundle size by 88% (10MB → 1.2MB) with code splitting, CDN assets, and lazy loading.
vue.js · vuetify · go · aws · docker
Customer Support Experience Platform
Built the Customer Support Experience platform (Golang + Svelte.js) for 700+ agents, including backend orchestrator. Developed and scaled an in-house chatbot UI from 0 → 6 lakh+ users with standardized conversational UI framework. Migrated Salesforce tickets to in-house CX Support Portal, saving ₹4 Cr annually.
go · svelte.js · mongodb · rabbitmq · aws
Survey and Poll Analytics Tool
Designed and developed survey and poll analytics tool; migrated JavaScript → TypeScript. Optimized APIs with MongoDB aggregation + caching; integrated Highcharts for analytics. Built reusable frontend components with ATOMIC design and backend integrations.
typescript · react · mongodb · highcharts · node.js · express
Task Auto-Assignment Tool
Developed internal task auto-assignment tool with Nest.js (location + workload balancing). Optimized image upload pipeline with S3 pre-signed URLs and improved API latency with RabbitMQ + MongoDB indexing. Deployed a highly available MongoDB cluster for fault tolerance.
nest.js · mongodb · rabbitmq · aws s3 · docker