Ovidiu Stoica

/ovistoica

Ovidiu Stoica

I write about SaaS, web development, freelancing, and marketing for developers

User Avatar

Ovidiu Stoica

3y ago

The GTD method, or the "Getting Things Done" method, is a productivity system designed to help individuals and organizations increase their effectiveness and efficiency.

It was initially used by busy executives in large companies but in the modern day, it suits perfectly the demands of indie hackers juggling family, a day job, and a side-hustle

Here are 6 benefits of using GTD for Indie Hackers:

1. Improved focus and concentration on the task at hand- GTD keeps focus on one task at a time which is what the brain can do best.

2. Reduced stress and anxiety - We all have things we know we should do but we are not. GTD provides a definite look at all the tasks you have and the next actions for them.

3. Better time management - GTD emphasizes the importance of regular review of one's current tasks and filtering them based on context (where am I? What can I do? How much energy do I have?) so you tackle the right task.

4. Better creativity and problem-solving - GTD uses the brain for what it does best, solving the current problem at hand. By forcing the question "What is the next action on this?", You already do more than 50% of the work

5. Progress tracking through multiple projects - GTD emphasizes keeping an active list of projects and at least one next action for each of them

6. Mind like water - Essentially GTD is a method of downloading your brain into a trusted system so your mind is not cluttered by the multitude of tasks you're not doing. By freeing your mind, you let it focus on what's in front of it

User Avatar

Ovidiu Stoica

4y ago

I've been a web developer for 7 years and explored all frameworks post @reactjs

The one I enjoy the most: @remix_run 💿

Let's dive into it 👇🧵

Introduction

Remix was created by @ryanflorence and @mjackson—The creators of React Router, and later joined by @kentcdodds (@TestingLib and many great courses)

The framework was initially a closed beta costing 250$ for a license but was later released for public usage.

Philosophy

Remix is an edge-first client-server framework built with the end-user and developer experience in mind.

Frameworks take a lot to learn, and knowledge doesn't transfer well.

Remix is built on classic web standards.

Learn Remix => accidentally learn the web

Nested Routes

In Remix, you can render a hierarchy of routes simultaneously.

Every sub-component concerns itself only with what it has to render, leading to better code-splitting and easier to reason about code.

No more Layout components rendered everywhere.


Data Mutation

To write data, you use forms and HTTP.

When the user submits a form, Remix will:

  1. Call the action

  2. Reload all of the data for all of the rendered routes

Bonus: The code below does not require any Javascript on the client to work 🤯

(Un)expected Errors

Your UI function should only concern itself with the *happy path *.

Remix uses special components for error handling. Errors are scoped to the nearest boundary

Unexpected error => `ErrorBoundary`

Expected error => `CatchBoundary`

Styling

Remix embraces CSS stylesheets.

You can scope styles based on your routes to avoid name clashes. CSS-in-JS is supported but not recommended because they are applied at runtime.

The most popular styling solutions are Tailwind and scoped CSS.

Performance

Remix is designed to take advantage of edge computing.

Computation power, but the network is limited, so deploy close to your users serve the minimum size necessary for best experience.

It supports all the modern edge providers.

remix.run/docs/en/v1/guides/performance

Deployment

Deployment is easy.

The team provided starter templates and examples for most platforms so this won't be a problem.

You can focus on building cool features for users.

Remix stacks

Stacks are pre-made tech stacks with deployment and scale in mind adapted to your needs with a music twist

Remix has 3 standard options and provides the ability to create your own stack template (until we run out of music genres)

More here:
remix.run/docs/en/v1/pages/stacks

Community

The community is welcoming.

There are dedicated devs in the discord server to help with any issues you have. The team is very responsive.

The founders had communities before Remix (React Router + KCD Community), so it is well managed.


discord.gg/v3btfyk7

Future & Funding

The team secured a $3M seed round in October 2021 lead by @naval.

The seed gives them 2 years of leeway and more will come since investing in Open Source is growing. No pricing model is established yet.

You can safely bet your next app on @remix_run

TL;DR @remix_run

• Great community

• Built for the edge

• Secured $3M seed

• Client-server model

• Based on nested routes

• Uses Forms for mutations

• Scopes styles to the current route

• Great experience for users and devs

• Is a react framework built on web standards

User Avatar

Ovidiu Stoica

4y ago

