Niklas Weber
Available —

The interactive lens needs WebGL. Everything it shows is also written out below.

Sensor view 50 mm · f/2

Fig. 1 — The plane of focus

Niklas Weber in focus.

Systems developer at 42 Heilbronn and Software Engineering student at Hochschule Heilbronn, building software close to the metal. Five projects sit at five distances on this bench — turn the focus ring and watch the glass move the sharp plane through them.

Drag the rubber focus ring · click a subject

Aperture
Focus
∞
Sharp zone
—
Depth of field
—
Hyperfocal
—
Helicoid travel
0.00 mm
Blur disc
—
§ 1

Subjects

Five projects, 2025–26, ordered from the foreground to infinity. Each sits at its own distance on the bench above.

01 at 0.60 m MMXXVI

Transcendence Casino

Real-time multiplayer online casino

Transcendence Casino real-time multiplayer interface showing blackjack table with player hands and chips
Fig. 1.1 — Casino table interfacelive
Games
3 live
Architecture
3-tier gRPC
Monitoring
6 dashboards

A real-time multiplayer casino — Blackjack, Poker, and slots — spanning Go, C++, and React, bridged by gRPC and a hand-rolled WebSocket hub, with a full Prometheus/Grafana monitoring stack.

Read the full case study

Problem: Transcendence is 42's capstone project format — a large, module-scored web application with strict architectural requirements: a typed backend, a real database, containerized services, real-time multiplayer gameplay, security, and production-grade monitoring. The brief here was a full online casino — Blackjack, Texas Hold'em Poker, and a slot machine — playable live over WebSockets, not a static demo.

Solution: The result is a three-tier system: a Go and Gin backend handling auth, wallets, and REST/WebSocket traffic; a standalone C++ engine handling the actual game rules — card shuffling, hand evaluation, poker betting rounds, slot RNG — over a gRPC contract; and a React/TypeScript frontend on top, themed as a from-scratch "luxury casino" design system rather than a reskinned component kit, with cross-browser support and a spectator mode so a live hand can be watched by other users in real time.

Technical Approach: Two details push this past a CRUD app with a casino skin. Every balance-changing operation — a bet, a deposit, a payout — runs inside a locked database transaction using exact decimal arithmetic, since float math is unacceptable for money; the transactions table is an append-only, independently auditable ledger. And the real-time layer is a hand-rolled WebSocket hub, not a pub/sub library — it tracks per-user, per-tab, per-topic subscriptions and debounces presence so a page refresh doesn't flicker a player's status offline. Similar cross-language, protocol-level thinking shows up in the ELO Leaderboard's concurrent match processing.

Results & Learnings: The stack also carries a full observability layer — Prometheus scraping six targets and six auto-provisioned Grafana dashboards, with alerting routed to Discord. OAuth2, 2FA, and a custom music module are still in progress. Working across three languages bridged by a single protobuf contract made the tradeoffs of IPC design concrete in a way a single-language stack never does.

Stack
Go · C++ · TypeScript · React · PostgreSQL
Focus
Real-time multiplayer · financial correctness
02 at 1.10 m MMXXVI

3D Go Renderer

From-scratch OpenGL renderer in Go

Fig. 1.2 — Orbit camera demoopengl 4.1
Allocs/frame
0.06
Parser
Concurrent
UV modes
3

A from-scratch 3D renderer in Go — custom .obj/.mtl parsing, ear-clipping triangulation, and an OpenGL 4.1 pipeline with zero steady-state heap allocations.

Read the full case study

Problem: scop is 42's OpenGL project — render a 3D .obj model with only a math library and raw OpenGL bindings as external dependencies. There's no scene-graph, no asset pipeline, no glTF loader to lean on: the file parser, the vector and matrix math, the triangulation, and the camera all have to be built from first principles.

Solution: The result is a Go renderer on OpenGL 4.1 core with GLFW for windowing. Custom .obj and .mtl parsers handle geometry and material properties (Ka/Kd/Ks/Ns/map_Kd) with graceful degradation when texture files are missing, and three automatic UV-generation modes — planar, cylindrical, spherical — cover models that ship without texture coordinates. An orbit and free-fly camera sit on top of hand-written vec2/3/4 types and column-major mat4 math, including perspective and lookAt transforms, with no external math dependency.

