<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel>
<title>Kulkarni Inc. Blog</title><link>https://blog.kulkarniinc.com/</link><description>Clear thinking. Practical technology.</description><language>en</language>
<item><title>2026 in review: five projects, one theme</title><link>https://blog.kulkarniinc.com/2026-year-in-review/</link><guid>https://blog.kulkarniinc.com/2026-year-in-review/</guid><description>Upgrades, migrations and integrations. What I worked on this year, what shipped, and what I'd do differently.</description><category>Year in review</category></item>
<item><title>A HubSpot backup you can actually browse</title><link>https://blog.kulkarniinc.com/a-hubspot-backup-you-can-actually-browse/</link><guid>https://blog.kulkarniinc.com/a-hubspot-backup-you-can-actually-browse/</guid><description>A read-only backup of configuration, records and files, plus a small web app to look through it.</description><category>HubSpot</category><category>Backup</category><category>DuckDB</category><category>Node.js</category></item>
<item><title>Moving a large file set out of Salesforce</title><link>https://blog.kulkarniinc.com/moving-a-large-file-set-out-of-salesforce/</link><guid>https://blog.kulkarniinc.com/moving-a-large-file-set-out-of-salesforce/</guid><description>A resumable export, an audit log, and a read-only check that told us exactly what had landed.</description><category>Migration</category><category>Salesforce</category><category>AWS</category><category>DynamoDB</category></item>
<item><title>Making a slow partner call fail predictably</title><link>https://blog.kulkarniinc.com/making-a-slow-partner-call-fail-predictably/</link><guid>https://blog.kulkarniinc.com/making-a-slow-partner-call-fail-predictably/</guid><description>A configurable timeout, a correlation id, and logs that hide passwords but keep usernames.</description><category>Integration</category><category>Resiliency</category><category>Logging</category></item>
<item><title>Planning an upgrade when there are no tests</title><link>https://blog.kulkarniinc.com/planning-an-upgrade-when-there-are-no-tests/</link><guid>https://blog.kulkarniinc.com/planning-an-upgrade-when-there-are-no-tests/</guid><description>How I approached a Grails 7 and Java 17 upgrade of a large production app with almost no test coverage.</description><category>Grails</category><category>Java</category><category>Upgrades</category><category>Testing</category></item>
<item><title>Keying HubSpot to our own IDs</title><link>https://blog.kulkarniinc.com/keying-hubspot-to-our-own-ids/</link><guid>https://blog.kulkarniinc.com/keying-hubspot-to-our-own-ids/</guid><description>What identifies a record when two systems both think they own it, and why blank fields are dangerous.</description><category>HubSpot</category><category>Integration</category><category>Webhooks</category></item>
<item><title>What Grails 7 and ActiveMQ 6 actually broke</title><link>https://blog.kulkarniinc.com/what-grails-7-and-activemq-6-actually-broke/</link><guid>https://blog.kulkarniinc.com/what-grails-7-and-activemq-6-actually-broke/</guid><description>The unglamorous list of fixes from upgrading an integration service and a core app.</description><category>Grails</category><category>ActiveMQ</category><category>Spring</category><category>Upgrades</category></item>
<item><title>Showing the SQL before running it</title><link>https://blog.kulkarniinc.com/showing-the-sql-before-running-it/</link><guid>https://blog.kulkarniinc.com/showing-the-sql-before-running-it/</guid><description>A debug panel for a report builder, and a toggle between two backends.</description><category>React</category><category>Reporting</category><category>Tooling</category></item>
<item><title>Generating Cypress tests from a role matrix</title><link>https://blog.kulkarniinc.com/generating-cypress-tests-from-a-role-matrix/</link><guid>https://blog.kulkarniinc.com/generating-cypress-tests-from-a-role-matrix/</guid><description>How a small generator produced thousands of role checks, and what the hand-written tests were for.</description><category>Testing</category><category>Cypress</category><category>CI</category></item>
<item><title>From Software Engineer to Technology Leader</title><link>https://blog.kulkarniinc.com/amit-kulkarni-software-engineer-technology-leader/</link><guid>https://blog.kulkarniinc.com/amit-kulkarni-software-engineer-technology-leader/</guid><description>How responsibility grows from writing code to leading technology and innovation, and what to build along the way.</description><category>Technology Leadership</category><category>Career</category></item>
<item><title>Enterprise Integrations Should Start with the Workflow</title><link>https://blog.kulkarniinc.com/enterprise-integrations-workflow-first/</link><guid>https://blog.kulkarniinc.com/enterprise-integrations-workflow-first/</guid><description>A practical framework for defining ownership, failure handling, and support before connecting enterprise applications.</description><category>Enterprise Integration</category><category>Software Architecture</category></item>
<item><title>SaaS Cost Optimization Starts with Usage</title><link>https://blog.kulkarniinc.com/saas-cost-optimization-start-with-usage/</link><guid>https://blog.kulkarniinc.com/saas-cost-optimization-start-with-usage/</guid><description>Review SaaS costs through usage, business outcomes, dependencies, and measurable service requirements before changing contracts or tools.</description><category>SaaS Optimization</category><category>Technology Strategy</category></item>
<item><title>Modernize Platforms Without Losing Business Context</title><link>https://blog.kulkarniinc.com/modernize-platforms-without-losing-business-context/</link><guid>https://blog.kulkarniinc.com/modernize-platforms-without-losing-business-context/</guid><description>Plan software modernization around preserved workflows, explicit tradeoffs, and reversible delivery rather than a technology replacement alone.</description><category>Platform Modernization</category><category>Software Architecture</category></item>
<item><title>Engineering Leadership Means Making Decisions Clear</title><link>https://blog.kulkarniinc.com/engineering-leadership-make-decisions-clear/</link><guid>https://blog.kulkarniinc.com/engineering-leadership-make-decisions-clear/</guid><description>Help engineering teams move forward with explicit outcomes, documented choices, clear ownership, and useful feedback.</description><category>Engineering Leadership</category><category>Team Development</category></item>
<item><title>What the HubSpot Free plan can and cannot do</title><link>https://blog.kulkarniinc.com/hubspot-free-what-you-can-build/</link><guid>https://blog.kulkarniinc.com/hubspot-free-what-you-can-build/</guid><description>Custom objects need Enterprise, so we used the standard objects and treated the limits as part of the lesson.</description><category>HubSpot</category><category>Planning</category></item>
<item><title>A static-token app, and why scopes bite</title><link>https://blog.kulkarniinc.com/static-token-app-and-scopes/</link><guid>https://blog.kulkarniinc.com/static-token-app-and-scopes/</guid><description>The CLI key and the app token are different credentials with different scopes. Mixing them up cost us a few 403s.</description><category>HubSpot</category><category>API</category></item>
<item><title>Properties, pipelines and forms as code</title><link>https://blog.kulkarniinc.com/properties-pipelines-forms-as-code/</link><guid>https://blog.kulkarniinc.com/properties-pipelines-forms-as-code/</guid><description>Idempotent scripts that create things the first time and update them every time after.</description><category>HubSpot</category><category>Automation</category></item>
<item><title>Three ticket types from one pipeline</title><link>https://blog.kulkarniinc.com/three-ticket-types-one-pipeline/</link><guid>https://blog.kulkarniinc.com/three-ticket-types-one-pipeline/</guid><description>We wanted different forms to create different kinds of tickets. A field beat a second pipeline.</description><category>HubSpot</category><category>Design</category></item>
<item><title>Sample data you can load, update and verify</title><link>https://blog.kulkarniinc.com/sample-data-load-update-verify/</link><guid>https://blog.kulkarniinc.com/sample-data-load-update-verify/</guid><description>A seeded generator, batch loading, a guarded mass update and a verify script that says PASS or FAIL.</description><category>HubSpot</category><category>Testing</category></item>
<item><title>Hosting the company site on AWS</title><link>https://blog.kulkarniinc.com/company-site-on-aws/</link><guid>https://blog.kulkarniinc.com/company-site-on-aws/</guid><description>A private bucket behind CloudFront, a certificate in the right region, and DNS records you can read.</description><category>AWS</category><category>Infrastructure</category></item>
<item><title>A brand you can rebuild from code</title><link>https://blog.kulkarniinc.com/a-brand-you-can-rebuild/</link><guid>https://blog.kulkarniinc.com/a-brand-you-can-rebuild/</guid><description>Tokens, a vector K drawn in a script, an outlined wordmark and a mistake that looked like a Q.</description><category>Brand</category><category>Design systems</category></item>
<item><title>One CloudFront distribution, many sites</title><link>https://blog.kulkarniinc.com/many-sites-one-cloudfront/</link><guid>https://blog.kulkarniinc.com/many-sites-one-cloudfront/</guid><description>A small viewer-request function routes hostnames to folders, and one flag in a deploy script stops it deleting them.</description><category>AWS</category><category>Infrastructure</category></item>
</channel></rss>
