Ionut Andrei Oanca

Hi, I'm a Full-stack Developer with a Computer Science & Engineering (CSE) background.

Currently working at Domyn.

Résumé Get a copy of my curriculum vitae.

@OancaAndrei View my GitHub profile.

About me

I like to tinker with things, tear them apart and see how they work, be it software or hardware.

Below you'll find several open-source projects to which I've contributed to some extent. You'll also find some of my biggest, yet personal, projects on which I've worked during the years.


Open source

Jellyfin

Jellyfin is a neat and free media library system.

I've contributed to this project by implementing SyncPlay, a feature that lets multiple people watch the same content synced on different devices scattered around the world.

SyncPlay got announced as the headline feature in their 10.6.0 release, woah. Also, I got a shout-out in this podcast by name (at around 7:21).

C#, JavaScript, WebSockets

SkipIntro

SkipIntro is a plugin for Jellyfin which lets you skip the intros or repeated content of TV shows.

This is done by analyzing the audio of all episodes and finding similar sound cues (chroma-based features).

C++, OpenCL, C#, Vue.js, Python

Matching content for the first four episodes of Rick and Morty.

Matching content for the first seven episodes of Rick and Morty.

Matching content for the first four episodes of Spongebob Squarepants.

Matching content for the first four episodes of Bojack Horseman.

OPAL

OPAL is an administration layer for Policy Engines such as Open Policy Agent (OPA), and AWS' Cedar Agent.

OPAL uses fetchers to initialize and update its internal data. I've implemented the MongoDB OPAL Fetcher which allows retrieving data from a MongoDB database.

Python, MongoDB

Goldberg Steam Emulator

Goldberg Steam Emulator emulates Steam online features on a LAN.

I've helped by writing some Linux specific callbacks that the library was missing. This required some reverse-engineering in order to understand what the different callbacks needed to do.

C++, IDA

One of the many attempts. The game used to crash before this point.

The game finally starts: hosting a server and loading content now works.

blender2ogre

blender2ogre is a Blender exporter for the OGRE 3D engine.

