Casper Juel 2026

[Hello]

Casper Juel

[Creative developer]

converts pixels to bits.

Fifteen years of making things for the web, and still mildly annoyed about border-radius: 50%.

COPENHAGEN, DK  [55.67°N, 12.57°E]

casper@cj.dk ~
Type help and hit enter.

Who [float: left; float: right; clear: both]

[Currently]

  • Building MCP servers for things that should have had an API.
  • Shipping tiny native apps with Tauri.
  • Fishing. Badly. With data.

I'm a developer who cares about the last 2%: the easing curve, the focus ring, the way a layout survives a 320px viewport. I work at Signifly, where I build websites, apps and the odd thing that does not fit a category.

Work [hobby projects, mostly]

  1. Sponos NEW! A fast macOS controller for Sonos with Spotify search, a queue you can drag around, and a floorplan of your rooms. Tauri · Rust · TypeScript · [download]
  2. aula-mcp POPULAR MCP server for Aula, the Danish school platform. Ask your assistant what's for lunch on Thursday. MitID auth included. TypeScript · Bun · MCP · [open source]
  3. Fondfinder.dk Natural-language search across every Danish fund and grant. Describe a project, get ranked matches with reasons. Next.js · Embeddings · Claude · [live]
  4. Byggebørsen.dk A marketplace for reused building materials. Web and app, so the leftover tiles from your renovation find a new floor. Next.js · Expo · Turborepo · [live]
  5. Materialepasset.dk Digital material passports for reused construction materials. Create them with AI, share them with a QR code, and read a material's full history. Next.js · AI · QR · [live]
  6. Hjem Home Assistant wall panels for the Shelly Wall Display. 26 KB gzipped, 58 fps on a 1 GB Cortex-A7, because Lovelace is 5 MB. Vanilla JS · WebSocket · [private]
  7. abrp-mcp Unofficial MCP server for A Better Route Planner. EV routes, charging stops and range estimates as tools. TypeScript · Hono · Vercel · [open source]
  8. OrchTerm WIP / HIDDEN A macOS terminal that knows about Claude Code: task panes, diffs and git worktrees. Work in progress. Tauri 2 · React · [wip]

More on GitHub [54 repos, half of them forks, don't judge]

Sandbox [things I know about the web]

A few deliberately ugly demos. Each one is a bug I have shipped at least once.

01 / The ellipse problem

border-radius: 50% on a rectangle gives you an ellipse, because 50% is resolved against width and height separately. You wanted a pill. Use border-radius: 9999px, or calc(infinity * 1px) if you like to live dangerously.

02 / Nested radius padding 24px · outer 32px

If the inner corner uses the same radius as the outer, the corners look wrong. The inner radius should be outer − padding. Tick the box and watch it stop fighting you.

03 / 100vh is a lie on phones —
100vh
100dvh
100svh

On mobile the browser chrome comes and goes, and 100vh uses the biggest possible viewport. Use dvh for things that should follow the toolbar, svh for things that must never jump.

04 / Glass button [11 layers, 0 images]

One anchor, eleven nested spans. The rim is a rotating rainbow gradient masked to a 1.5px ring with mask-composite: exclude. Two CSS variables, --mx and --my, carry the pointer position and every layer reads them. No canvas, no images.

Bigger playgrounds: radius lab · dither lab

Graveyard [here lies the code we all wrote]

Ten years of hacks, each one load-bearing at the time. Click a stone to exhume the body.

Gone, not forgotten. Pour one out. †

Toolkit

Mostly TypeScript. Occasionally Rust. Always HTML.

Hit me up,

info@casperjuel.dk