I've been a web developer for 7 years and explored all frameworks post @reactjs

The one I enjoy the most: @remix_run 💿

Let's explore 11 aspects of Remix👇🧵

1/Introduction & Team

Remix was created by @ryanflorence and @mjackson—The creators of React Router, and later joined by @kentcdodds (@TestingLib and many great courses)

The framework was initially a closed beta costing 250$ but was later released for public usage

2/Philosophy

Remix is an edge-first client-server framework built with the end-user and developer experience in mind.

Frameworks take a lot to learn, and knowledge doesn't transfer well.

Remix is built on classic web standards.

Learn Remix => accidentally learn the web

3/Nested Routes

In Remix, you can render a hierarchy of routes simultaneously.

Every sub-component concerns itself only with what it has to render, leading to better code-splitting and easier to reason about code.

No more <Layout /> components rendered everywhere.

4/Data Mutation

To write data, you use forms and HTTP.

When the user submits a form, Remix will:

1. Call the action function

2. Reload data for the form or affected routes

Bonus: The code below does not require any Javascript on the client to work 🤯

5/(Un)expected Errors

Your UI function should only concern itself with the *happy path *.

Remix uses special components to handle errors. Errors are scoped to the nearest boundary, to not break the full app

Unexpected error => `ErrorBoundary`

Expected error => `CatchBoundary`

6/Styling

Remix embraces CSS stylesheets.

You can scope styles based on your routes to avoid name clashes. CSS-in-JS is supported but not recommended because they are applied at runtime.

The most popular styling solutions are Tailwind and scoped CSS.

7/Performance

Remix is designed to take advantage of edge computing.

Computation power grows, but the network is limited, so deploy close to your users, and serve the minimum size necessary for best experience

It supports all the modern edge providers

http://remix.run/docs/en/v1/guides/performance

8/Deployment

Deployment is easy.

The team provided starter templates and examples for most platforms so this won't be a problem.

You can focus on building cool features for users.

9/Remix stacks

Stacks are pre-made tech stacks with deployment and scale in mind fitted to your needs with a music twist

Remix has 3 standard options and provides the ability to create your own stack template (until we run out of music genres)

Details: http://remix.run/docs/en/v1/pages/stacks

10/Community

The community is welcoming.

There are dedicated devs in the discord server to help with any issues you have. The team is very responsive.

The founders had communities before Remix (React Router + KCD Community), so it is well managed.

http://discord.gg/v3btfyk7

11/Future & Funding

The team secured a $3M seed round in October 2021 lead by @naval.

The seed gives them 2 years of leeway and more will come since investing in Open Source is growing. No pricing model is established yet.

You can safely bet your next app on @remix_run

TL;DR @remix_run

• Great community

• Built for the edge

• Secured $3M seed

• Client-server model

• Based on nested routes

• Uses Forms for mutations

• Scopes styles to the current route

• Great experience for users and devs

• Is a react framework built on web standards

If you enjoyed this thread, jump back to the top and retweet for others to see it

1. Follow me -> @ovstoica for more deep dives and tips from web development

2. Here's another thread you might enjoy:

User Avatar

Ovidiu Stoica

4y ago

Many creators see their biggest success with posts about their results.

If you can use this technique correctly, you can attract more people to your course/SaaS/consulting. Sharing wins may feel weird, but it will become easier after we understand how others perceive it.

Now, let's dive in.

#1: People feel you are finally validated

Results mean you went through the struggle, iterated on your creations, and now someone finally bought.

I saw a creator share "2 people bought my course," and he got 10 more customers from that post—including me.

#2: Other creators love celebrating the wins of peers

When somebody is on the same path as you and wins, it shows you are doing something right.

I love when other creators win, and I retweet many of their results.

#3: It's easier to buy something others have bought

People HATE making wrong decisions with their money.

When somebody has already bought and seems satisfied, buying becomes very easy.

#4: People are drawn to big win events

This is why startup funding rounds are 100x times more publicity than bootstrapping.

A startup founder who just closed a big seed round will get invited to give talks, interviews, and what is his "secret" while bootstrappers will code away in silence until they share some profits.

#5: Process makes people aware; results make them interested

Sharing your process is very important, but people take you more seriously when you back it with results.

I have a YouTuber friend who's been at it for 3 years, and a video averages 400 views. People ask him, "When are you gonna be done with that?". If he averaged 10k views per video, they'd ask, "When is the next video coming out?"

