2023

Catalyst

Catalyst is a project meant to allow collaboritive efforts blossom into a greater whole. It is a platform where people can collaborate on projects, and where they can share their ideas and collaborate with others.


Technologies and Tools

  • Next.js

    Next.js was chosen as the framework as we knew large parts of the project could benefit from server-side rendering and the server actions the App Router provides.

  • Docker

    Docker was used to containerize the application, ensuring consistency across development, staging, and production environments. By packaging the app and its dependencies into a single container, we reduced environment-specific bugs and made deployment more predictable. It also made it easier to collaborate with other developers, as I expected I would need help as the project grew in complexity.

  • Storybook

    In order to try and mantain a high level of quality and consistency, I decided to use Storybook to create a UI library for the project. This allowed me to create a set of components that would be used throughout the project, and would be stable, easy to use and maintain.

  • Auth.js

    We knew we would need to implement user authentication and authorization for the project, so I decided to use Auth.js, which provides a simple and secure way to handle user authentication and authorization. In particular, we used magic links to allow a passwordless login experience.

  • UploadThing

    Uploading images is a common task in the project. To handle this, we implemented UploadThing, a lightweight and fast image uploading library, which fit our needs perfectly.

  • React Deprecated

    React was chosen as the framework for the project due to its simplicity, industry-wide adoption and strength. This project needed to be highly interactive, with many state changes continually happening as the users interacted with the site, which made React a great fit for this project.

    In 2025, I decided to take a more modern approach to the project, and opted to use Next.js App Router.

  • Express Deprecated

    Express is the go-to framework for building APIs in Node.js. It is a lightweight and fast framework that is easy to use and understand. Since the backend of this project could become complex, using Express which is largely unopinionated and allows for a lot of flexibility was a good fit.

    In 2025, Express was replaced by a combination of server actions and API routes after the implementation of Next.js App Router.

  • Nginx Deprecated

    Nginx was originally used in this project as a reverse proxy and static asset server. It helped improve performance, manage HTTPS termination, and handle load balancing during early deployments. This setup gave us more control over caching strategies and allowed us to serve the application efficiently in a production environment.

    In 2025, Nginx was deprecated as the project migrated to a serverless architecture using the Next.js App Router, which handled routing and server functions internally.


Roles and Responsibilities

This project was developed single-handedly by myself in 2023. In 2025 it received a near-complete overhaul, with a focus on performance and scalability. I was responsible for every facet of it, from design to development. Of note are:

  • View Structure

    Designed the way the displayed data would be structured. This was a complex task, as the project uses many layers of content, from project, to branches, to posts, so it was important to establish a clear hierarchy and structure.

  • Front - Back Communication

    Implemented the project’s API endpoints and ensured they were efficient and secure. At the same time, I implemented fetch methods in the frontend that ensured we only got the data we needed. I used Express, Passport and PostgreSQL amongst other tools to achieve this.


Challenges and Solutions

  • Scope Management

    This was a very ambitious project, and maintaining a clear scope was a difficult task. I had to decide which features to prioritize, and which ones to drop. In many ocasions I had to stop and reflect on whether a certain feature was helpful towards the project’s goals, or if it was just a distraction. For example, the idea of adding certain ‘social media’ such as comments was dropped, but a timeline was maintained, as it helped with the idea of people contribution to projects they were interested in.

    In the end, I believe the initial scope of the project as a collaborative site was preserved, and the development cycle was smooth and efficient thanks to that.

  • Dockerization

    The project ran into many issues when dealing with dockerization. This was one of my first experiences dealing with containers in a full-stack project, and I had to troubleshoot and fix many issues. After much trial and error and documentation reading, I was able to containerize the project.

  • API Design

    Designing the API was a complex task, as the project had many interconnected parts, and it was difficult to know how much information each part needed, while also ensuring the API was secure and efficient. In my first attempt at this, it was a mess, which worked, but was not very scalable or efficient.

    I restructured the API to be more flexible and scalable, with a focus on clarity: each endpoint has a clear purpose, a clear input and output, and there is no contamination of data between endpoints. This allowed for a more efficient and scalable API, that should also be easier to maintain in the future.

  • 2025 Overhaul

    By 2025, I had become much more experienced in the field, and I decided to take a look at the project again. However, it quickly became clear it would be faster for me to completely restart it, rather than try to rewrite parts of it. I decided to take a more modern approach to the project, with a focus on performance and scalability.

    Next.js was chosen as the framework. I implemented server actions, API endpoints. All of this meant a great deal of ‘translating’ between the old version and the new one. Often, all I could copy from the old version was the idea, and had to completely rewrite the implementation.

    The result is a much more robust and scalable project, in which I as the developer can work with much more efficiency and confidence, and the users will have a much better experience.