back to the portfolio
the receipts · 25 of them
What I've actually done
Every line is a claim I can defend under follow-up questions. Open one and the detail underneath is the mechanism, not the same sentence in new words.
Scale & performance
Can you find a bottleneck yourself, or do you wait to be told?
Took report exports from ~5 min to ~5 sec, 3 GB to 200 MB60×
- Root cause: exports were rendered through Blade, which buffers the whole compiled view into one string before returning. The dataset sat in memory twice, once as hydrated models and again as rendered output, both scaling linearly with rows.
- Swapped in OpenSpout, a streaming XLSX writer that emits one row and immediately releases it, so memory never holds the workbook. Chose it over PhpSpreadsheet, which materialises every cell as a PHP object.
- Fed the writer from a chunked query over plain arrays instead of one hydrated result set, and hoisted every lookup out of the row loop.
- The number to lead with is not 60×, it is that peak memory is now roughly constant. The next 10× in report size no longer takes the endpoint down.
Name resolution from 490 ms to 0.8 ms with a Manticore infix index600×
- Root cause: LIKE '%x%' cannot use a B-tree index, so it scans linearly with table bytes. Manticore indexes every substring down to min_infix_len=2, which turns a partial name into a dictionary lookup instead of a scan.
- The number to lead with is not 600×, it is the shape of the curve. LIKE went 2.7 ms to 493 ms as rows went 2.4k to 1M; Manticore went 0.3 ms to 0.8 ms over the same range. Benchmarked on 1M synthetic rows, since the live table is 2.4k today where the win is only 9×. It buys the next two orders of magnitude, not today's latency.
- Nothing writes the index on save, no observers and no model events, so adding the trait to a model costs that model's writes nothing. A scheduled job per model reads what MySQL changed every 30 minutes, re-reading a 5-minute overlap window to catch rows committed by a transaction that opened before the last read.
- A full rebuild stamps every document with a generation number and only then deletes the older ones, so search stays answerable throughout instead of going empty mid-refresh. Typo hits are reordered by recomputed Levenshtein distance, because Manticore ranks fuzzy matches by term rarity rather than closeness, and they are returned flagged as guesses so a caller cannot resolve an id off one.
Moved heavy work off the request path with queues and events
- Laravel jobs and event-based processing for anything that does not need to block a response.
- Scheduled tasks for the recurring reporting and sync work, so nothing depends on someone remembering to trigger it.
Manual work I deleted
Do you fix the ticket, or the process behind it?
Ended vendor price discovery by phone call and spreadsheetphone → thread
- Before me: operations rang each vendor one at a time for a quote, pasted the replies into Excel, and scanned the sheet by eye to find the best price. Nobody could answer how long a quote had been outstanding.
- Now an enquiry sends a templated pricing request to the vendors, and every reply stays on that same thread, so the quote history sits with the enquiry instead of in one person's inbox.
- Replies come back marked against the enquiry, so best price is a sort on real data rather than a person reading a spreadsheet under time pressure.
- The time saved is the obvious half. The half worth saying out loud is that price comparison stopped depending on who was doing it that day.
One join key turned the finance spreadsheets into queryable dataorg code ↔ Zoho ID
- The missing piece was identity. Our organisation code and the Zoho Books account ID were the same customer with nothing linking them, so revenue and cost could only ever be reconciled by hand in sheets.
- Mapping the two in the database is the whole unlock. The same numbers then went into the database instead of a spreadsheet, and analysis became a query rather than a rebuild.
- Receivables now drive automated email follow-up to customers for payment, so collections chase themselves instead of waiting on someone's memory.
- Payables work the same way round: bills tracked against vendors so they get paid on time, not when a due date is noticed.
Wired WhatsApp into Laravel so RFPs go out from inside the systemexternal API client
- The problem was handoff. Every lead and deal is created in the CRM, but the operations person still had to go find that deal from the salesperson before acting on it, because the actual conversation lived in a chat the system could not see.
- Built a WhatsApp API client into the Laravel app so RFPs and deal communication are sent from the record itself. The thread then belongs to the deal rather than to somebody's phone.
- Same principle as the vendor pricing flow, different channel: communication that happens outside the system is communication the system cannot follow up on.
Systems I own end to end
Do you own a feature or a domain? Can you design a data model?
Four production domains where I owned the data model, not a slice4 systems
- CRM: leads and deals through to onboarding as a customer or vendor organisation, then linked to warehouses so the rest of the platform can act on them. The CRM is not a dead end.
- ERP: the full freight and customs enquiry lifecycle. Enquiry in, vendor schedules collected, pricing quoted back, confirmation into onboarding and the operations that follow.
- Warehouse and assets: product kits, lot position management so stock is traceable to a position, contracts and expense contracts, inward and outward inventory movement.
- Finance: invoices, POs and bills synced with Zoho Books over webhooks, automated profit and revenue reporting, vendor bill payments and expense tracking.
Sole engineer on the positions and asset-management backend
- Data structuring, architecture and implementation, all of it. No one else to hand the hard part to.
- The interesting constraint: a lot position has to stay traceable to the inventory that filled it while space is still used profitably, so the model answers both questions from the same rows.
Own the Laravel admin API powering all four domains
- One API surface, four domains. The real tension is keeping module boundaries honest when everything shares organisations and warehouses.
- Feature and unit tests with PHPUnit on the paths that would be expensive to get wrong.
Delivery is mine too: CI/CD, Docker, Coolify
- GitHub CI/CD pipelines, containerised deploys through Coolify, AWS and RDS underneath.
- Means I debug my own production issues instead of describing them to someone else.
AI in production, not demos
Have you shipped LLM work that real users depend on daily?
AI voice calls handling 100+ outreach calls a week100+/wk
- Three channels for the sales team on n8n with open-source LLMs: email, WhatsApp reminders, and voice calls.
- The production part is the guardrails, not the model: constrained prompts, response validation, failure logging, automatic retries.
- Follow-up work that filled a rep's day now takes 5 to 15 minutes. That is the sentence to lead with.
LLM document and data handling inside logistics and CRM flows
- Built into the existing workflows rather than bolted alongside them, so the manual step disappears instead of moving.
- Removes the transcription and lookup work that used to sit between a document arriving and the record being correct.
Built the workflow automation every team in the company runs on
- Started as the automation foundation in the Solutions Architect role, then grew into the tools daily operations depend on.
- Earlier generation was Google Apps Script and AppSheet, and some of it still runs. Knowing when a spreadsheet is the right answer is part of the job.
Built in the open
What do you build when nobody assigns it, and how do you argue architecture?
Reyaak: on-device Android agent with a bandit LLM router37 providers
- The router scores 37 free-tier providers every turn. Beta-posterior reliability with Thompson sampling, so exploration is proportional to uncertainty rather than a fixed epsilon. Signals normalize to [0,1] and combine as a convex combination, multiplied by headroom and rate-limit guardrails, instead of a sum of hand-tuned bonuses.
- Memory and skills are separate concerns: facts the agent can search, and procedures it writes for itself. skill_write refuses to touch a shipped skill or one the user has edited. Curation runs on inactivity, archives instead of deleting, and anything pinned bypasses every automatic transition.
- Native Kotlin, not a WebView wrapped around a bundled runtime. The :ui module has no platform source set, so fonts and the launcher mark arrive from the host as composition locals, and an iOS host could supply its own without :ui gaining an expect declaration.
- NOTICE records the design debts to freellmapi and Hermes Agent line by line, including the ones MIT does not require, because attribution is owed for ideas even where it is not owed for code.
DocMagic: multi-agent RAG over logistics, ERP and CRM documentscited answers
- A LangGraph supervisor routes each question to one capability specialist, documents, spreadsheet data, arithmetic or live web search, so the model never juggles every tool at once.
- Hybrid retrieval fuses dense vector search with BM25, then re-scores with a cross-encoder reranker. Ingestion runs metadata, analyst, reviewer with a bounded revision loop.
- Built twice on two branches, Next.js + FastAPI + pgvector and Streamlit + LCEL + Chroma, so the architectural trade-offs are visible side by side rather than argued about.
- Every answer cites the exact page or sheet. In this domain an uncited answer is not an answer.
Tevel IntelliDB: an AI SQL client that never sees your dataschema-only RAG
- Built on a fork of Antares SQL (MIT). The Electron and Vue shell is upstream; the AI layer is mine: IntentRouter, SchemaIntelligence, EmbeddingRetriever, SqlValidator and the pipeline, with 36 unit tests. Upstream copyright stays in LICENSE next to mine. Say this before an interviewer opens package.json and finds the antares key.
- The model reasons over metadata only, tables, columns, keys, indexes, relationships, and never touches a single customer row. That is the whole design premise.
- Schema Intelligence ranks and enriches candidate tables through hybrid retrieval, a keyword ranker blended with cached table embeddings by cosine, falling back to keyword-only when embeddings are off. A business vocabulary decodes cryptic names, so tbl_cust_hdr becomes customer header.
- classifyRisk() grades every statement safe, moderate or high, and anything above safe raises a confirm-to-run before it executes. Invalid SQL goes through an auto-repair loop until it validates.
- Ships as cross-platform desktop builds for Windows, macOS and Linux.
ImaGen: eight prompting strategies compared on one instruction8 techniques
- Zero-shot, few-shot, structured, chain-of-thought, self-refine, meta-prompt, tree-of-thought and raw, all run against the same instruction so the difference is measurable.
- Always shows the exact messages sent to the LLM and the final prompt handed to the image model, so the technique's effect stops being folklore.
- The image model has no server-side mask, so a brushed region is composited back over the original client side. Worth framing as a constraint I worked around, not a feature.
Research & recognition
Is the depth real, or is all of it self-reported?
Patent filed: intelligent transport vehicle management and routingIP India
- Application 202241077102 with Intellectual Property India. Filed Dec 2022, published Jan 2023.
- Same problem space I work in now, which is worth pointing out: the logistics interest predates the logistics job.
Two IEEE Xplore publications, both 20222 papers
- Intelligently Optimized System for Hydroponic Cultivation, IEEE Xplore 2022.
- Aiderbot: DTMF Based Medical Robot, IEEE Xplore 2022.
- Both came out of the hardware work at Flare, so they connect to the founding story rather than sitting on their own.
Best Outgoing Student, Institution of Engineers India, 2023IEI 2023
- Awarded across the graduating cohort, not within a single subject.
- Graduated with 9.05 / 10 CGPA in Electronics & Communication Engineering.
Mentored a Smart India Hackathon finalist team, 2024
- Mentoring one year after graduating, while shipping full time.
- Useful signal for anything with a coaching or tech-lead component to the role.
Trajectory
Where is this person going, and how fast did they get here?
L1 to L2 in 18 months at StockareaOct 2024 → Apr 2026
- Joined as Software Engineer L1 in Oct 2024, promoted to L2 in Apr 2026.
- Scope grew with it: backend APIs, then full-stack delivery with Next.js and React, then AI automation in production.
- Was at the company before that as Solutions Architect for Automation from Aug 2023, so the domain knowledge did not start at the promotion.
Founded a company and led a 10-person team, straight out of collegeFlare, 2022
- Flare Innovations: IoT monitoring for aquaculture and hydroponics. Founded Feb 2022, ran it to Jun 2023.
- Incubated at ICAR-CIBA (Central Institute of Brackishwater Aquaculture) and Annamalai University, with a pilot system actually deployed at CIBA.
- Python applications processing live sensor data, hardware sensors integrated with cloud for remote monitoring.
- Wound it down after graduation to join Stockarea. Worth saying plainly: that was a decision, not a failure.
Went from average student to school topper on self-learning alone98% SSLC
- Nowhere near the top until self-learning and plain curiosity took over. Finished as school topper.
- That is still exactly how I pick up anything new, which is the reason the answer is worth giving at all.
Four-plus years shipping production software, zero data-loss incidents4+ years
- No dropped tables, no lost tenant data, across CRM, ERP, warehouse and finance modules.
- Boring on purpose. In a finance module that syncs to Zoho Books, boring is the feature.