Please share your results, no matter how small they are!

I wish you well on your journey, and comment below with your last results.

User Avatar

Ovidiu Stoica

Clojure

4y ago

I'm translating some Clojure code to Javascript for my job for transparency for the UI team and I realized why I prefer Clojure for Javascript. Here's the problem:

Select only unique objects from a list

Javascript:

const myDistinctArray = [
  ...new Set(myObjArray.map(JSON.stringify)),
].map(JSON.parse);

or

// This one presumes unique "id" === unique object 
let uniqueObjArray = [
  ...new Map(
    objArray.map((item) => [item["id"], item])
  ).values(),
];

Clojure

(distinct my-object-list) // that's it

Why does the Clojure one work?

Clojure promotes immutability by default, and this includes maps. So maps are compared directly by value and not by reference or identity.

Conclusion

The beautiful thing about Clojure is how expressive the language is and how much you can say with very few lines of code.

User Avatar

Ovidiu Stoica

4y ago

Last year, 190B$ were spent on burnout healthcare costs. Here's how to be the exception for this statistic:

#1 Don't volunteer for every task to get recognition - It never pays off the way you expect and you'll be disappointed.

#2 Go for walks everyday - Get outside, get some sun 🌞

#3 Avoid overtime more than 1 day / week - If you have to overtime, do it once / week. Otherwise, at 17:00 close your laptop. 🕓

#4 Set clear work expectations with your boss - Tell them your work schedule and what you won't do.

#5 Mandatory: Exercise - Non-negotiable. Exercise or get the chair hump. You choose.🏋️‍♂️

#6 Have side-projects - Work on programming stuff outside of work. Helps to get your mind off the stress at work.

#7 Have a non-tech hobby - Churchill painted to relax from politics. What makes you think you can do better? 🎨

#8 Take breaks often - 5 minute breaks: Stretch, call a friend, play with your dog. Often, this will make you more productive than before. ⌛️

#9 Ask for help from colleagues - Being blocked on a task and not asking -> Working overtime to solve it -> burnout

#10 Admit to your team when you're bored with a project - You can switch projects but many times admitting it to others will solve the issues

#11 Request domain training to revitalise your passion - Training in modern practices or attending a conference can revitalise you

#12 Solid sleep schedule - Programmers tend to sleep 5-6 hours. You'll grow old faster. Sleep 8 hours. No tech one hour before bed.😴

#13 At the daily standup say "Yesterday I had a bad day and didn't do much". - Feeling behind -> Working overtime -> Burnout

#14 Social life - You need offline friends. 🙋‍♂️

#15 Talk to your boss about your future in the company - If you think there's no future for you in the company, you'll be disinterested. Discuss a promotion path and steps to achieve it. 📈

User Avatar

Ovidiu Stoica

4y ago

Untitled...

Getting maximum value from programming courses 101

Over the past 5 years, I've taken over 50 programming courses.

Want to know a secret?

I use the same 6 rules every time to get full value 🧵👇

Rule #1: Type with the instructor

Why it works?

You engage your brain visually and by typing, creating multiple types of connections.

This leads us to rule #2 👇 .

Rule #2: Create a GitHub repo with your version of the code

Why it works:

  • You have a reference that you can go back to in the future

  • You can split lessons by commits to have a better overview

Rule #3: Create a similar project at the end

Don't consult the course material. Why it works:

• You form better connections from recall, not note-taking

• You apply the information in a different context

Rule #4: Spread out the course over 1 hour / day

Don't cram . Instead, do 1 hour / day. Why?

• You retain more information and longer

• You go into more details

• Your experience is better

Do this, and you'll be wildly successful.

Rule #5: Take small parts and apply to your job

If you see packages, frameworks or techniques you can start to apply at your day job, do so!

Your company will benefit from added expertise and you'll get to apply what you learned in the real world.

Great job!

Rule #6: Change it up as you go

Change a key part of the course to engage your brain.

  • If it's a javascript course, try converting to typescript

  • Try changing the styling of the app

  • Use a different DB than the instructor

Don't just follow along blindly.

That's it!

TL;DR: 6 rules to get max value from programming courses:

• Type with the instructor

• Create a GitHub repo with the code

• Create a similar project at the end

