FRONT END
HTML - AstroJS
Astro is a modern web framework designed for building fast, content-focused websites. It leverages a unique approach by allowing developers to use their favorite UI components from frameworks like React, Vue, and Svelte, while optimizing the final output to be as lightweight as possible. Astro achieves this by rendering most of the content at build time, resulting in minimal JavaScript being sent to the browser. This makes Astro an excellent choice for creating high-performance, SEO-friendly static sites and blogs.
Astro works with many front-end frameworks. It separates a static website from dynamic webapp features.
CSS - TailwindCSS
TailwindCSS is a utility-first CSS framework that provides a set of predefined classes to help developers build custom designs quickly and efficiently. Unlike traditional CSS frameworks that come with pre-designed components, TailwindCSS allows for greater flexibility by enabling developers to compose their own styles directly in their HTML. This approach promotes consistency and maintainability, as it encourages the reuse of utility classes across the project. TailwindCSS also offers a highly customizable configuration, making it easy to extend and adapt to the specific needs of any project.
Consistent styling across web components with the capability of creating a unique look.
JAVASCRIPT - Typescript
TypeScript is a statically typed superset of JavaScript that adds optional type annotations and other features to the language. Developed and maintained by Microsoft, TypeScript aims to enhance the development experience by providing better tooling, early error detection, and improved code readability. By enabling developers to specify types for variables, function parameters, and return values, TypeScript helps catch potential bugs at compile time, rather than at runtime. Additionally, TypeScript supports modern JavaScript features and can be transpiled to plain JavaScript, making it compatible with any JavaScript environment. This makes TypeScript a popular choice for large-scale applications and projects that require robust maintainability and scalability.
Looking forward to interfaces and data types getting supported natively.
BACKEND
NGINX
NGINX is a high-performance web server and reverse proxy server that is widely used for serving static content, load balancing, and handling concurrent connections. It is known for its stability, rich feature set, simple configuration, and low resource consumption. NGINX can efficiently manage thousands of simultaneous connections with minimal memory usage, making it an ideal choice for high-traffic websites and applications. Additionally, NGINX supports various protocols, including HTTP, HTTPS, SMTP, and IMAP, and can be used as a reverse proxy to distribute traffic across multiple backend servers, improving scalability and reliability.
NGINX works great with a static site generator like Astro.
PHP
PHP is a widely-used open-source scripting language that is especially suited for web development and can be embedded into HTML. It is known for its simplicity, speed, and flexibility, making it a popular choice for creating dynamic web pages and applications. PHP code is executed on the server, generating HTML which is then sent to the client. This allows for the creation of interactive and data-driven websites. PHP supports a wide range of databases, and its extensive ecosystem includes numerous frameworks and libraries that facilitate rapid development. With its strong community support and continuous improvements, PHP remains a reliable and efficient option for backend development.
I only use PHP if the customer is already using it and requires updates. My recommended stack is now AstroJS with a NodeJS backend.
SERVER - Fastify
Fastify is a highly performant and flexible Node.js web framework designed for building fast and scalable server-side applications. It is known for its low overhead, powerful plugin architecture, and developer-friendly features. Fastify provides a rich set of built-in utilities for handling routes, requests, and responses, while also supporting asynchronous programming with promises and async/await. Its schema-based validation and serialization ensure data integrity and improve performance. With its focus on speed and simplicity, Fastify is an excellent choice for developers looking to create efficient and maintainable backend services.
EMAIL - Nodemailer
Nodemailer is a popular Node.js library designed to simplify the process of sending emails from a server. It provides a straightforward API for configuring email transport options, composing messages, and handling attachments. Nodemailer supports various transport methods, including SMTP, OAuth2, and custom transports, making it versatile and adaptable to different email delivery requirements. With its robust feature set and ease of use, Nodemailer is a reliable choice for implementing email functionality in web applications, such as sending transactional emails, notifications, and newsletters.
REALTIME DATA - Websockets
WebSockets provide a full-duplex communication channel over a single, long-lived connection between a client and a server. This technology is particularly useful for applications that require real-time updates, such as chat applications, live notifications, and online gaming. Unlike traditional HTTP requests, which follow a request-response model, WebSockets allow for continuous data exchange, enabling the server to push updates to the client as soon as they are available. This results in lower latency and more efficient use of resources, making WebSockets an ideal choice for building interactive and dynamic web applications.
DATABASES
CACHE - Redis
Redis is an in-memory data structure store that can be used as a database. Known for its high performance, Redis supports various data structures such as strings, hashes, lists, sets, and sorted sets. It offers features like persistence and replication, making it versatile for different use cases. Redis is often used to cache frequently accessed data to reduce latency and improve application performance. Its ability to handle high-throughput operations with low latency makes it a popular choice for real-time applications and services.
In many languages, keeping lots of data directly in memory will cause periodic slowdowns as the garbage collector runs trying to free up unused data. Using a in-memory database avoids this slowdown and also synchronizes with multiple server instances.
I also use Database as a Service providers like Supabase and Aiven. Supabase can act as single source of truth for user authentication across many servers and simplifies the codebase in development and production.