Prešov, Slovakia · CS, Technical University of Košice

RomanŠafranko

Every project here started as something I wanted to exist. A few of them I still use every week.

Now Prismatic Arena — Teamfight Tactics stats and automated comp labelling
In use VB Visualizer, the tool my short-form music content runs on
Working in Python · TypeScript · React / Next.js · Docker · Linux
Status Open to junior / mid roles — full-stack, backend, AI tooling

Selected work

Each project is filed under the constraint that shaped it. The constraint is usually the interesting part.

VB Visualizer

Browser music visualizer · Vanilla ES modules, Web Audio, Canvas

Turns a track into vertical video for short-form. Onset detection runs on spectral flux, lyrics sync from LRCLIB, and the whole thing stays a static page, nothing to install, nothing to host. Built for my own music channel, which means it gets used every week and breaks in public. Several visual modes, rewritten a few times into a module-based architecture.

Constraint Stays lightweight or it dies. Every feature that would have pulled in a model or a server got cut.
  • Build stepnone
  • Onsetsspectral flux
  • LyricsLRCLIB
  • Output9:16

Prismatic Arena

Stats site · Next.js, Riot API, Docker (Postgres + Redis)

Match-history mining for Teamfight Tactics. An automated merger labels raw board states into named compositions, so tier lists assemble themselves instead of being hand-maintained. The labelling pass and the front end are being built out now; anything that depends on live match volume waits its turn.

Constraint No production API key yet, so the work is sequenced around it. Everything that can be finished without full match throughput gets finished first.
  • FrameworkNext.js
  • Labellingautomated merger
  • UpstreamRiot API
  • RuntimeDocker — Postgres + Redis

Voice-controlled robotic arm

Bachelor thesis · Python, OpenCV, local LLM, speech recognition, Dobot Magician

Spoken instruction into a local language model, model output into arm motion, and computer vision closing the loop on where the objects actually are. The interesting failure mode was never the robot, it was the gap between what a person says and what a gripper can be told to do.

Constraint No cloud API. Speech recognition, the language model and the vision pipeline all had to run on the machine sitting next to the arm.
  • HardwareDobot Magician
  • VisionOpenCV
  • Inferencefully local
  • Demo1:46, running

Purged walk-forward backtester

Research pipeline · Python, pandas

Built to answer one question honestly: does a signal survive when you stop leaking the future into it? The pipeline runs the same strategy twice — once with leakage intact, once with purged walk-forward splits, and the gap between the two curves is the actual result.

Constraint No live capital, ever. The deliverable is a number you can trust, not a bot.
  • Marketcrypto, historical
  • Validationpurged walk-forward
  • Capital at risk0

CV builder with ATS mode

React · content linting, job-description tailoring, multi-format export

Writes CVs that survive the parser before they reach a person. Constraint: whatever renders on screen has to come back out of an ATS intact, which rules out most of what makes a CV look good. The CV linked at the top of this page came out of it.

Windows provisioning tool

PowerShell · 35 apps, 16 tweaks, 7 scripts, 4 presets

A fresh machine reaches my full working environment in one pass. Constraint: built because I rebuild often and refuse to do it by hand twice.

Evidence

A skill list is a claim. This one has to cite where it was used.

SkillWhere it was actually used
PythonThesis pipeline · backtester · data tooling
TypeScript / JavaScriptVB Visualizer · Prismatic Arena
React / Next.jsPrismatic Arena · CV builder with ATS mode
Computer visionOpenCV object localisation for the robotic arm
Local model integrationSpeech → local LLM → arm control, fully offline
Audio & DSPSpectral flux onset detection, Web Audio graph
Docker · LinuxPostgres and Redis containers behind Prismatic Arena
Validation designLeakage control and purged splits in the backtester

Available for
the interesting parts

Roman Šafranko — 2026 Set in Archivo & Martian Mono. One accent, no JavaScript. Source →