• Spread out the course over 1 hour/day

• Take small parts and apply to your job

• Change it up as you go

Don't forget to follow me for more threads -> @ovstoica

Here's another thread from me you might like:
https://twitter.com/ovstoica/status/1509778155346743304

User Avatar

Ovidiu Stoica

4y ago

In the first part, you captured everything that was floating around in your brain in Todoist in the Capture section of your GTD project.

If you stop at this point, you will still gain some clarity from having all the things you kept in your head, laid out in front of you. Good job!

You probably have items looking like this:

If you took the time to do this correctly, you can expect to have more than 70 entries captured.

"What is the next action on this item?"

Go through each item in part and ask what is the next action on it.

Go through the items in order, so your brain trusts the process

It will be tempting to process preferentially but force yourself to do it in order.

This will make your brain trust that whatever the item that was captured, it will be processed by the system whenever you have your weekly review.

Make your next action be specific and include context in the description.

"Build dashboard" is not an action, but "Research tech stack for new dashboard" is.

Context means:

You can include context using Labels in Todoist. I'll include screenshots.

In the next part, we will cover what to do with items in the No Action section.

User Avatar

Ovidiu Stoica

4y ago

You get a maximum of 4 hours of peak focus per day.

Let that sink in. You cannot use all that time for your day job. As a developer, you need to learn to be more productive, so you spend less time at your job. Here are four tips to do that:

#1 Keep actionable tasks near you:

What's the next action on this task?

Non-descriptive, general tasks will make you procrastinate because you don't know where to start. With a general task, ask, "What's the next action on this?" usually it will be:

  • Research X

  • Ask somebody

  • Implement Y

#2 Breakdown big tasks: 

Avoid general tasks like “Build dashboard.”

Your brain doesn't know how to "build a dashboard," but most likely it knows how to research a design system for the new dashboard or create a Next Js repo for the dashboard.

Break down big general tasks into small and actionable pieces.

#3 Communicate with the team: 

The tech world is very dynamic. What was critical yesterday doesn't matter today.

Always check in with your colleagues and manager/PM to ensure you are working on areas with real impact. Two hours spent on critical issues are more valuable than two days spent on nice-to-haves.

#4 Delegate whenever possible: 

Teaching a younger dev to do your job is a win-win.

By doing this you create better people for your company, and you create more time for yourself. Never be the dev that goes to his programming cave and comes out with the final product. Communicate and delegate.

Finally, you'll get better if you keep working on side-projects.

User Avatar

Ovidiu Stoica

4y ago

Over the last 1.5 years, I navigated between the JS and Clojure ecosystems, having spent the last 6 years in the JS world.

I observed important differences between the two. Here are my initial observations:

#1 Javascript: Fast! Now! vs Clojure: Control & Overview

In the Javascript world, you can start a full-stack app in two seconds while in Clojure you need to think about the tools you'll use.

Javascript advantage: More out-of-the-box functionality

Clojure advantage: More control and easier to fix bugs

#2 Javascript: Fast MVP vs Clojure: Upfront thinking about features 

This builds on the previous point. Having more out-of-the-box, you can start building right away with Javascript.

In Clojure, it pays off to think about all the features you'll build in order to save time later on. This technique is also called Hammock-driven development

#3 Javascript: Update packages! vs Clojure: Do we need the update?

As developers, we build upon other people's work.

The NPM registry has 1 million packages with a complex web of inter-dependencies between them. They receive frequent updates which make developers update their project dependencies very often.

In the Clojure world, package updates are done only when necessary: critical bug fixes, new features, etc.

#4 Javascript: Standard tooling vs Clojure: Internal tooling

Because of the size of the JS tools, standard tools arise from the masses that see massive adoption.

Because the Clojure world is smaller and developers tend to create their own tools, many companies have a lot of internal tools geared towards their specific needs.

#5 Javascript: Big framework vs Clojure: Compose small tools

This builds upon the last point.

The standard in the JS world is to have 1 or 2 go-to frameworks for a particular scenario and they are very well documented.

In the Clojure world, because of the Lisp curse, you'll see tons of tools for the same job and many of them are poorly documented. One of the challenges is deciding on the best tools for the job.

User Avatar

Ovidiu Stoica

Side-Hustle

4y ago

I announced verbally a month in advance but forgot to give written notice.