Technical Approach: Two problems needed real solving. Arbitrary polygons — including concave, non-planar, and degenerate ones — get triangulated with ear clipping over each face's Newell-normal plane, so geometry stays correct regardless of how the source .obj was authored. And the render loop is allocation-free at steady state: a single VAO/VBO/EBO per model with vertex deduplication, Gribb–Hartmann frustum culling, and texture-state batching bring it to 0.06 allocs/frame under -debug. Parsing itself is parallelized — worker goroutines pre-parse vertex and face data per line-aligned chunk, the same concurrency discipline behind the ELO Leaderboard's match processing.

Results & Learnings: On the Utah teapot, concurrent parsing cut load time from 9.9ms to 7.0ms, and unit tests cover the parser, triangulation, UV generation, math, camera, and frustum culling. Building a rasterization pipeline by hand — after a SIMD raytracer the semester before — made the tradeoffs between rasterization and ray tracing concrete in a way tutorials never do.

Language
Go
Graphics
OpenGL 4.1 · GLFW
03 at 2.00 m MMXXVI

42 ELO Leaderboard

Competitive rankings system for 42 Heilbronn

42 ELO Leaderboard competitive ranking interface with player ratings and match history
Fig. 1.3 — Leaderboard interfacearchived
Avg response
30ms
Status
Archived
Query target
<100ms

High-performance ELO ranking system in Go and PostgreSQL, built for real-time match submissions with live leaderboards and historical data. No longer actively maintained.

Read the full case study

Problem: The 42 Heilbronn community ran table football and table tennis tournaments with no shared way to track who was actually good. Beyond just storing results, two students could report the same match slot within seconds of each other — naive rating recalculation is a textbook race condition, since an Elo update is a read-modify-write against a shared score and two concurrent submissions can't be allowed to read the same stale rating and both write back.

Solution: I built a complete Elo ranking system in Go with PostgreSQL, optimized from the ground up for performance. Match submissions run inside a transaction that locks both players' rows before applying the rating update, so concurrent reports serialize instead of clobbering each other, while reads — the public leaderboard, player profiles, match history — stay on a separate fast path. The backend served a React frontend with live leaderboards, detailed player profiles, and historical match data.

Technical Approach: Composite indexes on the columns the leaderboard and history views actually filter and sort by, plus Redis for the aggregate stats (win/loss streaks, rating deltas) that don't need to be recomputed on every request and get invalidated on write instead. Go's goroutines handled concurrent API traffic cleanly since each match update was isolated to its own transaction. I profiled throughout development to find and remove the slow paths rather than guessing at them. Similar optimization patterns appear in other systems projects like the raytracer, where every algorithmic decision has direct performance implications.

Results & Learnings: The system achieved 30ms average response times and maintained 99.9% uptime across tournament seasons, and the row-locking approach never produced a double-counted match under concurrent load in practice. Query optimization and profiling-driven development are non-negotiable for systems that prioritize performance. The project is now archived and no longer under active development.

Stack
Go · TypeScript · React · PostgreSQL
Role
Full implementation
Demo
eloleaderboard.de — archived, unmaintained
04 at 3.80 m MMXXV

miniRT

High-performance raytracer in C

miniRT raytracer C implementation with sphere rendering, shadows, reflections and Phong lighting
Fig. 1.4 — Rendered output120 fps
Frame rate
120+ fps
Speed-up
80×
SIMD
SSE/AVX

120+ FPS raytracer built on SIMD vectorization, cache-efficient data structures, and tile-based multi-threaded rendering.

Read the full case study

Problem: I started building a basic raytracer in C to understand computer graphics fundamentals. The initial naive implementation achieved only 1–5 FPS when rendering complex scenes with multiple light sources.

Solution: I rebuilt the core rendering loop with C systems programming principles at its foundation. The approach combined SIMD vectorization using SSE/AVX intrinsics for batch vector operations, cache-efficient data structures using structure-of-arrays layouts instead of array-of-structures, and multi-threaded tile-based rendering to leverage multiple CPU cores.

Technical Approach: Three pillars: vectorization, memory hierarchy, parallelism. SSE intrinsics process 4 floats in parallel, AVX handles 8. I restructured data to exploit CPU cache locality by storing all X-coordinates contiguously, then Y, then Z. The renderer divides the framebuffer into tiles, with each thread processing one tile independently. Profiling with perf and cycle-accurate analysis revealed that the ray-primitive intersection test was the hottest code path.

