{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "version": 1,
  "generated_at": "2026-09-02T06:13:23.724Z",
  "person": {
    "name": "Nikhil Patil",
    "handle": "indieNik",
    "pronouns": "he/him",
    "tagline": "Product-minded engineer who runs cafés and builds the systems that run them.",
    "headline": "I build AI products, autonomous systems and the software behind my own café business.",
    "location": "Bengaluru, India",
    "contact": "https://nikhilpatil.in/contact/",
    "site": "https://nikhilpatil.in",
    "roles": [
      "Lead engineer, Publicis Sapient",
      "Founder and operator, The Jaggery Point",
      "Founder, Appetite Avenue"
    ],
    "bio": [
      "I am a product-minded engineer in Bengaluru with about ten years of frontend and full-stack work, most recently as a lead engineer at Publicis Sapient. The rest of the time I run a small chai café chain called The Jaggery Point and a corporate café business called Appetite Avenue, and I write the software they run on: a point of sale, a loyalty club, voice ordering, a merch store, and a live cockpit for the numbers.",
      "Since late 2025 most of my personal work has been AI products and autonomous systems: a video ad generator, a media-buying agent, an affiliate store that runs itself, an intraday trading bot, and a two-voice AI interview panel. All of it is live at real URLs and most of it touches real money, so the engineering is about guardrails as much as models.",
      "I work with Claude Code as my primary development environment. Every repo carries a CLAUDE.md, a STATUS file, dated branches, decision records and a habit of verifying live before claiming anything. This site is built the same way and is readable by AI agents through llms.txt, a JSON profile, and an MCP server."
    ],
    "focus": [
      "Agentic systems with deterministic guardrails",
      "Voice interfaces on Gemini Live",
      "Generative video pipelines",
      "Angular, NestJS and FastAPI on Google Cloud",
      "Small business operations software"
    ],
    "links": {
      "github": "https://github.com/indieNik",
      "linkedin": "https://www.linkedin.com/in/nikhiljpatil",
      "medium": "https://medium.com/@indienik",
      "instagram": "https://www.instagram.com/indienik",
      "x": "https://x.com/indienik",
      "soundcloud": "https://soundcloud.com/real_indienik",
      "youtube": "https://www.youtube.com/@indieNik",
      "stackoverflow": "https://stackoverflow.com/users/3438461/indienik"
    },
    "ventures": [
      {
        "name": "The Jaggery Point",
        "href": "https://thejaggerypoint.com",
        "what": "A chai café chain with four outlets across Bengaluru and Belgaum, built around jaggery chai. Every sip and bite made with the goodness of jaggery.",
        "role": "Founder and operator",
        "since": "2023"
      },
      {
        "name": "Appetite Avenue",
        "href": "https://appetiteavenue.com",
        "what": "Corporate café partnerships. The café your workplace runs on.",
        "role": "Founder",
        "since": "2023"
      }
    ],
    "properties": [
      {
        "label": "Trading dashboard",
        "href": "https://trades.nikhilpatil.in"
      },
      {
        "label": "Affiliate store",
        "href": "https://shop.nikhilpatil.in"
      },
      {
        "label": "IgniteAI",
        "href": "https://igniteai.in"
      },
      {
        "label": "IgniteAds",
        "href": "https://ads.igniteai.in"
      },
      {
        "label": "Baristalk",
        "href": "https://baristalk.com"
      },
      {
        "label": "The Jaggery Point",
        "href": "https://thejaggerypoint.com"
      },
      {
        "label": "Appetite Avenue",
        "href": "https://appetiteavenue.com"
      }
    ],
    "availability": "Open to conversations about agentic systems, voice AI, and software for small businesses. The contact form is the fastest route."
  },
  "projects": [
    {
      "slug": "igniteai",
      "name": "IgniteAI",
      "tagline": "One product photo in, one finished UGC video ad out.",
      "summary": "A production SaaS that turns a product photo and a one-line brief into a voiced, captioned, storyboarded video ad. Stills are approved before any paid video generation, scenes are generated one after another with last-frame continuity, and the script is fitted to a fixed words-per-second budget so speech is never cut. It ships a remote MCP server so AI agents can use its free marketing tools directly.",
      "category": "AI product",
      "status": "live",
      "years": "2025 to present",
      "stack": [
        "Python",
        "FastAPI",
        "LangGraph",
        "Veo 3.1",
        "Gemini",
        "ElevenLabs",
        "Cloud Run",
        "Firestore",
        "Angular",
        "Next.js",
        "Razorpay",
        "MCP"
      ],
      "highlights": [
        "Three-layer design: Markdown directives, an orchestrating agent, and deterministic Python for everything that must be repeatable.",
        "Every pricing or availability fact is synced across the MCP server, WebMCP tools, llms.txt and page copy in the same pull request, with drift-audit greps.",
        "Self-serve purchases have been paused since 2026-08-23 behind a fail-closed flag. Signup, free credits, generation for existing users, the free tools and the MCP server all stay open. Nothing was deleted."
      ],
      "links": [
        {
          "label": "igniteai.in",
          "href": "https://igniteai.in"
        },
        {
          "label": "App",
          "href": "https://app.igniteai.in"
        }
      ],
      "page": "https://nikhilpatil.in/work/igniteai/"
    },
    {
      "slug": "alphie",
      "name": "Alphie",
      "tagline": "An intraday trading bot for NSE stocks, with a Claude sleeve inside hard risk rails.",
      "summary": "Alphie runs a backtested gap-fade strategy on Indian equities from a small GCP VM, with a Flutter dashboard for web and Android. Every live trade is shadowed by more than a dozen counterfactual strategies so promotion to live is a decision backed by evidence, not a hunch. The newest sleeve lets Claude Code place discretionary bracket orders every ten minutes, but only through one endpoint that enforces notional caps, daily trade limits and kill switches in deterministic code.",
      "category": "Autonomous system",
      "status": "live",
      "years": "2026 to present",
      "stack": [
        "Python",
        "FastAPI",
        "APScheduler",
        "Zerodha Kite",
        "Flutter",
        "Firestore",
        "Gemini",
        "Claude Code",
        "GCP"
      ],
      "highlights": [
        "The bot commits its own daily data snapshots and post-session critiques to the repo, written by scheduled Claude Code routines.",
        "The rule that no LLM sits in the execution path was overridden once, deliberately, with a written decision and a review gate.",
        "The deploy script refuses to deploy during market hours if a position is open."
      ],
      "links": [
        {
          "label": "trades.nikhilpatil.in",
          "href": "https://trades.nikhilpatil.in"
        }
      ],
      "page": "https://nikhilpatil.in/work/alphie/"
    },
    {
      "slug": "dhanchakra",
      "name": "DhanChakra",
      "tagline": "An affiliate income loop that scouts, creates, publishes, measures and heals itself.",
      "summary": "DhanChakra runs an Amazon India affiliate store end to end: it scouts products weekly, generates creatives, publishes static product pages with structured data, distributes through Instagram and capped Meta ads, measures every click, and runs a deterministic optimizer with a self-healing medic agent. My only recurring job is uploading the monthly earnings file. It orchestrates three of my other repos through documented seams.",
      "category": "Autonomous system",
      "status": "live",
      "years": "2026 to present",
      "stack": [
        "Python",
        "FastAPI",
        "Cloud Run",
        "Cloud Scheduler",
        "Firestore",
        "Astro",
        "Netlify",
        "Gemini",
        "Veo",
        "Imagen",
        "Amazon Creators API"
      ],
      "highlights": [
        "Over a hundred numbered architecture decision records. The house rule: if there is no ADR for a decision, the work is not done.",
        "Money rules live in tested code. The model writes prose and classifies, it never decides spend.",
        "Product pages ship with zero client-side JavaScript, JSON-LD, and an llms.txt for AI search engines."
      ],
      "links": [
        {
          "label": "shop.nikhilpatil.in",
          "href": "https://shop.nikhilpatil.in"
        }
      ],
      "page": "https://nikhilpatil.in/work/dhanchakra/"
    },
    {
      "slug": "baristalk",
      "name": "Baristalk",
      "tagline": "Scan a table QR, speak your order in any language, it lands on the counter priced and paid.",
      "summary": "A multi-tenant voice ordering product I built in five days and piloted at my own café. Guests talk to a Gemini Live barista grounded in that business's menu, in Kannada, Hindi, English or whatever they speak. The order appears on a staff tablet as an accept, prepare, pay card. All menu, persona, languages, currency and geofence settings come from per-tenant configuration, never from code.",
      "category": "AI product",
      "status": "live",
      "years": "2026",
      "stack": [
        "Angular",
        "NestJS",
        "Nx",
        "Gemini Live",
        "AudioWorklet",
        "Firestore",
        "Cloud Run",
        "PWA"
      ],
      "highlights": [
        "The system prompt, voice and tools are locked into a single-use ephemeral token on the server. The browser connects to Gemini directly but can never read or alter the prompt.",
        "Prices are never computed by the model. The order tool sends item ids and the server prices them from the live catalog.",
        "Voice minutes are metered as the unit cost, which is what prices the product."
      ],
      "links": [
        {
          "label": "baristalk.com",
          "href": "https://baristalk.com"
        }
      ],
      "page": "https://nikhilpatil.in/work/baristalk/"
    },
    {
      "slug": "panelprep",
      "name": "PanelPrep",
      "tagline": "A live mock interview with two AI panelists who have two real voices and interrupt each other.",
      "summary": "PanelPrep puts you in front of a two-person AI interview panel over full-duplex audio. It intakes your role and seniority conversationally, grounds questions in how the target company actually interviews, and scores a rubric report afterwards. A Gemini Live session has exactly one voice, so I run one session per panelist and made the client the floor-control authority, with a hand-off tool, guards against ping-pong, and a watchdog so the room can never go silent.",
      "category": "AI product",
      "status": "live",
      "years": "2026",
      "stack": [
        "Angular",
        "Gemini Live",
        "Node",
        "Express",
        "Cloud Run",
        "Secret Manager",
        "Firebase",
        "Remotion"
      ],
      "highlights": [
        "Built for the NamasteDev hackathon in about a month, with a repo-local verification skill that drives real Gemini Live sessions headlessly.",
        "Prompts and voices are locked server-side into ephemeral tokens. Verified absent from the client bundle."
      ],
      "links": [
        {
          "label": "panel-prep.web.app",
          "href": "https://panel-prep.web.app"
        },
        {
          "label": "Showcase repo",
          "href": "https://github.com/indieNik/panelprep-showcase"
        }
      ],
      "page": "https://nikhilpatil.in/work/panelprep/"
    },
    {
      "slug": "hoist",
      "name": "Hoist",
      "tagline": "A JavaScript and TypeScript learning PWA built for recall under pressure, not just comprehension.",
      "summary": "Hoist is an installable, offline-capable app with more than a hundred authored lessons across eight tracks, animated explainers, spaced repetition, a guided path, and an interview prep mode. Hoisty, a Gemini Live voice tutor, can drive the UI and run a mock interview. I built it for my own interview preparation and then finished it as a product.",
      "category": "Learning tool",
      "status": "live",
      "years": "2026",
      "stack": [
        "Angular 22",
        "TypeScript",
        "PWA",
        "Service Worker",
        "FSRS",
        "Gemini Live",
        "Vitest",
        "Playwright",
        "Netlify"
      ],
      "highlights": [
        "Every non-obvious code sample was run before it was written down. The pull request template asks for it, and marble diagrams are TestScheduler-verified.",
        "Initial transfer is under a hundred kilobytes. Every route and lesson body is lazy loaded and the Markdown renderer is hand rolled."
      ],
      "links": [
        {
          "label": "hoist-learn.netlify.app",
          "href": "https://hoist-learn.netlify.app"
        },
        {
          "label": "GitHub",
          "href": "https://github.com/indieNik/hoist-learn"
        }
      ],
      "page": "https://nikhilpatil.in/work/hoist/"
    },
    {
      "slug": "next-eight-seconds",
      "name": "next eight seconds",
      "tagline": "An Instagram channel where the audience writes a story and AI films the next eight seconds daily.",
      "summary": "Every afternoon the top comment becomes the next chapter. A moderation gate and a cinematic prompt feed Veo, seeded with the previous clip's last frame so the same character carries the story forward. The Reel publishes itself with a caption crediting the commenter. A public storyline page shows the vote leaderboard and a countdown.",
      "category": "Autonomous system",
      "status": "live",
      "years": "2026",
      "stack": [
        "Python",
        "Firebase Functions",
        "Veo 3.1",
        "Gemini",
        "Instagram Graph API",
        "Angular",
        "ffmpeg"
      ],
      "highlights": [
        "Two gates stay in every version: a moderation filter and a human approval step until many trusted cycles have passed. Dry-run is the default.",
        "Strict isolation from my other Meta apps, down to prefixed function names and secrets, so an App Review on one product can never entangle the other."
      ],
      "links": [
        {
          "label": "nexteightseconds.web.app",
          "href": "https://nexteightseconds.web.app"
        },
        {
          "label": "@nexteightseconds",
          "href": "https://www.instagram.com/nexteightseconds"
        }
      ],
      "page": "https://nikhilpatil.in/work/next-eight-seconds/"
    },
    {
      "slug": "igniteads",
      "name": "IgniteAds",
      "tagline": "A media-buying agent that builds a whole Meta campaign, launches it paused, and waits for a human to type ACTIVATE.",
      "summary": "The companion to IgniteAI. Give it a video and it writes policy-safe copy, creates the campaign, ad set and ad through the Graph API, and launches everything paused under hard budget caps. Activation is a separate, typed confirmation. Launch steps are idempotent and keyed on a launch id so a queue retry can never double-spend.",
      "category": "Autonomous system",
      "status": "live",
      "years": "2026",
      "stack": [
        "Python",
        "FastAPI",
        "Meta Graph API",
        "Cloud Run",
        "Cloud Tasks",
        "Firestore",
        "Gemini",
        "Angular"
      ],
      "highlights": [
        "Ad spend is real money, not cloud credit. Caps, dry-run defaults and the typed gate are pinned by tests that fail if loosened.",
        "The Activate button was demoted from a loud primary to a quiet outline because it invited accidental spend."
      ],
      "links": [
        {
          "label": "ads.igniteai.in",
          "href": "https://ads.igniteai.in"
        }
      ],
      "page": "https://nikhilpatil.in/work/igniteads/"
    },
    {
      "slug": "espresso-journal",
      "name": "Espresso Journal",
      "tagline": "A one-day build for dialing in espresso, with one concrete suggestion per shot.",
      "summary": "Log grind, dose, yield, time and taste, and get a single deterministic suggestion for the next shot. Track bean bags by days off roast. Ask a Gemini Live barista when stuck. It reuses the design system from Hoist and was built in a day for my own kitchen.",
      "category": "Personal tool",
      "status": "live",
      "years": "2026",
      "stack": [
        "Angular",
        "Firebase",
        "PWA",
        "Gemini Live",
        "Netlify"
      ],
      "highlights": [
        "No native browser prompts, ever. Every save gives visible feedback."
      ],
      "links": [
        {
          "label": "espresso-journal.netlify.app",
          "href": "https://espresso-journal.netlify.app"
        },
        {
          "label": "GitHub",
          "href": "https://github.com/indieNik/espresso-journal"
        }
      ],
      "page": "https://nikhilpatil.in/work/espresso-journal/"
    },
    {
      "slug": "demo-builder",
      "name": "Automated Product Demo Builder",
      "tagline": "A one-page product spec in, a narrated three-minute demo video out.",
      "summary": "A config-driven Python pipeline for hackathon demos. An analysis agent scans the product site, Gemini writes a storyline and script, ElevenLabs voices it, captions are generated from the audio, and ffmpeg assembles the result. Swap the spec file to demo a different product.",
      "category": "Tooling",
      "status": "archived",
      "years": "2026",
      "stack": [
        "Python",
        "Gemini",
        "ElevenLabs",
        "ffmpeg"
      ],
      "highlights": [],
      "links": [
        {
          "label": "GitHub",
          "href": "https://github.com/indieNik/Automated-Product-Demo-Builder"
        }
      ],
      "page": "https://nikhilpatil.in/work/demo-builder/"
    },
    {
      "slug": "oasis-pos",
      "name": "Oasis POS",
      "tagline": "The offline-first Android point of sale my café chain runs on every day.",
      "summary": "A Kotlin and Jetpack Compose app covering the whole operation: menu, cart, UPI and cash checkout, inventory with low-stock alerts, expenses with bill photos, a recipe-driven cost-of-goods engine, a P&L dashboard, thermal receipts, and staff broadcasts. Writes go to Room first and sync to Firestore. Cloud Functions send WhatsApp reminders, verify UPI payments by webhook, and serve a live cockpit for the owner.",
      "category": "Café systems",
      "status": "live",
      "years": "2026 to present",
      "stack": [
        "Kotlin",
        "Jetpack Compose",
        "Room",
        "Hilt",
        "Firebase",
        "Cloud Functions",
        "Gemini",
        "WhatsApp Cloud API",
        "Setu UPI"
      ],
      "highlights": [
        "Gemini reads a supplier bill photo into line items that restock inventory automatically.",
        "Voice orders from Baristalk arrive as a full-screen takeover with an alarm, then convert into a real sale.",
        "A custom Claude Code skill dumps live Firestore data and renders a one-glance cockpit for the business."
      ],
      "links": [
        {
          "label": "Menu board",
          "href": "https://oasis-android-283b2.web.app"
        }
      ],
      "page": "https://nikhilpatil.in/work/oasis-pos/"
    },
    {
      "slug": "club",
      "name": "club by The Jaggery Point",
      "tagline": "A loyalty club where the phone, the counter and the POS share one data plane.",
      "summary": "Scan the table QR, sign in with an email OTP, a passkey or WhatsApp, play a short activity, win a discount, and show a personal QR at the counter. The POS scans it and writes the order back, so visits and rewards accumulate in a loop. The spin wheel outcome is decided on the server and tuned to protect margins. The wheel only animates to it.",
      "category": "Café systems",
      "status": "live",
      "years": "2026 to present",
      "stack": [
        "Angular",
        "NestJS",
        "WebAuthn",
        "Web Push",
        "WhatsApp Cloud API",
        "Firestore",
        "Cloud Run"
      ],
      "highlights": [
        "First run was cut from eight taps to about three after a scripted UX audit measured the waits.",
        "The pass page polls for the scan, so the customer sees a tick before the phone goes back in the pocket."
      ],
      "links": [
        {
          "label": "club.thejaggerypoint.com",
          "href": "https://club.thejaggerypoint.com"
        }
      ],
      "page": "https://nikhilpatil.in/work/club/"
    },
    {
      "slug": "merch",
      "name": "Tea Tee Store",
      "tagline": "A Shopify store replaced with my own Angular SSR, NestJS and Prisma platform.",
      "summary": "Tea-themed t-shirts and hoodies with a full catalog, cart, Razorpay checkout, print-on-demand fulfilment through Qikink webhooks, order tracking, a Google Shopping feed and server-side rendering for search. It moved from AWS to Cloud Run and was folded into The Jaggery Point as its merch store. A Gemini-driven autoresearch loop proposes and A/B tests SEO copy on its own.",
      "category": "Café systems",
      "status": "live",
      "years": "2026",
      "stack": [
        "Angular SSR",
        "NestJS",
        "Prisma",
        "PostgreSQL",
        "Razorpay",
        "Qikink",
        "Playwright",
        "Cloud Run"
      ],
      "highlights": [
        "The most tested repo I own, with Playwright end-to-end flows for auth, cart, checkout and products.",
        "The migration runbook has a section titled where reality differed from the plan. It includes an iptables rule that silently bypassed nginx."
      ],
      "links": [
        {
          "label": "merch.thejaggerypoint.com",
          "href": "https://merch.thejaggerypoint.com"
        }
      ],
      "page": "https://nikhilpatil.in/work/merch/"
    },
    {
      "slug": "oasis-v1",
      "name": "OASIS v1",
      "tagline": "A zero-cost café back office with Google Sheets as the database.",
      "summary": "Operations And Sales Intelligent System. An Angular PWA over an Express API where staff logged sales, closing cash counts and expenses from a phone while I kept the raw data in a spreadsheet I could edit. It ran the shop for two months and became the blueprint for the Android POS.",
      "category": "Café systems",
      "status": "archived",
      "years": "2025 to 2026",
      "stack": [
        "Angular",
        "Express",
        "Google Sheets API",
        "PWA",
        "Vercel"
      ],
      "highlights": [],
      "links": [
        {
          "label": "GitHub",
          "href": "https://github.com/indieNik/oasis-the-jaggery-point"
        }
      ],
      "page": "https://nikhilpatil.in/work/oasis-v1/"
    },
    {
      "slug": "zenith",
      "name": "Zenith",
      "tagline": "An operations portal for Appetite Avenue outlets: orders, analytics, expenses, invoicing and events.",
      "summary": "A unified dashboard for daily operations at Appetite Avenue with Google sign-in, role-based access for admins, staff and event managers, sales trends, top items, and invoicing. Google Sheets acts as the headless backend so the numbers stay in a tool the team already trusts. Gemini handles the parts that need reading and summarising.",
      "category": "Café systems",
      "status": "live",
      "years": "2025 to present",
      "stack": [
        "Angular",
        "Firebase Auth",
        "Google Sheets",
        "Gemini",
        "Netlify"
      ],
      "highlights": [],
      "links": [],
      "page": "https://nikhilpatil.in/work/zenith/"
    },
    {
      "slug": "oversight",
      "name": "OverSight",
      "tagline": "A decision acceleration app for fast fashion executives, built for a 2026 hackathon.",
      "summary": "A mobile-first progressive web app that turns early social signals into stock-keeping decisions in under a minute. Three workflows: a morning signal scan, risk calibration, and competitive response. The strategy folder holds nine numbered documents, from persona to workspace runbook, written before the first line of code.",
      "category": "Hackathon",
      "status": "hackathon",
      "years": "2026",
      "stack": [
        "Python",
        "FastAPI",
        "Angular",
        "PWA",
        "Docker",
        "Netlify"
      ],
      "highlights": [
        "Two rules from the brief: if a feature does not reduce time to decision it does not ship, and if an insight cannot be explained in one sentence it does not surface."
      ],
      "links": [
        {
          "label": "GitHub",
          "href": "https://github.com/indieNik/oversight"
        }
      ],
      "page": "https://nikhilpatil.in/work/oversight/"
    },
    {
      "slug": "genai-avatar",
      "name": "GenAI Avatar Interviewer",
      "tagline": "A speaking avatar that conducts a screening interview, from a 2024 hackathon.",
      "summary": "A Python agent with speech to text and text to speech behind an Angular front end, so a candidate could talk to an AI interviewer with a streaming avatar. An early experiment in voice interfaces that later became PanelPrep.",
      "category": "Hackathon",
      "status": "hackathon",
      "years": "2024",
      "stack": [
        "Python",
        "Angular",
        "OpenAI",
        "HeyGen"
      ],
      "highlights": [],
      "links": [
        {
          "label": "GitHub",
          "href": "https://github.com/indieNik/genai-avatar"
        }
      ],
      "page": "https://nikhilpatil.in/work/genai-avatar/"
    },
    {
      "slug": "langchain-experiments",
      "name": "LangChain experiments",
      "tagline": "Where the AI work started in 2023: searchable YouTube transcripts with FAISS and GPT-3.5.",
      "summary": "Early experiments with LangChain: building a vector index from video transcripts, similarity search with FAISS, and a Slack integration. Small, but it is where the habit of shipping AI things began.",
      "category": "Experiment",
      "status": "archived",
      "years": "2023",
      "stack": [
        "Python",
        "LangChain",
        "FAISS",
        "OpenAI"
      ],
      "highlights": [],
      "links": [
        {
          "label": "GitHub",
          "href": "https://github.com/indieNik/langchain-experiments"
        }
      ],
      "page": "https://nikhilpatil.in/work/langchain-experiments/"
    }
  ],
  "how_i_work": {
    "principles": [
      {
        "title": "Verify live before claiming anything.",
        "body": "A feature is done when it has been exercised in production and the receipt is written down: the revision id, the HTTP status, the object id. Anything not verified is labelled not verified. Status files keep three buckets: claimed and verified, not verified, deliberately incomplete.",
        "evidence": "Run every non-obvious code sample before writing the output down."
      },
      {
        "title": "Push complexity into deterministic code.",
        "body": "Language models are probabilistic and most business logic is not. Directives in Markdown describe intent, an agent orchestrates, and Python or TypeScript does everything that has to be repeatable. The model writes prose and classifies. Code decides.",
        "evidence": "90% accuracy per step is 59% success over five steps. Push complexity into deterministic code."
      },
      {
        "title": "Money rules never live in agent judgment.",
        "body": "Budget caps, kill switches, dry-run defaults and paused-first launches are enforced on the server and pinned by tests that fail if loosened. Automated de-risking is allowed. Automated re-risking is not. Turning real risk on is always a human call.",
        "evidence": "Gemini writes analyst notes only; decisions stay reproducible."
      },
      {
        "title": "Docs ship in the same commit as the code.",
        "body": "Every repo has a CLAUDE.md that an agent reads first, a STATUS file that is read first and updated last, numbered architecture decision records, a changelog, and per-PR notes. A doc update is part of the change, not a follow-up.",
        "evidence": "If you make a decision and there is no ADR for it, you are not done."
      },
      {
        "title": "Dated branches, small pull requests, deploy from main.",
        "body": "Every change gets a branch named with the date. At most a few changes per pull request, squash merged, and deployed before the next batch starts. Merging is the release. Nothing else touches production.",
        "evidence": "Never wait on the user to merge or deploy. Real-capital decisions still flow through the approval system."
      },
      {
        "title": "Never debug in production.",
        "body": "Development builds are forgiving and production builds are strict, so the production build and the tests run locally before every push. Fixes that were needed once become scripts so they are never needed twice.",
        "evidence": "Follow the process. Every. Single. Time."
      },
      {
        "title": "Say what was not done, and why.",
        "body": "Every decision record lists what was deliberately not shipped, what was consciously rejected, and what was deferred rather than rejected. Corrections are appended, never silently rewritten. Stale claims get marked stale.",
        "evidence": "Dead code implying otherwise is worse than none."
      },
      {
        "title": "Secrets stay server-side, and so do prompts.",
        "body": "API keys live in Secret Manager or a gitignored env file, never in a browser bundle or an APK. For voice products the system prompt, voice and tools are locked into a single-use token on the server, so the client can connect but never read or alter them.",
        "evidence": "The browser never sees the key and cannot alter the prompt."
      },
      {
        "title": "Honest copy, human voice.",
        "body": "No invented numbers, no fake scarcity, no marketing filler. Structured data must match the visible text. Copy is linted for em dashes and the vocabulary that gives away machine writing. A claim I cannot stand behind does not ship.",
        "evidence": "No AI-styled language on any user surface. Em dashes called out as the giveaway."
      },
      {
        "title": "Mobile first, one accent colour, no decoration.",
        "body": "Most of my traffic is on phones, so the phone layout comes first. White or near-black surfaces, hairline borders, one accent, system type, motion limited to transform and opacity and silent under reduced motion. No gradients, glass or emoji in product UI.",
        "evidence": "If a feature does not reduce time to decision, it does not ship."
      },
      {
        "title": "Spend is measured, not guessed.",
        "body": "Cloud credits, generation costs, voice minutes and per-tick model calls are tracked to the rupee and written into the status file. Generation freezes are tied to credit expiry dates. Cost per unit is what prices a product.",
        "evidence": "Burn was measured against the live catalog, not guessed."
      },
      {
        "title": "Read the real source instead of guessing.",
        "body": "When a library or vendor behaves unexpectedly, the fix starts by reading its actual source, not by adding a workaround on top of a theory. Environment traps that have already cost time are written down so they are never rediscovered.",
        "evidence": "These have all bitten already. Do not rediscover them."
      }
    ],
    "loop": [
      {
        "step": "Read",
        "detail": "CLAUDE.md, then STATUS.md, then the charter. State before action."
      },
      {
        "step": "Branch",
        "detail": "A dated branch named for the change. Never commit on main."
      },
      {
        "step": "Build",
        "detail": "Directives describe intent. Code carries the logic. Tests pin the money rules."
      },
      {
        "step": "Verify",
        "detail": "Production build and tests locally. Then exercise it live and keep the receipt."
      },
      {
        "step": "Record",
        "detail": "ADR for the decision, changelog entry, STATUS update, all in the same PR."
      },
      {
        "step": "Ship",
        "detail": "Squash merge, deploy from main, and only then start the next batch."
      }
    ],
    "toolbelt": [
      {
        "name": "Claude Code",
        "role": "Primary development environment. Custom skills, scheduled routines, and in one case a trader."
      },
      {
        "name": "Angular",
        "role": "Zoneless, signals, standalone. Aggressive lazy loading and small bundles."
      },
      {
        "name": "FastAPI and NestJS",
        "role": "Backends. Pure modules for anything that has to be unit tested."
      },
      {
        "name": "Google Cloud and Firebase",
        "role": "Cloud Run, Cloud Tasks, Scheduler, Secret Manager, Firestore, Hosting."
      },
      {
        "name": "Gemini",
        "role": "Live audio, vision, text, and Veo for video. Ephemeral tokens for anything in a browser."
      },
      {
        "name": "Kotlin and Compose",
        "role": "The café point of sale. Offline first, Room then Firestore."
      },
      {
        "name": "Astro and Netlify",
        "role": "Static sites with zero client JavaScript, including this one."
      },
      {
        "name": "Playwright and Vitest",
        "role": "Screenshot audits, end-to-end flows, and specs that enforce invariants."
      }
    ]
  },
  "timeline": [
    {
      "when": "2026 Aug",
      "what": "Claude sleeve goes live inside Alphie",
      "detail": "Claude Code places discretionary orders every ten minutes through one endpoint with deterministic risk rails."
    },
    {
      "when": "2026 Jul",
      "what": "Baristalk shipped in five days",
      "detail": "Multi-tenant voice ordering piloted at The Jaggery Point. Domain purchased the same week."
    },
    {
      "when": "2026 Jul",
      "what": "PanelPrep submitted to the NamasteDev hackathon",
      "detail": "Two-voice AI interview panel on Gemini Live."
    },
    {
      "when": "2026 Aug",
      "what": "DhanChakra submitted to Build with Gemini XPRIZE",
      "detail": "An autonomous affiliate loop, documented in numbered decision records from day one."
    },
    {
      "when": "2026 Jun",
      "what": "club by The Jaggery Point launches",
      "detail": "Loyalty club with a QR pass the POS redeems in real time."
    },
    {
      "when": "2026 Mar",
      "what": "Alphie starts trading",
      "detail": "Backtested gap-fade strategy on NSE stocks with a Flutter dashboard."
    },
    {
      "when": "2026 Feb",
      "what": "Oasis POS rebuilt for Android",
      "detail": "Kotlin and Compose, offline first, replacing the Google Sheets version."
    },
    {
      "when": "2026 Jan",
      "what": "Tea Tee Store leaves Shopify",
      "detail": "Own Angular SSR and NestJS platform with Razorpay and print-on-demand."
    },
    {
      "when": "2025 Dec",
      "what": "IgniteAI begins",
      "detail": "A product photo into a finished UGC video ad. Later a Devpost submission and a remote MCP server."
    },
    {
      "when": "2025 Dec",
      "what": "OASIS v1 runs the café on Google Sheets",
      "detail": "Zero-cost back office. Sales, closing cash, expenses."
    },
    {
      "when": "2024 Nov",
      "what": "Zenith announced",
      "detail": "Vision AI receipts into Google Sheets, voice to task, dashboards. Internal tools for my own cafés first."
    },
    {
      "when": "2024 May",
      "what": "Voice avatar interviewer at a hackathon",
      "detail": "Speech in, avatar out. The seed of PanelPrep."
    },
    {
      "when": "2023 Nov",
      "what": "The Jaggery Point",
      "where": "Bengaluru and Belgaum",
      "detail": "A chai café chain built around jaggery chai. Opened November 2023. Started brewing chai, now building systems."
    },
    {
      "when": "2023 May",
      "what": "First LangChain experiments",
      "detail": "Searchable YouTube transcripts with FAISS and GPT-3.5."
    },
    {
      "when": "2023 Jan",
      "what": "Appetite Avenue founded",
      "detail": "Corporate café partnerships. The café your workplace runs on."
    },
    {
      "when": "2021",
      "what": "A run of Medium articles",
      "detail": "Lazy loading images, Ember versus React, Google Sheets automation, a party analogy for auth."
    },
    {
      "when": "2020 Oct",
      "what": "Joined Publicis Sapient",
      "where": "Bengaluru",
      "detail": "Frontend, then lead engineer."
    },
    {
      "when": "2017 Dec",
      "what": "How hard can Angular 5 be?",
      "detail": "A checklist PWA in four days, and the first Medium post."
    },
    {
      "when": "2015",
      "what": "Graduated",
      "where": "KLS Gogte Institute of Technology, Belgaum",
      "detail": "B.E. Information Science. ACM chapter coordinator, Firefox Student Ambassador."
    },
    {
      "when": "2014 Apr",
      "what": "Joined GitHub as indieNik",
      "detail": "Here to make the web a beautiful place."
    }
  ],
  "writing": [
    {
      "title": "Enrolling in the Medium Partner Program: A New Chapter for Indian Writers",
      "href": "https://medium.com/indienik/enrolling-in-the-medium-partner-program-cf6b9dfd7786",
      "date": "2024-08-23",
      "summary": "Why the Partner Program opening to India matters, and how the setup works.",
      "source": "Medium"
    },
    {
      "title": "How to lazy load your images?",
      "href": "https://medium.com/indienik/how-to-lazy-load-your-images-87ce77b3f437",
      "date": "2021-10-29",
      "summary": "Three approaches to lazy loading, and the src and data-src pattern behind them.",
      "source": "Medium"
    },
    {
      "title": "Ember.js vs React.js: when to use what?",
      "href": "https://medium.com/indienik/ember-js-vs-react-js-when-to-use-what-ebe8d7c2fa58",
      "date": "2021-10-27",
      "summary": "Right tool for the task. React versus Glimmer is the fairer comparison.",
      "source": "Medium"
    },
    {
      "title": "I automated an hour long process within seconds using Google Sheets",
      "href": "https://medium.com/indienik/automate-an-hour-long-process-within-seconds-using-google-sheets-4a6b9d825999",
      "date": "2021-10-25",
      "summary": "Apps Script pulls ad leads into Sheets every two hours with geocoding. An hour of work became twenty seconds.",
      "source": "Medium"
    },
    {
      "title": "A party analogy to understand authentication vs authorisation",
      "href": "https://medium.com/indienik/a-party-analogy-to-understand-authentication-vs-authorisation-e1e4557eb837",
      "date": "2021-10-23",
      "summary": "A nightclub door explains 401 versus 403.",
      "source": "Medium"
    },
    {
      "title": "How to improve performance of an Angular application by optimising images?",
      "href": "https://medium.com/indienik/how-to-improve-performance-of-an-angular-application-by-optimising-images-1cce034f87dd",
      "date": "2020-06-06",
      "summary": "Image optimisation as the cheapest performance win.",
      "source": "Medium"
    },
    {
      "title": "How hard can Angular (4/5/6) be?",
      "href": "https://medium.com/indienik/how-hard-can-angular-4-5-6-be-ec75c0833a99",
      "date": "2017-12-09",
      "summary": "An Angular and Firebase checklist PWA built in four days.",
      "source": "Medium"
    }
  ],
  "agent_surfaces": {
    "llms_txt": "https://nikhilpatil.in/llms.txt",
    "llms_full_txt": "https://nikhilpatil.in/llms-full.txt",
    "me_json": "https://nikhilpatil.in/me.json",
    "mcp": "https://nikhilpatil.in/mcp",
    "agent_card": "https://nikhilpatil.in/.well-known/agent-card.json",
    "rss": "https://nikhilpatil.in/rss.xml",
    "sitemap": "https://nikhilpatil.in/sitemap-index.xml"
  }
}