{
  "name": "Hardik Zinzuvadiya",
  "role": "I build and ship ERP.",
  "location": "India",
  "url": "https://hardikzinzu.com",
  "email": "hardiktech7@gmail.com",
  "booking": "https://cal.com/hardikzinzu/30min",
  "availability": "Remote from India",
  "summary": "ERPNext specialist and AI software engineer. Five years inside Frappe and ERPNext. Certified Frappe Developer and Software Engineer II. I build AI agents that draft inside the ERP, the custom apps around them, and the servers that keep them up.",
  "certification": {
    "title": "Certified Frappe Developer",
    "issuer": "Frappe Technologies",
    "when": "March 2025"
  },
  "evidence": [
    {
      "label": "Eight merged pull requests across five Frappe repositories",
      "href": "https://github.com/frappe/frappe/pulls?q=is%3Apr+author%3AZ4nzu+is%3Aclosed"
    },
    {
      "label": "Claude 101, Anthropic course completion, September 2026",
      "href": "https://academy.claude.com/verify/81be141f08e43e3f4d0d930cbb634b49"
    },
    {
      "label": "TryHackMe, security practice after hours",
      "href": "https://tryhackme.com/p/hardikzinzu"
    },
    {
      "label": "Writing on Medium",
      "href": "https://medium.com/@hardikzinzu"
    },
    {
      "label": "Frappe forum",
      "href": "https://discuss.frappe.io/u/hardik_zinzu"
    },
    {
      "label": "GitHub",
      "href": "https://github.com/Z4nzu"
    }
  ],
  "profiles": {
    "github": "https://github.com/Z4nzu",
    "linkedin": "https://linkedin.com/in/hardikzinzu",
    "medium": "https://medium.com/@hardikzinzu",
    "frappe": "https://discuss.frappe.io/u/hardik_zinzu",
    "youtube": "https://www.youtube.com/@hardikzinzu",
    "tryhackme": "https://tryhackme.com/p/hardikzinzu"
  },
  "capabilities": [
    {
      "title": "Servers, hosting and hardening",
      "body": "Two application servers, a primary MariaDB with a replica ready to take over, Docker, CI/CD and Grafana alerting, with hardening as the baseline.",
      "url": "https://hardikzinzu.com/work/ha-infrastructure/"
    },
    {
      "title": "Version migrations and upgrades",
      "body": "Compatibility audit of your custom apps, a migration rehearsed on a copy of production, data validation and a tested rollback plan.",
      "url": "https://hardikzinzu.com/services/migration/"
    },
    {
      "title": "Custom Frappe apps and features",
      "body": "Features ERPNext does not have, built as proper Frappe apps that survive upgrades instead of patches to core.",
      "url": "https://hardikzinzu.com/services/custom-apps/"
    },
    {
      "title": "Integrations and syncs",
      "body": "Shopify, payment gateways, WhatsApp Business, e-invoicing and any REST or GraphQL API, with idempotent syncs and visible error queues.",
      "url": "https://hardikzinzu.com/work/shopify-erpnext-suite/"
    },
    {
      "title": "AI agents inside the ERP",
      "body": "Assistants that answer from live ERP data and draft records for a person to approve, bounded by permissions and cost ceilings.",
      "url": "https://hardikzinzu.com/work/frappe-copilot/"
    },
    {
      "title": "Backend services and APIs",
      "body": "The Python services and servers underneath: background workers, schedulers and push delivery from your own infrastructure.",
      "url": "https://hardikzinzu.com/work/web-push-notifications/"
    },
    {
      "title": "Database and query work",
      "body": "MariaDB and PostgreSQL under real volume: slow queries, indexes and background workers, measured before and after."
    },
    {
      "title": "Code review and contribution",
      "body": "Contributor to Frappe and ERPNext. AI writes a lot of the first draft here; every line still passes a review, a test and a security check.",
      "url": "https://github.com/frappe/frappe/pull/31371"
    }
  ],
  "services": [
    {
      "title": "ERPNext implementation and setup for your company",
      "body": "A production-ready ERPNext on AWS, GCP, Azure or your own servers, configured for how your business actually runs: companies, warehouses, workflows, print formats and users.",
      "url": "https://hardikzinzu.com/services/implementation/",
      "scope": [
        "Hosting on AWS, GCP, Azure or your own servers",
        "Companies, warehouses and users set up the way you operate",
        "Workflows and approvals",
        "Print formats and documents",
        "Imports rehearsed on a copy of the site and validated before go-live"
      ]
    },
    {
      "title": "Custom Frappe apps and ERPNext features",
      "body": "Features your team needs and ERPNext does not have, built as proper Frappe apps that survive upgrades: monitors, approval flows, document automation, dashboards.",
      "url": "https://hardikzinzu.com/services/custom-apps/",
      "scope": [
        "Monitors and dashboards",
        "Approval flows",
        "Document automation",
        "Features ERPNext does not have, built as proper Frappe apps",
        "Tested on ERPNext v14 to v16"
      ]
    },
    {
      "title": "Workflow automation and approvals",
      "body": "Approvals that reach the person who has to decide, document events that fire the next step, and scheduled jobs nobody has to remember, all under your permission rules.",
      "url": "https://hardikzinzu.com/services/workflow-automation/",
      "scope": [
        "Approval inboxes: approve, deny, edit or snooze, with what happens on each spelled out",
        "Triggers on schedules, document events, date fields, webhooks, inbound email or by hand",
        "Notifications to the people who have to act, not to everyone",
        "Every step runs as a real Frappe user, under the permission policy",
        "Runs you can review before they are armed, and pause mid-way"
      ]
    },
    {
      "title": "Reports and dashboards",
      "body": "The number your team asks for every week, on a page that answers it: stock per warehouse, every order against its status, what is overdue and what to do about it.",
      "url": "https://hardikzinzu.com/services/reports-dashboards/",
      "scope": [
        "Query and script reports, with the filters people actually use",
        "Role-based dashboards: one page per job, not one page for everyone",
        "Stat cards counted from real records, with quick filters over them",
        "Exception boards, where every problem is a record with a bucket and one next action",
        "Tested on ERPNext v14 to v16"
      ]
    },
    {
      "title": "Integrations",
      "body": "Shopify, payment gateways, WhatsApp Business, government e-invoicing, sFTP and any REST or GraphQL API, with idempotent syncs and visible error queues.",
      "url": "https://hardikzinzu.com/services/integrations/",
      "scope": [
        "Shopify orders, stock and invoices",
        "Payment gateways",
        "WhatsApp Business",
        "Government e-invoicing",
        "sFTP and any REST or GraphQL API",
        "Idempotent syncs and visible error queues"
      ]
    },
    {
      "title": "ERPNext version migration and upgrades",
      "body": "Compatibility audits of your custom apps, rehearsed migrations on a copy of production, data validation and a tested rollback plan.",
      "url": "https://hardikzinzu.com/services/migration/",
      "scope": [
        "Compatibility audit of custom apps",
        "Rehearsed migration on a copy of production",
        "Data validation",
        "Tested rollback plan",
        "Odoo v13 to v19 migrations too"
      ]
    },
    {
      "title": "Odoo customisation and migration",
      "body": "Custom modules, report and invoice templates, integrations and version upgrades, in Community and Enterprise, from Odoo v13 to v19.",
      "url": "https://hardikzinzu.com/services/odoo/",
      "scope": [
        "Custom modules across Sales, Purchase, Stock, Accounting, CRM, Planning, Maintenance, Repair and Field Service",
        "Report and document templates: order confirmations, invoices and receipts, including DIN 5008 and Swiss layouts",
        "Website, eCommerce and eLearning customisation, down to checkout rules and course access",
        "Version migration in both editions, v13 through v19, with your custom modules carried forward and re-tested",
        "Integrations: WhatsApp messaging from CRM and Sales, payment gateways, and REST or file-based feeds",
        "Odoo Online, Odoo.sh and your own servers, including deployment and the pipeline around it"
      ]
    },
    {
      "title": "Hosting, high availability and monitoring",
      "body": "Two application servers, a primary MariaDB with a replica ready to take over, Docker, CI/CD and Grafana alerting, with hardening as the baseline.",
      "url": "https://hardikzinzu.com/services/hosting/",
      "scope": [
        "Two application servers: one for the people using the system, one for API traffic and frequent cron",
        "A primary MariaDB with a replica kept in sync and promoted when the primary fails",
        "AWS, Azure or GCP — DNS, SSL, backups and scaling — or your own hardware",
        "Docker images and Compose environments tuned for build and runtime, deployed by CI/CD without downtime",
        "Grafana and Prometheus on every environment, alerting on symptoms users would feel, not on every metric",
        "Key-only SSH, host firewalls, least-privilege database users, and backups restored on a schedule rather than only taken"
      ]
    },
    {
      "title": "AI agents and document automation inside your ERP",
      "body": "Assistants that answer from live ERP data and draft records for human approval, invoice and PDF extraction with review, bounded by permissions and cost ceilings.",
      "url": "https://hardikzinzu.com/services/ai-agents/",
      "scope": [
        "An agent in the Desk that answers from live records — aggregations, search, link tracing and saved reports — with no vector index to keep in step",
        "Digital and scanned PDFs, photos and e-invoices read into draft Purchase Invoices and Expense Claims",
        "Supplier and line-item matching, totals checks and a confidence score on every extraction",
        "Every write is a draft a person approves, denies or edits; nothing posts on its own",
        "Several LLM providers behind one interface, with failover, so one outage is not your outage",
        "Bounded by the same permission rules as the user behind it, and by a cost ceiling you set"
      ]
    },
    {
      "title": "Support and maintenance",
      "body": "Bug fixes, performance work, upgrades and proactive monitoring for ERP systems already in production.",
      "url": "https://hardikzinzu.com/services/support/",
      "scope": [
        "Bug fixes and performance work on the system you are running now, custom apps included",
        "Version upgrades planned as a rehearsal on a copy of production, not as an evening's work",
        "Custom apps kept working across upgrades — the part that breaks when a major version lands",
        "Monitoring and alerting that pages on what users would feel, with a runbook per environment",
        "Backups verified by restoring them on a schedule",
        "Taking over a system somebody else built, starting with a read of what is actually installed"
      ]
    }
  ],
  "industries": [
    {
      "name": "Manufacturing",
      "line": "End-to-end ERPNext for a bakery manufacturer: production, stock and invoicing on a primary and replica pair.",
      "url": "https://hardikzinzu.com/services/implementation/"
    },
    {
      "name": "Distribution and logistics",
      "line": "A trading business with thousands of SKUs across warehouses, and freight handling for international shipments.",
      "url": "https://hardikzinzu.com/services/implementation/"
    },
    {
      "name": "Retail and e-commerce",
      "line": "Shopify orders becoming submitted Sales Orders, Invoices and Delivery Notes on a schedule.",
      "url": "https://hardikzinzu.com/work/shopify-erpnext-suite/"
    },
    {
      "name": "Service and hospitality",
      "line": "ERPNext and custom Frappe apps for service businesses. These engagements are not published.",
      "url": "https://hardikzinzu.com/services/custom-apps/"
    }
  ],
  "stack": [
    {
      "group": "ERP",
      "name": "Frappe / ERPNext",
      "level": "Expert"
    },
    {
      "group": "ERP",
      "name": "Odoo",
      "level": "Expert"
    },
    {
      "group": "ERP",
      "name": "Version migrations and upgrades",
      "level": "Expert"
    },
    {
      "group": "Backend",
      "name": "Python",
      "level": "Expert"
    },
    {
      "group": "Backend",
      "name": "Django",
      "level": "Experienced"
    },
    {
      "group": "Backend",
      "name": "Flask / FastAPI",
      "level": "Familiar"
    },
    {
      "group": "Backend",
      "name": "unittest / Playwright",
      "level": "Experienced"
    },
    {
      "group": "Backend",
      "name": "pytest",
      "level": "Familiar"
    },
    {
      "group": "Backend",
      "name": "REST / GraphQL / XML-RPC",
      "level": "Expert"
    },
    {
      "group": "Backend",
      "name": "AI agents and chatbots",
      "level": "Experienced"
    },
    {
      "group": "Data",
      "name": "MariaDB / PostgreSQL",
      "level": "Expert"
    },
    {
      "group": "Data",
      "name": "Redis / MongoDB",
      "level": "Experienced"
    },
    {
      "group": "DevOps and cloud",
      "name": "Containerization",
      "level": "Expert"
    },
    {
      "group": "DevOps and cloud",
      "name": "Nginx",
      "level": "Expert"
    },
    {
      "group": "DevOps and cloud",
      "name": "AWS / GCP / Azure",
      "level": "Expert"
    },
    {
      "group": "DevOps and cloud",
      "name": "CI/CD",
      "level": "Experienced"
    },
    {
      "group": "DevOps and cloud",
      "name": "Grafana / Prometheus",
      "level": "Experienced"
    },
    {
      "group": "DevOps and cloud",
      "name": "Automation",
      "level": "Experienced"
    },
    {
      "group": "DevOps and cloud",
      "name": "Git",
      "level": "Expert"
    },
    {
      "group": "Frontend",
      "name": "JavaScript",
      "level": "Expert"
    },
    {
      "group": "Frontend",
      "name": "React",
      "level": "Experienced"
    },
    {
      "group": "Frontend",
      "name": "HTML / CSS",
      "level": "Expert"
    }
  ],
  "timeline": [
    {
      "when": "Oct 2022 – present",
      "what": "Software Engineer II, Application Practice",
      "where": "Limendo India, Ahmedabad (hybrid, Italy HQ projects)"
    },
    {
      "when": "Jun – Sep 2022",
      "what": "Software Engineer",
      "where": "HCL Technologies, Noida"
    },
    {
      "when": "Mar 2021 – May 2022",
      "what": "Python and ERP Developer",
      "where": "Tecblic, Ahmedabad"
    },
    {
      "when": "2018 – 2021",
      "what": "BE, Information Technology",
      "where": "Gujarat Technological University"
    },
    {
      "when": "2015 – 2018",
      "what": "Diploma, Information Technology",
      "where": "Gujarat Technological University"
    }
  ],
  "work": [
    {
      "id": "frappe-copilot",
      "title": "Frappe Copilot",
      "category": "product",
      "status": "alpha",
      "outcome": "An AI agent inside ERPNext that answers from live data and drafts records for human approval.",
      "description": "Frappe Copilot is an AI agent that lives inside ERPNext: ask questions in plain language, turn invoices into records, and approve every write before it lands.",
      "date": "2026-08-15",
      "stack": [
        "Python",
        "Frappe v15/v16",
        "React",
        "SSE streaming"
      ],
      "headline": {
        "value": "28",
        "label": "tools the agent can call"
      },
      "numbers": [
        {
          "value": "6",
          "label": "LLM providers with automatic failover"
        }
      ],
      "highlights": [
        {
          "title": "Agent",
          "items": [
            "Chat inside the Desk that plans, calls tools, reads results and repeats until done",
            "28 tools for reading, analysing, drafting, extracting and navigating",
            "Skills are records: write one in the Desk and the next message already uses it",
            "Each skill can carry knowledge sources: your notes, a documentation URL, or a scan of a DocType",
            "Book this invoice: reads the PDF, matches supplier and items, drafts, asks for approval",
            "Mention any document with @ to pull it into the prompt"
          ]
        },
        {
          "title": "Routing, caching and failover",
          "items": [
            "An intent router reads the message first and picks the smallest tool and skill set the executor will see",
            "It ships off, and returning nothing is a supported answer, so an install behaves the same until you turn it on",
            "Greetings and acknowledgements never reach it, so the cheapest messages cost no routing call",
            "Prompt caching pins the stable layers: identity and moderation, then the skills block, then the tool catalogue",
            "Long conversations compact themselves past 60% of the token budget; the last eight messages stay verbatim",
            "The compacted block keeps figures bound to the tool and filter that produced them, so the next turn recovers state instead of re-reading prose",
            "Rate limits and outages move to the next provider mid-run; an auth failure skips that provider outright"
          ]
        },
        {
          "title": "Answers",
          "items": [
            "Records, aggregations, full-text search, document link tracing and saved reports",
            "Sentences, sortable tables or charts, streamed over SSE as real UI components",
            "No vector index to maintain and no stale copy of the database",
            "Compact tool results use 40-60% fewer tokens than JSON"
          ]
        },
        {
          "title": "Extraction",
          "items": [
            "Digital and scanned PDFs, photos and FatturaPA e-invoices become Purchase Invoices",
            "Expense Claims from receipts through the same review card",
            "Supplier and line-item matching, totals checks, confidence scores",
            "Uncertain lines show ranked candidates; nothing is silently guessed"
          ]
        },
        {
          "title": "Control",
          "items": [
            "Runs as the logged-in user: if you cannot open a record, Copilot cannot either",
            "PrivacyGate masks sensitive fields before any prompt leaves the server",
            "Every write is a draft card; nothing changes until you approve",
            "A dry run validates each draft first, so errors show before you confirm",
            "Analysis runs in a sandbox: restricted Python, masked output, and a rollback even on success",
            "Admin centre: setup wizard, usage, traces, per-user quotas",
            "Prompts are versioned records, moved from draft to canary to active to retired"
          ]
        }
      ],
      "url": "https://hardikzinzu.com/work/frappe-copilot/"
    },
    {
      "id": "shopify-erpnext-suite",
      "title": "Shopify to ERPNext operations suite",
      "category": "integration",
      "status": "production",
      "outcome": "Shopify orders become submitted Sales Orders, Invoices and Delivery Notes on a schedule, with monitors for orders and products.",
      "description": "Shopify to ERPNext integration: scheduled one-way order sync into Sales Orders, Invoices and Delivery Notes, with Order and Product monitors on the Desk.",
      "date": "2026-05-26",
      "stack": [
        "Python",
        "Frappe v16",
        "ERPNext",
        "Shopify REST 2025-10",
        "Shopify GraphQL",
        "Redis",
        "RQ background jobs",
        "MariaDB"
      ],
      "highlights": [
        {
          "title": "Order sync",
          "items": [
            "Shopify order becomes a submitted Sales Order; a Sales Invoice follows once paid",
            "Delivery Note when Shopify reports a successful fulfilment, partials included",
            "Cancellation in Shopify unwinds the order, all or nothing, only if nothing shipped",
            "Shopify quantity variants map to pack sizes on one item via Item Sales Pack",
            "Keyed on the Shopify order id: re-running a window never duplicates a document"
          ]
        },
        {
          "title": "Monitors",
          "items": [
            "Order Monitor reads Shopify and checks each order against ERPNext documents",
            "Sync, Re-sync and Import historical orders from the card",
            "Product Monitor with Shopify, ERPNext and Inventory tabs and bulk sync",
            "Sync Monitor maps 401, 403, 429, 5xx and timeouts to plain errors, flags stale runs"
          ]
        },
        {
          "title": "Reliability",
          "items": [
            "Cron every 10 minutes over a watermark window with overlap, under a Redis lock",
            "Cursor pagination against the Shopify API with a page cap per run",
            "Client-credentials access token refreshed on a schedule",
            "Historical import reconciled with compensating Stock Entries",
            "Integration tests run against a real site with bench execute"
          ]
        }
      ],
      "url": "https://hardikzinzu.com/work/shopify-erpnext-suite/"
    },
    {
      "id": "product-inventory-monitor",
      "title": "Product Inventory Monitor",
      "category": "product",
      "status": "production",
      "outcome": "Stock per warehouse, quick stock actions and a board for post-shipment exceptions, on one ERPNext page.",
      "description": "Product Inventory Monitor for ERPNext: actual, reserved and projected stock per warehouse, 8 quick filters, stock actions and an Inventory Exception board.",
      "date": "2026-02-17",
      "versions": [
        "ERPNext v15",
        "ERPNext v16"
      ],
      "stack": [
        "Python",
        "Frappe",
        "ERPNext v15 and v16",
        "JavaScript",
        "SQL"
      ],
      "headline": {
        "value": "8",
        "label": "quick filters"
      },
      "numbers": [
        {
          "value": "6",
          "label": "stat cards"
        },
        {
          "value": "5",
          "label": "exception buckets"
        }
      ],
      "highlights": [
        {
          "title": "Stock overview",
          "items": [
            "6 stat cards: total SKUs, in stock, out of stock, below reorder, stock value, reserved",
            "Actual, reserved, ordered and projected quantity per warehouse",
            "8 quick filters, from in stock and out of stock to below reorder and negative stock",
            "Template and variant grouping; Product Bundle support",
            "Search by item code, name or barcode; company, item group and warehouse filters"
          ]
        },
        {
          "title": "Stock actions",
          "items": [
            "Add, Move and Remove create draft Stock Entries; a reason is required on Remove",
            "Movement history and open purchase and sales orders per item",
            "Draft Sales Order quantity shown against available stock",
            "Downloadable xlsx template and bulk Stock Reconciliation from the same file"
          ]
        },
        {
          "title": "Settings and performance",
          "items": [
            "Page size 25, 50 or 100, default view mode and excluded warehouses in PIM Settings",
            "Feature toggles per site",
            "Pagination and caching for thousands of SKUs"
          ]
        },
        {
          "title": "Exception board",
          "items": [
            "5 buckets: cancel, product issue, delivery issue, wrong quantity, wrong item",
            "Kanban columns Awaiting Return, Received · Decide, In Repair, Ready to Ship, Resolved",
            "Follow-up date with overdue flag; chargeback decision: courier, customer or absorb",
            "Returns, repair and scrap warehouses and a return window in settings"
          ]
        },
        {
          "title": "Stock postings",
          "items": [
            "Inbound goods are Stock Entries, never a return Delivery Note",
            "Resends are over-delivery Delivery Notes on the original Sales Order",
            "The original Delivery Note is only flagged, never cancelled or edited",
            "Every board button posts the ERPNext documents; nobody opens them by hand"
          ]
        }
      ],
      "url": "https://hardikzinzu.com/work/product-inventory-monitor/"
    },
    {
      "id": "sales-order-monitor",
      "title": "Sales Order Monitor",
      "category": "product",
      "status": "production",
      "outcome": "One ERPNext page that shows every Sales Order with its delivery, invoice and payment status and the next action.",
      "description": "Sales Order Monitor is an ERPNext page tracking each order through delivery, invoicing and payment, with 6 summary stats, 9 quick filters and item comparison.",
      "date": "2026-01-18",
      "versions": [
        "ERPNext v14",
        "ERPNext v15",
        "ERPNext v16"
      ],
      "stack": [
        "Python",
        "Frappe",
        "ERPNext v14 to v16",
        "JavaScript",
        "CSS",
        "SQL"
      ],
      "headline": {
        "value": "9",
        "label": "quick filters"
      },
      "numbers": [
        {
          "value": "6",
          "label": "summary stats"
        }
      ],
      "highlights": [
        {
          "title": "Dashboard",
          "items": [
            "6 stats: total, awaiting delivery, invoice or payment, outstanding, overdue invoices",
            "Date range and customer filters, search by order number or customer",
            "9 quick filters: draft, missing or partial delivery, missing or partial invoice, and more"
          ]
        },
        {
          "title": "Order cards",
          "items": [
            "Three columns: identity, process flow, financial",
            "Delivery, invoice and payment progress as percentages",
            "Grand total, outstanding, days remaining or overdue",
            "Next recommended action per order"
          ]
        },
        {
          "title": "Item tracking",
          "items": [
            "Ordered versus delivered versus invoiced per item",
            "Delivery Note returns and credit notes netted into the quantities",
            "Status badges; 50 items per page"
          ]
        },
        {
          "title": "Linked documents",
          "items": [
            "Delivery Notes, Sales Invoices, Payment Entries and returns on the card",
            "Sales Invoices with their outstanding amount, payments with mode and date",
            "One-click submit for drafts"
          ]
        },
        {
          "title": "Performance",
          "items": [
            "One optimised SQL fetch, then client-side filtering",
            "Modals load lazily",
            "Installs with bench get-app on-premise or on Frappe Cloud"
          ]
        }
      ],
      "links": {
        "github": "https://github.com/Z4nzu/sales_order_monitor"
      },
      "url": "https://hardikzinzu.com/work/sales-order-monitor/"
    },
    {
      "id": "attachment-manager",
      "title": "Attachment Manager for Frappe",
      "category": "product",
      "status": "production",
      "outcome": "Card and list views, inline preview for 15+ file formats, and zip download of every attachment inside any Frappe form.",
      "description": "Attachment Manager for Frappe: card and list views, inline preview of PDF, DOCX, XLSX, images, video and code, and zip download inside any form.",
      "date": "2026-01-23",
      "versions": [
        "ERPNext v14",
        "ERPNext v15",
        "ERPNext v16"
      ],
      "stack": [
        "Frappe",
        "Python",
        "JavaScript",
        "HTML/CSS",
        "docx-preview",
        "xlsx",
        "canvas-datagrid",
        "CodeMirror"
      ],
      "headline": {
        "value": "15+",
        "label": "file formats previewed inline"
      },
      "highlights": [
        {
          "title": "Views and navigation",
          "items": [
            "Card and list view toggle",
            "Preview, download and delete on every file",
            "Carousel navigation between attachments",
            "Images render inline on the card",
            "Responsive on desktop and mobile"
          ]
        },
        {
          "title": "Search and filter",
          "items": [
            "Search by name, type or extension",
            "Category filter: images, videos, documents",
            "Download All as zip, respecting the active filters",
            "File type detection"
          ]
        },
        {
          "title": "Document preview",
          "items": [
            "PDF viewer with page controls, zoom and fit-to-width",
            "DOCX via docx-preview",
            "XLSX and CSV with sheet tabs",
            "Text and code via CodeMirror"
          ]
        },
        {
          "title": "Media and quick actions",
          "items": [
            "Image zoom and drag-to-pan; native audio and video; SVG",
            "Right-click context menu",
            "Drag and drop upload, multiple files at once",
            "Inline refresh; Download All with a progress indicator"
          ]
        },
        {
          "title": "Integrations",
          "items": [
            "Optional Open in OnlyOffice when that app is installed",
            "Works on any DocType with attachments",
            "Installs with bench get-app on-premise or on Frappe Cloud"
          ]
        }
      ],
      "links": {
        "github": "https://github.com/Z4nzu/frappe-preview-attachment"
      },
      "url": "https://hardikzinzu.com/work/attachment-manager/"
    },
    {
      "id": "web-push-notifications",
      "title": "Web Push Notifications for Frappe",
      "category": "product",
      "status": "production",
      "outcome": "Rule-based browser push from document events and timed reminders, sent from your own server with no third-party relay.",
      "description": "Web Push Notifications for Frappe: rules on 8 document events or timed reminders, 4 recipient types, Jinja templates, and no third-party push service.",
      "date": "2026-01-23",
      "versions": [
        "ERPNext v14",
        "ERPNext v15",
        "ERPNext v16"
      ],
      "stack": [
        "Python",
        "Frappe v14 to v16",
        "JavaScript",
        "Web Push and VAPID",
        "Jinja",
        "Frappe scheduler"
      ],
      "headline": {
        "value": "8",
        "label": "event types"
      },
      "numbers": [
        {
          "value": "4",
          "label": "recipient types"
        }
      ],
      "highlights": [
        {
          "title": "Notification rules",
          "items": [
            "8 event types: new, save, submit, cancel, delete, days or minutes before or after",
            "4 recipient types: user, role, docfield, all assignees",
            "Optional Python condition per rule",
            "No Update Since X Days helper for stale records"
          ]
        },
        {
          "title": "Time-based reminders",
          "items": [
            "Days before or after a date field, minutes before or after a datetime",
            "Driven by the Frappe scheduler",
            "Sent reminders clean themselves up"
          ]
        },
        {
          "title": "Messages and fallback",
          "items": [
            "Jinja title and body with the document in scope, for example {{ doc.name }}",
            "Rich text",
            "Parallel in-app system notification, configurable per rule",
            "Lands in the Frappe notification centre when push is unavailable"
          ]
        },
        {
          "title": "Subscription, security and setup",
          "items": [
            "Guided opt-in that walks the user through the browser permission prompt",
            "Subscription stored per user; users manage their own",
            "VAPID keys generated and stored in settings; no external relay",
            "Test notification from the settings page"
          ]
        }
      ],
      "url": "https://hardikzinzu.com/work/web-push-notifications/"
    },
    {
      "id": "frappekit",
      "title": "FrappeKit",
      "category": "product",
      "status": "production",
      "outcome": "A Chrome extension that keeps every Frappe site, account and environment one click away, with alerts and developer tools.",
      "description": "FrappeKit is a Chrome extension for Frappe teams: project-grouped sites, account switching, health checks, push alerts, PIN lock and 4 developer tools.",
      "date": "2026-02-22",
      "stack": [
        "JavaScript",
        "Chrome Extension API",
        "Frappe REST API",
        "ERPNext"
      ],
      "headline": {
        "value": "4",
        "label": "developer tools"
      },
      "numbers": [
        {
          "value": "4",
          "label": "environment types"
        }
      ],
      "highlights": [
        {
          "title": "Projects and sites",
          "items": [
            "Sites grouped by project",
            "Production, staging, development and local labels; the active tab is highlighted",
            "Search, open, switch, or open in incognito"
          ]
        },
        {
          "title": "Accounts and login",
          "items": [
            "Password and API-key credentials per site",
            "Quick login pills on the Frappe login page",
            "Auto-detected login card; bulk delete and filter"
          ]
        },
        {
          "title": "Alerts and health",
          "items": [
            "Frappe system notifications delivered as desktop push, even with the browser closed",
            "Latest first; open the linked record in one click",
            "Polling health checks with status and response time per site"
          ]
        },
        {
          "title": "Developer tools",
          "items": [
            "DocType Inspector with deep links from Link and Table fields",
            "Field Metadata Overlay",
            "Custom Field Highlighter",
            "Child-table support throughout"
          ]
        },
        {
          "title": "Security",
          "items": [
            "PIN lock with masked input",
            "Auto-lock timeout, including until the browser closes",
            "Lock state synced across login page, popup and options",
            "Encrypted credential storage, all client-side",
            "Light and dark theme"
          ]
        }
      ],
      "links": {
        "product": "https://chromewebstore.google.com/detail/dkbmhgcickjangpojbknaadppcokpbcj"
      },
      "url": "https://hardikzinzu.com/work/frappekit/"
    },
    {
      "id": "taptodesk",
      "title": "TapToDesk",
      "category": "backend",
      "status": "production",
      "outcome": "Send a password or snippet from phone to browser through a QR session, encrypted end to end, nothing stored.",
      "description": "TapToDesk sends text and passwords from phone to desktop: scan a QR code, encrypt with a per-session RSA-2048 key, relay over WebSocket, never plaintext.",
      "date": "2026-01-23",
      "stack": [
        "Python",
        "FastAPI",
        "Redis",
        "WebSockets",
        "Web Crypto API",
        "Chrome Extension API",
        "PWA"
      ],
      "headline": {
        "value": "RSA-2048",
        "label": "per-session keys"
      },
      "numbers": [
        {
          "value": "0",
          "label": "data stored on the server"
        }
      ],
      "highlights": [
        {
          "title": "Security",
          "items": [
            "RSA-OAEP 2048 key pair generated per session in the extension",
            "End to end: the server relays ciphertext and never sees plaintext",
            "Sessions locked to the first device",
            "Keys in Redis expire on a TTL; HTTPS required"
          ]
        },
        {
          "title": "Desktop extension",
          "items": [
            "Generates the key pair on demand and shows the QR code",
            "Messages arrive over WebSocket and are decrypted locally",
            "Configurable session duration and message limit"
          ]
        },
        {
          "title": "Mobile",
          "items": [
            "Progressive web app with offline support",
            "Built-in QR scanner; works with the native camera too",
            "Encrypts with the Web Crypto API before sending",
            "Redirects automatically when the session expires"
          ]
        },
        {
          "title": "Performance",
          "items": [
            "No polling: WebSocket delivery",
            "Redis-backed sessions with TTL cleanup",
            "Multiple messages per session"
          ]
        }
      ],
      "links": {
        "github": "https://github.com/Z4nzu/taptodesk"
      },
      "url": "https://hardikzinzu.com/work/taptodesk/"
    },
    {
      "id": "ha-infrastructure",
      "title": "High-availability ERP infrastructure",
      "category": "infrastructure",
      "status": "production",
      "outcome": "Two application servers, a primary MariaDB with a replica promoted on failure, and Grafana alerting on every environment.",
      "description": "Fault-tolerant ERPNext hosting: two application servers, a primary MariaDB with a synced replica and failover, CI/CD, and Grafana plus Prometheus monitoring.",
      "date": "2025-03-01",
      "stack": [
        "MariaDB replication",
        "Docker",
        "CI/CD",
        "Grafana",
        "Prometheus",
        "Ansible",
        "AWS",
        "Azure",
        "GCP"
      ],
      "headline": {
        "value": "99%+",
        "label": "uptime"
      },
      "numbers": [
        {
          "value": "2 + 2",
          "label": "application and database servers"
        }
      ],
      "highlights": [
        {
          "title": "Topology",
          "items": [
            "Two application servers: one serves users, one serves API traffic and frequent cron jobs",
            "One primary MariaDB connected to both application servers",
            "A replica kept in sync and promoted when the primary fails",
            "AWS, Azure and GCP: DNS, SSL, backups, scaling"
          ]
        },
        {
          "title": "Delivery",
          "items": [
            "Custom Dockerfiles and Compose environments tuned for build and runtime",
            "CI/CD pipelines with zero-downtime deployments",
            "Documented runbooks for every environment"
          ]
        },
        {
          "title": "Observability",
          "items": [
            "Grafana and Prometheus across all managed environments",
            "Alerts on database health, queue depth, disk, TLS expiry and application errors",
            "Alerts page on symptoms users would feel, not on every metric"
          ]
        }
      ],
      "url": "https://hardikzinzu.com/work/ha-infrastructure/"
    }
  ],
  "inDevelopment": [
    {
      "id": "frappeops",
      "title": "FrappeOps",
      "category": "product",
      "status": "in development",
      "outcome": "Say what should happen on your Frappe site. FrappeOps builds the recipe, wires the integrations, and asks a person when it matters.",
      "description": "Agentic automation for the Frappe Framework: plain English becomes a permission-gated recipe with six triggers, AI steps, MCP, APIs, OAuth 2.0 and approvals.",
      "date": "2026-09-01",
      "stack": [
        "Python",
        "Frappe v16",
        "React 18",
        "Tailwind 4",
        "shadcn/ui",
        "TanStack Query",
        "Socket.IO",
        "MCP",
        "OAuth 2.0",
        "Anthropic",
        "OpenAI",
        "Gemini",
        "Groq",
        "OpenRouter",
        "Ollama"
      ],
      "headline": {
        "value": "18",
        "label": "step kinds"
      },
      "numbers": [
        {
          "value": "6",
          "label": "trigger kinds"
        },
        {
          "value": "6",
          "label": "LLM providers, one failover router"
        }
      ],
      "highlights": [
        {
          "title": "Build by talking",
          "items": [
            "A conversation becomes a wired, validated recipe",
            "Grounded in your doctypes, fields, connectors and sample records, so it proposes steps that exist",
            "Asks with concrete options instead of guessing",
            "The Assistant edits an open recipe by chat and previews every change before it lands"
          ]
        },
        {
          "title": "Triggers and steps",
          "items": [
            "6 triggers: schedule, document event, date field, webhook, inbound email, manual",
            "18 step kinds, from AI agent, router and loop to email, HTTP, API and MCP calls",
            "Retries with backoff, rate caps, dedupe windows and a daily cost ceiling per recipe",
            "Every run keeps a step-by-step trace with secrets redacted"
          ]
        },
        {
          "title": "Integrations",
          "items": [
            "Any MCP server: point at it, test it, and its tools become steps",
            "REST APIs from an OpenAPI spec, or from docs the AI reads and drafts into operations",
            "OAuth 2.0 with Slack, GitHub, Google and Microsoft presets; anything else through OpenID discovery",
            "Custom integrations as Python classes in your own Frappe app, without touching FrappeOps"
          ]
        },
        {
          "title": "Approvals",
          "items": [
            "Every action category resolves to a policy: auto-run, ask a human, never",
            "Runs execute with the owner's real Frappe permissions, never as the scheduler",
            "Runs pause mid-graph and resume on approve, deny, edit or snooze",
            "Each card shows proposed values, previews, the agent's reasoning and what happens either way"
          ]
        },
        {
          "title": "Models",
          "items": [
            "Anthropic, OpenAI, Google, Groq, OpenRouter and local Ollama behind one router",
            "Ordered failover on rate limits, timeouts, quota and billing lapses, with cooldowns",
            "Model tiers (fast, balanced, agentic) so a step picks a class, not a vendor",
            "A kill switch restricts the site to local models only"
          ]
        }
      ],
      "links": {
        "product": "https://frappeops.hardikzinzu.com/"
      }
    }
  ],
  "featured": [
    {
      "title": "ERPNext import and sales implementation",
      "line": "Full ERPNext rollout for a trading business: thousands of SKUs across warehouses, freight handling for international shipments, and a pricing engine.",
      "tags": [
        "ERPNext",
        "Python",
        "B2B and B2C"
      ]
    },
    {
      "title": "Bakery manufacturing ERP",
      "line": "End-to-end ERPNext customisation for a bakery manufacturer on a two-server, primary and replica setup, with background workers that cut invoice turnaround from days to a day.",
      "tags": [
        "Frappe",
        "Manufacturing",
        "MariaDB"
      ]
    },
    {
      "title": "IoT device dashboard",
      "line": "Django dashboard on a Raspberry Pi capturing sensor data in real time and pushing it to cloud APIs.",
      "tags": [
        "Django",
        "Raspberry Pi",
        "APIs"
      ]
    },
    {
      "title": "WhatsApp Business with ChatGPT",
      "line": "Conversational support flows on the WhatsApp Business API with plug-and-play prompts.",
      "tags": [
        "Twilio",
        "OpenAI",
        "Python"
      ]
    },
    {
      "title": "PDF data import with OCR",
      "line": "Document ingestion that reads PDFs with OCR and a language model, then shows every field for review before it becomes a record.",
      "tags": [
        "OCR",
        "ChatGPT",
        "Python"
      ]
    },
    {
      "title": "Odoo customisations, v13 to v19",
      "line": "Sales, CRM, manufacturing, POS and website modules, payment gateways and automated workflows, on Odoo Community and Enterprise from v13 to v19.",
      "tags": [
        "Odoo",
        "Python",
        "PostgreSQL"
      ]
    }
  ],
  "moreWork": [
    {
      "title": "Grid Page Length for Frappe",
      "line": "Control the number of rows in child tables with a configurable page length.",
      "href": "https://github.com/frappe/frappe/pull/31371",
      "label": "Pull request"
    },
    {
      "title": "Workspace Sidebar on Hover",
      "line": "Quick access to modules from any page by hovering over the company icon.",
      "href": "https://youtu.be/ysMjyxCwJAI",
      "label": "Video"
    },
    {
      "title": "Quick Workspace",
      "line": "Hover the logo to jump to any workspace instantly.",
      "href": "https://github.com/Z4nzu/Frappe-Quick-Workspace",
      "label": "GitHub"
    }
  ],
  "howIWork": [
    {
      "title": "Understand before building",
      "body": "I read the existing system, trace the real flow, and find the root cause before touching code. The smallest change in the wrong place is a second bug."
    },
    {
      "title": "AI-assisted, human-reviewed",
      "body": "Claude Code, Copilot and Cursor write a lot of the first draft. Every line still passes a review, a test, and a security check before it ships."
    },
    {
      "title": "Nothing writes to production without a gate",
      "body": "Approvals, permission policies and audit trails are part of the design, not an afterthought. That is how the agents I build behave, and how I work."
    }
  ],
  "career": {
    "title": "AI Engineer — LLM agents and Python backend",
    "titles": [
      "AI Engineer",
      "Backend Engineer",
      "Python Developer",
      "Forward Deployed Engineer",
      "ERPNext Specialist",
      "Frappe Developer",
      "Odoo Developer"
    ],
    "summary": "Five years shipping Python to production, most of it inside ERP systems for real businesses. Builds LLM applications end to end: agents with tool calling, routing and failover across providers, prompt caching, streamed UIs, and a human approval gate before anything writes. Does not train models today; learning model training and fine-tuning, and says so rather than implying it.",
    "openTo": [
      "AI Engineer (LLM applications and agents)",
      "Backend / Python Engineer",
      "Forward Deployed Engineer",
      "Senior Frappe/ERPNext or Odoo roles",
      "Contracts and consulting"
    ],
    "location": "Ahmedabad, India. Remote-first; open to client-site travel and to relocation for the right role.",
    "path": "Started on Django (an IoT dashboard at HCL, a WhatsApp + ChatGPT support bot at Tecblic), moved to Odoo (v13 to v19, Community and Enterprise), then Frappe and ERPNext (v13 to v16). Three Python frameworks built on the same ideas — models and an ORM, controllers, background jobs, permissions — so each new one was a matter of learning its conventions, not the craft.",
    "learnsFast": [
      "Three Python web frameworks in production: Django, then Odoo across seven major versions (v13 to v19), then Frappe (v13 to v16)",
      "Moved from ERP work to embedded IoT at HCL: Python adapted to the memory and CPU limits of Raspberry Pi edge devices, plus Linux modem and network automation",
      "Built this site's MCP server on AWS Lambda, API Gateway and DynamoDB with SAM, outside his day-to-day stack",
      "Ported his own Frappe automation engine to Odoo 19 on base_automation, with a six-provider LLM router and 54 tests",
      "Two Anthropic course completions in September 2026 (Claude 101, Claude Code in Action) while shipping LLM products",
      "Uses AI tooling (Claude Code, Codex, Copilot, Cursor) to get productive in an unfamiliar codebase or language fast; every change still passes review, tests and a security check"
    ],
    "clientFacing": [
      "Onsite with clients at Tecblic for requirements gathering, implementation and production support",
      "Selected to work with senior leadership at Limendo's Italy headquarters on a cross-team engineering initiative, with a formal commendation for the outcome",
      "Led build, customisation and production support for 8+ ERPNext systems across manufacturing, logistics and hospitality clients",
      "Mentors junior developers through code review and Frappe architecture guidance"
    ],
    "experience": [
      {
        "company": "Limendo India Private Limited",
        "role": "Software Engineer II, Application Practice",
        "when": "Oct 2022 – present",
        "where": "Ahmedabad, hybrid; projects for the Italy headquarters",
        "highlights": [
          "Led end-to-end build, customisation and production support for 8+ ERPNext systems across manufacturing, logistics and hospitality, at 99%+ uptime with zero-downtime deployments",
          "Migrated ERPNext from v14 to v16 on live production: custom-app compatibility audits, schema migration, data validation and post-migration performance tuning",
          "Built a two-way Shopify–ERPNext integration over REST and webhooks: order sync, stock levels, product catalogue and automated fulfilment",
          "Built an automated sales pipeline processing 500+ Sales Orders a day with inter-company logic and auto-submitted Delivery Notes, cutting order cycle time by ~70%",
          "Built an invoice engine consolidating 12,000+ orders a month by customer and shipping address, auto-submitting invoices and transmitting them to the Italian tax authority's e-invoicing API",
          "Designed the high-availability layout: two application servers and two MariaDB nodes in a Galera cluster, one node taking the traffic and the other taking over automatically on failure",
          "Integrated OCR plus OpenAI for PDF import into ERPNext doctypes, removing manual entry and cutting post-import errors by 80%",
          "Set up Grafana and Prometheus across client environments, cutting incident response time by 60%+",
          "Built inventory enhancements: multi-warehouse tracking, live stock levels, aging analysis, reorder alerts and inter-warehouse transfer automation",
          "Owns CI/CD pipelines, Docker environments and Azure infrastructure (DNS, SSL, backups, scaling) across concurrent client deployments"
        ]
      },
      {
        "company": "HCL Technologies",
        "role": "Software Engineer",
        "when": "Jun – Sep 2022",
        "where": "Noida",
        "highlights": [
          "Built a Python/Django IoT dashboard on Raspberry Pi edge devices, capturing industrial sensor data in real time and streaming it to the cloud",
          "Designed fault-tolerant REST APIs ingesting geolocation and diagnostic data from field devices, with automated device provisioning",
          "Automated cellular and network connectivity on edge devices with Linux ModemManager and NetworkManager"
        ]
      },
      {
        "company": "Tecblic Private Limited",
        "role": "Python and ERP Developer",
        "when": "Mar 2021 – May 2022",
        "where": "Ahmedabad",
        "highlights": [
          "Built Python applications on Django, Frappe/ERPNext and Odoo covering CRM, Sales, Manufacturing, Planning, POS, Inventory and Helpdesk",
          "Built a WhatsApp Business + ChatGPT integration on Django and Twilio: conversational support, order status updates and Helpdesk tickets from WhatsApp messages",
          "Deployed client applications on AWS, GCP and DigitalOcean, and worked onsite with clients"
        ]
      }
    ],
    "projects": [
      {
        "name": "This portfolio and its MCP server",
        "stack": [
          "Astro",
          "React Three Fiber",
          "TypeScript",
          "AWS Lambda",
          "API Gateway",
          "DynamoDB",
          "AWS SAM",
          "Playwright",
          "Lighthouse CI"
        ],
        "summary": "The site is a 3D motherboard you scroll through, and also an MCP server: a stateless Lambda that reads the site's own resume.json, with rate-limited email sending backed by DynamoDB. Playwright tests and Lighthouse CI gate every commit."
      },
      {
        "name": "Odoo Ops (Odoo 19)",
        "status": "in development",
        "stack": [
          "Python",
          "Odoo 19",
          "OWL",
          "base_automation",
          "Anthropic",
          "OpenAI",
          "Gemini",
          "Groq",
          "OpenRouter",
          "Ollama"
        ],
        "summary": "His Frappe automation engine ported to Odoo 19: recipes that create base_automation records, signed webhooks, an inbound-email trigger, a cron retry queue, an approval inbox, and an LLM router over six providers with structured output, redaction and cost logging. 54 TransactionCase and HttpCase tests; the AI step kinds are still being built."
      },
      {
        "name": "Furniture retailer back-office (Odoo 14 Enterprise)",
        "summary": "Odoo as the ERP behind an external e-commerce site: JSON APIs for orders, catalogue, containers and a delivery-driver app; PayPal, Braintree and SagePay payment data; WhatsApp for Sales and Helpdesk; CSV imports over XML-RPC; PDF and Excel reports; order-line images loaded from a CDN."
      },
      {
        "name": "Sale Order to Google Slides (Odoo 13)",
        "summary": "One click on a Sale Order updates a Google Slides deck through the Slides API: default slides filled with order data, order-line tables built, and slides created or deleted as the order requires."
      },
      {
        "name": "Odoo 14 and 15 Enterprise customisation",
        "summary": "Custom-SQL dashboards on KS Dashboard, one-click website payment, Sale module customisation, report customisation, module migration from v14 to v15, and per-diem travel-expense calculation on hr.expense by city and country."
      },
      {
        "name": "Construction site management (Odoo 15 Enterprise)",
        "summary": "A construction-site model tying together project, warehouse, assets, analytic account, work orders, Sale Orders and Purchase Orders."
      },
      {
        "name": "Purchase compliance (Odoo 14 and 15)",
        "summary": "Supplier quality certificates checked on every Purchase Order, a blocking wizard when one fails, and a renewal reminder job."
      },
      {
        "name": "Invoice layouts to national standards (Odoo 16 to 18)",
        "summary": "Invoices built on DIN 5008 and the Swiss QR bill, carried from v16 to v18, plus an A6 counter receipt."
      },
      {
        "name": "Workforce planning and billing (Odoo 16 to 17 Enterprise)",
        "summary": "Customer billing from Planning shifts, monthly resource and hours reports exported to Excel, and a REST API for employees, slots and comments; migrated from v16 to v17."
      },
      {
        "name": "Stock, dropshipping and WMS (Odoo 14 and 15 Enterprise)",
        "summary": "Advanced stock rules and warehouse priority with bin-packing tests, delivery splitting, a WMS integration framework, and dropship pickings exported to AWS S3 with boto3."
      },
      {
        "name": "More Odoo work (v14 to v19)",
        "summary": "A REST API for telecom service contracts and devices with access-rights tests; a Google Drive document portal; eLearning portals with enrolment, careers pages, course trials and webinar scheduling; rentals and appointments; manufacturing for textile dyeing and job work; WhatsApp click-to-chat from CRM, Sales, Field Service and Helpdesk; a styled Excel pivot export on v19."
      },
      {
        "name": "GPT vendor-bill reader (Odoo 15)",
        "status": "prototype",
        "summary": "Built and demoed, not shipped: a vendor bill goes to the OpenAI Assistants API and comes back as a draft bill with its vendor, lines and a follow-up activity for a person to approve."
      }
    ],
    "certifications": [
      {
        "name": "Certified Frappe Developer",
        "issuer": "Frappe Technologies",
        "when": "March 2025"
      },
      {
        "name": "Claude Code in Action (course completion)",
        "issuer": "Anthropic, Claude Academy",
        "when": "September 2026",
        "url": "https://academy.claude.com/verify/2c6dce14ffe4035c9c66d3e6a33c7d6d"
      },
      {
        "name": "Claude 101 (course completion)",
        "issuer": "Anthropic, Claude Academy",
        "when": "September 2026",
        "url": "https://academy.claude.com/verify/81be141f08e43e3f4d0d930cbb634b49"
      }
    ],
    "skills": {
      "Languages": "Python, JavaScript and TypeScript, SQL, Bash, HTML and CSS",
      "Frameworks": "Frappe (v13–v16), Odoo (v13–v19), Django; Flask and FastAPI (familiar); React, Vue, OWL",
      "AI and LLMs": "Tool-calling agents, multi-provider routing and failover (Anthropic, OpenAI, Gemini, Groq, Azure OpenAI, OpenRouter, Ollama), Anthropic prompt caching, structured output, SSE streaming, MCP servers and connectors, OCR plus LLM extraction, human approval gates. Not model training yet",
      "Testing": "unittest-based suites (Frappe test cases; Odoo TransactionCase and HttpCase), Playwright end-to-end, Lighthouse CI; pytest (familiar). Frappe Copilot carries 61 test files and FrappeOps 266",
      "Data": "MariaDB (Galera cluster, query tuning), PostgreSQL, MySQL, Redis, MongoDB; Pandas for data-import scripts",
      "Cloud and DevOps": "AWS (EC2, S3, RDS, Route 53, Lambda, API Gateway, DynamoDB, SAM), Azure, GCP, DigitalOcean; Docker, Docker Swarm, Frappe Press, Nginx, Jenkins, GitLab CI, Ansible, Terraform, Grafana, Prometheus",
      "Integrations": "REST, GraphQL, webhooks, XML-RPC, Shopify, WhatsApp Business and Twilio, OpenAI, PayPal, Braintree and SagePay, Italian e-invoicing, sFTP, Google Slides and Drive APIs"
    }
  }
}
