I’m Vishwanath, 36, a hands-on engineering team lead based in Amsterdam. I build Python backends, AI systems, and cloud platforms.
At Simvia, I lead the engineering team, set technical direction, and write production code. My role also covers platform engineering, setting up DevOps, and managing cloud infrastructure.
I started with electronics and embedded systems. That took me into research, manufacturing, EV charging, and eventually the software I work on today.
2024 — NOW
Simvia
Amsterdam
Team Lead · Apr 2024 – present
I lead the engineering team, set technical direction, and write production code across Python services, AI document processing, and compliance search. I work with the C-suite on GenAI priorities and delivery.
I also lead platform engineering: the AWS infrastructure as code, CI/CD, monitoring, and the ways of working around planning, code review, testing, and releases.
The product work spans document extraction and review, retrieval with source evidence, client-facing APIs and an MCP server, and SharePoint-integrated onboarding.
2021 — 2024
EVBox
Amsterdam
Senior Software Engineer & Team Lead
Building backend services and tools for connected EV chargers, while managing and mentoring engineers. A mix of telemetry, fleet operations, testing, APIs, and helping people make sense of the data.
2018 — 2021
EFFECT Photonics
Eindhoven
Senior Software Engineer
Working with physicists and production teams on software for optical transceiver manufacturing, device tuning, and research. I built full-stack tools, dashboards, and automated testing and delivery workflows.
2016 — 2018
Philips
Eindhoven
Software Developer
Building Python measurement systems, testing tools, and interfaces for research data. This was a chance to work closely with scientists and firmware engineers, and make manual experiments repeatable.
And a little further back…+
2016 / SCANIA
A thesis in high-performance computing.
At Scania, I studied Linux cluster performance and benchmarked finite element analysis and computational fluid dynamics applications for my master’s thesis.
2015–2016 / WATTY
Energy data and embedded hardware.
As an intern and part-time data integrity analyst, I worked on GSM firmware, hardware testing, and automating data cleaning for disaggregation algorithms.
2012–2014 / BRADY CORPORATION
Learning the business side.
A business analyst role working on reporting, forecasting, and financial analysis — an earlier part of my path before the move to Sweden.
2011–2012 / LI2-INNOVATIONS
Starting with a balancing robot.
As a junior developer, I worked on a two-wheeled self-balancing robot, using motion sensors, filtering, and closed-loop PID control.
EDUCATION
M.Sc. Embedded Systems
KTH Royal Institute of Technology
Stockholm, Sweden · 2014–2016
B.E. Electrical & Electronics Engineering
M.S. Ramaiah Institute of Technology
Bangalore, India · 2008–2012
03 / SOME OF MY WORK
Projects & technical decisions.
Grouped by where the work happened. Each entry covers the problem, what I built, and the decisions behind it — and most open into a small example showing how the system responds to a change in workload, evidence, or input.
AmsterdamApr 2024 — present5 projects
Simvia
A supply-chain compliance platform. A multi-tenant Django backend, an LLM document pipeline, and the AWS infrastructure underneath both.
01
AI / DOCUMENT INTELLIGENCE
Making sense of messy documents
A Django and LLM pipeline that turns certificates, audit reports, and lab results arriving as scans and PDFs into structured, reviewable data.
My roleArchitecture, implementation & platform
PythonLLMsEvaluationAWS
A few more detailsClose the notes+
The challenge
Supply-chain documents arrive in many formats. Manual review made turning them into consistent, usable product data a recurring operational burden.
What I built
I designed and built the pipeline end to end: staged OCR that turns scans into searchable pages, then classification, field extraction, entity matching, verification, and translation. Each stage runs as its own asynchronous task with its own model and timeout, so a fast classification never waits behind a slow extraction. A configuration-driven layer lets non-engineers add document types without changing code.
The engineering decisions
Model calls are the scarce resource, so context budgets and a shared rate limiter sit in front of them rather than in each caller. Quality is measured, not assumed: a deterministic scorer compares extracted fields against human-approved labels, and reviewer corrections feed back as new labels. Reusable components keep each new document type from becoming a separate implementation.
The outcome
Structured data across roughly 500 document types, replacing manual review and making document support easier to extend.
Ingest→Classify→Extract→Evaluate
Try it: scale a document import
The project supports roughly 500 document types through reusable configurations. In this capacity model, grow an import, change the document mix, and balance worker capacity against the shared API budget. Retried requests and human review add different kinds of work.
03 / Shared model API2 requests / secondShared across workers
04 / Validate & reviewReview needs people, not more workers
Estimated extraction time
Effective throughputdocuments / second
Documents needing review
The decision: scale the limiting stage, keep retries within the API budget, and plan human review separately. Supporting more document types also needs reusable configuration and evaluation, beyond adding compute.
Illustrative workload, not production volumes or timings. Each attempt takes 4 worker-seconds; retry and review percentages come from the selected example mix. Extraction time = total attempts ÷ min(workers ÷ 4, API budget). Parsing, startup, and human review time are excluded; review count is not an accuracy score.
02
AI / KNOWLEDGE RETRIEVAL
Finding answers, with the source attached
Retrieval over the whole document estate, so a compliance analyst gets an answer and the page it came from rather than a search results list.
My roleRetrieval design & implementation
RAGEmbeddingsVector search
A few more detailsClose the notes+
The challenge
Answering supply-chain compliance questions meant manually searching a large collection of unstructured documents. Finding the evidence could take analysts days.
What I built
I built retrieval on top of the OCR pipeline, embedding documents at page level so a match carries its page reference with it. Vector search selects the candidate pages, and the answer is generated only from what was retrieved, with each claim shown next to the page that supports it.
Why the source matters
For compliance work, an answer needs a path back to its evidence. Source visibility helps analysts inspect the underlying material and prepare an audit response.
The outcome
Questions that required days of manual searching could be answered in seconds, enabling same-day audit responses.
Question→Retrieve→Answer + sources
Try it: answer a compliance question with evidence
An analyst is checking lot A12 on 1 September 2026. Grow the example archive while keeping the answer context small. Remove the site filter to see a similarly worded certificate consume that context, then add the renewal and check the evidence again.
step resting
Fan outScoreFill budgetAnswer
CONTEXT BUDGET0 of 2 passages
01 / Indexed archive
02 / Matching candidatesSearch to inspect
03 / Answer contextNo passages yet
04 / Check the evidenceNo answer yet
SAMPLE DOCUMENT EXCERPTS
01 / DELIVERY NOTE · PAGE 1
Lot: A12 Supplier: Cedar Produce Packing site: North packhouse Packed: 14 August 2026
02 / PACKING CERTIFICATE · PAGE 1
Site: North packhouse Scope: apple and pear packing Valid: 1 July 2025 – 30 June 2026
03 / SIMILAR CERTIFICATE · WRONG SITE
Site: South packhouse Scope: apple and pear packing Valid: 1 July 2026 – 30 June 2027
04 / RENEWED CERTIFICATE · PAGE 1
Site: North packhouse Scope: apple and pear packing Valid: 1 July 2026 – 30 June 2027
READY TO SEARCH
Find the relevant evidence before answering.
The decision: keep the answer context bounded as the archive grows, match evidence to the correct entity, check validity, and leave unsupported questions unanswered.
Synthetic archive counts and four fictional excerpts, with fixed ranking and answer rules. The archive count illustrates scale; this page does not index 100,000 documents or run an LLM. The project uses embeddings and vector search. The displayed passages and decisions explain the retrieval boundary, not a latency benchmark.
03
AI / PRODUCT DELIVERY
Helping customers get started
Onboarding a new customer used to mean an engineer hand-mapping their document formats. An LLM step now proposes the mapping and a person confirms it.
My roleWorkflow redesign & LLM integration
LLMsWorkflow designProduct thinking
A few more detailsClose the notes+
The challenge
Every new client depended on a manual configuration step. That delivery bottleneck slowed onboarding and held up the sales cycle.
What I changed
I rebuilt onboarding around the extraction pipeline: a customer's sample documents are parsed, a model proposes the field mapping, and the confirmed result is saved as a reusable configuration rather than as code. A SharePoint integration pulls documents in automatically, so customers keep working where their files already live.
The leadership connection
This work sits within my partnership with the C-suite on GenAI strategy: translating business goals into shipped capability and choosing applications where AI creates practical value.
The outcome
Onboarding moved from weeks to days. Removing the delivery bottleneck also shortened the sales cycle from months to days.
New customer→LLM onboarding→Ready to use
Try it: configure a new customer document format
A new document uses unfamiliar field names. Suggest a mapping, check it against the sample, and turn it into a reusable import configuration.
mapped 0held 0
Read samplePropose mappingConfirmReuse across batch
CUSTOMER’S SAMPLE DOCUMENT
MAP INTO THE PLATFORM’S FIELDS
CONFIGURATION INCOMPLETE
No validated fields yet.
REUSE THE VALIDATED CONFIGURATION
Validate the mapping before importing a batch.
The change: a new format can start from a suggested configuration, with ambiguous fields resolved before import. This illustrates the manual setup dependency removed by the onboarding work.
Fictional documents, repeated sample layouts, and fixed suggestions; no live LLM or file import. The batch shows configuration reuse and a deliberately changed field. A changed layout is held for review, without silently modifying the validated configuration.
04
PLATFORM / AGENT INTEGRATION
Connecting agents to useful tools
A public API and an MCP server that let customer agents query the platform, with scoped permissions and an audit trail on every call.
My roleAPI design, permissions & implementation
MCPREST APIsAccess controlMulti-tenancy
A few more detailsClose the notes+
The challenge
Customers need their AI agents to work with platform data and tools. Giving an agent that capability also means defining what it can access and making its actions traceable.
What I built
I built the MCP server and the client-facing REST API, both sitting behind API keys, tenant isolation, and per-scope permissions. Alongside them is a natural-language query tool: a model is given the data model and writes the query, but the generated SQL passes a read-only guard before it ever reaches the database, so anything that is not a single plain SELECT is refused.
The engineering principle
The integration boundary is part of the product. An agent is an unpredictable caller, so the interface has to be safe by construction rather than by instruction: what it may reach is decided outside the model, and every action it takes stays traceable.
The outcome
Client-facing integration capabilities that connect customer agents to the platform while keeping access scoped and actions auditable.
Client agent→MCP / API→Scoped tools
Try it: give an agent exactly the access it needs
A client agent can read certificate CERT-104. Try an extraction, grant its required scope, and then request a document from another workspace. Send a batch to see that a denied request creates no work, even when repeated.
REQUEST
RESPONSE
No request sent.
allowed 0denied 0
Client agentPlatform tools
no request sent
Extractions started: 0
The agent has read access. An extraction also requires extractions:run.
No requests yet.
The decision: check both the action and the resource boundary before starting work. Every request has an auditable decision; granting an extraction scope does not grant another client’s data.
Local simulation with fictional clients, workspace boundaries, tool names, and scopes. No API calls or persisted jobs. Counters cover all attempts; the scrollable audit shows the last eight.
05
PLATFORM / CLOUD INFRASTRUCTURE
The platform the product runs on
The AWS infrastructure, deployment pipeline, and operating practices behind the platform, defined as code and owned by the team that ships on it.
My rolePlatform engineering, DevOps & infrastructure
AWSCDKECSCeleryCI/CDObservability
A few more detailsClose the notes+
The challenge
An AI pipeline and a web application are very different workloads sharing one codebase. Long document jobs should never slow down a request a customer is waiting on, and several teams need somewhere realistic to test before anything reaches production.
What I built
The whole environment is described in TypeScript with AWS CDK: containerised services on ECS, a managed Postgres database, Redis, load balancers, and a CDN-served frontend. The Django workload is split into separate services rather than one pool — the customer-facing API, the public API, the admin application, and background workers that are separated by job type, including a dedicated one for AI document processing, so a queue of long extractions cannot starve the rest.
The engineering decisions
Every environment comes from the same code, with production as the base and each development environment as a small set of overrides, so a team can have a full stack of its own without a parallel configuration to maintain. Deployments are version bumps in the repository rather than manual steps, which makes each release reviewable and reversible. Dashboards and alarms are defined next to the services they watch, so new infrastructure arrives already observable.
The outcome
Infrastructure the team can change safely: isolated environments per team, releases that are traceable to a commit, and workloads that scale independently of one another.
Commit→Pipeline→Versioned deploy→Monitored service
Amsterdam2021 — 20241 project
EVBox
Backend services for a fleet of connected EV chargers, from telemetry ingestion to the tools people used to operate it.
06
BACKEND / CONNECTED INFRASTRUCTURE
The systems behind EV charging
Backend services, telemetry pipelines, and tools that help people operate and understand a fleet of connected chargers.
My roleTeam leadership, backend & infrastructure
PythonAsyncIOREST APIsDocker
A few more detailsClose the notes+
The challenge
EV chargers generate high volumes of telemetry. Operators need dependable device status and remote operations, and downtime can leave a driver unable to charge.
What I built
I built and scaled asynchronous, event-driven services to ingest and process charger data, alongside backend APIs for fleet status, diagnostics, remote operations, and reporting.
My role as a lead
I managed and mentored engineers while contributing to the backend and infrastructure. I also worked with developers and QA engineers on charger testing APIs, internal tools, and dashboards for understanding test data.
The outcome
Telemetry processing and fleet management capabilities used by engineering and operations, with reliability, concurrency, and performance central to the design.
Devices→Async pipelines→Fleet operations
Try it: keep charger status correct when updates arrive late
Send a fault from charger AMS-017, then deliver an older charging update. Pause processing to see why an operator’s fleet view can lag behind the device. Each event button resends the same update; press it again to test duplicate handling.
FLEET CAPACITY / ILLUSTRATIVE WORKLOAD
Incoming updates / second
Processing capacity / second
Recovery after a 5-minute pause
Assume 2 updates per charger per minute and 50 updates/s per consumer. Recovery uses capacity left after new traffic: backlog ÷ (processing capacity − incoming rate). These are example limits, not EVBox fleet figures.
FOLLOW ONE CHARGER / ORDERING AND DUPLICATES
Charger AMS-017No new eventLast known sequence: #40
The decision: leave headroom to recover a backlog while new traffic continues. At the individual charger, preserve ordering and reject duplicates so higher throughput still produces a correct fleet view.
Synthetic charger events. Sequence numbers illustrate ordering; this is not an EVBox protocol implementation. The example queue holds 20 events and the history shows the last eight.
Eindhoven2016 — 20211 project
EFFECT Photonics & Philips
Software for photonics research and manufacturing, built alongside physicists, operators, and firmware engineers.
07
FULL-STACK / AUTOMATION
Software for the lab and production line
Working with scientists and operators to turn experiments, measurements, and manufacturing steps into repeatable workflows.
My roleFull-stack software & research collaboration
PythonFull-stackTest automation
A few more detailsClose the notes+
The challenge
Precision hardware needs repeatable measurement and dependable workflows. Scientists need room to explore; manufacturing operators need consistency across stations.
At EFFECT Photonics
I designed and built a full-stack system for the production of SFP optical transceiver modules: executing test sequences, capturing measurements, tracking progress and yield, and coordinating station workflows. I also worked directly with physicists on device characterisation and tuning tools.
At Philips
I built Python measurement, test, and data-acquisition systems for photonics research, along with visualisation tools. Working with scientists and firmware engineers taught me to turn experimental methods into usable software.
The outcome
Manual research operations became repeatable and unattended. Production operators gained integrated tooling, and automated testing and CI/CD helped standardise builds and releases at EFFECT Photonics.
Experiment→Repeatable tooling→Production workflow
Try it: test a module, record a failure, and retest
Follow one module through measurement, saved failure, adjustment, and retest. Then run the remaining sample lot: first-pass yield and release status are different measures, and a successful retest must not erase the original failure.
Modules tested0 / 12
First-pass yield—
Modules on hold0
SFP-042 · sample station readings
Measurement
Example limits
Reading
Check
Optical output
−3 to +1 dBm
—
Waiting
Supply current
20 to 80 mA
—
Waiting
tested 0first-pass —
MODULE DISPOSITIONNot tested
No saved measurements.
No saved test records.
The decision: make saved results part of the station workflow. Track first-pass yield across the lot, release each unit only after a saved pass, and retain its earlier failures for investigation.
Fictional lot of 12 modules, with three low-output fixtures. These readings, limits, and yield figures are illustrative. Bulk testing saves each untested module’s first result; it never adjusts failed modules or overwrites saved attempts. No hardware is connected.
These are summaries of my contributions. There’s no proprietary code or customer data here — just a little context about the work.
04 / HOW I WORK
Hands-on engineering. Team leadership.
I stay hands-on with architecture, implementation, and delivery while helping the team do good work. My approach is pragmatic: start simple, keep the code maintainable, and add complexity when the problem calls for it.
01
Design and build.
I take systems from architecture into implementation: Python services, asynchronous pipelines, LLM extraction, retrieval, and APIs. I work through the details alongside the team, with clear boundaries, readable code, and tests that make changes easier.
02
Lead the engineering work.
I set technical direction, review code, and mentor engineers. I establish practical ways of working across planning, testing, and releases, and help the team make decisions and take ownership of delivery.
03
Own the platform.
I set up DevOps practices and CI/CD, manage cloud infrastructure, and stay involved in deployment, monitoring, and production support. I choose tools and operating practices the team can understand, maintain, and grow with.