Blog · Kulkarni Inc.

Clear thinking.
Practical technology.

Engineering notes from a year of upgrades, migrations and integrations, articles on technology leadership, and a build log of how this company's systems were set up as code. Dead ends included.

Featured · Engineering notes

2026 in review: five projects, one theme

Upgrades, migrations and integrations. What I worked on this year, what shipped, and what I'd do differently.

Read the article · 3 min
2026 at a glance

Steady output, in bursts.

Non-merge commits by month, de-duplicated by hash across the repos I work in.

352Q1
731Q2
861Q3
785Q4
2,729commits
Jan: 3 commits3JanFeb: 1 commits1FebMar: 348 commits · Cypress suite, report builder348MarApr: 28 commits28AprMay: 169 commits · Grails 7 begins169MayJun: 534 commits · Grails 7 and ActiveMQ 6534JunJul: 132 commits · Integration resiliency132JulAug: 89 commits · HubSpot events89AugSep: 640 commits · Upgrade plan, HubSpot keys640SepOct: 729 commits · Salesforce files, timeouts729OctNov: 56 commits · HubSpot backup56NovDec

22 posts

Engineering notes

A HubSpot backup you can actually browse

A read-only backup of configuration, records and files, plus a small web app to look through it.

Amit Kulkarni · Nov 2026 · 1 min read
Engineering notes

Moving a large file set out of Salesforce

A resumable export, an audit log, and a read-only check that told us exactly what had landed.

Amit Kulkarni · Oct 2026 · 2 min read
Engineering notes

Making a slow partner call fail predictably

A configurable timeout, a correlation id, and logs that hide passwords but keep usernames.

Amit Kulkarni · Oct 2026 · 1 min read
Engineering notes

Planning an upgrade when there are no tests

How I approached a Grails 7 and Java 17 upgrade of a large production app with almost no test coverage.

Amit Kulkarni · Sep 2026 · 2 min read
Engineering notes

Keying HubSpot to our own IDs

What identifies a record when two systems both think they own it, and why blank fields are dangerous.

Amit Kulkarni · Sep 2026 · 1 min read
Engineering notes

What Grails 7 and ActiveMQ 6 actually broke

The unglamorous list of fixes from upgrading an integration service and a core app.

Amit Kulkarni · Jun 2026 · 1 min read
Engineering notes

Showing the SQL before running it

A debug panel for a report builder, and a toggle between two backends.

Amit Kulkarni · Mar 2026 · 1 min read
Engineering notes

Generating Cypress tests from a role matrix

How a small generator produced thousands of role checks, and what the hand-written tests were for.

Amit Kulkarni · Mar 2026 · 1 min read
Insights

From Software Engineer to Technology Leader

How responsibility grows from writing code to leading technology and innovation, and what to build along the way.

Amit Kulkarni · 2026 · 2 min read
Insights

Enterprise Integrations Should Start with the Workflow

A practical framework for defining ownership, failure handling, and support before connecting enterprise applications.

Amit Kulkarni · 2026 · 2 min read
Insights

SaaS Cost Optimization Starts with Usage

Review SaaS costs through usage, business outcomes, dependencies, and measurable service requirements before changing contracts or tools.

Amit Kulkarni · 2026 · 2 min read
Insights

Modernize Platforms Without Losing Business Context

Plan software modernization around preserved workflows, explicit tradeoffs, and reversible delivery rather than a technology replacement alone.

Amit Kulkarni · 2026 · 2 min read
Insights

Engineering Leadership Means Making Decisions Clear

Help engineering teams move forward with explicit outcomes, documented choices, clear ownership, and useful feedback.

Amit Kulkarni · 2026 · 2 min read
Build log · Part 1

What the HubSpot Free plan can and cannot do

Custom objects need Enterprise, so we used the standard objects and treated the limits as part of the lesson.

Kulkarni Inc. · Nov 2026 · 1 min read
Build log · Part 2

A static-token app, and why scopes bite

The CLI key and the app token are different credentials with different scopes. Mixing them up cost us a few 403s.

Kulkarni Inc. · Nov 2026 · 1 min read
Build log · Part 3

Properties, pipelines and forms as code

Idempotent scripts that create things the first time and update them every time after.

Kulkarni Inc. · Nov 2026 · 1 min read
Build log · Part 4

Three ticket types from one pipeline

We wanted different forms to create different kinds of tickets. A field beat a second pipeline.

Kulkarni Inc. · Nov 2026 · 1 min read
Build log · Part 5

Sample data you can load, update and verify

A seeded generator, batch loading, a guarded mass update and a verify script that says PASS or FAIL.

Kulkarni Inc. · Nov 2026 · 1 min read
Build log · Part 6

Hosting the company site on AWS

A private bucket behind CloudFront, a certificate in the right region, and DNS records you can read.

Kulkarni Inc. · Nov 2026 · 1 min read
Build log · Part 7

A brand you can rebuild from code

Tokens, a vector K drawn in a script, an outlined wordmark and a mistake that looked like a Q.

Kulkarni Inc. · Nov 2026 · 1 min read
Build log · Part 8

One CloudFront distribution, many sites

A small viewer-request function routes hostnames to folders, and one flag in a deploy script stops it deleting them.

Kulkarni Inc. · Nov 2026 · 1 min read