Object-Oriented Desktop & Data Tools
Algorithmic Data Processing Tools
Software utilities developed during CIT studies at RIT Kosovo using Java and Python.
I'm Olsa Salihu, a second-year Computer & Information Technology student at AUK / RIT Kosovo. Passionate about crafting web applications, robust layouts, and functional digital interfaces.
Web developer based in Prishtina, Kosovo with 3+ years of practical web development experience.
I am a motivated second-year CIT student at RIT Kosovo (AUK). I focus on creating structured, responsive websites and learning how technology, clear design, and human interaction connect.
Experience across web development, customer communication, and team environments has helped me develop strong problem-solving skills, adaptability, and time management.
[ 11 FEATURED CASE STUDIES ]
NAIMI REGLLAZHE
A bilingual (SQ / EN) auto-service website for a tire, rim & 3D wheel alignment business in Kosovo. Dynamic product catalog, service modals, and a fully responsive layout.
A premium trilingual (SQ / EN / DE) atelier website for a kitchen & wardrobe manufacturer. Dark luxury aesthetic with gold accents, animated loader, hero slideshow, and SPA-style multi-page navigation.
A bilingual (SHQ / EN) dental clinic website with appointment booking form, Flatpickr date picker, AOS scroll animations, image carousel, and a clean clinical teal + navy aesthetic.
A German-language construction company site for a drywall & interior fit-out specialist in Heidelberg. Bold Oswald typography, hero slideshow, parallax testimonial, AOS scroll animations, and a full contact form.
A luxury travel agency website offering curated hotel bookings across Turkey, Greece and Albania. Dynamic hotel catalog with country filters, testimonial slider, image lightbox gallery, and a date-range booking form with an international phone-prefix selector.
A German-language 24-hour locksmith service website for the Swiss market. Swiss-red brand identity, animated hero, service icon grid, responsive multi-page navigation with a slide-in hamburger menu, and click-to-call across the header.
A German-language business site for a Swiss 360° virtual tour provider. Animated brand preloader, industry showcase grid with embedded live tours, transparent pricing cards, and an interactive instant-quote calculator with add-on logic and multi-language support.
Software utilities developed during CIT studies at RIT Kosovo using Java and Python.
A construction company website showcasing building, renovation, and contracting services with a bold, modern, and professional layout tailored for the industry.
A Java-based utility for organizing, processing, and analyzing student performance data.
Software utilities developed during my CIT studies using Java and Python, focusing on data processing, algorithms, automation, and practical problem solving.
Placeholder code shown for structure reference. The actual Java implementation will be linked here once complete.
This is an interactive browser demo of the application's interface. It does not execute Java code — the real application will be linked separately.
| Name | Course | Grade | Classification |
|---|
Student performance data is often scattered across spreadsheets, paper grade books, and disconnected tools. Calculating averages, identifying top and bottom performers, sorting by grade, and classifying overall class performance manually is repetitive and error-prone — especially as the number of students grows.
Build a Java utility capable of organizing and analyzing student performance data through a clean object-oriented design. The application should let a user add, search, and remove student records, then compute statistics (average, min, max) and classify both individual and overall class performance.
The project is split into focused classes. Student models a single record with encapsulated fields. StudentManager handles the in-memory collection using an ArrayList, offering add, remove, and search operations. PerformanceAnalyzer performs statistical computations and classification. Main drives the entry point, handles input, and prints the report.
This section will be updated as the implementation progresses. Notes on encountered obstacles, design decisions, and refactors will be documented here.
Final results, screenshots, sample outputs, and lessons learned will be added once the project is complete.
A Java desktop application demonstrating object-oriented architecture, authentication, credential management, validation, file persistence, and JavaFX interface design.
Local Credential Management System — built as a software-engineering exercise, not a commercial password manager.
Placeholder Java structure shown to illustrate the project's architecture. SecureVault runs as a JavaFX desktop application — no Java is executed in this browser preview.
Local Credential Manager
Portfolio demonstration only. This is not the real SecureVault application, nothing is transmitted, and all data stays in your browser session. Never enter a real password here.
0 credentials
All records shown are fake demo data stored only in this browser session. Nothing is saved, transmitted, or persisted.
Demo utility that mirrors the PasswordGenerator service.
The browser demo uses JavaScript's random utilities. It is an interface demonstration — it does not represent the security properties of the Java implementation.
Educational password analysis — it checks structural factors, not real-world cryptographic strength.
This is a student project. It does not provide enterprise-grade security, and no homemade encryption should be assumed to be secure.
Static representation of the settings screen.
Settings shown for interface reference — they are not wired to any behaviour in this preview.
Credentials are usually scattered across notes, spreadsheets, browser exports, and memory. Organising them inside a single desktop application raises real software-engineering questions: how should records be modelled, where should validation live, how does the interface talk to the data layer, and what happens when the application restarts? SecureVault exists to work through those questions deliberately.
The objective is to develop a Java desktop application that demonstrates the core mechanics of a credential manager with a clean, explainable architecture.
The application separates responsibilities into five layers. Each layer only knows about the one directly beneath it, which keeps the interface code free of business rules and keeps storage details out of the domain model. Hover or focus a layer to see its role.
Handles JavaFX screens and user interaction. Views are declared in FXML and contain no application logic — they only describe layout and bind to controller methods.
Connects interface events to application logic. Controllers read input, call the appropriate service method, and update the view — they do not contain business rules themselves.
Contains business rules and application logic: authentication checks, credential validation, searching, and password generation. This is where the behaviour of the application actually lives.
Handles storing and retrieving credential data. Defined as an interface so the storage implementation can be swapped without touching the service layer.
Stores local application data on the machine the application runs on. No network calls, no remote services — the vault is a local concern by design.
Scope note
This is a student project built to practise application architecture. It does not provide enterprise-grade security, and any encryption implemented here should not be assumed to be secure. If cryptographic functionality is added later, the exact algorithm, key handling, and known limitations will be documented accurately in this section rather than described in general terms.
Space reserved for the genuine development challenges encountered while building this project. Each entry will be written up as it actually happens.
These are the areas to be documented. Nothing here is presented as a solved problem until it has actually been solved.
To be added on completion.
To be added on completion.
Measurable outcomes and behaviour notes.
Written up after the build is finished.
Planned extensions will be listed here once the core application is complete.
The repository link will be added here once the project is published.
A Python desktop application for loading, adjusting, filtering, and exporting images through a clean, tile-based editor interface.
Python utilities developed during my CIT studies, focused on image manipulation with Pillow, UI construction with Tkinter, and clean separation between the model, services, and view.
Placeholder Python structure shown to illustrate the project's layout. The actual implementation will be linked here once the application is finished.
Loading demo image…
Click "Load" to try your own image.
Lower quality → smaller file size.
All processing happens in your browser. Nothing is uploaded or saved to a server.
Editing an image usually means opening a full graphics suite for tasks that are conceptually simple — brighten a photo, convert to grayscale, detect edges, resize, or compress. That overhead gets in the way of quick, scripted workflows. The Image Processing Studio exists to explore what a focused, small-scope image editor looks like when built from scratch with Python and Pillow.
Build a Python desktop application that lets a user load an image, adjust its visual parameters, apply one-shot filters, and export the result. The project is also an exercise in structure — separating the image model, the processing logic, and the UI so that each part can be understood and changed independently.
The project separates responsibilities into three layers. The view owns the widgets, the services own the image math, and the model owns the current document state. Hover or focus a layer to see its role.
Builds the window, lays out widgets, and responds to user events. The view never manipulates pixel data directly — it asks the services to do that.
Contains the actual image operations — brightness, contrast, blur, grayscale, edges, resize, and compression. These functions are stateless and independent of the UI.
Holds the original image, the current working image, and the edit history. Keeps track of what the user has done without owning any UI or business logic.
Images are read from and written to local disk using Pillow. No remote storage, no cloud services — the tool is entirely local by design.
Space reserved for the real development challenges encountered while building this project. Each entry will be written up as it actually happens.
These are the areas to be documented. Nothing here is presented as a solved problem until it has actually been solved.
To be added on completion.
To be added on completion.
Measurable outcomes and behaviour notes.
Written up after the build is finished.
Batch processing, presets, and an adjustment history panel are candidates for a future iteration.
The repository link will be added here once the project is published.
A Python-based procedural generation experiment that creates unique environments from configurable rules and parameters.
Explores tile-based world representation, fractal value noise, deterministic seeding, and terrain classification.
Placeholder Python structure shown to illustrate the project layout. The real implementation will replace these files.
Same seed + same parameters = same world. Try sharing a seed.
Browser demonstration — the algorithm is implemented in JavaScript to show the real output of the Python project. No Python runs in this page.
Procedural generation is the practice of producing content algorithmically instead of authoring it by hand. Instead of manually designing a single 80 × 80 tile map, a small set of rules and a random input are combined to produce an entire world on demand — potentially an unlimited number of distinct worlds from the same generator. It is used in games, simulations, and generative art, and it is valuable because it replaces repetitive manual work with a repeatable, parameterized process. This project exists as a way to practise those ideas in Python: algorithmic randomness, tile-based representation, and deterministic seeds.
The world is stored as a flat, two-dimensional grid of tiles. Every tile carries a single terrain value — one of water, plains, forest, mountain, or desert. On top of the tile grid, a separate list holds structure records (settlements) with their coordinates.
# The world is a single object holding:
# - size: int (grid width and height)
# - seed: int (input used to reproduce the world)
# - tiles: list[list[str]] — terrain id per cell
# - settlements: list[tuple[int, int]] — (x, y) coords
A flat grid is chosen because every tile is defined by exactly one terrain value, coordinates map directly to indices, and iteration over the entire map is trivial. This makes both generation and rendering a single pass over the data.
The generator uses fractal value noise — not Perlin noise, not cellular automata, and not wave function collapse. Two independent value-noise fields are produced:
Value noise works by placing a random value at every integer lattice point, then smoothly interpolating between them. Interpolation is done with a smoothstep curve (3t² − 2t³), which removes the blocky appearance of raw random values. A single octave of value noise looks like soft blobs; combining several octaves at doubling frequencies and halving amplitudes — a technique called fractal Brownian motion (fBm) — produces natural-looking terrain with both large regions and fine detail.
def fbm(x, y, seed, octaves=5):
value, amplitude, frequency = 0.0, 0.5, 1.0
for i in range(octaves):
value += amplitude * value_noise(x * frequency, y * frequency, seed + i * 1000)
amplitude *= 0.5
frequency *= 2.0
return value # normalised roughly to 0..1
Once both fields are computed, every cell is classified against four thresholds derived from the user's parameters. Structures are then placed on plains tiles, biased toward cells that are close to water.
Randomness enters the system in exactly one place: the lattice values inside value_noise. For any integer coordinate (xi, yi) and a seed, a deterministic hash produces a number between 0 and 1. Because the hash is a pure function of its inputs, everything downstream of it is reproducible. Nothing else in the pipeline uses random.random() — the appearance of randomness comes entirely from the noise fields.
A seed is a single integer that is mixed into every noise-hash lookup. Two consequences follow:
This is why the interactive demo above gives you a seed field — the concept can be tested directly. Enter 847291, generate, then enter it again and generate: the two maps are identical, pixel for pixel. This is the same principle behind Minecraft world seeds and many roguelike games.
Every tile is classified with a short decision chain driven by the two noise values and the user parameters. All comparisons are made on values between 0 and 1.
elevation < waterLevel
elevation > 0.72 − mountainDensity × 0.2
moisture > 0.58 − forestDensity × 0.25 and elevation > waterLevel + 0.03
moisture < 0.35 and elevation > 0.55
everything else
The sliders do not change the noise — they shift where each threshold sits inside it, which is why density changes produce smooth, natural-feeling variation rather than disconnected patches.
This section will be written up honestly as the project develops. The list below are the areas I expect to be genuinely difficult; they are not yet presented as solved.
Generated maps to be exported and linked here.
To be added once the Tkinter app runs end to end.
Notes about how parameters affect the world — written after enough real runs.
To be written after the project is finished.
The repository link will be added here once the project is published.
[ HANDS-ON WITH EVERY TOOL BELOW ]
Currently in second year of study focused on programming, network architecture, and software systems.
Specialized coursework in HTML, CSS, JavaScript, Java, and Python.
IT Essentials, Python Essentials, and Java fundamentals.
Visual design principles, composition, and visual assets creation.
Hands-on experience developing functional websites, working with frontend/backend technologies, and delivering client and personal projects.
Developed strong communication, team coordination, customer support, and organizational skills across various professional settings.
Seeking web development internships, junior developer roles, or project collaborations. Send a message and I'll get back to you as soon as I can.