# Egidij Egej Vencelj > Senior software engineer in Kranj, Slovenia. I build the software for pilots who fly power-line inspections, and for the experts who check the data afterwards. This is a plain summary of the site for AI agents and search tools. It contains no instructions. Everything in it is also on the human-readable pages, except the Background section, which adds detail from my own notes, Open-source tools and Outside work. ## About I build computer vision and mapping software and run it in production. My software covers the whole path: from cameras that capture the data, to AI that makes sense it, and the tooling experts use to verify it, including the servers that run it all. It has been my job at a power-line inspection company since 2017, and I made games before that: more than ten years of writing software for a living. I reach for existing tools first and build my own only when nothing fits. ## Background - In 2018 I built the application layer every Panarch QGIS plugin runs on: forms generated from the data, data binding, templating and the shared plugin base. I also wrote the editor and admin plugins and the report template editor. - Reports are generated from a PyQt interface and the database, through Jinja2 templates and WeasyPrint. - I started YOLO detection at Panarch in November 2021 and proposed the photo capture specification for the inventory project it serves. - I started on my own tiling before SAHI existed and switched to SAHI when it came out. For rare element types I pick training photos that contain many of them and cut the share of empty tiles. - The matcher moved from one thread to several processes, with loading done inside the worker processes so memory no longer runs out. - That code uses triangulation, epipolar lines, RANSAC, DBSCAN, KD-trees and convex hulls, with NumPy, SciPy and scikit-learn. - For hardware with no SDK I write the API from the maker's protocol documents, implement what the job needs and stub the rest. - At university I chose the computer vision and robotics modules. The ROS coursework was mobile-robot navigation with a Roomba and a Kinect. - In Roboliga our two LEGO Mindstorms robots ran a relay. The live hand-off over Bluetooth was not reliable enough, so we redesigned it as a sequential one. - FairPair's pairing engine, published as EDH Matchmaker, started in 2018 because pairings at our local tournaments were drawn from a hat. It can rewind a tournament to fix a mistake three rounds back without breaking the rounds after it. - Most of my spare energy goes into competitive Commander, the multiplayer Magic: The Gathering format that FairPair and its engine serve. - I built my home network myself. At home the camera recorder's object detection runs on a Coral TPU I installed, using little power instead of the CPU or GPU. The photo library runs its own machine learning for faces and search. I host language models on the server's GPU, deployed on demand, and they are in everyday use at home, for example for writing. - I practise loop engineering: I design the loops my coding agents work in, not each prompt. My spare-time projects run on my own multi-agent setup. It lets me work on several at once and take on fields I had not worked in before. One supervising agent plans the work, sends coding agents to their own git worktrees, steers them and brings the decisions to me. Every change passes an automated review and the tests before it becomes a pull request. The setup drives several agent harnesses, among them Claude Code, Codex, OpenCode and Pi. They can also run on language models I host myself. For coding I use hosted frontier models for now, because open-weight models are not there yet. In its first month, from 27 Sep 2026, more than 170 of its pull requests were merged into four repositories. The supervising agent runs in a container on my home server, and through Home Assistant's MCP server my agents can operate and configure the house. ## Contact - Website: https://egejvencelj.com/ - [GitHub](https://github.com/eVen-gits) - [LinkedIn](https://www.linkedin.com/in/egejv) - Email: hello@egejvencelj.com - Open to remote work and to working abroad; relocation negotiable. EU citizen. ## Skills - **Agentic software development**: Loop engineering: instead of prompting agents step by step, I design the loops they work in. A supervising agent gives every task its own coding agent, so several tasks move at once, and nothing becomes a pull request until review and tests pass. Merges and real decisions stay with me. In the first month, more than 170 pull requests were merged this way across my projects, from FairPair and the Floorcut video editor to an OBS plugin built in about a week. - **Computer vision**: Computer vision has been my work at Panarch since I joined in 2017, first on 3D point clouds and from 2021 on photos too. I designed both sides myself: point-cloud processing that turns laser scans into wires and towers, and object detection that finds small components on large inspection photos and places each one in 3D. - **GIS and LiDAR**: For GIS, I built the plugin framework behind Panarch's QGIS inspection suite in 2018, and every plugin in it still runs on it. For LiDAR, my point-cloud code turns laser scans into a 3D line for every wire and measures how far each tower leans. - **Hardware integration**: When a camera, gimbal or GNSS receiver comes without an SDK, I write its driver from the maker's protocol documents. I also specified and built the GPU server for our model training and the small cluster for our inference runs. I built my smart home infrastructure, with NVR, local AI models, AI camera models and more. - **Algorithms**: Matching noisy real-world data is the heart of my work: across many overlapping photos, my matching suite decides which detections are one object and places it in 3D with epipolar geometry, triangulation and outlier-tolerant clustering. In my spare time, FairPair core pairs four-player Swiss tournaments. - **Testing and CI**: At work my algorithms handle noisy real-world data, and a ground-truth benchmark I wrote measures every change to it. My own project, FairPair core, has about as many lines of tests as of engine, and they run on every release. - **Desktop and UI**: I build desktop tools in Qt for the people who use them in the field and the office: the QGIS inspection suite, the pilots' navigation system and FairPair's desktop app. In the suite, my report system lets non-technical staff lay out and produce the client's PDF reports themselves. - **Real-time audio and video**: Speech, live and recorded. An OBS Studio plugin captions a stream in step with the speaker, and Floorcut cuts hours of recorded speech into short subtitled clips on word boundaries. I designed both and directed the coding agents that wrote them. - **Linux, IT and networking**: I look after many parts of our office's everyday IT as well as our Linux AI infrastructure. At home my own server runs the cameras with on-device detection, the media and photo libraries and the home automation. - **Programming and spoken languages**: Python is my main language, at work since 2017, with SQL for PostGIS and JavaScript and Vue for FairPair's live side. Before that, C# in Unity at the game studio. Spoken: Slovenian (native), English (fluent), German (basic). ## Work Panarch in Kranj conducts airborne powerline inspections with multiple sensors. I joined as a developer in December 2017 and have been the lead software engineer since 2020. My software covers it all: from the camera to the report. Pilots, field crews and reviewers use it every day. The code is private, so each demo is rebuilt from scratch on public data. ### [Ultra-high-resolution YOLO detection](https://egejvencelj.com/work/inspection-pipeline/) (2021 - present) My feature matching algorithm places a big inspection project's YOLO detections in 3D in about a day, where linking them by hand would take more than two years. The detector power grid elements on 150-megapixel imagery. An original procedure I designed and implemented cut wrong and missed detections by roughly 70 %. A damper takes up a tiny part of a 150 MP frame. Shrink the photo and the detector loses it, and a single photo can't tell how far away it is. That is why the detection runs on full-resolution tiles with SAHI, which I patched to process tiles in parallel for faster runs. Each component appears in many overlapping photos, and matching works out which detections belong to one object. It then places that object in 3D, to a few centimetres at about 50 m from the camera. Cluster QC, the second opinion. The matcher sometimes counts a damper twice or misses one, and I started Cluster QC on my own to catch that. Cluster QC asks every photo of a spot how many dampers it sees. Each photo is a vote, and the count most photos agree on wins. On a project of about 30,000 elements it cut missed detections, and the manual review they cause, by roughly 70 %. I wrote the training, the dataset tools for annotation in CVAT, batch inference and the matching. For the 3D placement I chose epipolar geometry over structure-from-motion, because it is fast and the photos never need opening again once detection has run. Cluster QC was my idea and my initiative, and I wrote its 880-line design document and the ground-truth benchmark that measures every change. Result. A couple of weeks of flight data take a couple of days of YOLO detection and about a day of 3D placement. People then inspect and check the results in the geotagger for one to two weeks, depending on the project. For a project of about 30,000 elements, I assessed whether the job could be done at all and worked out how. Built with: Python, PyTorch, Ultralytics YOLO11, SAHI, CVAT, OpenCV, PostgreSQL. ### [The QGIS inspection suite](https://egejvencelj.com/work/qgis-plugins/) (2018 - present; Wrote the plugin framework and key plugins) The whole company works in these QGIS plugins every day. Crews edit inspection data in them, and it all lands in one PostgreSQL database. The suite turns it into client-ready reports. Since 2018 I have written the framework every plugin runs on and many of the plugins. Detection and geotagging. YOLO detection finds components on the photos, and the geotagger ties photos, tie points and elements together in 3D. See the detection and the geotagger re-created. Reports. Reports used to be made by hand. Now data is edited in forms generated from it, and pages are laid out in the suite's own template editor. A batch run turns the database into finished PDFs, and non-technical staff produce the reports themselves. Everything around them. Project set-up and import, the editor where the team reviews data, LiDAR wire detection and centreline extraction, and cross-sections. All of it runs on the shared framework I wrote in 2018. The 2026 port to QGIS 4 and Qt 6 spanned five repositories, with a compatibility layer that keeps QGIS 3 working. Built with: PyQGIS, PyQt, PostgreSQL, PostGIS, WeasyPrint, PyTorch, YOLO. ### [Geotagger: photos, map and 3D](https://egejvencelj.com/work/geotagger/) (2021 - present; Wrote the triangulation, the 3D view and other key features) The geotagger is a QGIS tool where a human reviewer checks each detection, with its photos and tie points on the map and in 3D. A pick in one of its two linked photo windows draws the epipolar line in the other. It is part of the QGIS inspection suite, and I wrote its triangulation, its 3D view and its matching. Detection and matching produce thousands of elements, about 30,000 on one project, and each one needs a person's check before anything goes to the client. Two photo windows sit beside the map. A pick in one shows the epipolar line in the other, where the same point must lie. Tie points are the YOLO detections, and links join each element to the photos that see it. New elements. Elements are made automatically or by hand. By hand, you pick the element in two photos, and the geotagger finds its other observations and builds the 3D element with all its links. A person can add tie points too. Bundle adjustment. Align views finds keypoints by itself in a photo and its neighbours, aligns the photo on them, and the photo's element matches improve. It runs at sub-pixel precision on the photos a person selects, because a whole project would take too much computing. It helps most when a photo starts from a bad pose. When the pose is already good, it often adds little. Re-matching. For the elements a photo sees, the geotagger can match the tie points again and realign the photos involved. A count from every photo decides how many elements each cluster gets. It shows the whole plan before anything is written, and logs the old poses so they can be put back. I wrote the triangulation, the 3D view and the matching, replaced much of the early code, and maintain it as part of the QGIS suite. Built with: Python, PyQGIS, PyQt, SuperPoint, LightGlue, OpenCV, PostgreSQL, PostGIS, Multi-view geometry. ### [Point-cloud slices on demand](https://egejvencelj.com/work/point-cloud/) (2022 - 2025) A small service I wrote cuts a slice out of the LiDAR point cloud on request. The reports and web maps call it whenever they need a cross-section, and it runs in Docker. Built with: Python, LiDAR, Point clouds, Docker. ### [Point cloud to photo projection](https://egejvencelj.com/work/camera-model/) (2021 - 2025) The camera geometry I wrote projects a power grid's 3D data into each inspection photo. If the camera pose is even a little off, the drawing misses the wires, and solving the pose makes it land. It covers mount rotations, the camera's intrinsics, projecting LiDAR wires and towers into a photo, and the ray back out from a pixel. Panarch uses it to check detections against the model and to place in 3D what the camera saw. Built with: Python, NumPy, Multi-view geometry. ### [Helicopter pilot live map](https://egejvencelj.com/work/skynav/) (2019 - present; Wrote key features of its 2019 rebuild) The dynamic navigation system pilots fly inspection with. It shows the job's flight lines, with large instruments for speed, height above ground, distance from the line and progress along it. I wrote key features of its 2019 rebuild. The camera's overlap depends on speed, and the job sets a height above the terrain for every line. The pilot has to hold both while reading the screen in a vibrating cockpit. In the 2019 rebuild I added planned heights above ground along each flight line from a terrain model, the tunnel view and progress along the active line. I also split one large script into modules. Later I wrote the driver for a newer GNSS receiver, a tool to import layers from a server, and fixes for high-DPI screens. Built with: Python, QML, Qt, QGIS, GNSS. ### [Wire and pylon vectorization from point cloud](https://egejvencelj.com/work/wire-vectorization/) (2018 - present; Wrote the wire fitting and the tower measurement) From the LiDAR scans, my code draws one clean 3D line per conductor per span and measures how far a lattice tower leans. The wire part is about 10k lines of original code in the QGIS suite, written between 2018 and 2024. The tower part started as my bachelor's thesis in 2019 and is still in production today. Built with: Python, LiDAR, laspy, NumPy. ### [The multi-camera gimbal pod](https://egejvencelj.com/work/camera-pod/) (2020; Wrote the control software and the device drivers) The pod hangs several sensors on motorised pan heads, suspended below a helicopter, and my software steers them from a controller. The software shows where each head points, its limits and each camera's settings. I wrote all the control software and device drivers for the pod's second version, from the makers' protocol documents. It stayed as a R&D prototype. Heads move one at a time or together. Sync lines the others up with the selected one, and origin brings them home. Soft limits and a turn counter stop a head from swinging into the airframe or winding up its cables. Interval capture fires the selected cameras on a timer, and ISO, shutter, aperture, focus and exposure compensation are set per camera from the pad. Each device runs on its own thread with a command queue, so a slow camera never stalls the heads. Built with: Python, PyQt5, pyserial, Threads, Gamepad input. ### [Flight video synced to the map](https://egejvencelj.com/work/video-sync/) (2018) A QGIS plugin that tied inspection video to the flight track, so the map and the video followed each other. Playing the video moved a marker along the track, and clicking the track, a tower or a finding jumped the video to that moment. I wrote it in my first year at the company. Video time was matched to the flight log, so every frame had a place on the map and every place on the track had a frame. Clips could be cut out and brought back into the project. Status. Nearly all of it dates from 2018, and the company no longer uses it. Built with: Python, PyQt5, QGIS, Video. ### The GPU server and the camera hardware (2021 - present) I specified and built the CUDA server that runs our training and the big batch jobs, and I keep it running. On the aircraft side I integrated industrial cameras, motorised heads and gimbals into the capture system and wrote their low-level control code. Built with: CUDA, Linux, Docker, Device protocols. ## Projects FairPair, a live tournament platform, and Floorcut, an AI video editor, plus streaming tools, a home server and 3D prints, all built in my spare time. The agent setup is listed here too, and on the home page it leads Work. ### [My multi-agent coding setup](https://egejvencelj.com/projects/agent-setup/) (2026 - present; Set it up and designed its loops) I follow the latest industry concepts. Currently, I employ loop engineering principles: I design the loops my coding agents work in, not each prompt. A supervising agent runs them across my spare-time projects and stops for my decisions. In its first month, more than 170 of their pull requests were merged. I set it up to work on several projects at the same time and to take on fields I had not worked in before. I don't prompt the agents step by step. I design the loops they work in. My spare-time projects run on them, among them the OBS plugin, Floorcut, FairPair, my 3D-printed parts and my CV site. The supervision loop. I talk to one supervising agent. It plans the work and gives each task its own coding agent in a clean git worktree, so tasks run side by side. It wakes on events, checks each agent, steers it or restarts a stuck one, then waits again. The validation loop. Every change goes through an automated review, the tests and the fixes they ask for, again until it is clean. Only then does it become a pull request. Me in the loop. Merges, deploys and real decisions stop and wait for me. Spending and merge rights are set by rules, not by an agent's judgement. The rules I write. Small, clear changes skip the full pipeline. FairPair changes go to a running demo that I approve first, and nothing goes public without my word. Agents load my written playbooks, for my home server and for my CV's wording, when a task needs them. Harnesses and the home server. The setup drives several agent harnesses, among them Claude Code, Codex, OpenCode and Pi. The harnesses can also run on language models I host myself. For coding I use hosted frontier models for now, because open-weight models are not there yet. The supervising agent runs in a container on my home server. Through Home Assistant's MCP server my agents can also operate and configure the house. One of them set up my 3D printer's integration, its dashboard and the print alerts. I set up the open-source tooling, design the loops and their rules, and run my projects on it. Result. In its first month, from 27 Sep 2026, more than 170 pull requests from it were merged. They went into four repositories: the OBS plugin, Floorcut, and FairPair's engine and web app. The OBS plugin went from its first scaffold to release 0.1.4 in about a week. Projects without a GitHub repository, such as my CV site, are merged locally and are not counted. Status: In daily use. Built with: Claude Code, Codex, OpenCode, Pi, git worktrees, Docker, Home Assistant (MCP). ### [FairPair](https://egejvencelj.com/projects/fairpair/) (2018 - present; Started it; built the engine and the live side) A web app that runs competitive Commander (Magic: The Gathering) tournaments, live at fairpair.gg. I started it, and it has grown into a small team. I wrote the live side: the stream overlay, its phone remote and the life-total sync. Its pairings come from EDH Matchmaker, the Swiss engine I started in 2018. A whole Commander event runs on it from the players' phones: sign-up with decklists, Swiss rounds, judges' notes, standings and the top cut. I also play competitive Commander, 4th of 315 at the 2025 European Championship. I work with judges and tournament organisers on clearer rulings and on transparent matchmaking, which players want as well. The team. I started it, and it has grown into a small team. I hold most of the product knowledge. My own code is the live side, for streams. The pairing engine: EDH Matchmaker. Pairings at our local tournaments were drawn from a hat, so in 2018 I wrote my own Swiss pairing engine. Ordinary Swiss software pairs people two at a time, but Commander is played four to a table. My small script grew into a fully fledged PyQt tournament manager. The core powers FairPair today. The cEDH European Championship's multiplayer rules addendum (https://www.cedheurope.com/rules/mtr-addendum) lists it first among the tools for the pairing it recommends. Tests. There are about as many lines of tests as of engine, and they run on every push. I play the format in tournaments myself, so the tiebreakers come from the player's side. Status: Live at fairpair.gg; engine v4.0.0, released 29 Sep 2026. The web app's source code is in a private repository. The engine is open source. fairpair.gg: https://fairpair.gg Source on GitHub: https://github.com/eVen-gits/EDH_matchmaker Documentation: https://even-gits.github.io/EDH_matchmaker/ Built with: Vue 3, Node.js, MongoDB, Python, FastAPI, PyQt6, NetworkX, pytest, GitHub Actions. ### [Floorcut](https://egejvencelj.com/projects/session-clips/) (2026) Floorcut is my AI-assisted video editor that turns hours of recorded meetings into short, subtitled clips of the speakers I choose. It finds each speaker by voice, transcribes them and proposes the cuts, which I adjust in a browser editor before a one-click render. Face detection frames the speaker automatically, and a neural network removes background noise. Public meetings run for hours, and the minutes worth sharing are few. I built it for my own use, to find those minutes and turn them into subtitled vertical clips. Finding the clips. It loads a recording and finds where the chosen speakers talk by matching their voices on the local GPU. Only those sections go to Soniox, which returns a Slovenian transcript with word timings. Claude then proposes clips, each with cut points on word boundaries, a title, a hook and a post. Every proposal is checked against the transcript, so the subtitles are always the speaker's own words. The editor and the render. A browser editor shows the video, the waveform and the words. You nudge cuts word by word, delete filler words Descript-style, and accept or reject each clip. The render step makes 9:16, 4:5 or 1:1 videos with burned-in subtitles that pop in, loudness and voice clean-up, per-shot colour correction, a crop that follows the speaker's face, and a cover image. Status: Built for my own use. The source code is in a private repository. Built with: Python, PyTorch (ROCm), SpeechBrain, Soniox, Claude, ffmpeg, OpenCV, MediaPipe. ### [Real-time transcription and translation for OBS](https://egejvencelj.com/projects/soniox-obs/) (2026) An OBS Studio plugin that subtitles speech as it is spoken, in the original language or translated, on the stream and in the recording. Coding agents wrote all of it in about a week, some 7,500 lines of C++ and 3,300 of tests. Speech recognition and translation come from Soniox's real-time API, and the plugin does everything else inside OBS Studio, the streaming and recording app. How it was built. Coding agents wrote all of it, one task at a time. The first scaffold went in on 30 Sep 2026, and release 0.1.4 came out on 5 Oct. I decided what it does and ran each build in OBS Studio on my own machine. When long sentences made the captions jump, I proposed showing only the words Soniox marks final. When sentences dropped out, I asked for a debug view, which became the Debug tab. After the first public release I asked for a full code audit and signed off its decisions. Captions. It taps the OBS audio tracks you pick and streams them to Soniox over a WebSocket. The captions are drawn on top of the finished program, so they show on every scene. It can also send CEA-608 closed captions with the stream, write .srt and .vtt files next to each recording, and read the translation aloud on its own audio source. Sync. Captions lag the speech by a second or two. The Sync tab measures the lag, and the plugin can hold the whole program back by that much, video and audio, so the words land on the mouth. The delay lives on the GPU as a ring of finished frames, held only while you stream or record, and it turns itself off if the ring would not fit in free VRAM. Cost control. Soniox bills for every second a session is open, silence included. A local voice detector (libfvad) closes the session after 30 seconds of quiet and reopens it when someone talks, keeping the second before speech so the first word isn't lost. Tests and status. Next to the 7,500 lines of C++ there are 3,300 lines of tests. The core does not link against OBS, so most of it is tested without OBS running. CI builds it for Linux, macOS and Windows, but only Linux has been tested, and the README says so. Status: 0.1.4, early release (tested on Linux). The source code is in a private repository. Built with: C++, Qt, OBS Studio API, WebSocket, CMake, GitHub Actions. ### [Smart home server: media, AI cameras, automation](https://egejvencelj.com/projects/homelab/) (Ongoing) One Linux machine at home runs our media library, a camera recorder with on-device AI, home automation and the family photo library. Layout. Every service is its own Docker Compose stack. A reverse proxy is the single web entry point and issues certificates on its own, so adding a service takes a few labels in its compose file. Services talk to each other over internal container networks, and a host firewall limits what the local network can open. The camera recorder. Frigate records the cameras. I chose a Coral TPU for its object detection and integrated it, so detection uses little power instead of the CPU or the big GPU. The card is made for an M.2 slot my PC does not have, so I found a PCIe adapter board that let me fit it. A person or a car is spotted in real time without a frame leaving the house, and detections go out over MQTT, so Home Assistant can act on them. Media and photos. The film library sits on a NAS, and the GPU transcodes a stream when a device needs it. The photo library finds faces and searches with its own machine learning, and it is copied to the NAS every night. Home Assistant. It ties the house together, with dashboards for the 3D printer, electricity use and tariff blocks, and the health of the detection hardware. My coding agents set up the printer integration, its dashboard and the print alerts. Local AI. Whisper transcribes audio on the GPU, and I host language models that I start when they're needed. At home we use them for writing. Through Home Assistant's MCP server the agents can operate the house too. Operations. I treat the server like production: one entry point and least exposure. A written operating map of the host covers how stacks are laid out, the proxy's label pattern, the firewall rules, and where each secret lives (never the secret itself). Status: In daily use. Built with: Linux, Docker Compose, Traefik, nftables, NFS, Frigate, Coral TPU, Home Assistant, MQTT, Whisper. ### [3D printing at home](https://egejvencelj.com/projects/printed-parts/) (Ongoing) I print a lot as a hobby, mostly fixes, holders and fittings for around the house. The latest is a drain fitting for our heat pump, two pieces from one print and designed in code. Our heat pump's outdoor unit stands in the attic. When it heats and defrosts, water runs out of one 42 mm hole in its base pan. I wanted a fitting that seals that hole and takes a hose. The drain fitting. It pushes into the hole from below, an O-ring seals it, and a twist of a small tab locks it. The body and its lock ring are two pieces from one print, printed in place without supports, and the fitting comes out again by hand. It comes as an elbow, a straight fitting and a blanking cap. Designed in code. The fitting is a Python CAD script, written by coding agents to my brief. A print check in the script fails any part that would need supports. This is the sixth version: earlier ones broke on install or when pulled out, and each fix went into the script. My own parts. Many of my prints are other people's models. My own I draw in Onshape, among them a doorbell cover, a deck holder, a clip for a playmat tube and feet for a friend's shop. The two-part litter scoop went through about a dozen versions, and the 3D viewer shows it too. Status: Printed on a Bambu Lab A1 mini. Built with: Onshape, Python, build123d, Bambu Studio. ## CV - 2026: EU drone pilot certificates, Open and specific category. A1/A3 and A2 for the open category, and the standard scenarios STS-01 and STS-02 for the specific category. I passed the A2 and STS theory exams in March 2026. Relevant to work that flies cameras over infrastructure. - 2020 - present: Senior software engineer, Panarch, Kranj. Panarch inspects power grids from helicopters, with multiple sensors. I look for what slows the crews and reviewers down, then plan, design and build the solutions. I maintain the vision pipeline, the QGIS suite, the flight software and the servers. - Sep 2018 - present: FairPair, Personal project · fairpair.gg. It grew out of the pairing engine I started in 2018 into a tournament web app, which I started and a small team now builds. I wrote its live side for streams. - Dec 2017 - 2019: Software developer, Panarch, Kranj. In 2018 I wrote the framework that every Panarch QGIS plugin runs on. The report system, wire vectorization and the flight-video sync tool also date from these years. I pitched my own ideas to the company and started building them before I finished my degree. - 2019: Bachelor's degree in Computer and Information Science, Faculty of Computer and Information Science, University of Ljubljana. After the game studio stint, I went back to university and finished the degree in 2019, part-time alongside the job at Panarch. My thesis, measuring pylon lean from LiDAR, went into production at work and is still in use. Coursework included mathematical modelling and mobile-robot navigation with ROS, and I took part in Roboliga, the faculty's robot contest. - Mar 2013 - Sep 2015: Junior software engineer, ZootFly / IBZoot / Interblock. The studio made computer games at first and casino games after the Interblock acquisition. I wrote front and back end code for a cross-platform 2D Unity client that loaded several game instances at once, and an early prototype in cocos2d-x. ## Open-source tools - [GroupBulletinBoard](https://github.com/eVen-gits/GroupBulletinBoard) (2025; Lua): My fork of a World of Warcraft add-on that sorts group requests from chat by dungeon. I rewrote how its windows are managed, fixed memory leaks and added player lookups. - [cp77_hairdresser](https://github.com/eVen-gits/cp77_hairdresser) (2020; Python · PyQt5): Hairstyle editor for Cyberpunk 2077, GUI and command line, on PyPI. Retired when a full appearance editor came out. - [Warframe relic evaluator](https://github.com/eVen-gits/warframe_relic_eval) (2018; Python): Values each relic as the drop-chance-weighted median market price of its rewards, read from the warframe.market API under a rate limit, and exports a CSV. ## Outside work - **Competitive Commander**: Top four at 9 of 17 tournaments since 2025, and 4th of 315 at the 2025 European Championship. Results on cedhstats (https://cedhstats.org/players/9QfRGP6g95M7HBg8qKj78FEXqV32) - **World of Warcraft**: I led a Slovenian guild of about 60 players for a short while, and I was an officer in several others over the years. - **Dota 2**: I reached Immortal, the top ranked tier, with a peak rating of about 6,500 MMR.