<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mihir Soni</title><link>https://mihir.cloud/</link><description>Mihir Soni (Soni Mihir) — Principal Engineering Manager at Microsoft Azure Compute, founding engineer of OpenSearch at AWS. Cloud computing, distributed systems, and infrastructure engineering leader based in Seattle. Personal site, resume, and writing on tech and personal finance.</description><generator>Hugo 0.165.0 &amp; FixIt v1.0.0-alpha-mti6jl18</generator><language>en-us</language><managingEditor>mihirsoni.123@gmail.com (Mihir Soni)</managingEditor><webMaster>mihirsoni.123@gmail.com (Mihir Soni)</webMaster><copyright>© 2026 Mihir Soni</copyright><lastBuildDate>Mon, 12 Jul 2021 09:00:00 +0000</lastBuildDate><atom:link href="https://mihir.cloud/index.xml" rel="self" type="application/rss+xml"/><item><title>From X-Pack Removal to GA: Five Months, 82 PRs</title><link>https://mihir.cloud/posts/opensearch-x-pack-to-ga/</link><pubDate>Mon, 12 Jul 2021 09:00:00 +0000</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/opensearch-x-pack-to-ga/</guid><description>&lt;p&gt;On January 30th, 2021, I merged a PR called &amp;ldquo;Remove x-pack directory&amp;rdquo; into a repo that had existed for about five hours. Today, July 12th, AWS put out &lt;a href="https://aws.amazon.com/blogs/opensource/opensearch-1-0-launches/" target="_blank" rel="external nofollow noopener noreferrer"&gt;&amp;ldquo;OpenSearch 1.0 launches&amp;rdquo;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, and &lt;a href="https://opensearch.org" target="_blank" rel="external nofollow noopener noreferrer"&gt;opensearch.org&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; posted its own &lt;a href="https://opensearch.org/blog/opensearch-general-availability-announcement/" target="_blank" rel="external nofollow noopener noreferrer"&gt;GA announcement&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;. Between those two dates I merged 82 pull requests into OpenSearch Dashboards. Writing down the whole arc here while it&amp;rsquo;s still fresh:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;January 30 – February 23: pulling Elastic out.&lt;/strong&gt; Eleven PRs stripping the x-pack directory, disabling telemetry that phoned home to Elastic, getting a basic CI pipeline running. Nobody outside the team saw any of this. The repo was private, the project didn&amp;rsquo;t have a name people knew yet, and the work was entirely &amp;ldquo;make sure this thing legally and technically stands on its own.&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;March 3 – March 19: the rename.&lt;/strong&gt; This is the biggest single chunk — 49 PRs in seventeen days, renaming every &lt;code&gt;kbn-*&lt;/code&gt; package to &lt;code&gt;osd-*&lt;/code&gt;, directory by directory, because doing it all at once would have made a broken build impossible to debug. Sixty percent of everything I shipped on this project happened in these seventeen days.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;March 22 – April 10: getting ready to be looked at.&lt;/strong&gt; License headers, README and CONTRIBUTING updates, a URL that still pointed at opensearch.co two days before launch and needed fixing. Eighteen PRs of the kind of housekeeping you only do once you know strangers are about to show up.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;April 12: the announcement.&lt;/strong&gt; &lt;a href="https://opendistro.github.io/for-elasticsearch/blog/contribution/2021/04/introducing-opensearch/" target="_blank" rel="external nofollow noopener noreferrer"&gt;&amp;ldquo;Introducing OpenSearch&amp;rdquo;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; went out to the world. I watched it happen from the inside, already knowing every commit that made it true.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;April 15 – May 13: the last stretch.&lt;/strong&gt; &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/292" target="_blank" rel="external nofollow noopener noreferrer"&gt;Bumping the version to 1.0.0&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, a typo fix in a rename script, one more docs pass on the README and CONTRIBUTING guide. Small PRs, but the kind that matter when you&amp;rsquo;re closing out a release.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;July 12: GA.&lt;/strong&gt; OpenSearch 1.0 was generally available. Five months and change after that first commit.&lt;/p&gt;&#10;&lt;p&gt;Most of the five months wasn&amp;rsquo;t glamorous — directory-by-directory renames, license header updates, fixing a URL two days before launch. No single PR in that list is interesting on its own. It&amp;rsquo;s 82 PRs, done mostly by hand, that happened to hold together when people looked at it on April 12th and again today.&lt;/p&gt;&#10;&lt;p&gt;Not sure what happens to it from here. That&amp;rsquo;s up to whoever picks it up and runs it. But it&amp;rsquo;s a good feeling to sit here on GA day and remember it started with a directory called &lt;code&gt;x-pack&lt;/code&gt; that needed to come out.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards" target="_blank" rel="external nofollow noopener noreferrer"&gt;Repo history&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>The 48 Hours Before OpenSearch Went Public</title><link>https://mihir.cloud/posts/opensearch-48-hours-before-launch/</link><pubDate>Mon, 12 Apr 2021 09:00:00 +0000</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/opensearch-48-hours-before-launch/</guid><description>&lt;p&gt;AWS announced OpenSearch today with a post called &lt;a href="https://opendistro.github.io/for-elasticsearch/blog/contribution/2021/04/introducing-opensearch/" target="_blank" rel="external nofollow noopener noreferrer"&gt;&amp;ldquo;Introducing OpenSearch&amp;rdquo;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;. Reading it, you wouldn&amp;rsquo;t know what the repo looked like from the inside in the days right before it went out.&lt;/p&gt;&#10;&lt;p&gt;My last PR before the announcement was &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/277" target="_blank" rel="external nofollow noopener noreferrer"&gt;#277&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, a README update, merged April 10th. Two days later the announcement went live. In the weeks before that, the PRs stopped being about renaming packages and started being about the kind of stuff you only think of once you realize actual strangers are about to look at this thing:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/245" target="_blank" rel="external nofollow noopener noreferrer"&gt;Removing the OSS build flag&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; so the default build didn&amp;rsquo;t secretly assume you were building the old Elastic-licensed version&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/246" target="_blank" rel="external nofollow noopener noreferrer"&gt;Fixing eslint errors that had been ignored&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; because who&amp;rsquo;s going to fix a lint warning nobody outside the team could see&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/259" target="_blank" rel="external nofollow noopener noreferrer"&gt;Updating the license header across the whole project&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; and &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/262" target="_blank" rel="external nofollow noopener noreferrer"&gt;updating NOTICE.txt&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; — the unglamorous legal housekeeping that has to be right before you publish&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/266" target="_blank" rel="external nofollow noopener noreferrer"&gt;Fixing every URL that still pointed at opensearch.co instead of opensearch.org&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; — caught two days before launch, which is about as late as you want to catch something like that&lt;/li&gt;&#10;&lt;li&gt;Updating &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/212" target="_blank" rel="external nofollow noopener noreferrer"&gt;CONTRIBUTING.md&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; and the README so that when people showed up, there was actually somewhere for them to start&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;None of these are hard engineering problems. They&amp;rsquo;re the boring last mile you do because you know someone&amp;rsquo;s about to look — wrong URLs, missing license headers, a README that assumes you already know what this project is. The last two weeks felt less like building features and more like cleaning up before guests show up.&lt;/p&gt;&#10;&lt;p&gt;Today I read the same announcement everyone else is reading for the first time, except I already knew every PR that went into making it true — which commit fixed the URL, which one updated the license headers, all of it, from two days ago.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards" target="_blank" rel="external nofollow noopener noreferrer"&gt;Repo history&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; · &lt;a href="https://opendistro.github.io/for-elasticsearch/blog/contribution/2021/04/introducing-opensearch/" target="_blank" rel="external nofollow noopener noreferrer"&gt;&amp;ldquo;Introducing OpenSearch&amp;rdquo;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Renaming Kibana to OpenSearch Dashboards, One PR at a Time</title><link>https://mihir.cloud/posts/opensearch-dashboards-rename/</link><pubDate>Fri, 19 Mar 2021 09:00:00 +0000</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/opensearch-dashboards-rename/</guid><description>&lt;p&gt;Between March 3rd and March 19th, 2021, I merged 49 pull requests into what would become OpenSearch Dashboards. That&amp;rsquo;s roughly three PRs a day for seventeen straight days, and almost all of them were doing the same kind of thing: renaming &lt;code&gt;kbn-*&lt;/code&gt; packages to &lt;code&gt;osd-*&lt;/code&gt;, one directory at a time.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;kbn-&lt;/code&gt; shows up in package names, import paths, config files, build scripts, generated docs, test fixtures, and a bunch of other places that don&amp;rsquo;t all update the same way. Doing it all at once gets you a PR nobody can review and a build that&amp;rsquo;s broken in ways nobody can trace back to a single change. So we didn&amp;rsquo;t — we did it directory by directory, package by package, and shipped each piece as its own reviewable PR.&lt;/p&gt;&#10;&lt;p&gt;You can see the shape of it just from the PR titles:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/38" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;kbn-utils&lt;/code&gt; → &lt;code&gt;osd-utils&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/41" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;kbn-ui-framework&lt;/code&gt; → &lt;code&gt;osd-ui-framework&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/53" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;kbn-test&lt;/code&gt; in four separate parts&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; because that one package touched too much to do in one PR&lt;/li&gt;&#10;&lt;li&gt;refactors of &lt;code&gt;src/core/server&lt;/code&gt;, &lt;code&gt;src/core/public&lt;/code&gt;, &lt;code&gt;src/plugins/vis_type_vega&lt;/code&gt;, &lt;code&gt;src/plugins/vis_type_table&lt;/code&gt;, and on, and on&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/128" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;src/dev&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/137" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;test/&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/142" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;src/legacy&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/143" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;src/optimize&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/144" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;examples/&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;On March 15th there&amp;rsquo;s &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/167" target="_blank" rel="external nofollow noopener noreferrer"&gt;PR #167&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;: &amp;ldquo;Fixes renaming renames and able to start Dashboards 🎉🎉🎉🎉.&amp;rdquo; After two weeks of renaming pieces one at a time, that&amp;rsquo;s the PR where the whole thing rebuilt and started up again.&lt;/p&gt;&#10;&lt;p&gt;Doing this in 49 separate PRs instead of one giant one wasn&amp;rsquo;t about process for its own sake. A rename this size touches thousands of files, and if something breaks after landing it all in one shot, you have no idea which change caused it. In small, reviewable pieces, when something did break — and things did break — we knew within minutes which PR to look at.&lt;/p&gt;&#10;&lt;p&gt;It&amp;rsquo;s the most I&amp;rsquo;ve shipped in any single stretch of this project so far — more PRs in these seventeen days than everything before them combined. Not the most interesting engineering problem I&amp;rsquo;ve worked on, but probably the one that&amp;rsquo;s required the most discipline to do carefully instead of fast.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards" target="_blank" rel="external nofollow noopener noreferrer"&gt;Repo history&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>What It Actually Takes to De-Elastic a Codebase</title><link>https://mihir.cloud/posts/opensearch-purify-sprint/</link><pubDate>Tue, 23 Feb 2021 09:00:00 +0000</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/opensearch-purify-sprint/</guid><description>&lt;p&gt;Right now this is still just a checkout of Kibana with a bunch of things that need to come out. Between January 30th and February 23rd, I merged eleven PRs that we labeled &lt;code&gt;[PURIFY]&lt;/code&gt; in the title, because that&amp;rsquo;s basically what it is — going through the codebase and taking out everything that isn&amp;rsquo;t ours to keep.&lt;/p&gt;&#10;&lt;p&gt;None of this is public yet. I don&amp;rsquo;t know when it will be, or what shape the announcement takes when it happens. Right now it&amp;rsquo;s a repo nobody outside the team can see, and work nobody is going to write a launch blog about — not this part, anyway.&lt;/p&gt;&#10;&lt;p&gt;Here&amp;rsquo;s roughly what a &lt;code&gt;[PURIFY]&lt;/code&gt; PR looked like in practice:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6" target="_blank" rel="external nofollow noopener noreferrer"&gt;Remove the x-pack directory&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; — the actual commercial code&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/7" target="_blank" rel="external nofollow noopener noreferrer"&gt;Remove x-pack references from the build scripts&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; — because deleting a directory doesn&amp;rsquo;t help if six build scripts still expect it to exist&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/8" target="_blank" rel="external nofollow noopener noreferrer"&gt;Fix the tests that broke&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; once x-pack was gone, and make sure the test suite actually ran again&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/9" target="_blank" rel="external nofollow noopener noreferrer"&gt;Remove x-pack from the i18n build&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, because internationalization tooling had its own set of x-pack hooks&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/25" target="_blank" rel="external nofollow noopener noreferrer"&gt;Disable the telemetry network calls&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; that phoned home to Elastic&amp;rsquo;s servers&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/36" target="_blank" rel="external nofollow noopener noreferrer"&gt;Clean up the &lt;code&gt;.ci&lt;/code&gt; directory&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; and get a basic Jenkins pipeline running so we had a way to know when we broke something&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;That pattern shows up a lot: remove x-pack from the main directory, and it turns out the CI scripts still reference it, the i18n tooling references it, the telemetry system pings back to it, and half the test suite assumes it&amp;rsquo;s there. Each one of those had to get found and fixed on its own, because there was no automated way to know what &amp;ldquo;still depends on x-pack&amp;rdquo; meant across a codebase this size.&lt;/p&gt;&#10;&lt;p&gt;Slow, careful, unglamorous work — check what breaks, fix it, check again. Nothing here is going to make it into a launch announcement, if there&amp;rsquo;s ever one to write. But you can&amp;rsquo;t ship an Apache 2.0 fork of Kibana while it&amp;rsquo;s still quietly calling home to Elastic&amp;rsquo;s telemetry servers, so somebody has to go find that code and turn it off. Right now that&amp;rsquo;s me, working through a checklist that keeps growing every time I think I&amp;rsquo;ve finished it.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards" target="_blank" rel="external nofollow noopener noreferrer"&gt;Repo history&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>The First Commit</title><link>https://mihir.cloud/posts/opensearch-first-commit/</link><pubDate>Sat, 30 Jan 2021 09:00:00 +0000</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/opensearch-first-commit/</guid><description>&lt;p&gt;On January 14th, 2021, &lt;a href="https://www.elastic.co/blog/licensing-change" target="_blank" rel="external nofollow noopener noreferrer"&gt;Elastic announced&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; they were changing the license on Elasticsearch and Kibana. No more Apache 2.0 — going forward it&amp;rsquo;d be the Elastic License or SSPL instead.&lt;/p&gt;&#10;&lt;p&gt;I remember hearing about it at work and thinking, okay, that&amp;rsquo;s a big deal, but I didn&amp;rsquo;t know yet that it was about to become my problem.&lt;/p&gt;&#10;&lt;p&gt;Sixteen days later, on January 30th, I merged &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6" target="_blank" rel="external nofollow noopener noreferrer"&gt;PR #6&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; — &amp;ldquo;Remove x-pack directory&amp;rdquo; — into a brand new repo called &lt;code&gt;opensearch-project/OpenSearch-Dashboards&lt;/code&gt;. The repo had been created less than five hours earlier. I checked the timestamps later: repo created 22:10 UTC, my PR merged 02:58 UTC. Under five hours from &amp;ldquo;this repo exists&amp;rdquo; to &amp;ldquo;here&amp;rsquo;s the first commit.&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;There was no announcement yet. No blog post, no press release, nothing on Hacker News. As far as the outside world knew, nothing had happened. Internally, a small group of us had been told: we&amp;rsquo;re forking Elasticsearch and Kibana, keeping everything on Apache 2.0, and we&amp;rsquo;re starting now. Not &amp;ldquo;we&amp;rsquo;re starting a design doc.&amp;rdquo; Starting.&lt;/p&gt;&#10;&lt;p&gt;My job that first day was about as unglamorous as it gets — go into the Kibana codebase and rip out the &lt;code&gt;x-pack&lt;/code&gt; directory, the commercial, non-Apache-2.0 part of the code. Not rewrite it, not replace it, just remove it and make sure the rest of the app still built. Delete a directory, see what breaks, fix it.&lt;/p&gt;&#10;&lt;p&gt;No whiteboard session, no kickoff meeting. Just a repo, a checkout, and a directory that needed to go. I merged that PR, went and looked for the next broken thing, and merged that too.&lt;/p&gt;&#10;&lt;p&gt;Not sure yet how long this takes, or what it&amp;rsquo;s called by the time anyone outside the team sees it. Right now it&amp;rsquo;s just a checkout of Kibana with a directory missing, and a list of things that still need to come out after it.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards" target="_blank" rel="external nofollow noopener noreferrer"&gt;Repo history&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; · &lt;a href="https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6" target="_blank" rel="external nofollow noopener noreferrer"&gt;PR #6&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Committing to Anomaly Detection Four Days Before AWS Announced It</title><link>https://mihir.cloud/posts/anomaly-detection-before-the-announcement/</link><pubDate>Tue, 26 Nov 2019 09:00:00 +0000</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/anomaly-detection-before-the-announcement/</guid><description>&lt;p&gt;The &lt;code&gt;anomaly-detection&lt;/code&gt; repo under &lt;a href="https://aws.amazon.com/blogs/opensource/stepping-up-for-a-truly-open-source-elasticsearch/" target="_blank" rel="external nofollow noopener noreferrer"&gt;Open Distro for Elasticsearch&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; was created on November 15th, 2019. My first commit landed a week later, on November 22nd — a small fix to &lt;a href="https://github.com/opendistro-for-elasticsearch/anomaly-detection/pull/2" target="_blank" rel="external nofollow noopener noreferrer"&gt;the test workflow config&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, the kind of unglamorous CI plumbing that has to work before anyone can trust the rest of the repo. Four days after that, on November 26th, AWS published &lt;a href="https://aws.amazon.com/blogs/opensource/introducing-real-time-anomaly-detection-open-distro-for-elasticsearch/" target="_blank" rel="external nofollow noopener noreferrer"&gt;&amp;ldquo;Introducing real-time anomaly detection in Open Distro for Elasticsearch&amp;rdquo;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; and the plugin became public.&lt;/p&gt;&#10;&lt;p&gt;I don&amp;rsquo;t think it&amp;rsquo;s a coincidence that the commit came before the announcement rather than after. By the time AWS is ready to publish a blog post like that, the code already has to be in decent enough shape to point people at. Someone has to get it there first, quietly, in the days right before — this time that someone was me, fixing a CI workflow nobody outside the team could see yet.&lt;/p&gt;&#10;&lt;p&gt;On the Kibana side, &lt;a href="https://github.com/opendistro-for-elasticsearch/anomaly-detection-kibana-plugin" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;anomaly-detection-kibana-plugin&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; has an interesting wrinkle: its git history goes back to July 2019, four months before the public repo existed on GitHub in November. That&amp;rsquo;s not a mistake in the dates — it&amp;rsquo;s what open-sourcing already-in-progress internal work looks like. The commits are real, the dates are real, they just predate the repo being something the public could see.&lt;/p&gt;&#10;&lt;p&gt;Not a big dramatic story — a CI fix, four days, and a blog post. But it&amp;rsquo;s the same pattern I keep noticing: the public announcement is the last step, not the first one, and by the time you read it, someone&amp;rsquo;s already been living inside that code for weeks.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/opendistro-for-elasticsearch/anomaly-detection" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;anomaly-detection&lt;/code&gt; repo&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; · &lt;a href="https://aws.amazon.com/blogs/opensource/introducing-real-time-anomaly-detection-open-distro-for-elasticsearch/" target="_blank" rel="external nofollow noopener noreferrer"&gt;AWS announcement&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Building a CLI So I Didn't Have to Click Through Kibana</title><link>https://mihir.cloud/posts/odfe-monitor-cli-and-oscon/</link><pubDate>Mon, 23 Sep 2019 09:00:00 +0000</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/odfe-monitor-cli-and-oscon/</guid><description>&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/opensource/stepping-up-for-a-truly-open-source-elasticsearch/" target="_blank" rel="external nofollow noopener noreferrer"&gt;Open Distro for Elasticsearch launched&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; on March 11th, 2019, and Alerting was one of the plugins that shipped on day one. Two weeks after that, on March 25th, I merged my first PR against it — &lt;a href="https://github.com/opendistro-for-elasticsearch/alerting-kibana-plugin/pull/7" target="_blank" rel="external nofollow noopener noreferrer"&gt;support for Kibana 6.6.2&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;. Over the next six months I kept shipping PRs against the alerting Kibana plugin, mostly chasing whatever Kibana version had just shipped: &lt;a href="https://github.com/opendistro-for-elasticsearch/alerting-kibana-plugin/pull/32" target="_blank" rel="external nofollow noopener noreferrer"&gt;6.7.1 in April&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, &lt;a href="https://github.com/opendistro-for-elasticsearch/alerting-kibana-plugin/pull/44" target="_blank" rel="external nofollow noopener noreferrer"&gt;7.0.1 in May&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, plus a steady stream of smaller fixes — &lt;a href="https://github.com/opendistro-for-elasticsearch/alerting-kibana-plugin/pull/42" target="_blank" rel="external nofollow noopener noreferrer"&gt;where-clause support for visual monitors&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, a &lt;a href="https://github.com/opendistro-for-elasticsearch/alerting-kibana-plugin/pull/64" target="_blank" rel="external nofollow noopener noreferrer"&gt;monitor update bug&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, &lt;a href="https://github.com/opendistro-for-elasticsearch/alerting-kibana-plugin/pull/95" target="_blank" rel="external nofollow noopener noreferrer"&gt;moving the schedule field per UX feedback&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Somewhere in the middle of all that, I got annoyed at how I was actually managing monitors day to day. Alerting monitors — the rules that watch your data and fire notifications — lived entirely in the Kibana UI. If you wanted the same monitor on two clusters, you clicked through the UI twice, by hand, and hoped you didn&amp;rsquo;t fat-finger a threshold. If you wanted to know what changed in a monitor over time, you didn&amp;rsquo;t, because there was no history — just whatever state it was currently in.&lt;/p&gt;&#10;&lt;p&gt;So I built &lt;a href="https://github.com/mihirsoni/odfe-monitor-cli" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;odfe-monitor-cli&lt;/code&gt;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, a command-line tool that let you define monitors as YAML files instead. Write the monitor once, commit it to git, and push it to as many clusters as you wanted. Diff it before you applied a change. Actually know what changed and when, because now it was a file in version control instead of a state hidden inside Kibana.&lt;/p&gt;&#10;&lt;p&gt;On June 12th, 2019, I wrote it up for the &lt;a href="https://aws.amazon.com/blogs/opensource/open-distro-for-elasticsearch-alerting-monitors-command-line/" target="_blank" rel="external nofollow noopener noreferrer"&gt;AWS Open Source Blog&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; — the first time I had a byline on an official AWS blog post. Then in July, at OSCON 2019 in Portland, I gave a talk on the same idea, &lt;a href="https://youtu.be/c2HTkmqoyG8?t=703" target="_blank" rel="external nofollow noopener noreferrer"&gt;&amp;ldquo;Gourmet Alerting with Open Distro for Elasticsearch&amp;rdquo;&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;. Same tool, same argument: alerting rules are configuration, and configuration belongs in version control, not locked inside a UI you have to click through by hand.&lt;/p&gt;&#10;&lt;p&gt;I spent months in the actual UI, fixing the actual bugs real users hit, and the CLI came directly out of being annoyed at my own workflow while doing that. It wasn&amp;rsquo;t a roadmap item — I was the one shipping the plugin every week, had to live with how clunky it was to operate, and eventually just built the thing I wanted.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/mihirsoni/odfe-monitor-cli" target="_blank" rel="external nofollow noopener noreferrer"&gt;&lt;code&gt;odfe-monitor-cli&lt;/code&gt; on GitHub&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; · &lt;a href="https://aws.amazon.com/blogs/opensource/open-distro-for-elasticsearch-alerting-monitors-command-line/" target="_blank" rel="external nofollow noopener noreferrer"&gt;AWS blog post&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; · &lt;a href="https://youtu.be/c2HTkmqoyG8?t=703" target="_blank" rel="external nofollow noopener noreferrer"&gt;OSCON 2019 talk&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Wrapping Up: Last Commits to Ubuntu Touch</title><link>https://mihir.cloud/posts/wrapping-up-ubuntu-touch/</link><pubDate>Fri, 03 Apr 2015 09:00:00 +0530</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/wrapping-up-ubuntu-touch/</guid><description>&lt;p&gt;Hello,&lt;/p&gt;&#10;&lt;p&gt;Landed &lt;a href="https://bugs.launchpad.net/bugs/1438910" target="_blank" rel="external nofollow noopener noreferrer"&gt;bug 1438910&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; on Calendar today — almost exactly two years since I first showed up to help close out bugs on the &lt;a href="https://launchpad.net/ubuntu-calculator-app" target="_blank" rel="external nofollow noopener noreferrer"&gt;Calculator app&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; back in July 2013. Between those two dates: a full app rebuilt from a half-finished blueprint, an &lt;a href="https://launchpad.net/~mihirsoni" target="_blank" rel="external nofollow noopener noreferrer"&gt;Ubuntu Membership&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, a lot of design arguments over IRC, more Autopilot test debugging than I ever expected to do for a phone calendar.&lt;/p&gt;&#10;&lt;p&gt;Haven&amp;rsquo;t been as consistent the last couple of months as I was through most of last year — work&amp;rsquo;s gotten busier, and the commits have been getting further apart. Not stopping exactly, just slower than I&amp;rsquo;d like to admit.&lt;/p&gt;&#10;&lt;p&gt;Whatever happens next with the app, it feels worth writing down that two years ago this was just a bug I filed on an app I barely used, and somewhere in there it turned into something I actually cared about finishing properly. &lt;a href="https://rpadovani.com/two-years-later" target="_blank" rel="external nofollow noopener noreferrer"&gt;Riccardo&amp;rsquo;s own two-year post&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; went up a couple of weeks ago — 660+ commits and a couple of Canonical Sprints in, still going strong. Wouldn&amp;rsquo;t mind having that kind of staying power.&lt;/p&gt;&#10;</description></item><item><title>The Calculator I Helped Ship Is Getting a Reboot</title><link>https://mihir.cloud/posts/calculator-gets-a-reboot/</link><pubDate>Wed, 24 Dec 2014 09:00:00 +0530</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/calculator-gets-a-reboot/</guid><description>&lt;p&gt;Hello,&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://rpadovani.com/ubuntu-calculator-app-reboot" target="_blank" rel="external nofollow noopener noreferrer"&gt;Riccardo&amp;rsquo;s writing up&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; the Calculator app reboot — scientific mode, a favourites/history feature, a cleaner design, all built on MathJs. Feels a bit strange in a good way: the app we scraped together the first release of back in 2013 is outdated enough now to need a proper rebuild.&lt;/p&gt;&#10;&lt;p&gt;He signed off the post with:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;If you need help, or have feedback, write me a mail or join #ubuntu-app-devel on Freenode and ping me (rpadovani) or Bartosk (gang65) or Mihir (mihir).&amp;rdquo;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Haven&amp;rsquo;t touched the Calculator codebase in over a year — I&amp;rsquo;ve been heads down on Calendar since late 2013 — but apparently I&amp;rsquo;m still one of three names people get pointed to on that app. Good excuse to go poke around the new scientific mode once it&amp;rsquo;s further along.&lt;/p&gt;&#10;</description></item><item><title>The Bug That Followed Me Across Six Projects</title><link>https://mihir.cloud/posts/the-bug-that-followed-me-across-six-projects/</link><pubDate>Thu, 06 Nov 2014 09:00:00 +0530</pubDate><author>mihirsoni.123@gmail.com (Mihir Soni)</author><guid>https://mihir.cloud/posts/the-bug-that-followed-me-across-six-projects/</guid><description>&lt;p&gt;Hello,&lt;/p&gt;&#10;&lt;p&gt;Landed &lt;a href="https://code.launchpad.net/~mihirsoni/ubuntu-calendar-app/DesignFixDefaultWeekView-5" target="_blank" rel="external nofollow noopener noreferrer"&gt;DesignFixDefaultWeekView-5&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; today, but the thing that&amp;rsquo;s actually eaten most of my week is &lt;a href="https://bugs.launchpad.net/bugs/1362962" target="_blank" rel="external nofollow noopener noreferrer"&gt;bug 1362962&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt; — &amp;ldquo;Calendar icon usually shows the wrong date.&amp;rdquo; Sounds trivial. The little calendar icon in the launcher is supposed to show today&amp;rsquo;s date, and sometimes it just doesn&amp;rsquo;t. Except the fix touches &lt;a href="https://launchpad.net/indicator-datetime" target="_blank" rel="external nofollow noopener noreferrer"&gt;indicator-datetime&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, &lt;a href="https://launchpad.net/ubuntu-ui-toolkit" target="_blank" rel="external nofollow noopener noreferrer"&gt;ubuntu-ui-toolkit&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, &lt;a href="https://launchpad.net/qtorganizer5-eds" target="_blank" rel="external nofollow noopener noreferrer"&gt;qtorganizer5-eds&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;, and a few other projects besides Calendar, and it&amp;rsquo;s been sitting near the top of the importance list across all of them for weeks now.&lt;/p&gt;&#10;&lt;p&gt;Turns out the icon isn&amp;rsquo;t owned by the Calendar app at all — it&amp;rsquo;s a system indicator that several apps and toolkit components all have a hand in updating. What looks like &amp;ldquo;wrong date on an icon&amp;rdquo; is actually a question of which component is responsible for refreshing state, and how many of them are quietly assuming someone else already did.&lt;/p&gt;&#10;&lt;p&gt;Learning more about how the stack actually fits together chasing this one bug than I have from most of the features I&amp;rsquo;ve shipped.&lt;/p&gt;&#10;</description></item></channel></rss>