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.