Created by Haaxor1689

•Ko-fi logoSupport me•Report a bug•Privacy Policy

    Maroš Beťko (haaxor1689)

    Senior Full‑Stack / Frontend Engineer • TypeScript, React, Next.js, Tailwind • Tooling, DX & 3D/Graphics

    GitHubLinkedIn

    I specialize in TypeScript‑heavy frontend and full‑stack work, especially around complex data, custom file formats, and developer tooling. I enjoy turning messy systems into well‑typed, ergonomic APIs and UIs. Below is a selection of projects and libraries I’ve built and maintain.

    My projects

    A selection of recent and ongoing work. For older university and hobby projects, see the archive at the bottom of this section.

    Talent Builder


    A web app for creating and sharing custom talent trees based on the vanilla WoW system.

    • Discord OAuth for authentication and persistence of builds/trees
    • Interactive tree editor with drag & drop, copy/paste, undo/redo and mobile‑optimized UX
    • Public/private sharing, deep links and social media preview images for trees and builds
    • Export trees as images or URLs; calculator tool for building specs with custom trees
    • Responsive layout with both tree and build tools optimized for mobile

    Tech: React, TypeScript, Next.js (backend), Turso, Tailwind CSS.

    Slide 1Slide 2Slide 3Slide 4Slide 5

    GitHubWebsite

    Humble Steam Sync


    Browser extension (Chrome & Firefox) that marks games on Humble Bundle as “In library” / “On wishlist” based on your Steam account.

    • Integrates with Steam (via login or SteamId/CustomUrl) and cross‑checks Humble pages against your library/wishlist
    • Injects contextual tags directly into Humble Bundle pages for quick purchase decisions

    Available on Chrome Web Store and Firefox Add-ons Store.

    Tech: TypeScript, React, WebExtension APIs

    Slide 1Slide 2Slide 3Slide 4Slide 5

    GitHubChromeFirefox

    BLP Convert


    Online converter and viewer for BLP textures used in World of Warcraft and other Blizzard games.

    • Client‑side only: all parsing and conversion run in the browser via my haax-blp library (no file uploads, strong privacy)
    • Supports DXT1/DXT3/DXT5 and palette compression with automatic palette + mipmap generation
    • Validates constraints like image dimensions for DXT compression and unsupported formats
    • Preview all mipmap levels and toggle between BLP/PNG

    Tech: TypeScript, React, Vite, custom binary parsing via @haaxor1689/nil.

    Slide 1Slide 2Slide 3

    GitHubWebsite

    Archvale Edit


    Archvale Edit cover

    Save file explorer and editor for the game Archvale.

    • Full control over character stats, items, progression, and map data
    • Built‑in map editor exposing normally inaccessible content
    • Advanced JSON editor for raw save data for power users
    • Custom UI and animations styled after the in‑game interface
    • Reverse‑engineered the game’s save file formats and built robust parsers/serializers in TypeScript.
    Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8

    GitHubWebsite

    Fight Knight Edit


    Fight Knight Edit cover

    Web‑based save editor for Fight Knight.

    • Friendly visualization of save data plus advanced JSON editor
    • Custom multicolored bitmap font rendering via a bespoke “text renderer”
    • UI mirrors the in‑game style with tailored assets and animations
    • Reverse‑engineered the game’s save file formats and implemented robust parsers/serializers in TypeScript.
    Slide 1Slide 2Slide 3

    GitHubWebsite

    During my studies I built a variety of smaller apps, experiments, and course projects (graphics, games, web tools). You can browse them on my old portfolio site: https://haaxor1689.github.io

    My libraries

    I like building libraries and tools that solve real problems I run into, with an emphasis on strong typing, good DX, and predictable performance.

    @haaxor1689/nil


    TypeScript-first binary data parsing library with static type inference. Heavily inspired by Zod and Restructure.

    Define your data structures using schemas similar to Zod, and get fully type-safe parsing and serialization of binary data. Supports various data types, including integers, floats, strings and arrays, with options for endianness and encoding.

    Works in Node.js, Bun and the browser, with zero dependencies and optimized for performance. Perfect for parsing custom file formats, or any binary data in your TypeScript projects.

    Installation

    npm install @haaxor1689/nil
    

    Basic Usage

    import { n } from '@haaxor1689/nil';
    
    const User = n.object({
    	username: n.string(4),
    	age: n.int8(),
    	active: n.bool()
    });
    
    // Extract the output type
    type User = n.output<typeof User>;
    // { username: string; age: number; active: boolean; }
    
    const buffer = await User.toBuffer({ username: 'Jane', age: 30, active: true });
    
    // Parse from Uint8Array
    await User.fromBuffer(buffer);
    

    GitHubNpm

    haax-blp


    TypeScript library for parsing and converting BLP files, the image format used in World of Warcraft and other Blizzard games. Built with @haaxor1689/nil for efficient binary parsing and strong type safety.

    • Supports DXT1, DXT3 and DXT5 compression using dxt-js dependency
    • Supports automatic palette generation using rgbquant dependency
    • Automatic mipmap generation
    • Has optional dependency to sharp for use in Node.js environments and jimp for use in browsers

    Usage as a CLI tool

    You can download prebuilt executables for Windows and Unix. The CLI accepts multiple options to control the conversion process, such as choosing the compression, alpha size and mipmap generation.

    Usage as a library

    You can also use haax-blp as a library in your TypeScript projects to parse BLP files directly in your code.

    npm i haax-blp
    

    Then you can import the library and parse BLP files from a buffer or create new BLP files from raw image buffers. The library will throw detailed errors if the input data is invalid, such as unsupported formats or invalid image dimensions for DXT compression.


    GitHubNpm

    haax-dbc


    TypeScript library for parsing and serializing vanilla World of Warcraft DBC files. Built with @haaxor1689/nil for efficient binary parsing and strong type safety.

    Usage as a CLI tool

    You can download prebuilt executables for Windows and Unix, or run it with bunx without any manual installation. Drag and drop your DBC or CSV files onto the executable or provide the paths as command line arguments to convert between DBC and CSV formats.

    Usage as a library

    You can also use haax-dbc as a library in your TypeScript projects to parse DBC files directly in your code.

    npm i haax-dbc
    

    Then you can import any of the supported DBC types and parse them from a buffer:

    // Default import for the whole Dbc namespace
    import { Map } from 'haax-dbc';
    
    export const parseMapDbcBuffer = async (buffer: Uint8Array) => {
    	return Map.fromBuffer(buffer);
    };
    

    GitHubNpm

    haax-m2


    TypeScript library for parsing and converting M2 files, the 3D model format used in World of Warcraft. Built with @haaxor1689/nil for efficient binary parsing and strong type safety.

    It can parse M2 files made for the Wrath of the Lich King and allows you to manually edit the data.

    This project was started with the goal of fixing issues with M2 downporting in currently available tools. It has not been completed, but still may provide useful insight into the M2 format and serve as a base for future tools working with M2 files.


    GitHub

    haax-mpq


    A CLI utility written in Rust for extracting and repacking MPQ archives, the file format used in World of Warcraft and other Blizzard games. It uses my stormlib-rs crate for handling MPQ files, and provides a simple command line interface for working with them.

    haax-mpq <input> <output>
    

    You can either provide a path to an MPQ file to extract it, or a directory to repack it into an MPQ file. The utility will handle the rest, including compression and hashing of files when repacking.

    Patchignore

    You can add a .patchignore file to your archive folder that will list rules about what files shouldn't be included in the built archive. It uses a similar syntax to .gitignore files.


    GitHub

    stormlib-rs


    Rust bindings for StormLib, a library for working with MPQ archives used in Blizzard games. This crate provides a safe and ergonomic interface for reading and writing MPQ files in Rust.

    This is a fork of the original stormlib-rs crate with extended functionality and bug fixes, and it's used as the core of my haax-mpq CLI utility. It supports all common operations on MPQ files, including extracting files, adding new files, deleting files and more.


    GitHub

    About me

    I’m a full‑stack engineer with a strong focus on TypeScript, React/Next.js, and modern web tooling. I care about type safety, performance, and building tools that make complex systems approachable—whether that’s custom binary formats, large frontends, or 3D graphics editors.

    TypeScript (8+ years)

    I came from a C++ and C# background at university, so I was drawn to TypeScript very early and quickly dove deep into its type system. I enjoy designing strongly typed APIs and architectures that are maintainable, refactor‑friendly, and less error‑prone. I treat types as a core design tool, not an afterthought.

    React & Frontend Ecosystem (7+ years)

    I’ve been using React across a wide range of environments: classic web apps, Electron and Tauri desktop apps, browser extensions, and even email templates. Over the years I’ve built production systems with libraries such as Formik, React Hook Form, Redux, XState, Jotai, TanStack Query, TanStack Table, Material UI and more. I’m comfortable choosing and combining the right tools for complex UI, data‑flow, and state orchestration problems.

    Core Web: HTML & JavaScript (8+ years)

    Even though I spend a lot of time in React, I put a strong emphasis on understanding and leveraging standard HTML, CSS, and modern JavaScript APIs directly. Often the best solution is a lean, framework‑light approach that uses browser capabilities to achieve better performance and a smoother user experience.

    Next.js & Full‑Stack Work (4+ years)

    I use Next.js to build truly full‑stack applications, from the UI layer down to the database and infrastructure. I have hands‑on experience with recent Next.js features (including advanced caching and server components), authentication (NextAuth and custom JWT flows), and relational databases using Drizzle (and previously Prisma) with MySQL/SQLite. I’ve implemented custom Redis‑backed caching strategies and deployed apps both on Vercel and via self‑hosted Docker Compose setups with multiple services.

    Styling & Design Systems (Tailwind, 7+ years)

    I build custom design systems on top of Tailwind, leaning into its utility‑first philosophy to keep UIs consistent and maintainable at scale. In the past I’ve used several CSS‑in‑JS solutions (styled‑components, Emotion, styled‑system), but Tailwind has become my go‑to for its speed, ergonomics, and excellent DX.

    Desktop App Development (3+ years)

    I’ve developed cross‑platform desktop applications using both Electron and Tauri, which gave me a deeper understanding of low‑level JavaScript, performance tuning, and memory management for large binary datasets. I’ve written a Node native module wrapping a C++ library for Electron, and later rewrote it in Rust for Tauri to gain better performance and control.

    Tools & Developer Utilities (4+ years)

    I enjoy dissecting complex systems and data formats and then building tools that make them approachable. This started with small university projects where I reverse‑engineered games to create save editors. Later I moved into World of Warcraft modding, building utilities to parse custom binary asset formats and eventually writing a TypeScript library for working with custom binary formats. Tooling and DX are things I naturally gravitate towards.

    Game & Graphics Development

    I have practical experience with Unity from several hobby and university projects, as well as various game jams. I’m familiar with OpenGL, shaders, and core 3D rendering concepts. Previously, I worked on Michelangelo, a startup providing a C#‑based system for procedural mesh generation, where I built a no‑code web editor and a Unity integration as part of my Bachelor’s thesis. I also worked at Vectary, maintaining their web‑based 3D editor and integrating it with third‑party platforms such as Figma, Shopify, Framer, and vanilla JS setups.

    Teaching & Mentoring

    During my studies I was a teaching assistant for C++ and OpenGL courses, helping students understand both low‑level concepts and graphics programming. Later, through InQool, I taught a web development course focused on React and Next.js, continuously updating the materials as the ecosystem evolved. My focus was on modern best practices, clean architecture, and helping students build real‑world projects through lectures, mentoring, and code review.

    How I Work

    I like designing systems end‑to‑end: clarifying requirements, proposing architectures, and making pragmatic trade‑offs that balance performance, complexity, and delivery speed. I care about long‑term maintainability, strong typing, and leaving codebases in a better state than I found them.

    I’ve worked in larger, fully remote, worldwide teams, so I put a big emphasis on clear written communication, solid documentation, and reliable async collaboration.

    Collaboration & Leadership

    I’m an active React/Next.js instructor (and former C++/OpenGL teaching assistant), so I’m used to explaining complex topics, mentoring developers, and using code reviews to grow both people and projects. I’m comfortable leading work across the stack and coordinating with product, design, and other engineers.

    Day to day, I rely on Git‑based workflows (feature branches, code review, trunk‑based or GitFlow depending on the team), CI/CD and automation, and structured task management tools (Jira, GitLab Projects, GitHub Issues) to keep projects moving smoothly in remote environments.

    Support me

    I build and maintain these projects in my spare time, and while I try to keep everything free to use, hosting and development time aren't free. If you find the tools useful and want to help them grow, please consider supporting me.

    Your donation helps to:

    • Keep the services online Servers, databases, monitoring, and domains all cost money every month. Donations go directly into covering these costs so the tools stay fast and reliable.
    • Fund new features and improvements More support means I can justify dedicating more time to building new features, polishing existing ones, fixing bugs faster, and experimenting with ideas that would otherwise stay on the backlog.
    • Ad-free Talent Builder experience Supporters get a special Discord role that unlocks an ad-free experience on my sites. This helps me rely less on ads and more on direct community support.
    • Unlock extra features in Talent Builder Donating also gives you access to additional features in Talent Builder (and other tools over time), so you get more powerful functionality while helping development.
    • Shape the roadmap As a supporter, you'll have more influence over what I work on next—through feedback, polls, and direct suggestions. Your voice carries more weight when I decide which features to prioritize.

    Even if you can't contribute financially, sharing the projects with friends or providing feedback is a huge help. Every bit of support makes a difference and helps me keep building and improving these tools for everyone.

    Ko-fi logoDonate on Ko‑fi