Results & Learnings: The optimized raytracer renders at 120+ FPS — an 80× improvement over the baseline. Systems programming at the graphics layer isn't just about algorithms; it's about respecting CPU cache behavior, instruction pipelines, and memory bandwidth.

Language
C
Concepts
Linear algebra · optics simulation
05 at 9.00 m MMXXV

minishell

POSIX-compliant shell in C

“The shell is a window into the operating system's soul.”

Standard
POSIX
Primitives
fork/exec
Signals
sigaction

Unix shell from scratch — process management, file descriptors, pipes, I/O redirection, environment expansion, signal handling.

Read the full case study

Problem: Understanding how a Unix shell works requires deep knowledge of operating system fundamentals, and 42's minishell project forbids leaning on any of them from a library — no shell libraries, only raw libc and system calls. That means quoting, expansion, redirection, and pipelines all have to be built from first principles, and getting any one of them subtly wrong (a heredoc that doesn't respect quoted delimiters, an unset that leaves a stale env var visible to a child) is invisible until it breaks a specific command.

Solution: A POSIX-compliant shell in C that replicates bash's core behavior. A hand-written lexer and recursive-descent parser turn raw input into a token stream that respects single/double-quote semantics and here-doc boundaries, then an execution engine walks that structure using genuine Unix system calls — no system(), no shortcuts.

Technical Approach: Three systems-programming concepts carry the implementation. Process management via fork/execve with correct PATH resolution and exit-status propagation back through pipelines. File descriptor manipulation through dup2() for multi-stage pipes and I/O redirection (<, >, >>, here-docs), including keeping descriptors from leaking into children that shouldn't inherit them. And signal handling with sigaction() so SIGINT/SIGQUIT behave differently at the prompt versus inside a running child, without ever leaving a zombie process behind.

Results & Learnings: Building minishell transformed my understanding of Unix architecture — shells are orchestrators of the OS, not autonomous entities, and the same process/IPC discipline is exactly what shows up later in gRPC-bridged services or a multi-threaded render loop. Hands-on exploration of process management, file descriptors, and IPC deepened my appreciation for why low-level programming discipline matters.

Language
C
Focus
Unix internals · syscalls
§ 2

Field notes

Things I had to actually understand before I could ship them. All writing →

  1. 2026-10-02For vs while loops in C, C++ and Go: identical assembly, and what actually changes performanceSystems programming
  2. 2026-09-17Building a container runtime from scratch: namespaces, pivot_root, cgroups v2, and OverlayFS in pure GoSystems programming
  3. 2026-08-26Why I keep building from scratch: process handling, WebSocket hubs, and .obj parsersGeneral
  4. 2026-08-25Getting Elo leaderboard queries under 100ms: indexes, caching, and profiling instead of guessing42 ELO Leaderboard
  5. 2026-08-23gRPC versus REST: picking protocols at the Transcendence service boundaryTranscendence
  6. 2026-08-23Triangulating arbitrary polygons with ear clipping over a Newell-normal planeGo renderer
§ 3

Behind the lens

Build to understand. Understand to build better.

I'm at 42 Heilbronn, a peer-to-peer programming school where we learn by building real things.

In parallel I'm enrolled in Software Engineering at Hochschule Heilbronn (Heilbronn University of Applied Sciences) — the theory and engineering discipline to go with 42's build-first approach.

My passion is systems programming — where software meets hardware. There's something satisfying about understanding how things work at the deepest level: memory, scheduling, protocols, performance.

I work with C and Unix, Go for concurrent systems, and TypeScript when the problem needs it. Always learning, always optimizing.

Current focus — Sep 2026

Concurrency patterns in Go. Distributed systems. Writing up the internals behind the Go renderer and a container runtime — see Writing.

Live from GitHub

Repos
39
Stars
15
Followers
33
Commits · 12mo
—
github.com/nweber23 ↗
Studies
Software Engineering · Hochschule Heilbronn
School
42 Heilbronn · peer-to-peer, project-based
Languages
Go · C · C++ · Python · TypeScript · JavaScript · Java
Frontend
React · Tailwind · Vite · Electron · HTML · three.js
Backend
Node.js · PostgreSQL · Redis · Nginx · gRPC
Infra
Linux · Docker · Git · GitHub · pnpm

The best way to learn is to build, break, and rebuild.

§ 4

Contact

Available for collaboration.

Let's discuss your project.

Let's work on systems, performance, and problems where understanding the fundamentals makes a real difference.