• In which direction? In the direction of the deer.

    What are we hunting? Deer.

  • Revo Realms [2025]

    Three.jsTypeScriptWebGPU

    Born as a 3D open-world portfolio, it grew into a sandbox for experimenting with TSL (Three.js Shading Language), physics and advanced graphics programming and optimization techniques. Built with Three.js, WebGPU and TypeScript, it combines interactive terrain, procedural vegetation, water, fire, and spatial audio, with subtle references to the worlds and stories I love.

    • Built a compute-driven foliage pipeline: per-instance soft culling, animation, interaction, and dynamic effects, no CPU round trips, entirely on the GPU.
    • Optimized third-party models in Blender via polycount reduction, hidden-geometry removal, and custom texture atlases.
    • Created a fire system using a similar compute pipeline to foliage, handling transforms and lifetime fully in a GPU compute shader with pooled particles and custom color blending to convey both heat and depth.
    • Performance: Averages ~8 ms per frame (~120 FPS) on a MacBook Pro M2, rendering at 2268×1473 (DPR 1.5) with < 20 draw calls per frame.
    Revo Realms - Lake
    Revo Realms - Leviathan Axe and Fire
    Revo Realms - Vegetation and Dragon Ball
    Revo Realms - JoJo and One Piece

    RaidoA journey in motionA collision of worlds

  • Zanka no Tachi [2024]

    Three.jsR3FBlenderWebGL

    A real-time tribute to Yamamoto Genryūsai's Bankai from Bleach. Built with Three.js (via R3F) and GLSL to convey its heat, motion, and intensity. Featuring a stylized, dynamic fire effect and a simple low-poly environment, powered by GPGPU particle systems, custom shaders, and Blender assets, aiming to capture the raw power of that iconic moment.

    • Developed a useGPGpu hook to declaratively manage GPU-based computation in WebGL, via fragment shaders, buffers, and ping-pong rendering.
    • Implemented a post-processing shader to convey the heat haze generated by Yamamoto's Bankai.
    • Modeled Yamamoto and his sword in Blender with stylized cloth and footwear, and built a minimal low-poly environment to frame the effect.
    • Shaped each particle procedurally in GLSL (circular → hexagonal) using masks, avoiding alpha textures entirely.
    • Performance: Maintains < 3 ms per frame (120 FPS+, refresh-rate limited) on a MacBook Pro M2, even with 50k particles and unoptimized geometry/materials, leaving plenty of headroom for a richer environment or additional effects.
    Zanka no Tachi - Shikai
    Zanka no Tachi - Bankai

    SowiloFlame that cuts throughHeat woven in compute

  • Unshaken [2024]

    Three.jsR3FDreiBlender

    A low-poly homage to one of the most unforgettable video game experiences ever made: Red Dead Redemption II. Modeled and baked in Blender, brought to life with Three.js (via R3F), it depicts Arthur Morgan riding his horse down a hill beneath the warm colors of dawn.

    • Modeled an entire stylized low-poly scene in Blender: from terrain, vegetation, and rocks to characters (Arthur and horse), with manual UV unwrapping and baking everything in a single 4K texture atlas.
    • Lit the scene with the Drei's <Sky /> component, matching Blender's Nishita Sky dawn lighting.
    • Added an RDR2-inspired cinematic mode: disabling orbit controls, animating letterbox bars, and rotating the scene set to western ambient music for a cutscene-like experience.
    Unshaken - Threejs Scene
    Unshaken - Blender Arthur + Horse

    AnsuzSignal carried in the voidWords woven into code

  • Cosmic Canvas [2024]

    Three.jsR3FDreiWebGL

    My first solo Three.js piece (via R3F): a shader-driven study of Jupiter. One compact GLSL material recreates the swirling bands—no textures, just procedural noise, flow, and custom lighting tuned to remain smooth on low-end devices.

    • Implemented a compact GLSL material that layers animated noise to drive Jupiter's banding and storm motion.
    • Added rim (Fresnel) and specular highlights, with a softened day-night terminator to sell curvature and depth.
    • Reused early iterations of the planet shader for four of Jupiter's largest moons, adapting them for surface detail, and framed the scene with Drei's <Stars /> and <Trail /> components to make the satellites stand out.
    • Performance: ~2.5 ms per frame on a MacBook Pro M2 (120 FPS+, capped by display refresh rate). Current use of per-satellite materials leaves easy wins (e.g., material reuse) to reduce cost even further.
    Cosmic Canvas - Jupiter and Europa
    Cosmic Canvas - Great red spot
    Cosmic Canvas - Jupiter and Io

    TiwazSky father's mark Noise shaping the frame

  • Whisper World [2024]

    ClibuvCMakeTCP/IP

    WhisperWorld is a client-server chat app written in C, built to dive deeper into systems programming and TCP/IP. Powered by libuv for async I/O and CMake for builds, it gave me hands-on practice with memory management, networking, and modular design. The original idea was to rebuild it in other languages to compare ecosystems and approaches.

    • Built a multi-client chat server and client in C with broadcasting and connection management.
    • Integratedlibuv for non-blocking, event-driven I/O, replacing the initial select() implementation.
    • Migrated build setup from a simple Makefile to CMake with auto-fetched dependencies and cross-platform support.
    • Explored edge cases like partial reads, oversize payloads, and connection drops, while planning next steps such as an event queue and custom protocol abstraction.
    Whisper World - Local chat example

    AnsuzSky father's mark Noise shaping the frame

  • Futbob [2021]

    Next.jsMUINode.jsGraphQLMongoDB

    A side project born from my love of football and the weekly matches with friends. We wanted a way to track stats like goals and assists, organize games, and handle shared costs. I designed, built, and deployed the platform end-to-end: a Next.js PWA frontend with a Node.js + GraphQL + MongoDB backend. It ran live in 2020/21 and, while development paused before the match engine was finalized, I recently brought it back online as a "museum piece” of that journey.

    Beware of cold starts when checking it live, it might take a moment to load :)

    • Designed & built the entire stack solo, from data models to UI flows, using Next.js and Node.js + GraphQL.
    • Implemented player and pitch management: FIFA-style stat graphs, dynamic overall ratings, and field details (location, turf, dimensions, costs).
    • Added authentication, encryption, Google OAuth, and email flows with Nodemailer for account verification and password resets.
    • Deployed on a custom domain with Vercel (frontend) and Render (backend), gaining hands-on experience with deployment pipelines.
    Futbob - Player statsFutbob - Player stats
    Futbob - Player listFutbob - Player list
    Futbob - Overall score cardFutbob - Overall score card

    WunjoJoy in fellowshipStats that tell our story

  • DDreamkol [2018]

    Node.jsPugHTML

    DDreamkol was my very first project, started in 2018 while I was still at university. It was a community platform for my valley in Macedonia, with bus schedules, history notes, photos, and a page for our annual football tournament. Built in Node.js, serving a mix of plain HTML and Pug templates, it blended both server-rendered and static content (long before I knew the terms SSR and SSG). I recently revived it in mid-2025 as a kind of time capsule — a piece of where it all began.

    • Created a Node.js platform serving both HTML and Pug templates, mixing SSR and static content.
    • Implemented community features like photo uploads with manual approval and an open forum.
    • Built a dedicated football tournament page with teams and photos.
    • Deployed first on a rented server with Nginx and static IP, then revived in mid-2025 on Vercel with a custom subdomain.
    DDreamkol - Landing page
    DDreamkol - Nerezi village page
    DDreamkol - A bit of history about the valley

    GeboA gift to the communityRoots in every line of code