# Gautam Suthar > Gautam Suthar is a full-stack software engineer from India who builds and ships production software end to end, from database design and backend APIs through to polished React interfaces. He works at Pixerfect, on the company's own product and directly with its clients, and mentors the interns and junior engineers on his team. Before that he worked fully remotely for a US company, Untitledlabs, building backend systems in Node.js and Go and leading four interns across a 10-12 hour time difference, and spent two years freelancing for international clients. He maintains open source developer tools including Atarashi, Expressentials, Flux and Treegen, writes about databases and system architecture, and runs The Basement, a Discord community for developers. - **Full name**: Gautam Suthar - **Also known as**: Gautam, callmegautam, iamgautamsuthar - **Role**: Software Engineer at Pixerfect - **Location**: India (Asia/Kolkata, UTC+5:30) - **Website**: https://gautamsuthar.in - **Email**: iamgautamsuthar@gmail.com - **GitHub**: https://github.com/callmegautam - **LinkedIn**: https://www.linkedin.com/in/iamgautamsuthar - **X**: https://x.com/iamgautamsuthar - **npm**: https://www.npmjs.com/~iamgautamsuthar - **Discord**: https://discord.gg/2z6TAw2GFE - **Cal.com**: https://cal.com/gautamsuthar This file contains the complete public content of https://gautamsuthar.in, inlined. A shorter index is at https://gautamsuthar.in/llms.txt. ## About Gautam Suthar is a software engineer from India who has the increasingly rare habit of finishing things. He works across the whole stack (schema design, backend services, the API in the middle, and the interface people actually touch), and he treats the boundaries between those as an implementation detail rather than a job description. Professionally he is a Software Engineer at Pixerfect, where he ships features end to end across client applications and the company's core product, builds backend systems in NestJS and Node.js, and spends a meaningful share of his time on the unglamorous work that decides whether software is any good: chasing production bugs across the full stack and making slow things fast. He is not only an in-house engineer there: he works directly with clients, including one in South Africa whose product he builds and keeps running in production, and he guides the interns and junior engineers on the team through review, architecture calls and the debugging sessions where the actual learning happens. Before that he was at Untitledlabs, on the backend of an AI image generation platform in Node.js, Express and Go, building REST APIs and wiring up AWS S3 and Lambda for media processing at scale. That role was fully remote for a US company, done from India across a 10-12 hour time difference, and he led four interns through it. Remote is worth stating plainly rather than as a footnote: async by default, decisions written down instead of said out loud, and most of the working day spent shipping against a team that was asleep. He is very good at it because the job gave him no other option. Before that, two years of freelance work with international clients, which is where most of the end-to-end ownership instinct comes from: scoping, building, deploying and answering for it yourself, because when you freelance there is nobody else to hand the hard part to. The part that tells you the most about him is what he builds when nobody has asked. Atarashi is a scaffolding CLI he wrote, shipped, and then publicly wrote up the architectural dead end he had designed himself into. Flux is a package manager he started because his college is surrounded by forest and the internet was bad enough to make `npm install` a spectator sport. Expressentials is the four files he kept copying between Express projects, published so he could stop. Treegen is a Go tool for pasting folder trees into READMEs that quietly turned into a tool for reading them back out. None of these were career moves. They are all real, all installable, and all documented with the failures left in. He also keeps a graveyard page on his own portfolio: a public list of the projects he abandoned, each with one honest sentence about why. A text editor in C he finished and never opened again. A job-application bot that worked, which is precisely when he realised he did not want a job he could get without reading the posting. That page is voluntary, and it is the most credible thing on the site. He writes, mostly about databases and how systems come apart under load: read replicas, sharding, the trade-offs nobody puts in the marketing page. He runs The Basement, a Discord community for developers. His site publishes its own uptime, including its own outages, and answers `curl` with an ANSI card instead of HTML, because he thinks the terminal deserves a front door too. The through-line, if you want one, is the word he put in his own footer: kaizen. Continuous improvement. Ship it, use it, notice what's wrong with it, fix that. It is a slower way to get good and it is the only one that seems to work. ## What he works with - TypeScript - JavaScript - Node.js - React - Next.js - NestJS - Express.js - Go - Python - PostgreSQL - MongoDB - Prisma - Amazon Web Services - Tailwind CSS - REST API design - Database architecture - System design - Command-line tooling - Open source software - Full-stack web development ## Common questions ### Who is Gautam Suthar? Gautam Suthar is a full-stack software engineer from India who builds and ships production software end to end, from database design and backend APIs through to polished React interfaces. He works at Pixerfect, on the company's own product and directly with its clients, and mentors the interns and junior engineers on his team. Before that he worked fully remotely for a US company, Untitledlabs, building backend systems in Node.js and Go and leading four interns across a 10-12 hour time difference, and spent two years freelancing for international clients. He maintains open source developer tools including Atarashi, Expressentials, Flux and Treegen, writes about databases and system architecture, and runs The Basement, a Discord community for developers. ### What does Gautam Suthar do? Gautam Suthar is a Software Engineer at Pixerfect, working across the full stack. He designs database schemas, builds backend services and APIs in Node.js and NestJS, and builds the React and Next.js interfaces on top of them. Alongside that he maintains open source developer tools and writes about database scaling and system architecture at https://gautamsuthar.in/blogs. ### Where is Gautam Suthar based? Gautam Suthar is based in India and works in the Asia/Kolkata time zone (IST, UTC+5:30). He has held a fully remote role for a US-based company, working across a 10-12 hour time difference, and has delivered freelance work for international clients, so distributed, async collaboration is something he has done as the default rather than as an experiment. He is reachable at iamgautamsuthar@gmail.com. ### What has Gautam Suthar built? Gautam Suthar's open source projects include Atarashi, a TypeScript project scaffolding CLI published on npm; Flux, a Node.js package manager built to survive bad internet; Expressentials, an Express.js utility library of error handlers, status constants and async wrappers; Treegen, a Go CLI that generates clean folder trees for READMEs and reads them back; and SystemCanvas, a Next.js tool for drawing system design diagrams. Every one is public on GitHub and documented in full, including the parts that did not work. ### What technologies does Gautam Suthar use? Gautam Suthar works primarily in TypeScript and JavaScript across Node.js, NestJS, Express, React and Next.js, with Go and Python for tooling. On data he uses PostgreSQL, MongoDB and Prisma; on infrastructure, AWS services including S3 and Lambda. For AI features he works with LangChain and ChromaDB. Interfaces are built with Tailwind CSS. ### How can I contact Gautam Suthar? The fastest routes are email at iamgautamsuthar@gmail.com or a 30-minute call booked at https://cal.com/gautamsuthar. He is also on GitHub as @callmegautam, on LinkedIn at https://www.linkedin.com/in/iamgautamsuthar, and on X as @iamgautamsuthar. ### Is Gautam Suthar open to work? Gautam Suthar is a Software Engineer at Pixerfect and is open to hearing about interesting engineering roles, freelance work and collaborations. The best first step is a 30-minute intro call at https://cal.com/gautamsuthar. ## Work history ### Pixerfect · Software Engineer (Jun 2026 - Present) - Architected and delivered end-to-end features across client applications and the company's core product, owning implementation from database design and backend APIs to polished React interfaces. - Worked directly with clients rather than only on the in-house product, including a South African client whose application I build, ship and keep running in production, owning requirements and delivery end to end. - Guided interns and junior engineers day to day: code review, architecture direction, debugging sessions, and unblocking them on live production work. - Engineered scalable backend systems with NestJS and Node.js, designing maintainable APIs, business logic, and integrations for production workloads. - Diagnosed and resolved high-impact production issues spanning the full stack, eliminating complex bugs and significantly improving system reliability. - Drove application performance by optimizing backend services, database interactions, and frontend rendering, resulting in faster and more efficient user experiences. - Collaborated closely with product and engineering teams to translate complex requirements into scalable, production-ready solutions while maintaining high code quality and long-term maintainability. - Contributed across multiple projects simultaneously, taking ownership of critical functionality and delivering reliable solutions in a fast-paced development environment. ### Untitledlabs · Software Engineer · Remote — United States (Jul 2025 - Dec 2025) - Worked on the backend of an AI-powered image generation platform in Node.js, Express and Go. - Fully remote for a US-based company, working from India across a 10-12 hour time difference: async by default, written handoffs, and shipping against a team that was asleep for most of my working day. Remote is not a concession here, it is how this entire role was delivered. - Led four interns remotely, owning their onboarding, task breakdown, code reviews and day-to-day unblocking across that time gap. - Designed and developed REST APIs powering core product features. - Integrated AWS services including S3 and Lambda for scalable media processing. - Built internal tools and dashboards using React.js to improve developer workflows. - Collaborated with a distributed team to deliver production-ready features and bug fixes. - Wrote clean, maintainable code while participating in code reviews and feature planning. ### Freelance · Software Developer · Remote — international clients (May 2024 - Jun 2025) - Contributed to the development of internal platforms and client applications, delivering production-ready features across the full stack. - Worked with international clients across time zones, handling scoping, communication and delivery directly with no account manager in between. - Engineered backend services, APIs, and interactive user interfaces while maintaining clean, scalable, and maintainable codebases. - Implemented new features, resolved production issues, and optimized application performance across multiple projects. - Worked closely with stakeholders to translate requirements into reliable, high-quality software solutions. - Supported deployment, maintenance, and continuous improvements throughout the software development lifecycle. ## Projects Open source tools Gautam has built and shipped. Every one is public, installable and documented in full, including the parts that did not work. ### Atarashi - **Summary**: I wrote a scaffolding tool, then found out it could never support the thing I wanted it to do - **Write-up**: https://gautamsuthar.in/projects/atarashi - **Source**: https://github.com/callmegautam/atarashi - **npm**: https://www.npmjs.com/package/atarashi - **Live**: https://atarashi.gautamsuthar.in - **Built with**: TypeScript, Node.js, CLI, npm Starting a backend project is mostly a chore you have already done. You know what you want. Express or Fastify. Postgres or Mongo. Some auth. A Dockerfile you will not think about again. None of that is interesting, and all of it takes an evening before you write a single line of the thing you actually sat down to build. So I shipped a tool with five ready-made project templates. Pick one, get a folder. People installed it. For about a year I thought I had built a scaffolding tool. ## Then someone asked for a combination I did not have They wanted one of my templates, but with a different database. Reasonable ask. I went to add it, and that is when I did the arithmetic. Three frameworks. Four databases. Three ORMs. Auth on or off. Every one of those combinations is a template someone could reasonably want, and templates are things I have to write by hand and keep working forever. **144 of them.** I had five. And the feature I actually wanted to build next was a web page where you tick the things you want and get a project out. That idea makes no sense at all when the product is five frozen snapshots of five sets of decisions someone else made for you. The tool was not broken. It just could not ever become the thing I wanted, and no amount of polish was going to change that. ## So I rebuilt it around what you pick, not what I pre-made Now you describe the project you want, and Atarashi assembles it. ```bash atarashi new my-api --http fastify --db postgres --orm drizzle --auth jwt ``` No template matching that combination exists anywhere. It gets built for you, on the spot, from the pieces. If you ask for something impossible it tells you before it writes anything, and it says what would fix it. Ask for an ORM without a database and it names the databases that would work. Ask for two databases and it refuses and tells you why. You never get a half-made project you have to delete before trying again. ```mermaid flowchart LR A["atarashi new my-api
--http --db --orm --auth"] --> B{"Does that combination
make sense?"} B -- no --> C["Refuse before writing anything,
and say what would fix it"] B -- yes --> D["Assemble it from pieces"] D --> E["my-api/"] ``` If you would rather not think, there are still presets: ```bash atarashi new my-api --preset backend-ts --yes ``` That gives you a project that installs, builds, boots and answers a health check with no edits from you. Not "a starting point". It actually runs. ## The part I did not expect Because the tool composes from pieces instead of copying a finished folder, it can come back later. ```bash cd my-api atarashi add obs/pino # three weeks into the project ``` That is the bit I use most now, and it is the bit the old version could never have done. A template copier hands you a folder and forgets you exist. It has no idea what you picked, so there is nothing for it to add *to*. ![Atarashi composing a project from what you asked for, then adding to it weeks later](/pictures/atarashi-demo.gif) ## Things I decided on purpose **It works offline.** Everything it needs ships inside the package. On bad internet it still works, which matters to me more than it probably should. **Your project does not depend on Atarashi.** Nothing it generates needs the tool at runtime, and `atarashi eject` cuts the last link entirely. A scaffolding tool that installs itself permanently into your project has misunderstood the job. **It is fast enough that you do not go make tea.** Scaffolding is something you do while impatient. Under a second, and I keep it that way. **Every project records what it was made from**, so you can reproduce it exactly later, or hand the file to someone else and have them get the same thing. ## What it cost The rewrite changed everything: different commands, different names, a whole set of options where previously there were none. Anyone on the old version had to migrate, which is a sentence I never expected to write about a tool that started life copying folders. It was worth it, but I want to be honest that assembling a project from parts is genuinely harder than copying one. Pieces that each work fine can still combine into something that does not, which is why every combination gets built and tested rather than assumed. ## What I actually took from it The old templates were not wasted. They were five real, working sets of decisions, and breaking them apart into reusable pieces turned out to be almost mechanical once I was willing to do it. The catch is that I only got there after admitting that the previous year of the project was a dead end. That is the whole lesson, really: the thing that killed it was not a bug or a performance problem. It was a feature I wanted that the design simply could not reach. ### Expressentials - **Summary**: I published a small Express library, and strangers found every edge case I had not thought about - **Write-up**: https://gautamsuthar.in/projects/expressentials - **Source**: https://github.com/callmegautam/expressentials - **npm**: https://www.npmjs.com/package/expressentials - **Live**: https://www.npmjs.com/package/expressentials - **Built with**: TypeScript, Express, Node.js, npm Every Express project I started began the same way: I opened the last one and copied four files out of it. An error handler. Some status constants, because hardcoding `404` in eleven places is how you end up with a `40` somewhere. A few error classes. A wrapper so a failed promise in a route does not quietly hang the request forever. Copying works fine right up until you fix a bug in the copy and not the original. Then you have four slightly different error handlers in four projects and no idea which one is correct. So I packaged them. That part took an evening. ## The interesting part started after I published it People used it. Then people opened pull requests. The first one arrived within days, and it was for the error handler — the thing whose entire job is to be the last line of defence when everything else has failed. It turned out there was a situation where it would crash. Not handle an error badly. Crash, and take the process with it, in the exact moment you most needed it to work. I had written that same function four separate times across four projects and never once hit it, because my apps had never done the specific thing that triggers it. ## It kept happening That set the pattern for the next dozen contributions, and every single one was the same shape: a state my own code never produced. A timeout that fired *after* the request had already been answered, reporting a failure for something that had succeeded five seconds earlier. A request logger that silently dropped exactly the requests you most want to see — the ones where the client gave up and hung up mid-way. Validation that gave up halfway through and left you holding a request that was part-checked and part-not. A health check you could accidentally break by passing it your own data. Pagination that cheerfully accepted `"10abc"` as a number. None of these are exotic. Every one is something a real server does on an ordinary Tuesday. I just never wrote a test that did it, because it never occurred to me that it happened. ## What it gives you It grew past the original four files, but the rule held: every piece does one thing, and you can read the source of any of it in under a minute. ```ts app.use(requestId()); app.use(requestContext()); app.use(httpLogger({ skip: (req) => req.url === "/health" })); app.use(errorHandler()); ``` The one I reach for most is `requestContext`, because of what it removes. Anywhere in your code — a service, a helper, six calls deep — you can get a logger that already knows which request you are in: ```ts function findUser(id: string) { const log = getLogger(); log.info({ userId: id }, "Looking up user"); } ``` No `req` passed through five function signatures to get there. Every line from that request is tagged with the same id, and `findUser` never had to know a request existed. Validation works with whatever you already use. Zod, Yup, or something you wrote yourself — if it can check an object, it fits. I did not want to pick a winner on your behalf. One peer dependency: Express. Nothing else. ## What I would tell past me The library is not the interesting output here. It is four files I was already copying, plus a build step. What I actually got was a lesson in the distance between "works in my projects" and "correct". Every bug above was a perfectly legal thing for a server to do that my own apps simply never did. Not edge cases in any meaningful sense. Just *other people's normal*. Publishing something small and letting strangers run it against their servers turned out to be a far better test suite than anything I would have written alone — mostly because I would never have thought to write those tests. You cannot test for a state you do not know exists. The tests exist now. Other people wrote most of them, and I am completely fine with that. ### Flux - **Summary**: My college had terrible internet, so I started building a package manager - **Write-up**: https://gautamsuthar.in/projects/flux - **Source**: https://github.com/callmegautam/flux - **npm**: https://www.npmjs.com/package/@iamgautamsuthar/flux - **Live**: https://flux.gautamsuthar.in/ - **Built with**: TypeScript, Node.js, CLI, npm My college is surrounded by forest. That sounds lovely on a brochure. It is significantly less lovely when you are trying to install a package and the progress bar has been sitting in the same position long enough for you to question the entire degree. That is genuinely where this started. Not with a grand idea about package management. With a download that would not finish. ## The thing that actually annoyed me It was not the slowness. It was sitting in a lab watching a tiny package fail to download for the fourth time that week — on the same laptop. Those exact bytes had been on this machine three times already. They were gone, because every project starts from nothing and every install begins by asking the internet for permission. The internet being slow was a fact of life. Asking it for something I already had was just waste. So: download a package once, keep it, never ask again. ## The flex I built it, then benchmarked it against the tools everyone uses. It won. I would love to say I treated that result with scientific caution. I did not. I told everyone. For about a week I was a person who had written a faster package manager than npm, and I made that everyone else's problem. The uncomfortable truth, which took a while to say out loud: **it was fast because it did less.** npm is slow partly because it is careful. Flux was quick because it skipped the careful parts. A car with no doors, seatbelts or brakes also accelerates very well. The cache genuinely solved my actual problem. But "fastest package manager" was a benchmark of my own missing features, not of my engineering. Then exams happened and the repo went quiet for a long time. ## Bun Bun showed up and was absurd. Not "nice improvement" absurd. "Do that again, I think it failed" absurd. I ran an install and assumed it had silently broken, because nothing finishes that fast and actually works. What it made me feel was not "I should use this". It was: *someone went and did the version of this that I abandoned.* That reopened the repo. ## What it does now ```sh flux init Create a package.json flux install Install a package and record it flux uninstall [package] Remove one, or all of them flux update [package] Update one, or all of them flux list List installed dependencies flux outdated Show what has a newer version flux info Look up a package flux run