Home

Stack

The tools behind my projects, why I reach for each one, and when I don't.

This page is about decisions. For proficiency levels, see Skills

Layer 01

Frontend

  • Next.js

    Why I use it
    Routing, server rendering and API routes in one project. It fits sites that need SEO and a backend-for-frontend, like Sara3com's public, authenticated and admin areas.
    When I don't
    A purely client-side tool with no SEO needs. The SOC simulation is a React + Vite app instead.
  • React

    Why I use it
    Components and hooks keep UI logic reusable. In the SOC simulation, custom hooks act as the log, alert and health engines.
    When I don't
    Mostly static pages with little interaction, where plain HTML and CSS are enough.
  • TypeScript

    Why I use it
    Shared data shapes (projects, locales, API payloads) are checked at compile time, which matters once a codebase has several contributors or apps.
    When I don't
    Small projects where plain JavaScript is quicker. The Time Management System was written in JavaScript.
  • Tailwind CSS

    Why I use it
    Styles sit next to the markup, and on this site every utility points at a design token, so the look stays consistent.
    When I don't
    Projects that already have their own CSS approach. Mixing two systems costs more than it saves.
  • Vite

    Why I use it
    Fast dev server and a static build that Nginx can serve from a small container.
    When I don't
    When pages need server rendering or API routes. That is where Next.js comes in.

Layer 02

Backend

  • Spring Boot (Java 21)

    Why I use it
    Structure for a large API: Blackhole Academy's backend has 25 controllers, OpenAPI docs, Flyway migrations and STOMP WebSockets in one service.
    When I don't
    Small services, where the setup outweighs the benefit.
  • Node.js + Express

    Why I use it
    A light API in the same language as the frontend, next to Firebase for data.
    When I don't
    Large domains with many entities and roles, where a more opinionated framework keeps things organised.
  • Flask

    Why I use it
    A minimal web layer on top of Python analysis code: the Network Analysis Lab dashboard sits on a pure-Python packet parser.
    When I don't
    Apps that need accounts, an ORM and an admin area from day one.
  • NextAuth

    Why I use it
    Google and GitHub OAuth in a Next.js app without hand-rolling the flows.
    When I don't
    When authentication lives in a separate backend, as with Blackhole Academy's Spring API (OAuth plus TOTP 2FA).
  • WebSocket (STOMP)

    Why I use it
    Real-time chat: direct messages, groups, typing indicators and read receipts.
    When I don't
    Data that rarely changes. Plain requests are simpler to secure and cache.
  • LLM APIs

    Why I use it
    Sara3com's assistant uses a provider registry to switch between models; this site calls the Anthropic API server-side for the recon terminal, with a fixed prompt.
    When I don't
    Anything that must be deterministic or work offline. A model is never exposed as an open proxy.

Layer 03

Data

  • PostgreSQL

    Why I use it
    Relational data with real constraints: Blackhole Academy's 41-table schema, and Sara3com on serverless Postgres.
    When I don't
    Single-user, file-based analytics, where SQLite needs no server at all.
  • Prisma

    Why I use it
    Typed queries generated from the schema, which suits a TypeScript codebase.
    When I don't
    Java backends. Blackhole Academy manages its schema with Flyway migrations instead.
  • SQLite + Pandas

    Why I use it
    Pandas for cleaning and typing, SQLite as a zero-setup warehouse with analytical SQL views and incremental upserts.
    When I don't
    Many concurrent writers or a multi-user app.
  • Firebase Firestore

    Why I use it
    Real-time sync without running a database server.
    When I don't
    Heavily relational data with many joins.
  • Redis

    Why I use it
    A fast in-memory store alongside PostgreSQL in a multi-service stack.
    When I don't
    As the only store for data that has to survive a restart.
  • MinIO

    Why I use it
    S3-compatible file storage for avatars and course content, self-hosted in the same Docker stack.
    When I don't
    A handful of static assets, which can live in the app's public folder.

Layer 04

Security & Ops

  • Docker

    Why I use it
    The same environment everywhere. Blackhole Academy's full stack starts with one make command; the SOC simulation ships as a multi-stage build.
    When I don't
    A Next.js site on a managed platform. This site deploys to Vercel without a container.
  • Nginx

    Why I use it
    Reverse proxy with TLS termination, rate limiting and security headers in front of Blackhole Academy; static file server for the SOC simulation.
    When I don't
    When the platform already provides the edge. Here, headers are set in next.config and rate limits in the API routes.
  • Prometheus + Grafana

    Why I use it
    Metrics and dashboards when several services have to be watched together.
    When I don't
    A single app on a managed host, where the platform's own analytics are enough.
  • pytest

    Why I use it
    Tests for the ETL transformer layer, so data-quality rules don't break silently.
    When I don't
    Throwaway exploration scripts.
  • Vercel

    Why I use it
    Git-based deploys for Next.js apps, with analytics built in.
    When I don't
    Multi-container backends with databases, storage and monitoring, like Blackhole Academy, which run on Docker.