Minor contribution to add support for OgreMeshTool (basically OGRE released a new exporter so I've integrated it into the add-on).

Python, Blender


Personal projects

Zero

Side project made for fun (both in making and using it) that involved using different technologies.

Zero is a multiplayer shedding-type card game, aimed mainly to be played from mobile devices.

  • The core can easily be adapted for new game rules.
  • The back-end has been written with scalability in mind and relies on job queues to accomplish this. Hosted on Heroku.
  • The front-end, which is statically hosted on GitHub Pages (thus removing workload from the back-end), combines Vue.js, Bootstrap and vector images to obtain a PWA that properly scales to fit the screen size without losing visual quality.
  • Proper DNS configuration to merge the back-end with the front-end.

Node.js, Vue.js, lots of SVGs, Heroku, Redis, PostgreSQL, RabbitMQ, Progressive Web App

The homepage of Zero.

The rooms list view of Zero. From here you can create a new room or join an existing one.

Creating a new room in Zero. You can choose the game rules and the room name.

Waiting room in Zero. You can see the players that joined the room and share the invite link with others.

In-game view of Zero. Optimized for mobile devices.

In-game view of Zero. Optimized for mobile devices.

In-game view of Zero. Optimized for mobile devices.

In-game view of Zero. Optimized for mobile devices.

In-game view of Zero. Optimized for mobile devices.

In-game view of Zero. Optimized for mobile devices.

In-game view of Zero. Optimized for mobile devices.

GuitarSmith

This was my attempt at creating an open-source version of the game ˝Rocksmith 2014˝.

GuitarSmith is a desktop game that teaches the player how to play its guitar with gradual levels of difficulties. Even though it's still in an alpha stage, the key features are present and working, just in a rough way.

Key points of the project are:

  • uses the original game's songs, that is, it reads the propietary psarc format;
  • first attempt at writing a game engine (render loop, audio loop, game loop, threads);
  • some basic GLSL shaders placed on objects modeled in Blender;
  • should be cross-platform, further testing needed;
  • GitHub Pages deployment with CI/CD builds on Travis-CI.

C++, CMake, OGRE 3D, PortAudio, Essentia

clockface.json

A code-editor-inspired watch face for the Zepp OS platform.

clockface.json is a watch face I initially developed for my Amazfit GTS 4 Mini, which is a device with limited APIs and functionalities. With a custom editor and parametric design, it allows for a wide range of customization.

  • Easy customization with live preview in the editor.
  • Custom font support with offline rasterization. Native support for fonts is missing in Zepp OS 1.0.
  • Custom PNG and Targa images generator. Using color-palette-based images, the watch face can be customized with a wide range of colors, while reusing the same images.
  • On-device customization with a settings page.
  • GitHub CI/CD pipeline for automatic deployment to the Amazfit store.
  • Has +20k downloads on the official Amazfit store.

TypeScript, Vue.js, PNG, Targa, GitHub Actions, Zepp OS SDK

FMDN Accessory implementation

A custom Find My Device Network Accessory implementation on Newt, targeting the Nordic's nRF51 series, nRF52 series and Espressif Systems' ESP32.

Following Google's FMDN specification, the implementation allows for a device to be paired with Fast Pair and registered on the Find My Device network.

  • Fast Pair BLE packet broadcasting.
  • GATT server for the device's information, like characteristics and services.
  • Authentication with Anti-Spoofing keys and encrypted messages with exchanged keys.
  • Android successfully registers the device through the Fast Pair process.
  • Find My app will block devices mid-procedure when Model ID is in development mode.
  • Next step is to extract the private key of a commercial device and test the implementation.

C++, Bluetooth Low Energy, FMDN, Android

Tunnel Runner

A 3D First-Person Endless Runner game for the Zepp OS platform.

Tunnel Runner is my winning submission for the Zepp OS 2024 Global Online Hackaton.

  • Custom 3D engine with simple collision detection.
  • Uses the Canvas API added in Zepp OS 3.0.
  • All draws are either lines or image planes, aiming for a retro look with the benefit of being lightweight.

JavaScript, GitHub Actions, Zepp OS SDK

Custom module for Zepp OS

A custom native module for the Zepp OS Simulator firmware that is used to demonstrate the ability to load and run custom code on the simulator.

By injecting a custom code section and then patching the existing firmware, the module can be loaded and run on the simulator.

  • ELF injection done by custom patcher using libelf.
  • Patching is done manually with Ghidra by taking over the native WebSocket handler used by the simulator.
  • Custom module is able to call new functions and interact with the firmware, accessing unexposed methods as well.
  • Companion React Native app sends captured touch events and sensors data from a smartphone to the simulator.

ARMv8, Ghidra, Assembly, C++, WebSocket, React Native

Sections of original Zepp OS firmware, custom module and patched firmware. Notice the two extra sections added.

Manually adding jumps inside the Zepp OS firmware. As I would find out later, the HardFault is caused by the missing bit in the target address (Thumb-2 instruction set): 87C80000h should be 87C80001h.

Patched Zepp OS Simulator with custom module. External app sends touch events and sensors data to the simulator.

eMMC PWB for NWZ-E464

A custom breakout board for the flash memory of a Sony Walkman NWZ-E464.

  • Reverse-engineered by connecting the eMMC flash memory to an ESP32 and reading the data from it, first using a 1-bit bus and then a 4-bit bus.
  • Original memory had corrupted data in the user partition, system partition looked intact (several reads returned the same data).
  • Board was designed using KiCad and manufactured by AISLER.
  • Replacing the original 8GB Hynix H26M42001FMR chip with a compatible 64GB Samsung EMMC64G-IY29-5B101 chip.
  • The board also features pads for placing a SD card slot for further experimentation. The EMMA Mobile 1 processor on the NWZ-E464 supports booting from SD cards.
  • Solder jumpers allow for switching the function of the last unknown pin.

KiCad, eMMC, ESP32, AISLER

The schematic of the eMMC PWB breakout board.

The four layers of the eMMC PWB breakout board (plus silkscreens).

Front view of the eMMC PWB breakout board.

Back view of the eMMC PWB breakout board.


Favorites

Editor

Visual Studio Code, vim

Operating System

Linux (mainly Ubuntu), MacOS

Terminal

zsh