I was going to Bucharest from Rome at the airport when I called my manager with the news. He took it well and asked about the new position. In the end, he said, "Send me an email with the details."

Here's my biggest mistake: I forgot to do that. In the commotion of coming from vacation and reacomodating, I forgot. After two more weeks, I start to say that I need to close any loose ends before leaving. Here's when I hear my colleagues saying, "Wait, are you leaving?"

Never defer giving bad news just because it is uncomfortable.

Your reputation precedes you, and the people who carry it are those you worked with.

If you leave a job badly, it will most likely come back to bite you in the back.

My higher manager told me he just found out in the mids of all the confusion. That this will set him back for 2 months searching for a replacement, and that he wished at least I would've given him some notice and not only announce my direct manager. My relationship with him, even though it was good before, suffered.

Based on this, here's how to avoid what happened to me:

#1. Give your notice way before you are required to do that.

This helps your team by giving them enough time to replace you.

#2. Don't rely on your immediate superior that he will relay the news.

I thought he would inform all relevant parties, but that was not the case.

Inform whoever needs to be informed in person. Ask what you can do to ease the transition before you go, but don't compromise on your deadlines (I've received hints of doing that).

#3. Have a face-to-face with your colleagues.

Have meetings with the people you care about.

You will meet them throughout town, at conferences, or on social media, and it is a pity to tarnish a great relationship just because it will be awkward. A group call with your best friends from the job is also great to have some closure.

This has been weird to talk about. I hope you learned from my mistakes. Remember always to give written notice, even if you don't receive reminders about it!

User Avatar

Ovidiu Stoica

Side-Hustle

4y ago

5 Steps To Make Sure You Won't Be Sued For Your Side Project As A Software Dev

Have you ever heard horror stories of companies claiming an employee's side-business is their intellectual property?

As a software dev, you have side-projects you are working on, and some are profitable, but things can go downhill into chaos, mistrust, and wasted energy if you're not careful.

Here are the steps to make sure that won't happen:

#1 Check your contract's non-compete clause.

Usually, there will be instructions on what you can and cannot do. Here are typical entries:

  • You are obligated to inform the employer of other work

  • The work cannot be a direct competitor to the company

#2 Inform your employer.

Inform your boss about your side-business and also have it sent as an e-mail.

This is important because verbal agreements don't hold up. In the future, if the company decides to sue, you'll have the email for reference.

#3 Don't work on the company laptop.

If the company provides you with a laptop, any work done on that machine is the company's IP.

Make sure all the work done for your side business is on your personal laptop. You should not put any personal accounts/business on the company laptop as a general rule.

#4 Don't work on side projects on company time.

If you go to the office, this is straightforward. Don't work on side projects while in the office.

However, most software devs are remote now, so things get complicated. Generally, I stick with the 9-5 window, and I don't work on my side projects during that time. You can move this around at your convenience.

#5 If you don't find a consensus, better switch jobs.

If you informed your company, but they disagree with you working on the side, find a company that will.

If you are a software dev, there is a huge demand for your skills. You can start freelancing or negotiate rights to work on your business from the start.

Finally, I hope you'll get a profitable side business.

All of this is unnecessary if your side business is booming, so let's all work for that. Thank you!

User Avatar

Ovidiu Stoica

SaaS From Development Standpoint

4y ago

I've built products on the web for 6 years. My favorite frontend framework? Next.js

One superpower of Next.js is the Image component. Out of the box you get:

Let's look further at all the benefits:

Image size based on device

Users browse the web using their phones, tablets, and laptops, yet images are still a one size fits all.

For example sites load 2000x2000 px images, but phones display it as 100x100 px.

Next optimizes image size based on the device it is shown to improve loading speed.

Load images on-demand

30% of images on web pages are outside of the initial viewport.

With no optimizations, your page will wait for an image even if it won't show it initially. Next doesn't load images that a user will not see on the initial page load until they scroll further down the page.

With this technique, page load speed is increased significantly.

Convert automatically to WebP

When fetching images, Next will convert automatically to WebP.

99.7% of images on websites don't use modern image formats like WebP.

According to Google’s own data, WebP compression is:

Prevents layout shifting

Images without fixed width & height tend to jump around when the page is loaded.

This is bad for user experience and is associated with dissatisfaction with products. Google actually made Cumulative Layout Shift a Core Web Vital.

