Profile · Kulkarni Inc.

Build what comes next.

Systems, automation and brand work, built as code and documented as it goes. Thoughtful decisions. Lasting progress.

See the workRead the blog

Selected work

What I have built.

01

HubSpot as code

Custom properties, a ticket pipeline, three typed ticket forms, sample data, bulk load and mass update, all from idempotent Node scripts with a dry-run mode and an 11-check verify script.

HubSpot APINode.jsForms v3
02

Company site on AWS

A React and Vite site on a private S3 bucket behind CloudFront, with ACM certificates and Route 53 records for the root, www and cdn hostnames.

S3CloudFrontRoute 53ACM

kulkarniinc.com

03

Support intake

Three public forms create HubSpot tickets tagged by type (support, bug, access) on one pipeline, using a hidden field set per form.

HubSpot FormsTickets

Send a request

04

Brand system

One master K drawn in code, an outlined wordmark, design tokens with measured contrast, a PNG build script and a public guide.

SVGDesign tokens

brand.kulkarniinc.com

05

Many sites, one CDN

A single CloudFront distribution serving four hostnames from one bucket, routed by a small viewer-request function, with scripts that make it repeatable.

CloudFront FunctionsShell
+

More on the way

This list grows as projects ship. The blog tells the story behind each one, including the dead ends.

Read the blog
Approach

Three habits.

1

Code first

If a setting can live in a file, it does. Changes are reviewed as diffs, with the reason in the commit message.

2

Repeatable

Scripts are idempotent and can run twice safely. A dry run shows what would change before anything does.

3

Verified

Each setup has a check that proves it works, from API counts to measured colour contrast, so "done" has evidence.

Blog

Engineering notes, in order.

A technical history of this build, one post per step, starting with what the HubSpot Free plan can and cannot do.

Read all posts

Contact

Have a question or a project?

Send a request through the Kulkarni Inc. form and it arrives as a ticket.

Send a request