building · 2026-10-13 · 9 min
Why I Built Voxlet Clinic
The thinking, iterations, and product decisions behind building a clinic platform that connects its public website with the work happening behind it.
I started Voxlet Clinic because I kept coming back to a simple question: what if a clinic website was connected to the work a clinic actually does?
I had seen the familiar shape of a clinic website: a name, a few details about the doctors, a list of services, a phone number, maybe a contact form. That information matters. But it often feels like the website is one thing and the clinic's day-to-day work is another. The public page introduces the clinic, while appointments, doctor details, services, and content have to be managed somewhere else.
I wanted to explore what it would look like to treat those pieces as one product. That idea became Voxlet Clinic, a digital platform for modern clinics that I'm building under Voxlet Studio.
This is not a story about a finished product finding a huge audience. Voxlet Clinic is a product and demo I'm still developing. The interesting part for me is the process: figuring out what the idea should include, building both sides of it, and discovering how many product decisions hide inside something that first sounds straightforward.
The gap between the website and the work
I started web development in early 2023, and I've found I'm more interested in building whole products than isolated coding tasks. I'm currently building Voxlet Studio around web products, interfaces, and ideas; Voxlet Clinic gave me a concrete problem to explore: how could the public-facing experience and internal management experience belong to the same product?
The gap is easy to overlook when you think of a website as a collection of pages. A clinic can publish its services and doctors, but that alone doesn't give it a structured way to keep those details current. An appointment form can collect a request, but the rest of the workflow still needs somewhere to go. Information is visible, but the system around it is missing.
I wasn't assuming every clinic has the same process or needs the same tools. I was exploring a product shape where the information shown to visitors and the information managed by the clinic share a foundation.
More than a digital brochure
A brochure-style website has a clear job. It tells someone where a clinic is, what it offers, and how to get in touch. There is nothing wrong with that. The problem is when we assume that is the full digital experience a clinic needs.
Once appointments, doctors, services, content, and media are part of the picture, a set of static pages starts to feel disconnected from the work they describe. The public website might say one thing while the details are maintained in documents, messages, or separate tools. Even if each piece works on its own, the experience is split across boundaries the product could help make clearer.
I began to think of the website as one surface of a larger system. A visitor should be able to understand the clinic and take a useful next step. The people managing the clinic should have a clear place to maintain the information that makes that experience possible. That doesn't mean every action needs to be automated. It means the product should give related work a coherent home.
This framing changed what I considered part of the project. I had to think about how a service is represented, how a doctor is connected to the clinic, and how information in the admin side reaches the public side.
Deciding what belonged in the first version
The first version could not be everything. That sounds obvious, but it is easy to keep adding ideas when you're building alone. A new feature can sound small until you ask what data it needs, where it appears, who manages it, and how it affects the rest of the interface.
I settled on a set of connected areas to explore: a clinic website, appointment management, doctor management, service management, content management, media management, and an admin dashboard. I didn't see those as seven unrelated features. They were different parts of the same question: what information does the clinic need to present, and what does it need to manage in order to present it well?
That distinction helped me decide what to build first. Doctors and services shown on the public website need a representation in the management side too. Images need a way to be managed, and appointments need to be understandable as a workflow rather than hidden behind a form.
I still had to make assumptions. A demo doesn't give you the same feedback as watching a real clinic use a workflow, and I don't want to pretend otherwise. I treated the first version as a way to make the product idea tangible: build enough of the connected experience to see where it holds together and where it needs more thought.
Building the public experience
The public-facing side had to do more than look polished in a screenshot. It needed to make the clinic's information easy to understand and give each piece a clear role. A visitor should be able to move from learning about a service to understanding who provides it or how to ask about an appointment.
I care a lot about interfaces that feel intentional. That doesn't mean adding decoration everywhere. It means deciding what deserves attention, making the hierarchy clear, and giving the layout enough consistency that a person can understand how to move through it.
The public pages couldn't be detached from the application; their content has to map to something the clinic can maintain. That question kept the design honest: a polished page is not a useful product surface if its content has no clear source or update path.
Building the management side
The admin and application side brought a different set of design problems. It isn't enough to put every possible control on one dashboard and call it management. The work needs structure: the user should be able to understand what they are managing, where an item belongs, and how changes relate to the public experience.
That meant thinking through doctors, services, appointments, and content as connected parts rather than separate screens. A doctor can be associated with a service; a service needs information that makes sense both internally and on the website. An appointment belongs to a workflow, not just a row of data.
I also had to resist designing only for the happy path. What happens when information is incomplete? Which details should be required? What should be easy to find again? These questions are not glamorous, but they determine whether a management interface feels like a working tool or just a collection of UI components.
I didn't have a perfect map before implementation. Some decisions became clearer only after I could interact with a screen and see what was missing. A working version reveals questions an abstract feature list can hide.
The structure underneath
The current stack is Next.js, PostgreSQL, Drizzle, and Cloudinary. Those choices are not the story by themselves, but each one supports a part of the product I wanted to explore.
Next.js gives me a foundation for both the public website and application layer. They serve different needs, but belong to one product: the public side helps visitors, while the management side works with the information behind that experience.
PostgreSQL gives the product a relational model for information that isn't a pile of unrelated fields. Doctors, services, appointments, and content have relationships, and the schema forces me to be specific about what each entity is and how it connects to the others.
Drizzle provides type-safe database access and helps keep the application code aligned with that structure. It doesn't make the modeling decisions for me; I still have to decide whether the schema describes the product I mean to build.
Media needed its own consideration. Images are part of the public experience, but I didn't want them living directly inside the application as if they were ordinary content fields. Cloudinary handles image storage and delivery, keeping media concerns separate from the main application while giving the product a place to work with those assets.
None of these choices removes the need to revisit decisions. They give me a foundation I can reason about while the product changes.
What changed while I was building
The project did not move in a straight line from idea to finished screens. I changed my mind, removed things, restructured parts, and found questions only after building the first version of something.
That was especially true when connecting the two sides. A section that looked obvious on the public site raised harder questions in the admin experience: who maintains this information, and what should happen when it changes? A management screen could expose gaps in the data model. The interface and the system kept asking each other for clarification.
I had to learn that the hard part isn't just writing the code. It is deciding what the product should actually be. Code can turn a decision into a working feature, but it can't tell me whether that feature belongs, whether it fits the rest of the system, or whether the workflow makes sense.
Sometimes the right move was to add structure. Sometimes it was to simplify the idea or leave something out. I got more comfortable treating those changes as part of building instead of evidence that the original plan had failed. The plan was a starting point; implementation gave me better information.
What I learned from building it
Voxlet Clinic has made me pay closer attention to the distance between an interface and the system it represents. I used to be able to look at a screen and think mostly about its layout and interactions. Now I find myself asking where its information comes from, who can change it, what else depends on it, and whether the product's other surfaces tell the same story.
That has made me care even more about both sides of development. The interface should feel considered, and the engineering underneath should support it. A public page and an admin dashboard aren't one product just because they share a logo; their data and workflows have to make sense together.
I've also learned to be more honest about uncertainty. A product can be thoughtfully designed and still need to change once someone tries to use it. In this case, I'm building and refining a demo, not reporting on established clinic usage. The work can still teach me a lot, as long as I distinguish what I've implemented from what I have yet to validate.
Where I want to take the idea
I want to keep developing Voxlet Clinic as a product that can grow beyond a demo. For me, that means continuing to improve the relationship between the public website and the management experience, making the underlying information model clearer, and refining the details that make each workflow understandable.
I don't want to decide the future of the product by stacking up features. I'd rather keep asking whether each part strengthens the central idea: the clinic's public information and related work should have a coherent place to live. That gives me a useful way to evaluate what belongs next and what is only a tempting detour.
Building Voxlet Clinic has been a way to practice the work I want to do through Voxlet Studio: start with a problem, shape an idea, make the interface, and take responsibility for the system underneath. The product is still in progress, as is my understanding of it.
That's probably the most useful thing I've learned so far. A product doesn't become coherent because I planned every detail at the beginning. It becomes more coherent when I keep connecting the decisions, notice where they don't fit, and stay willing to revise them.