Next imposes a fixed size for all images to prevent this issue.

Serve stale while revalidating

Next.js caches all previously served & optimized images.

To improve loading speed further, Images are served stale and revalidated in the background.

6/7 Blur image preview while loading

To improve Time To Interactive (TTI), Next will show a blurred preview of your image to improve the experience for the end-user

https://web.dev/interactive/

7/7 Custom image loaders

If you already have image optimization implementation, you can integrate this seamlessly with custom loaders

Useful for:

  • integration with your current CDN

  • Easier to read code

TL;DR: Benefits of using Next.js Image

  • Custom image loaders

  • Prevents layout shifting

  • Load images on-demand

  • Image size based on device

  • Serve stale while revalidating

  • Convert automatically to WebP

  • Blur image preview while loading

If you found this thread valuable:

1. Toss me a follow for more threads on advanced web development and SaaS → @ovstoica

2. DM me for any questions related to your SaaS

3. Here’s another similar thread you might enjoy:
https://twitter.com/ovstoica/status/1508328142317965319

User Avatar

Ovidiu Stoica

Self Development

4y ago

Digital Writing Basics: 10 Lessons I Learned From Writing Online For 30 Days

Do you want to start writing online and build a better future for yourself?

In April, I joined my first Ship30for30 cohort. The experience was transformative.

Here are 10 lessons that stuck for me during this process:

  1. What is obvious to you is mind-blowing to someone else. You have a lot of knowledge. What is self-evident to you might be the missing piece for somebody else. Share!

  2. Double down on what resonates with your audience. Find a good mix of "people enjoy this subject/format" and "I enjoy writing on this topic."

  3. Don't put pressure on yourself. Quantity creates quality over time, so don't expect the quality to come now. Focus on hitting "Publish".

  4. You don't know what people want, so write diversely. The essay you think is mediocre or "evident" will be the one to go viral. Approach many subjects and don't let your mind discriminate against topics.

  5. Write for one person. When you write, picture the one person you address the whole essay. More people will find it interesting that way.

  6. The title and the hook are 80% of the piece. You can have the best content ever, but nobody will give it attention if it is buried under a lousy title/hook because they don't know what they are getting. Be clear about the promise and what the reader gets.

  7. Want to change? Join a community. You are the sum of the 5 people you hang out with. To change, you need to change those people. If you want to be a writer, join a community of writers.

  8. You get proportionally to what you give, so give a lot! People won't engage with you if they see you don't engage with them. Give 10x, then ask for 1x. Chances are you'll receive more.

  9. Make it easy to read. People don't read online like they read books. They skim and then decide if they will stay. Format your text to be skimmable.

  10. "Who am I writing for?"—know your audience. Writing for everyone is writing for nobody. My most viral essay was for "software developers juggle 9-5 and a side-project," but all the readers said, "This applies to me also." The more specific you are, the more people feel connected to your content.

User Avatar

Ovidiu Stoica

SaaS From Development Standpoint

4y ago

Can you improve the experience for your SaaS Clients using Server Side Rendering?

React is a framework for building performant Client-Side Applications; however, there are situations where it is not enough. Your Javascript containing React components is delivered to the browser, where it is executed, and all the UI is rendered.

This approach has some issues, which resulted in the creation of Server Side Rendering for React.

What is SSR?

Server-Side Rendering (SSR) is the process of fetching all necessary data and rendering your React Components on the server, and delivering the resulting HTML directly to the client browser.

Why use SSR?

  • SEO - Google page crawlers can execute synchronous javascript, meaning if you need to fetch data to render your content, it will not be seen and indexed by crawlers.

  • Bundle Size - When building a full client-side app, you need to deliver all your Javascript code to the browser. This code needs to be executed in the browser for the final user to interact with your application.

  • Time-To-Interaction (TTI) - How much time passed between users opening your application until they could interact with the content. The shorter this time, the better. SSR helps with reducing your application's TTI.

If you have dynamic pages that show data that can be indexed by Google and bring customers to your app, SSR is an excellent choice for this case.

Why NOT use SSR?

When there are many requests to your server to render for many clients, this can cause an overload and decrease the response time.

Client-Side apps: All clients do the rendering for themselves

SSR apps: The server does the rendering for all clients

If your application is a dashboard for a client to access his data, a SPA (Single Page Application) should be more than enough.