Learn modern web development by actually building things

Hands-on tutorials, open-source projects, and experiments — deep dives into Three.js, Nuxt and TypeScript, written while building the real thing.

particle-galaxy.client.ts
StackNuxt 4
LangTS
RenderWebGL
FPS60
Build412ms
01  import * as THREE from 'three'
02
03  const geometry = new THREE.BufferGeometry()
04  geometry.setAttribute(
05    'position', new BufferAttribute(positions, 3)
06  )
07
08  const points = new THREE.Points(geometry, material)
09  scene.add(points)

Compiling the shader

Step 2 of 3 — every line explained in the tutorial.

30+
Tutorials
100%
Open source
2022
Writing since
The approach

Tutorials that turn ideas into things you can ship

No copy-paste dumps. Each project is built end to end so you understand the decisions, not just the code.

Built in the open

Every tutorial ships with a working repo. Clone it, break it, and read the commits that got it there.

Real-world stacks

Nuxt 4, TypeScript, Three.js, Firebase and Mapbox — the same tools I use on production work, not toy demos.

Step by step, no gaps

Each guide walks the whole path — setup, the tricky middle, and deploying it somewhere people can actually visit.

Marcus Nilsson
Gothenburg, SE Open to work
About

Hi, I'm Marcus — a developer who learns by shipping

Web developer, freelancer, former e-sports professional and digital creator from Gothenburg, Sweden.

I built this site as a place to document my coding journey and to share the projects that hopefully inspire you or teach you something new.

Vue / NuxtTypeScriptThree.jsTailwindFirebaseMapbox
Latest

Articles & tutorials

Deep dives, practical guides and hands-on projects — published as I build them.

An Analytics Dashboard With No Analytics API: Nuxt 4 + TypeScript + DuckDB-Wasm + Parquet + Observable Plot
22 min
Aug 24, 2026

An Analytics Dashboard With No Analytics API: Nuxt 4 + TypeScript + DuckDB-Wasm + Parquet + Observable Plot

Ship the dataset instead of an endpoint: one sorted Parquet file served from Nitro over HTTP range requests, DuckDB-Wasm running the GROUP BY in a Web Worker, Apache Arrow handing columns straight to Observable Plot — five charts that cross-filter in tens of milliseconds, with no /api/stats anywhere in the app.

Read article
Semantic Search Over Your Own Content: Nuxt 4 + TypeScript + Nuxt Content + sqlite-vec + Transformers.js
21 min
Aug 21, 2026

Semantic Search Over Your Own Content: Nuxt 4 + TypeScript + Nuxt Content + sqlite-vec + Transformers.js

Add meaning-based search to a Nuxt 4 site without an API key or a vector database: Nuxt Content supplies heading-sized chunks, Transformers.js embeds them locally on the CPU, sqlite-vec stores them next to an FTS5 index, and one Nitro endpoint fuses keyword and vector results with Reciprocal Rank Fusion.

Read article
A Background Job Queue with Live Progress: Nuxt 4 + TypeScript + Nitro Tasks + Redis + SSE
19 min
Aug 20, 2026

A Background Job Queue with Live Progress: Nuxt 4 + TypeScript + Nitro Tasks + Redis + SSE

Get long-running work out of the request/response cycle without adding a second service: a durable queue on unstorage + Redis, a Nitro task that drains it, and Server-Sent Events streaming progress back to the browser — one typed Job shape shared by all three.

Read article
A Non-Blocking Image Editor with Nuxt 4 + TypeScript + Web Workers + Comlink + OffscreenCanvas
17 min
Aug 19, 2026

A Non-Blocking Image Editor with Nuxt 4 + TypeScript + Web Workers + Comlink + OffscreenCanvas

Move every pixel of a photo editor off the main thread: a typed Comlink RPC boundary, a canvas handed to a worker with transferControlToOffscreen, frame-coalesced rendering, and a full-resolution export that streams progress back — all SSR-safe inside Nuxt 4.

Read article
Tool-Calling Trip Planner with Nuxt 4 + TypeScript + AI SDK + Mapbox GL JS
18 min
Aug 18, 2026

Tool-Calling Trip Planner with Nuxt 4 + TypeScript + AI SDK + Mapbox GL JS

Build a Nuxt 4 app where an LLM cannot invent a coordinate: Zod tool schemas in the shared/ folder, Mapbox geocoding and directions running server-side, and a map that redraws itself from the streamed tool results.

Read article
Passwordless Sign-In with Nuxt 4 + TypeScript + Passkeys (WebAuthn) + Nitro SQL
16 min
Aug 17, 2026

Passwordless Sign-In with Nuxt 4 + TypeScript + Passkeys (WebAuthn) + Nitro SQL

Ship real passkey authentication on a plain Nuxt 4 server: nuxt-auth-utils for the WebAuthn ceremony, Nitro's built-in db0 SQL layer for users and credentials, sealed cookie sessions, and the rpID gotchas that only appear once you put nginx in front.

Read article

Three.js & WebGL

Particle galaxies, shaders, lava-lamp visuals and 3D globes — built from an empty canvas up.

Nuxt & Vue

SSR, content pipelines, PWAs and the small architectural calls that keep an app maintainable.

TypeScript patterns

Type-safe data layers, Zod schemas and API contracts that hold up once the project grows.

Ship & deploy

Docker, Nginx, PM2 and Firebase — the last mile between localhost and a real URL.

Start here

Pick a project and build it this weekend

Every guide is free, open source, and written to be followed start to finish.

marcusn.dev

A place to document my coding journey and share projects that hopefully inspire or teach something new.

Get in touch

Have a project in mind, or just want to say hi? My inbox is open.

marcus89n@gmail.com

© 2026 Marcus Nilsson. Built with Nuxt.

Gothenburg, Sweden