My own take on how I'd implement the multi-tenant architecture, with some comparisons and why I disagreed with RestaurantOrder's way.
design
architecture
Published on Feb 6, 2026
Updated on Feb 6, 2026
Recap
To recap, I am currently doing a UI/UX designer role in my capstone project for
Bachelor’s. But I do disagree with a lot of how they design the database, the
architecture and such to qualify for a multi-tenant architecture.
There are two projects concerned here, which should provide the same value, but
different philosophies and how operations are typically done. One of them is
called RestaurantOrder by the team, and one of them is FoodBasket by me. But both
should provide a restaurant-domain POS system and a food ordering system with
multi-tenancy.
Design Differences
I understand that keeping the scope small enough is a valid requirement, but please
also keep in mind that this project has to consist of 6 members expected to work
on the project at least in a part-time to full-time fashion, across 8-10 months.
All of them are seniors (Year 4) with almost no courses left to allow them to focus
on this project, and to finally present and defend the project to the committee
at the end of the run.
So all in all, even if you don’t like it, there are a lot to consider while doing
it. Sometimes simplicity would get you drilled in front of the committee, and sometimes
too much complexity would get you too out of scope to finish it in time. Or also
drilled in front of the committee.
Point 1 - Tech Stack
My argument is that the tech stack has to be maintainable, approachable and matured
enough to be actually safe across almost a year, until the presentation. I don’t
think we should try on an extremely new framework, just because some developers
like it, or too many libraries outside of what the standard framework gives, as
I also believe each new library is a moving part you need to consider.
If it was up to me, I’d have gone with something mature, battle-tested enough and
prioritize both UX and DX at the same time, something like Express and React with
TypeScript. From now, I’d call them the “Team” to be concise.
Until I found out that these are relatively new frameworks, they still contain
a lot of library-level wrinkles that haven’t been ironed out yet. I still wouldn’t
consider DX to be big enough of a priority to choose such new frameworks.
I’m not against NestJS or Tanstack per say, what I’m against is oRPC. In 2 months,
there have been constant issues about api contracts not syncing up, having to be
resolved by force rebases, force commits and forcing every branch to catch up, with
2 tickets having to be resolved by oRPC developers because they were bugs inside
the library. I’ll outline what the team has done in 3 months regarding the project
later for you to judge on your own whether that was a good call to use such a tech
stack.
I did it this way to allow mostly just for maintainability. As long as they all
share the same authentication/authorization model, I think having a few frontends
be server-rendered for performance as well as Google indexing might be a good
side benefit.
Point 2 - Libraries
Every developer has their own set of libraries they like to use. But the philosophy
of the one using them might differ.
This is fine to some extent, until you get to a few problems:
You can’t customize what BetterAuth’s organization plugin does. It’s practically
a black box even if you can read the source code or inspect the data models.
Also that BetterAuth supports role-based systems better than permission-based
systems, so there needs to be some workaround for that.
Shadcn is amazing for developer teams that don’t have a designer role, or none
of them can design something average enough, while also being customizable
enough for most use cases. But due to the number of custom components I
designed, I wonder if it would be better for them to search for the component
to use, rewrite a lot of it to fit the use case, than just making one specific
component for that from scratch?
They even once proposed letting the frontend connecting straight to BetterAuth’s
server for authentication, without letting the request go through the backend
first.
If I was the one calling the shot for the team, I’d let them go with Shadcn, but
would draw the line at BetterAuth. Someone once told me, you don’t have many
innovation tokens in a project, and usually you should spend those tokens on
features or designs that make the project different and unique, rather than on
non-mainstream libraries. And for the team, it seems like to me that they spent
too many tokens on libraries and frameworks. In the end, the product just feels
like a constrained spreadsheet experience in some workflows.
Point 3 - The Importance of Documentation
I strongly believe that software development doesn’t stop at just coding, there
are still a lot of processes to be done. And with the rise of LLMs recently
assisting, I see no reason why you can’t use LLMs to proof-read and assist in
writing specifications and documentation. I don’t really trust LLMs in writing
code for me unless it’s a very small and contained file, but for proof-reading
documentation, and rewriting them or catching small missteps feels like something
that a large language model would excel at.
When something goes wrong, we just know what goes wrong, but the process leading
up to why it goes wrong falls back to blaming, “Oh she didn’t read the file but
we actually had it”, “it was detailed enough”, “it was clearly written”.
Again, if I was the one calling the shot for the team, since a sprint is 1 week,
I’d have them write and review each other’s documentation and specification for
the first 2 days, and then spend the next 4 days implementing, or 1 week of docs
and 1 week of implementation. But to quote my professor, “You don’t need that,
that’s all fluff and unnecessary”.
Point 4 - Different User Personas
This clash stems from the fact that there are no actual user research, market
research, market-fit research done at all, but just considering already available
options, mainly TastyIgniter and GloriaFood. We of course don’t have the resource
to sit down with managers and ask, but I think going to restaurants, asking one
or two questions as probing, or bouncing ideas off other friends outside the group
would also be a budget way to conduct research.
This got fueled to blow up harder because there are also no solid software requirements
specifications, or SRS that documents such as “Given …, The system shall …”
format. When inquired about it, the team actually says that the features list IS
the required SRS, and the professor agreed that the features list is enough.
In short, the professor and the team believe that the software has to be “dumb and
rigid” to prevent flaws, but that risks having a very low ceiling and being frustrating
for power-users. I believe that the software has to work along side the user,
with a relatively low floor but a very high ceiling. I want the manager’s 4th
hour into the shift, getting interrupted by customers and employees to still
feel like they don’t have to fight the system.
Point 5 - Deployment Strategy
Somehow, this is Point 5, but this was the first we ever clashed on. Due to the
budgeting nature of Vietnameses, as well as extreme favoritism for “free” tools,
even if it’s piracy, they never looked into solutions that might cost a bit. Being
students and all, I do understand that, but when you calculate the costs, it costs
no more than a cup of milk tea per month for each member, then it begs the question,
is it worth going with lower quality free tools still, or is it worth buying a cup
of milk tea every month for a higher-quality paid tool?
For example, if I were to inquire for a Figma license to do my work in, they would
100% deny. Extremely thankful to the Figma team to allow Education licenses, or
I might not be able to use all the tools possible to do my work. For a professional
team, you would expect 5 developer licenses and 1 designer license, right? But this
is very understandable as a free license still provides enough for this, even in
the case of no Education licenses. The Edu license did help a lot with dev hand-off
though.
I know that even as students, we don’t have the luxury of going with industry-grade
tools like AWS or GCP or Azure, but budget options are out there, if you spent a
little bit of time to look.
To total that out, you pay around $13/mo (including taxes) for the paid services,
divided by 6 members, would be roughly no more than $2.5/mo. A single milk tea
cup in an entire month. Is it worth it to distribute so many services across so
many providers, just to save on that cup?
Point 6 - Architectural Design
There are massive clashes here from the start, but I let the developers design this
part on their own, trusting their expertise. And the two most prominent developers
wanted to design this part anyway.
This is a rather fair point, I’d say if anyone of them didn’t have much experience
with infrastructure or deployments. This makes it much easier to do it, but there
exists some user flow-related pain points, such as there’s no good way to switch
between restaurants without logging out and relogging in. Or being forced to belong
into a team (BetterAuth term for branch here) to do anything.
My idea is absolutely a lot more complicated, but I think it also provides a huge
talking point if it was asked in front of the committee. It was inspired greatly
by other platforms like AWS, and gives a heavy exposure to infrastructure and
deployment experience. And given 5 developers in 8 months? I think this can absolutely
be done.
Point 7 - Interface Design
There are probably more to speak on, but I want to end this blog before it gets
too long. Finally we will touch on interface design philosophy. Remember that the
professor is saying we have to aim towards managers and workers running around
on greasy tiny tablets.
While the ‘Table-First’ approach follows traditional legacy POS patterns, I
believe it underestimates the digital literacy of modern restaurant staff.
At the end of the day, it does just feel like a laggier, a more restricted
version of a spreadsheet. If they do target mom-and-pop brands, I wonder myself,
would they rather fall back to just a notebook and a pen? If they target a larger
chain with many branches, would they be able to do their work efficiently having
to scan tables and run filters, searchs and paginations on every workflow?
Even then, tables are notoriously dense in data, and would require horizontal
scrolling on smaller devices, given that the professor hated horizontal scrolling
and demanded that scrolling can only be in one direction, I don’t see how that’s
doable with tables. With greasy tablets, I do believe that the rate of mistaps
would be exponentially higher.
I wanted this product to give off a value, a more targeted set of users that may
benefit highly. I want to avoid the saying, “good for everyone, great for no one”,
and provide a truly different experience to other tools, targeted at power users,
those who are on the “restaurant floor battlefield”.
It sounds rather complicated, but those are just terms. At the end of the day,
on the UI, it just has a drill bar like a menu bar, and clicking an option is that
axis rotation. I made it this way to allow the workspace section to see live data,
and provide context and actionable data to the user, with unnecessary options or
editing tools tucked away until requested. I think it’s the best option because
due to its progressive disclosure nature, it’s instantly adaptive to all user
devices. Some more benefits that this accidentally gave me that I didn’t think of
until pointed out by friends or AIs:
The ability to optimize for offline-first, in case of internet drops in a restaurant
because it can cache.
Optimize away interruptions, because of caching, the user does not need to back
out of a flow to do another thing, they can just rotate the axis, do the thing,
and rotate back with still a “dirty workspace” to continue.
Extremely easy mapping of relational data with many-to-many relationships or nested
relationships. A workspace allows clickable data, instead of having to back out
and find the specific table needed.
Easy on the user’s mental model. For example, if they want to see who the role
is assigned to, they think “Role” first, not “User”. My UI allows them to click
“Role” and see the people assigned to, but the Tables UI would force them to
click “Users” and then “Filter by Role”.
It is non-linear and non-disruptive. A user can never be lost, because there are
no flows to force them in. They can always back out.
It also uses all of the screen space estate, if the user is on a larger device
to provide a bird’s eye view of the system and the data.
It is, admittedly, a bit more difficult to learn than a table. But I think anyone
that has ever used a phone before can learn this. From my observations in actual
restaurants, managers and employees are relatively young people, comfortably working
with technology, so my rationale would be “Why limit them to something slow?”
Point 8 - Branding
I do understand that the project is supposed to be a white-label system, and allows
tenants to register their own color theming for the system. But that’s not what
I’m talking about, I’m referring to the platform itself. What will the platform’s
branding be?
I understand this as developers just want to do it with Don’t Repeat Yourself, and
make it much more flexible and easier to change, if there is a change. But there’s
a problem with Figma, they don’t allow variations on a color, such as Tailwind’s
OKLCH scaling, or custom opacity on a color. When you set primary as a color on
Figma, there’s no way to make it well enough with semantic tokens. If only, Figma
added a feature to allow decoupling of opacity and scaling away from the colors.
It’s also extremely restrictive in a design point of view, because you can’t use
any weighted variants of a color, because it gives off the same problem. Changing
one -500 color, for example, requires you to change every single instance of
it having a different opacity. It’s easy for developers to change, not easy for
the designer to do so. If they have DX for developer’s experience, what about,…
DX, designer’s experience?
This point is not too much of a clash per say, just the way we think being different,
and I argue that both are valid. Except the part of not naming your project properly.
Like I understand developers are terrible at naming, but at least put some effort
in?
Afterwords
Wow, there were a lot to document out for this project alone. I hope you had a nice
read, and understand why I launched an open-source version of the project, but with
my visions and styles instead. There are a lot more points I want to speak on, such
as authorization and authentication, database design, team workflows, git usage,
but I think those are more nuanced, and a bit too small to make a point, but still
do contribute to the clashes.
I may be a little selfish, but I wanted my last project in school to be something
I can be proud of, and put onto the resume, and I can enthusiastically explain decisions,
trade-offs made during the process to future recruiters or even peers. I feel like
doing the professor’s way is safe, and just makes it look like a more team-effort
to-do app than an actual product worth investing in.
It sucks that I believe that the developers are truly good, and are capable of
producing more than a traditional CRUD app. But if your bottleneck is the professor
that stunted design works for 3 weeks because he asked for proof of the interface
design benefits, and dismissed it, then there’s really no hope for this. There’s
a reason why the OSS version existed with my vision, to save my sanity.