ARCHIVE

Archive →

More Projects

The Salko Oblak web gallery

2026 → present · solo

Salko Oblak · Self-hosted media cloud

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.

Languages
TypeScript · Kotlin · Rust · JavaScript · SQL
Tools
Node.js · Express · SQLite · Jetpack Compose · Tauri · ONNX Runtime · CLIP · sharp · ffmpeg · Caddy
Runs on
Linux · Windows · Android

Self-hosted · Solo build

Architecture

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.

Salko Oblak web gallery with a photo timeline, year navigation, Drive and albums.
Web galleryPhoto timeline, year navigation, Drive files and shared albums.

Uploads and playback

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.

Android photo timeline showing uploaded camera-roll items.
Android galleryCamera-roll browsing with upload status.
Android Drive upload with progress, pause and cancel controls.
Drive uploadsFile transfer progress with pause and cancel controls.

Access and administration

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.

Local semantic search

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.

A white cat search returning matching photos in the web gallery.
Content searchPhotos ranked by their visual match to the search phrase.

Desktop sync and delivery

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.

Desktop folder-sync application showing its upload queue and device status.
Folder syncWatched-folder uploads, queue status and device approval.
Triad of Redemption title screen

Triad of Redemption

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.

Languages
Java
Tools
LibGDX · LWJGL3 · Gradle · Tiled · Scene2D

Engine and maps

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.

Combat and animation

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.

Puzzles and desktop packaging

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.

SOL Novice news list running locally with real collected articles

SOL Novice · Web News Aggregator

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.

Languages
JavaScript · TypeScript · Python · Kotlin
Tools
Express · React · Chakra UI · MongoDB · Leaflet · Nivo
Runs on
Web · Android · Desktop

Collection and API

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.

Web interface

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.

Related modules

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.

Local application preview

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.

SOL Novice article list with real collected articles, categories and source metadata.
Article browsingCollected articles with original dates, sources and categories, alongside a dedicated filter sidebar.
SOL Novice map locating real collected articles with an open article popup.
Geographic viewArticle locations resolved from source datelines and location tags.
SOL Novice statistics chart built from real collected articles.
News statisticsNivo chart aggregating the collected news records.
SOL Sensors dashboard with live AMD CPU, GPU and memory readings on Linux

SOL Sensors

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.

Languages
C++
Tools
Qt Widgets · QCustomPlot · CMake · doctest

Sensor library

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.

Monitoring and recording

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.

SOL Sensors Qt dashboard showing CPU and GPU utilisation, temperatures and memory usage on Linux.
Hardware dashboardLive CPU, GPU and memory readings on Linux, with separate usage and temperature axes.
3D RPG gameplay screenshot in Unreal Engine 4

3D RPG · UE4

Small 3D RPG built in Unreal Engine 4 as a high school final project.

Mostly Blueprints, with some logic written directly in C++.

Languages
C++
Tools
UE4 Blueprints

Unreal Engine 4 · 3D