Backend engineering
APIs, business logic and services in Java on the Play Framework, with Guice and MyBatis over a relational schema. The work that decides whether everything above it can be simple.
Software Engineer at Zeetaminds — since August 2024
Backend services, the identity layer that guards them, and player software running on displays in places I will never visit. I care about what a system actually does in production — not what the spec says it should.
Engineering identity
Most of what I work on has no screen. It is the layer that decides whether the thing with a screen can be simple — and it spans five areas that turn out to be the same problem seen from different heights.
APIs, business logic and services in Java on the Play Framework, with Guice and MyBatis over a relational schema. The work that decides whether everything above it can be simple.
OAuth 2.0 and OpenID Connect in practice: Authorization Code with PKCE, JWT validation against JWKS, refresh and session lifetime, SSO, and the difference between proving who someone is and deciding what they may do.
Customer-facing software rather than exercises. Features that have to work for operators who did not read the release notes, on the day they need them.
Signage players on Samsung Tizen, LG webOS and Android: media playback, remote control, snapshots and live view, on embedded runtimes with their own rules about what a browser is.
Learning to build applications where a language model is one component in a system that still has to be correct: structured outputs, tool calling, retrieval, and evaluation that does not flatter itself. The newest of these five, and the one I am least expert in.
Current work
Production software at a digital signage company: the backend that serves it, the identity layer that guards it, and the device code that has to behave the same on three vendors’ hardware.
Zeetaminds builds a digital signage platform: a content management system that schedules and delivers media to displays running in shops, offices, campuses and public spaces. I work across the backend that serves those displays, the identity layer that guards it, and the device-side code that has to behave the same on hardware from three different vendors.
Selected engineering work
Two anonymised case studies from work, one personal project, and two slots I have deliberately left empty rather than fill with something invented.
Getting the right media onto displays that run on hardware from three vendors, over networks nobody controls.
OAuth 2.0 and OpenID Connect in production — Authorization Code with PKCE, JWT validation against JWKS, and SSO between applications.
A personal finance dashboard that replaced a spreadsheet — and turned into an exercise in how to fetch data from providers that do not want to be fetched from.
Slot reserved for a real LLM application — not filled with an invented one.
Slot reserved for a utility, automation or dashboard worth writing up.
Capability map
No percentages — a number like “Java 70%” means nothing to the person reading it. Three honest levels instead, and the difference between them matters.
Where most of my day goes.
The area I have gone deepest on, and the subject of most of my writing.
Signage hardware: three vendors, three sets of rules.
The newest area for me. Listed at the level I actually hold it, not the level it would be useful to claim.
How I think
Ten things I actually believe about building software, most of them learned the expensive way.
The fastest way to cause an outage is to fix a symptom in a part of the system you have not read yet. Before I change code I try to answer three questions: who calls this, what does it assume, and what breaks if it returns something different. If I cannot answer them, I am not ready to edit the file.
Every layer of indirection is a thing the next person has to hold in their head at 2am. I would rather write a boring service with an obvious call path than an elegant one that needs a diagram to explain. Complexity should have to justify itself; simplicity gets the benefit of the doubt.
A spec tells you what should happen. A device in a shop tells you what does. I have shipped code that was correct by the standard and still wrong in the field, because a runtime three years out of date disagreed. The real system is the source of truth, and the spec is a strong hypothesis about it.
When something fails I want a log line, a network capture, a reproduction — something that constrains the search space. Intuition is useful for choosing which evidence to collect first, and dangerous as a substitute for collecting it. The question I keep asking is: what would I expect to see if I were right?
Working on IAM taught me that authentication decisions leak into everything: where state lives, how long a session survives, which service is allowed to trust which token. You cannot bolt that on at the end. Decide the trust boundaries first, and most of the individual security bugs stop being possible.
Once a response shape is out there, a client is parsing it — possibly a device in the field that will not be updated this quarter. Adding a field is cheap, changing the meaning of one is expensive, and removing one is a decision, not a cleanup. I try to design endpoints as if I will never get to change them.
I write code that has to run on browser engines several years behind current, on hardware I cannot physically reach. That is not a bug in the plan; it is the plan. Treating old runtimes as a design input — rather than complaining about them — is most of what makes device work tractable.
The difference between a ten-minute fix and a two-day one is usually whether the system said anything useful before it fell over. Logging the input that caused the branch, not just the fact that the branch was taken, is the cheapest investment I know of.
Networks partition, devices reboot mid-download, tokens expire in the middle of a request, and a media file that worked yesterday hits a decoder that will not take it. The interesting part of the design is what happens then. Retries, timeouts and a safe fallback state are features, not defensive padding.
I use LLMs daily and they have genuinely changed how fast I work. They have not changed what it means for code to be correct. A model can produce a plausible integration in seconds; knowing whether it handles the expired-token case is still the job. I treat AI as a fast, confident junior collaborator whose work I am accountable for.
Direction
Stated as direction, not achievement. These are the areas I am deliberately spending time on — none of them are finished.
Treating an LLM as an unreliable component inside an otherwise ordinary system: where to put retries, how to validate structured output, when retrieval beats a bigger prompt, and how to evaluate any of it without fooling myself.
I already work on a system where thousands of clients hold their own state and the network is unreliable by default. I want the vocabulary and the theory behind the problems I keep meeting in practice.
Less clicking in consoles, more understanding of what the platform is actually doing. Containers, reproducible builds, and pipelines that make a deploy boring.
The parts that only show up under load or under attack: concurrency, performance work backed by measurement, and API design that survives its second and third consumer.
Engineering notes
Mostly written after debugging something and realising my mental model was wrong. Identity, device platforms, media, and what actually changes when a language model joins the system.
Path
Data structures and algorithms, operating systems, DBMS, computer networks, distributed computing, computer architecture, cryptography and network security.
Moved from coursework into production software: code that other people depend on, running on hardware I cannot reach.
Backend services in Java and Play, IAM with OAuth 2.0 and OpenID Connect, and device-side work across Samsung Tizen, LG webOS and Android.
Building LLM-backed applications and studying the failure modes of distributed systems, with the same bias toward understanding the layer underneath.
Education
Amrita Vishwa Vidyapeetham · Coimbatore, Tamil Nadu
2020 — 2024
Certifications
Coursework completed between 2019 — 2022, before I started engineering professionally. Listed for completeness rather than as evidence of current expertise — the work section is the better signal.
086675e9bc72…ade48f1c8dce…083939a590c7…37e2d540dad8…7ef43fc28ece…a84200473ee5…2676517a5593…7d2100026f04…e1704a231491…c9cba5f677ba…c51f7ac0a70d…698a4e452bef…076e3c669444…5f7bf5b8159e…f220fab5f595…753025786987…d4ebacc20890…e572947c072d…5a7ad1b2e8fe…8a054d728e75…6041da2108a0…I like talking about backend architecture, identity, the strange things devices do in production, and where language models genuinely help in a system that still has to be correct. If you are working on something in that space — or you think I have got something wrong in one of my notes — I would like to hear about it.