Archive →
2026 → present · solo
A self-hosted photo, video and file cloud with web, Android and desktop clients. I built the storage API, background uploads, shared albums, local semantic search and desktop installers as a solo project.
Self-hosted · Solo build
A TypeScript and Express API manages media, Drive files, albums and account access. SQLite stores metadata; originals and generated previews live on disk. The browser client uses JavaScript modules. Kotlin and Jetpack Compose provide the Android interface, while Rust and Tauri add desktop folder watching and a separate application for running the server.
Android background workers upload the camera roll. The desktop client watches selected folders and uses a persistent checksum ledger to recognise uploaded files, including renamed copies. Sync is upload-only: deleting a local file does not delete its cloud copy.
The server decodes images with sharp and processes video with FFmpeg, generating thumbnails, poster frames and browser-compatible previews. Large Drive uploads use resumable sessions that track the accepted byte offset, with SHA-256 verification before finalisation.
Device approval precedes account sign-in. Authentication uses bcrypt password hashes and signed tokens; browser media requests use an HttpOnly cookie. Administrators issue temporary passwords that users replace before receiving a session. Rate limits restrict sign-in and device requests. Album share links use a separate contributor approval flow.
ONNX Runtime runs the image and multilingual text models on the server. CLIP image embeddings and projected text embeddings share a 512-dimensional space. Search ranks their similarity, using both a minimum score and the score distribution for that query. Embeddings persist in SQLite and load into an in-memory index. YuNet and SFace detect and group faces; users assign names to the groups.
The Tauri client reuses the web gallery and adds a native upload queue. A separate server application manages configuration and process lifetime. Packaging scripts assemble the web build, backend and a checksum-verified Node runtime. The administration panel also publishes Android updates.
A 2D action-adventure prototype in Java and LibGDX, combining dungeon exploration, directional melee combat and timed puzzles. Project lead of a 14-person team.
LibGDX's Screen interface separates menus, gameplay and ending screens. A shared BaseMap loads and renders TMX maps, handles collision layers and processes transitions. MapFactory selects specialised labyrinth, combat and boss maps. Tiled object layers define walls, traps, spawn points, collectibles and exits; combat areas can block progression until their enemies are defeated.
Texture atlases provide directional idle, movement and attack animations. Melee attacks position rectangular hitboxes in the player's facing direction. Enemies switch between idle, pursuit and attack based on distance, with collision checks and sliding movement around obstacles. An orthographic camera follows the player in maps that enable it.
Scene2D dialogs present timed questions and portal challenges using word entry or keyboard sequences. Callbacks connect answers to map progression. Gradle separates the shared game module from the LWJGL3 desktop launcher and includes packaging tasks for Linux, Windows and macOS.
A Slovenian news aggregator with article filtering, geographic browsing and visual statistics. The repository combines a web client, a news API and related school projects around news collection and publishing.
A TypeScript and Express API ingests articles through source-specific scrapers. This local run uses restored RTV SLO, Siol and GOV.SI collectors. Ingestion validates metadata and checks for title and content duplicates before inserting MongoDB records through Mongoose. The shared model stores publication dates, authors, categories, view timestamps and GeoJSON point coordinates. Filtered read endpoints support browsing; administrative writes require RS256 JWT authorisation.
React and Chakra UI provide article browsing, source and date filters, category presets and sorting. Leaflet renders clustered geographic markers with article popups. Nivo charts aggregate articles by category, author and publication date.
The repository also includes Android clients, Compose Desktop administration, a Kotlin GeoLang interpreter for generating GeoJSON and experimental Python image-processing integrations. These extend the news project across web, desktop and mobile workflows.
These captures show real articles collected from RTV SLO, Siol and GOV.SI in a local database. Map locations come from source datelines or location tags; articles without a resolved location remain unmapped.
A C++ hardware-monitoring toolkit with a reusable sensor library, a Qt dashboard and a command-line recorder. Tracks processor, memory and graphics telemetry, including AMD GPUs.
Dedicated CMake targets separate hardware access, presentation and recording. A shared device model exposes discovery, utilisation and temperature APIs. Linux collectors read CPU activity from /proc/stat, memory from /proc/meminfo and NVIDIA telemetry through nvidia-smi. AMD collectors use amdgpu DRM/sysfs counters for GPU utilisation and VRAM usage, with hwmon labels for edge and memory temperatures. Individual source paths distinguish multiple adapters.
The Qt dashboard uses QCustomPlot for CPU, RAM, GPU and VRAM histories. It samples every 500 ms, retains the last 60 seconds of real observations and separates temperature from usage with labelled axes. Controls pause sampling, select devices and reveal logical-processor history. The command-line recorder supports sampling intervals, precision, device selection and semicolon-separated files.
Small 3D RPG built in Unreal Engine 4 as a high school final project.
Mostly Blueprints, with some logic written directly in C++.
Unreal Engine 4 · 3D