Research assistant
Not my idea. It showed up as a prototype, I spent two weeks rebuilding it properly, and it never reached a production client.
The idea came from outside the company and it is a good one. Researchers spend a huge amount of their time on the work around the science: shaping the question, finding out what has already been asked, writing the protocol, getting it past an ethics committee. The pitch was that a lot of that could be helped along. Hard to argue with that.
One day it turned up as a prototype, and I was asked to deploy it.
Getting it running
It was a prototype in the fullest sense of the word. Python, one repo, frontend and backend fused together in a way I still cannot describe properly, and a few secrets committed where they should not have been. None of which is really a criticism: it was written to make a point, not to be read, and on that front it worked. My own prototypes do not look any better.
It took me two days to get it running on an EC2 instance. What saved me was Docker. I stopped trying to make the machine agree with the code, put the code in a box with every dependency it turned out to need, and eventually the box started. Thank god that exists :)
Building it again
With the prototype up and demoable, the next request was to rebuild the whole application properly. So off I went. Two weeks, frontend and backend, an MVP from nothing.
The middle of it was an AI agent you could actually talk to about your own research. Give it your idea and it would take you through it, validate the hypothesis, tell you where the gaps in the field were, help you turn all of that into something you could write up.
Worth remembering what building an agent looked like then. No framework, no agreed way to hand tools to a model, no examples to copy from. You wired the prompts, the context and the loop yourself, and you found the edges by walking into them. Mostly by walking into them.
In the end there were several of them, sat in a studio the researcher picked from: a Socratic Tutor that questions you toward a focused research question, a Gap Explorer that goes looking for the openings in your field, and the rest of the app around them for protocols, papers and literature.
The landing page
When the app was done I put a landing page together. Sooner or later somebody was going to have to sell this thing, and there was nothing to point a buyer at.
The job ended up covering a fair bit of ground:
- The application. Frontend and backend, from an empty repo to a working MVP.
- The agents. The prompts, the context, the loop, the tools.
- The chatbot. A full-screen assistant you could open anywhere in the app and ask for whatever you needed.
- The branding. Some colours, and a hand in the logo.
- The landing page. Design, copy, build, and filming and editing the video on it.
- The infrastructure. AWS, containers, storage, CI/CD, deploys.
None of which ever reached a production client.
How it was put together
- FrontendReact, Zustand, feature-based architectureOne folder per feature, each owning its own components, hooks and store slice. Nothing reaches across into another feature to get its work done.
- BackendNestJS, Ollama provider, PostgresThe API, the auth, the documents, and every agent loop. The LLM sat behind a provider interface so the model underneath could change without the rest of it noticing.
- StoragePostgres, S3Postgres for everything relational. S3 for profile images and for the documents researchers uploaded to work against.
- InfrastructureAWS, Docker, GitHub ActionsThe application on AWS in containers, the landing page on Vercel, and CI/CD on GitHub Actions for all of it. Push to the branch, watch it go out.
One call in there was mine to make. The prompts were hard coded in the codebase. The tidy version is a prompts table in Postgres, versioned, with a small interface so a non-engineer can edit one without a deploy, and I knew that at the time. We had neither the time nor the money for it. Hard coded prompts ship the same afternoon, get reviewed in a pull request like any other change, and cannot be broken in production by somebody clicking the wrong thing. The cost is that changing a prompt means a deploy, and at the size we were, that looked like the cheaper problem to have.
It never shipped
I wanted to see this in production with a lot of people using it. That is the part I was building for, and it never arrived. I do not really know why, and it was not mine to decide. Sometimes reality is just like that.
The good part is what I picked up on the way there. Two weeks is not long, and I came out of them having done things I had never done before, agent loops back when nobody had a recipe for them among them. That part stays with me whether or not anyone ever bought it :')