Skip to content
View MaximilianWik's full-sized avatar
😼
Meowmjauu (^._.^)
😼
Meowmjauu (^._.^)

Block or report MaximilianWik

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
MaximilianWik/README.md

Maximilian Wikström — full-stack, Stockholm

max-wik.com portfolio linkedin instagram profile views


┌─ MANIFEST ──────────────────────────────────────────────────────────────────┐
│                                                                             │
│   I build small, opinionated web things — and the occasional desktop        │
│   oddity. React, TypeScript, Cloudflare Workers, Hono, Python, numpy.       │
│                                                                             │
│   Currently obsessed with: things that outlast their author. QR codes       │
│   verified against the ISO spec. State-switch architectures. DSP that       │
│   stays deterministic forever. Portfolios that load in under a second       │
│   on a phone in a basement.                                                 │
│                                                                             │
│   Based in Stockholm. Open to interesting work.                             │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

◆ ARTIFACTS

personal finance terminal

Connects to Lansförsakringar Bank via Enable Banking Open Banking API (RS256 JWT). Five-stage categorization pipeline: self-transfer detection → MCC codes → keyword rules → merchant cache → Gemini 2.0 Flash fallback. Budget periods run salary-cycle to salary-cycle, not calendar months. Savings goals with Vercel Blob images and monthly auto-sweep of surplus. Anomaly flagging, what-if budget simulator, recurring payment auto-detection, retro-CLI aesthetic throughout.

Next.js 15 · Drizzle ORM · Neon Postgres · Enable Banking · Gemini 2.0 Flash

live

Dark souls inspired personal portfolio

React 19 · Vite 6 · Tailwind 4 · motion/react. Ember-blood on ink-void, ceremonial typography, bonfire-lit hero. Heavy sections code-split via React.lazy. DispersingText runs a single pointermove listener + single RAF loop for the whole paragraph. JSON-LD Person + WebSite schemas for Knowledge Graph signals.

React 19 · Vite 6 · Tailwind 4 · motion

live

verified-permanent QR codes

A QR generator built for codes that get tattooed and must work for life. Encoder verified bit-for-bit against the ISO/IEC 18004 Annex I worked example. Every output round-tripped through three independent decoders (jsQR, zxing-js, native BarcodeDetector). Damage-tolerance simulated with progressive Gaussian blur. Printable archival spec sheet with full module matrix as ASCII + hex dump.

Vanilla JS · Reed-Solomon · GF(256) · 93 tests in CI

live · tests

subdermal // max-wik.com

the page behind a tattooed QR

A React SPA on Cloudflare Workers + Hono + D1, with a state-switch architecture: a single number in state.ts selects what the page renders. State 8 is a 16,384 × 24,576 collaborative canvas — nine brushes, pinch-zoom, draft auto-save, per-browser ownership in D1, admin-token-gated moderation.

React 19 · Hono 4 · Cloudflare D1 · edge SQLite

live

a typing survival game

Browser typing game, Dark-Souls aesthetic. Four zones, three bosses, parry system, dodge-roll i-frames. Three HiDPI canvases, game state in refs (HUD ticks at 10 Hz, no per-keystroke React renders). All audio synthesized via Web Audio on demand — cathedral reverb bus, dissonant tritone drones per zone, inharmonic bell partials.

React · HTML5 Canvas · Web Audio API

live

a desktop pet that chews audio

Frameless, transparent, mouth-shaped Windows app for the artist Carpet Eater. Drag any audio file onto it — it chews and spits a mangled version next to the original. Five DSP chains, nine pure-numpy stages, deterministic from a SHA-1 of the input file (same input → same output, forever). PyInstaller + Inno Setup, GitHub Actions CI builds EXE + installer + portable on every push.

Python · PySide6 · numpy DSP · ffmpeg

3D scroll-driven portfolio for a designer

Built (pro bono) for designer Ema Stoyanova. @react-three/fiber + Three.js r180, custom GLSL shaders (halftone, dither, paper, glass, metal), GSAP scroll-synced timelines. GPU-tier-adaptive: tier ≤ 1 devices get particles halved, postprocessing dropped, transmission swapped. Custom asset pipeline: 857 MB raw → ~70 MB WebP + 14 MB AVIF + LQIP placeholders.

R3F · Three.js · GLSL · WebGL

live

horror-realism portfolio · live calendar booking

Built (pro bono) for tattoo artist Sharon Shakti (@sharonnshakti). Next.js 14 App Router with a React Three Fiber hero, simplex-noise displacement shader + canvas2D oxblood ember particles. Google Calendar is the sole source of truth for availability; no database. Three API routes handle slot queries, 28-day horizon availability, and atomic booking with race-condition guard. Gothic ornament system: SVG quatrefoils, arcade arches, tracery corners, pointed-arch clip-path buttons.

Next.js 14 · R3F + Three.js · GSAP + Lenis · Google Calendar API

live

generative art — N-body attractor simulation

Single-file p5.js canvas piece. Particles are pulled by four orbiting inverse-square attractors and perturbed by layered Perlin noise. Velocity is mapped to HSB colour — slow particles burn deep crimson, fast ones shift blood-orange. Trails accumulate on a persistent off-screen buffer and decay frame-by-frame. A counter-rotating sigil of concentric polygons (hexagon · nonagon · dodecagon) sits beneath as geometric substrate.

p5.js · Perlin noise · N-body · HSB colour

live

◆ STACK

┌─ PRIMARY ──────────────────────────────────────────────────────────────┐
│  TypeScript    React    Vite    Hono    Cloudflare Workers    Tailwind │
└────────────────────────────────────────────────────────────────────────┘
┌─ ALSO COMFORTABLE WITH ────────────────────────────────────────────────┐
│  Python    numpy    PySide6/Qt    Three.js / R3F    GLSL    Node       │
│  D1 / SQLite    Postgres    Vercel    GitHub Actions    Playwright     │
└────────────────────────────────────────────────────────────────────────┘

GitHub streak stats

contribution snake animation

◆ TRANSMISSION

$ contact --priority high
  ↳ max.wik@icloud.com
  ↳ +46 70 736 05 15
  ↳ stockholm, se
  ↳ open to: cool projects · full-stack · creative engineering

// EOF — built with care, on a ground of ink, in a font of bone, with one drop of blood.

Pinned Loading

  1. Studio-Panic-Attack Studio-Panic-Attack Public

    Interactive portfolio for Ema Stoyanov, built with React, Vite, and @react-three/fiber. Scroll-driven 3D scenes, custom shader treatments on portfolio imagery, and editorial typography.

    TypeScript 1

  2. Tessera Tessera Public

    A web-based QR code generator built for permanence. Designed for one specific use case: generating a QR code that will be tattooed on myself and must work for life, but useful for anyone who wants …

    JavaScript 1

  3. Subdermal Subdermal Public

    My QR-tattoo target site : state-switch architecture on Cloudflare Workers.

    TypeScript 1

  4. PortfolioV3 PortfolioV3 Public

    Personal portfolio of Maximilian Wikström

    TypeScript

  5. CursedEchoesMiniGame CursedEchoesMiniGame Public

    Browser minigame I built. Next.js.

    TypeScript

  6. Paleblood-Vigil Paleblood-Vigil Public

    Generative blood-fluid simulation, p5.js particles drawn by orbiting attractors via inverse-square gravity and Perlin flow fields. Seeded, interactive, single HTML file.

    HTML