Hi, I'm Scott.

I build full-stack web apps and write about things I find interesting. This is my corner of the internet.

JavaSpring BootTypeScriptKotlinNext.jsReactTailwind CSSPostgreSQLDockerPythonCSS3HTML5Haskell
~/scott

$

Featured projects

All projects →

This website!

Featured

For my personal website, I wanted to create more than just a boring static webpage with a bunch of links. I wanted to create something I could interact with, and somewhere I could revisit often with room for improvements. I used Spring for the backend, while overkill and heavy for this sort of web app, it is what I am learning at the moment. ## Features - **Blog** — markdown posts with syntax highlighting, tags, read time, related posts, and comments - **Projects** — portfolio with featured projects, tech stack, repo and live links - **Admin panel** — protected dashboard to create, edit, publish, and delete posts and projects - **Dark mode** — system-aware with manual toggle - **Page transitions** — view transitions API As you can probably tell, there is a lot more going on in the backend than a lot of portfolio websites. I have my own admin panel which features safe login, allowing me to make, edit and delete post projects. Right now te admin panel looks like this: ![admin panel](https://res.cloudinary.com/do4hdvuet/image/upload/v1776610606/Screenshot_2026-04-19_155632_yvnx4s.png) This website is still in its early days and I am sure will be improved as my skills improve.

Java, Spring, PostgreSQL, Next.js, TypeScript, Tailwind, React

The Typing Quest

Featured

A real-time multiplayer typing race built with Node.js and WebSockets. Players join rooms via a shared code, and a persistent two way connection keeps everyone's progress in sync as they type, each keystroke triggers a server broadcast so all clients update simultaneously. The server runs a state machine across each room (lobby → countdown → racing → guess phase → results), supporting multiple concurrent gam es. The frontend is vanilla JS with no framework: typing sounds are generated procedurally using the Web Audio API, and the video background is driven by the YouTube IFrame API. ## Running locally ```bash npm install node server.js ``` Then open http://localhost:3000 In my web dev module, we touched upon websockets - descibing their use case and how they work but not applying it. I found the idea interesting and wanted to create something fun using websockets.

Node.js, Javascript, websockets

Recent posts

All posts →

30 April 2026

Game review - Windrose

Is it just 'Valheim with pirates'?

WindroseGameReview

19 April 2026

First Post!

This is a test post that tests the markdown implementation.

Test