Technical details

This website has been completely refactored since its first version.

The application has been upgraded from Laravel 5 to Laravel 13 and now runs inside a Docker container. However, the main goal of the rewrite was not simply to use newer technologies.

You might wonder why I chose Laravel instead of a framework such as Next.js or Nuxt.js, especially since I work primarily on the front end. The answer comes down to simplicity and separation of concerns.

I prefer keeping data management and business logic on the back end, while the front end is responsible for presenting that data. This website does not require a reactive client-side UI, so introducing an additional JavaScript framework would add complexity without providing any real benefit. For this particular project, a server-rendered application is simply a better fit.

The goal is not to use the most popular or modern technology available, but to choose the right tool for the problem.

A complete rewrite

As part of the refactoring, I also rewrote the application from the ground up.

The previous version had accumulated several technologies, dependencies and pieces of code that were no longer necessary. Rather than carrying them into the new version, I took the opportunity to simplify the whole application.

Some of the main changes include:

Containerized the application with Docker

The application is also containerized with Docker. The goal is not to introduce another layer of complexity, but to make the environment predictable and reproducible.

App configuration, PHP runtime and required services can be defined in code rather than relying on a specific local machine configuration. This makes the project easier to set up, run and maintain across different environments.

Migrated the database from MySQL to SQLite

This is a small, mostly static website. It does not require user accounts, concurrent writes or a complex relational data model. Running a separate database server would therefore add infrastructure and maintenance without providing any meaningful benefit. SQLite gives me exactly what I need: the entire database is stored in a single file, with no additional services to configure or maintain. SQLite is not necessarily a better replacement for MySQL: it is simply a better fit for the requirements of this particular project.

Replaced Bootstrap with a minimal custom SCSS codebase

Bootstrap is an excellent tool, especially for applications with many different components and complex interfaces. For this website, however, I found that most of what it provided was unnecessary. The UI is relatively minimal and well defined, so I preferred to use a custom SCSS codebase containing only the styles required by the application.

There are no generic components or utility classes that are not needed: the CSS is intentionally kept small and focused on the actual interface. I also split the styles into page-specific bundles, so each page only loads the styles it needs.

The result is a simpler stylesheet that is easier to understand, maintain and change.

Improved accessibility: semantic HTML and ARIA attributes

The previous version of the website was originally built in 2016. At the time, web accessibility was not something I had much experience with.

This rewrite gave me the opportunity to approach the UI differently, starting with semantic HTML and progressively improving the experience for keyboard and assistive-technology users.

I focused on: