{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "version": 1,
  "generated_at": "2026-09-08T17:34:27.875Z",
  "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": [
      "Senior Experience 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 senior experience 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",
      "devpost": "https://devpost.com/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 AI-traded sleeve inside deterministic rails, on NSE stocks.",
      "summary": "Claude trades a discretionary sleeve of NIFTY 50 stocks from a small GCP VM. A single session runs each trading day, resumed once a minute from 09:15 to 15:15 IST, carrying the whole day in memory; it reads the tape, its own rolling record and the day's rails, then manages at most one bracket trade: a stop 0.7% from entry, and once the trade is 0.2% in profit a trailing stop arms and tightens toward the price every five seconds. Server-side code bounds every number it picks: notional per trade, one position at a time, trades per day, a daily loss halt and a cumulative kill switch that only I can reopen. The backtested gap-fade strategy Alphie started as still runs its whole pipeline each morning, on paper only, so its evidence keeps accruing without money on it.",
      "category": "Autonomous system",
      "status": "live",
      "years": "2026 to present",
      "stack": [
        "Python",
        "FastAPI",
        "APScheduler",
        "Zerodha Kite",
        "Flutter",
        "Firestore",
        "Gemini",
        "Claude Code",
        "GCP"
      ],
      "highlights": [
        "The model picks the trade, tested code picks the limits. Rails run server-side and fail closed, so a session that wants more cannot argue its way past them.",
        "Every session closes itself: a data snapshot committed to the repo, an emailed brief, and a critique written by a scheduled Claude Code routine. The evidence loop runs whether or not I read it.",
        "Gap fade was demoted to paper rather than deleted, so its shadow experiments keep scoring against simulated fills while the sleeve carries the risk."
      ],
      "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": "stackos",
      "name": "Stack It Your Way",
      "tagline": "A build-your-own burger PWA for Stackos Burgers: scan, stack, name it, show the code at the counter.",
      "summary": "A customer scans the table QR, picks a patty, one mayo, one sauce and up to four toppings, watches the burger stack up as they choose, names it, and gets an order code for the counter. No backend and no accounts: the page is the order slip. One HTML file with the menu at the top of the script so the owner can change it, a service worker so it opens offline, and an A4 flyer with the QR for the tables. Built for a client in a weekend.",
      "category": "Client project",
      "status": "live",
      "years": "2026",
      "stack": [
        "HTML",
        "CSS",
        "JavaScript",
        "PWA",
        "Service Worker",
        "Netlify"
      ],
      "highlights": [
        "The brand mark has its letterforms baked into SVG paths, so the logo renders the same everywhere without loading a web font.",
        "The icons, share card, table QR and print flyer are all generated by scripts in the repo, so a logo change is one command."
      ],
      "links": [
        {
          "label": "stackos-burgers.netlify.app",
          "href": "https://stackos-burgers.netlify.app"
        },
        {
          "label": "GitHub",
          "href": "https://github.com/indieNik/stackos-burger-customiser"
        }
      ],
      "page": "https://nikhilpatil.in/work/stackos/"
    },
    {
      "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 Sep",
      "what": "First client project: Stack It Your Way for Stackos Burgers",
      "detail": "A build-your-own burger PWA with a QR flyer for the tables. No backend; the page is the order slip."
    },
    {
      "when": "2026 Sep",
      "what": "Alphie re-centres on the AI sleeve",
      "detail": "The AI-traded sleeve becomes the only live book. Gap fade keeps running on paper."
    },
    {
      "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": "2021 Sep",
      "what": "Joined Publicis Sapient",
      "where": "Bengaluru",
      "detail": "Senior Associate Technology, then Senior Experience Engineer from September 2023."
    },
    {
      "when": "2019 Sep",
      "what": "Openapp",
      "where": "Bengaluru",
      "detail": "Senior frontend developer on smart locks and the Tusk smart home range, then product manager."
    },
    {
      "when": "2017 Dec",
      "what": "How hard can Angular 5 be?",
      "detail": "A checklist PWA in four days, and the first Medium post."
    },
    {
      "when": "2016 Jan",
      "what": "First job, Persistent Systems",
      "where": "Goa",
      "detail": "Ember components and Cucumber automation for a cognitive automation system."
    },
    {
      "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"
    }
  ],
  "cv": {
    "page": "https://nikhilpatil.in/cv/",
    "pdf": "https://nikhilpatil.in/cv.pdf",
    "full_page": "https://nikhilpatil.in/cv/full/",
    "full_pdf": "https://nikhilpatil.in/cv-full.pdf",
    "note": "The two-page CV is at page and pdf. The comprehensive one is at full_page and full_pdf. The data below is the comprehensive set.",
    "summary": "Product-minded engineer in Bengaluru with about ten years of frontend and full-stack work, most recently at Publicis Sapient on insurance and payments front ends for a UK client. Outside work I run a chai café chain and a corporate café business, and I build the software they run on. Since late 2025 most of my own work has been AI products and autonomous systems that touch real money, so the engineering is about guardrails as much as models. I work with Claude Code as my primary development environment and write everything down: CLAUDE.md, status files, decision records.",
    "skills": [
      {
        "group": "AI systems",
        "items": [
          "Claude Code",
          "Gemini Live, vision and Veo",
          "MCP servers",
          "LangGraph and LangChain",
          "Agent guardrails in deterministic code"
        ]
      },
      {
        "group": "Frontend",
        "items": [
          "Angular (zoneless, signals)",
          "TypeScript",
          "RxJS",
          "PWA and service workers",
          "SCSS and BEM",
          "Web Components (Stencil)",
          "Ember.js",
          "D3.js"
        ]
      },
      {
        "group": "Backend",
        "items": [
          "FastAPI",
          "NestJS",
          "Node and Express",
          "Java",
          "Ruby on Rails",
          "Django",
          "Prisma and PostgreSQL"
        ]
      },
      {
        "group": "Cloud",
        "items": [
          "Google Cloud Run, Tasks, Scheduler, Secret Manager",
          "Firebase and Firestore",
          "Netlify",
          "Vercel",
          "Docker"
        ]
      },
      {
        "group": "Mobile",
        "items": [
          "Kotlin and Jetpack Compose",
          "Flutter",
          "Offline-first sync"
        ]
      },
      {
        "group": "Testing",
        "items": [
          "Playwright",
          "Vitest",
          "pytest",
          "Cucumber (BDD)"
        ]
      },
      {
        "group": "Product",
        "items": [
          "Roadmaps and trade-offs",
          "Running two food businesses",
          "Franchise and operations tooling",
          "Razorpay and UPI payments",
          "Meta and Instagram APIs"
        ]
      }
    ],
    "experience": [
      {
        "name": "Publicis Sapient",
        "where": "Bengaluru",
        "roles": [
          {
            "title": "Senior Experience Engineer",
            "from": "2023 Sep",
            "to": "present",
            "bullets": [
              "Senior Angular developer on the team for The AA, a UK motoring and insurance company.",
              "Maintain the front ends for the home, car and breakdown insurance products.",
              "Helped launch a spread-payment platform under a tight deadline: email templates, CMS changes and component styling.",
              "Built part of the mobile mechanics journey, where a customer books a mobile garage nearby.",
              "Proposed product improvements from the user journeys. A cross-sell on the route planner shipped."
            ],
            "stack": [
              "Angular",
              "TypeScript",
              "SCSS"
            ],
            "keep": 3
          },
          {
            "title": "Senior Associate Technology L1",
            "from": "2021 Sep",
            "to": "2023 Aug",
            "bullets": [
              "Moved from startups to a large consultancy. Client: IBM, on the Sterling Order Management call centre product."
            ],
            "stack": [
              "Angular",
              "Java"
            ],
            "keep": 1
          }
        ]
      },
      {
        "name": "Openapp",
        "where": "Bengaluru",
        "note": "Open Appliances designs and sells smart locks and, later, the Tusk smart home range.",
        "roles": [
          {
            "title": "Product Manager",
            "from": "2020 Oct",
            "to": "2021 Aug",
            "bullets": [
              "Ran Tusk Smart with a team of four engineers, a smart home app on Android and iOS that onboards devices from several brands.",
              "Ran the Tusk micro-franchise programme with development, sales, operations and marketing, growing a network of franchise owners across India within six months.",
              "Kept building alongside: customer dashboards, a GPS dashboard, operations consoles, an e-commerce site and the company websites."
            ],
            "stack": [
              "Angular",
              "SCSS",
              "Tailwind",
              "Notion",
              "Miro"
            ]
          },
          {
            "title": "Senior Frontend Developer",
            "from": "2019 Sep",
            "to": "2020 Oct",
            "bullets": [
              "Rebuilt the company website in Angular 9 and built the Tusk subscription site in Angular 8.",
              "Built the operations console for payment reminders, invoices and installation scheduling.",
              "Unlocked the company's Bluetooth padlocks from a browser with Web Bluetooth over their encrypted channel.",
              "Wrote a WhatsApp bot on the WhatsApp API through Twilio, in Node."
            ],
            "stack": [
              "Angular",
              "Bootstrap 4",
              "SCSS",
              "Node",
              "Web Bluetooth"
            ]
          }
        ]
      },
      {
        "name": "Engagedly",
        "where": "Bengaluru",
        "note": "Performance management software: reviews, 360 feedback, goals.",
        "roles": [
          {
            "title": "Senior Software Engineer, Frontend",
            "from": "2018 Nov",
            "to": "2019 Sep",
            "bullets": [
              "Built framework-independent web components with Stencil, including an in-house charting library on D3.",
              "Introduced BEM across the codebase and wrote the style guide so the UI stayed consistent.",
              "Designed and built a goal hierarchy chart in D3, and implemented the new performance and home dashboards from Sketch files.",
              "Was the go-to for anything frontend and for web standards."
            ],
            "stack": [
              "JavaScript",
              "CoffeeScript",
              "Backbone.js",
              "Stencil",
              "D3.js",
              "HAML",
              "SCSS"
            ]
          }
        ]
      },
      {
        "name": "Persistent Systems",
        "where": "Goa",
        "brief": true,
        "roles": [
          {
            "title": "Project Engineer",
            "from": "2018 Jan",
            "to": "2018 Nov",
            "bullets": [
              "Risk-based continuous patch management: an automated system that deploys and manages patches on registered endpoints through IBM BigFix."
            ],
            "stack": [
              "Ember.js",
              "Ruby on Rails"
            ]
          },
          {
            "title": "Software Engineer",
            "from": "2016 Jan",
            "to": "2017 Dec",
            "bullets": [
              "Built Ember components in a distributed cognitive automation system that installed middleware on any endpoint on demand, with a team spread across countries and a client in Singapore.",
              "Wrote the end-to-end Cucumber test automation for the Ember app, and Chef recipes that reset system state after every run."
            ],
            "stack": [
              "Ember.js",
              "Cucumber",
              "Chef",
              "Git"
            ]
          }
        ]
      },
      {
        "name": "WorkIndia",
        "where": "Mumbai",
        "brief": true,
        "roles": [
          {
            "title": "Software Developer",
            "from": "2015 Nov",
            "to": "2015 Dec",
            "bullets": [
              "Back-end features, UI fixes and bug fixes on a Django job-matching site."
            ],
            "stack": [
              "Python",
              "Django"
            ]
          }
        ]
      },
      {
        "name": "Advanced Byte Technologies",
        "where": "Belagavi",
        "brief": true,
        "roles": [
          {
            "title": "Co-founder",
            "from": "2014 Nov",
            "to": "2015 Oct",
            "bullets": [
              "A small web studio. Found the clients, scoped the work, designed and built their sites end to end."
            ],
            "stack": [
              "Laravel",
              "Bootstrap",
              "JavaScript"
            ]
          }
        ]
      },
      {
        "name": "Shreshta IT Technologies",
        "where": "Belagavi",
        "brief": true,
        "roles": [
          {
            "title": "Intern",
            "from": "2014 Jun",
            "to": "2014 Dec",
            "bullets": [
              "Linux: Nagios monitoring with the NRPE plugin, a Squid proxy for content filtering and caching, firewall rules."
            ]
          }
        ]
      }
    ],
    "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"
      }
    ],
    "education": [
      {
        "what": "B.E., Information Science and Engineering",
        "where": "KLS Gogte Institute of Technology, Belgaum",
        "years": "2011 to 2015",
        "detail": "ACM student chapter coordinator. Firefox Student Ambassador."
      },
      {
        "what": "Master's Program in Artificial Intelligence",
        "where": "Simplilearn",
        "years": "2019 to 2021"
      }
    ],
    "hackathons": [
      {
        "project": "DhanChakra",
        "slug": "dhanchakra",
        "event": "Build with Gemini XPRIZE",
        "when": "2026 Aug",
        "page": "https://nikhilpatil.in/work/dhanchakra/"
      },
      {
        "project": "PanelPrep",
        "slug": "panelprep",
        "event": "NamasteDev hackathon",
        "when": "2026 Jul",
        "page": "https://nikhilpatil.in/work/panelprep/"
      },
      {
        "project": "IgniteAds",
        "slug": "igniteads",
        "event": "Google Cloud Rapid Agent Hackathon",
        "when": "2026 Jun",
        "page": "https://nikhilpatil.in/work/igniteads/"
      },
      {
        "project": "IgniteAI",
        "slug": "igniteai",
        "event": "Gemini 3 Hackathon, AI For Good",
        "when": "2026 Feb",
        "page": "https://nikhilpatil.in/work/igniteai/"
      },
      {
        "project": "OverSight",
        "slug": "oversight",
        "event": "a hackathon on fast-fashion decisions",
        "when": "2026",
        "page": "https://nikhilpatil.in/work/oversight/"
      },
      {
        "project": "GenAI Avatar Interviewer",
        "slug": "genai-avatar",
        "event": "Speed hackathon",
        "when": "2024 May",
        "page": "https://nikhilpatil.in/work/genai-avatar/"
      }
    ],
    "community": [
      "Coursera mentor for the Ruby on Rails introduction course, Feb to Jun 2017. Answered learner questions and fed back to Coursera staff.",
      "Led the health and fitness club at the Publicis Sapient Bengaluru office and organised a mental wellness day."
    ],
    "honours": [
      "TCS CodeVita",
      "Coursera mentor, Ruby on Rails: An Introduction"
    ],
    "courses": [
      "Programming Foundations: Web Security (2019)",
      "Design Thinking: Understanding the Process",
      "The Secret to Better Decisions: Stop Hoarding Chips",
      "Be the Manager People Won't Leave"
    ],
    "languages": [
      "English",
      "Hindi",
      "Kannada",
      "Telugu",
      "Marathi"
    ],
    "interests": [
      "Beatboxing",
      "Chai and espresso",
      "Photography",
      "Short verses on YourQuote since 2017"
    ],
    "contact": "https://nikhilpatil.in/contact/"
  },
  "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",
    "cv_pdf": "https://nikhilpatil.in/cv.pdf",
    "cv_full_pdf": "https://nikhilpatil.in/cv-full.pdf"
  }
}