Olsa Salihu
Language
● Available for opportunities Prishtina, Kosovo
Web Developer & CIT Student

I build websites that feel as thoughtful as they work.

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.

Prishtina, Kosovo
CIT @ RIT Kosovo
3+ Years Web Dev
O
3+
Years Exp.
9+
Projects
Stack
HTML · CSS · JS
PHP · MySQL
Java · Python
Ready to build
↓ Scroll to explore
Web Development ◆ Computer & Information Technology ◆ PHP & MySQL Architecture ◆ Responsive Frontend Design ◆ Linux & System Basics ◆ Future Minds & Cisco Certified ◆ Web Development ◆ Computer & Information Technology ◆ PHP & MySQL Architecture ◆ Responsive Frontend Design ◆
01 / Introduction

About me

Web developer based in Prishtina, Kosovo with 3+ years of practical web development experience.

Frontend
Backend
Design
Problem Solving

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.

0
Years Exp.
0
Projects
0
Certificates
0
Commitment

Core Technical Focus

  • → Clean semantic HTML, CSS & JS
  • → Dynamic web backends with PHP & MySQL
  • → Object-oriented programming in Java & Python
  • → Linux fundamentals & CLI tools

Professional Attributes

Experience across web development, customer communication, and team environments has helped me develop strong problem-solving skills, adaptability, and time management.

02 / Projects

Selected Work

[ 11 FEATURED CASE STUDIES ]

NAIMI REGLLAZHE
[ CASE 01 ] LIVE
Visit live site
Naimi Regllazhe →
01. Client Website

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.

HTML5 Tailwind JavaScript i18n
BAMBOO HUS Premium Kitchen & Wardrobe Atelier
[ CASE 02 ] LIVE
Visit live site
Bamboo Hus →
02. Client Website

Bamboo Hus →

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.

HTML5 CSS3 JavaScript i18n
BlendiDent Dental Clinic
[ CASE 03 ] LIVE
Visit live site
BlendiDent →
03. Client Website

BlendiDent →

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.

HTML5 CSS3 JavaScript i18n
PRO TROCKENBAU Trockenbau & Innenausbau
[ CASE 04 ] LIVE
Visit live site
Pro Trockenbau →
04. Client Website

Pro Trockenbau →

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.

HTML5 Tailwind JavaScript AOS
RamTrip 365 Udhëtime Luksoze
[ CASE 05 ] LIVE
Visit live site
RamTrip365 →
05. Client Website

RamTrip365 →

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.

HTML5 Tailwind JavaScript Swiper Flatpickr
Swiss Schloss 24h Schlüsselservice
[ CASE 06 ] LIVE
Visit live site
Swiss Schloss →
06. Client Website

Swiss Schloss →

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.

HTML5 CSS3 JavaScript Responsive
Virtuelle Touren Schweiz 360° Rundgänge für Unternehmen
[ CASE 07 ] LIVE
Visit live site
Virtuelle Touren →
07. Client Website

Virtuelle Touren Schweiz →

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.

HTML5 Tailwind JavaScript i18n
Code editor and software development
[ CASE 08 ] 2025 / SOFTWARE

Object-Oriented Desktop & Data Tools

Algorithmic Data Processing Tools

Software utilities developed during CIT studies at RIT Kosovo using Java and Python.

ENDRIT CONSTRUCTION Bau & Renovierung
[ CASE 09 ] LIVE
Visit live site
Endrit Construction →
08. Client Website

Endrit Construction →

A construction company website showcasing building, renovation, and contracting services with a bold, modern, and professional layout tailored for the industry.

HTML5 CSS3 JavaScript Responsive
[ CASE 08 — EXTENDED ] JAVA

Student Performance Analyzer

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.

Language
Java
Type
Data Processing Utility
Focus
Algorithms & OOP
Status
In Development
Student.java
JAVA

Placeholder code shown for structure reference. The actual Java implementation will be linked here once complete.

Student Performance Analyzer — Desktop Application

Add Student

This is an interactive browser demo of the application's interface. It does not execute Java code — the real application will be linked separately.

Students
0
Average
—
Highest
—
Lowest
—
Class Performance
No data yet
—
Name Course Grade Classification
No students added yet. Use the form to add your first record.

01 / Problem

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.

02 / Objective

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.

03 / Approach

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.

04 / Algorithms & Logic

  • →Average calculation — sum of grades divided by count, iterated with a for-each loop over the collection.
  • →Min / max detection — linear scan tracking the current extreme value.
  • →Sorting — Collections.sort with a Comparator to order by grade or name.
  • →Searching — linear search by student name or course.
  • →Performance classification — grade ranges mapped to descriptive labels (Excellent, Very Good, Good, Satisfactory, Needs Improvement).
  • →Data validation — ensuring names are non-empty and grades fall within 0–100 before records are accepted.

05 / Challenges

This section will be updated as the implementation progresses. Notes on encountered obstacles, design decisions, and refactors will be documented here.

06 / Results

Final results, screenshots, sample outputs, and lessons learned will be added once the project is complete.

[ CASE 08 — EXTENDED ] JAVA JAVAFX

SecureVault

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.

Language
Java
Framework
JavaFX
Architecture
Object-Oriented
Focus
Application Architecture & Security Concepts
Status
In Development
Main.java
JAVA

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.

SecureVault — Local Credential Manager

SECUREVAULT

Local Credential Manager

Local session · Demo mode

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.

01 / Problem

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.

02 / Objective

The objective is to develop a Java desktop application that demonstrates the core mechanics of a credential manager with a clean, explainable architecture.

  • →Object-oriented programming with clear separation of responsibilities.
  • →Application architecture structured in distinct layers.
  • →Authentication flow with a master password gate.
  • →Credential data management — add, search, edit, remove.
  • →Input validation applied consistently before data is accepted.
  • →JavaFX UI development using FXML-defined views.
  • →Local persistence so the vault survives an application restart.

03 / 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.

UI Layer JavaFX · FXML

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.

↓
Controller Layer @FXML handlers

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.

↓
Service Layer Business rules

Contains business rules and application logic: authentication checks, credential validation, searching, and password generation. This is where the behaviour of the application actually lives.

↓
Repository Layer CredentialRepository

Handles storing and retrieving credential data. Defined as an interface so the storage implementation can be swapped without touching the service layer.

↓
Data Storage Local files

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.

04 / Java Concepts

OOP Classes Interfaces Encapsulation Collections Generics Enums Exception Handling File I/O JavaFX Event Handling MVC-style Architecture

05 / Security Concepts

  • →Authentication — a master password gate that must be satisfied before the vault contents are reachable.
  • →Password masking — stored values are hidden by default and only shown on an explicit user action.
  • →Input validation — records are rejected when required fields are empty or malformed.
  • →Session / state management — the vault holds an unlocked state that can be explicitly released again.
  • →Local data handling — data stays on the local machine; there is no synchronisation or remote storage.
  • →Secure design principles — security-relevant logic is concentrated in one layer instead of scattered across the interface.

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.

06 / Challenges

Space reserved for the genuine development challenges encountered while building this project. Each entry will be written up as it actually happens.

  • →Managing application state across the login and dashboard screens.
  • →Designing the class structure so responsibilities stay separated.
  • →Connecting JavaFX controllers to the service layer cleanly.
  • →Validating user input consistently across multiple entry points.
  • →Persisting data reliably and handling a missing or malformed store file.
  • →Handling errors gracefully instead of letting exceptions reach the interface.

These are the areas to be documented. Nothing here is presented as a solved problem until it has actually been solved.

07 / Results

Final screenshots

To be added on completion.

Demo video

To be added on completion.

Technical results

Measurable outcomes and behaviour notes.

Lessons learned

Written up after the build is finished.

Future improvements

Planned extensions will be listed here once the core application is complete.

08 / Source Code

View source on GitHub Coming soon →

The repository link will be added here once the project is published.

[ CASE 10 — EXTENDED ] PYTHON PILLOW TKINTER

Image Processing Studio

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.

Language
Python 3
GUI Toolkit
Tkinter
Core Library
Pillow (PIL)
Focus
Image Processing & UI Layout
Status
In Development
main.py
PYTHON

Placeholder Python structure shown to illustrate the project's layout. The actual implementation will be linked here once the application is finished.

Image Processing Studio — Tkinter Application

Preview

Loading demo image…

Click "Load" to try your own image.

— × — px Idle

Adjustments

Brightness 100
Contrast 100
Blur 0

Filters

All processing happens in your browser. Nothing is uploaded or saved to a server.

01 / Problem

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.

02 / Objective

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.

  • →Loading and rendering images efficiently in a Tkinter canvas.
  • →Applying adjustments (brightness, contrast, blur) without destroying the original.
  • →Implementing filters such as grayscale, edge detection, and blur.
  • →Preserving image quality through resize operations.
  • →Exporting images with configurable compression.
  • →Keeping the codebase readable through clear module separation.

03 / Architecture

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.

View Layer Tkinter · EditorView

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.

↓
Service Layer ImageProcessor · FilterService

Contains the actual image operations — brightness, contrast, blur, grayscale, edges, resize, and compression. These functions are stateless and independent of the UI.

↓
Model Layer ImageDocument

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.

↓
File Storage Pillow · Local disk

Images are read from and written to local disk using Pillow. No remote storage, no cloud services — the tool is entirely local by design.

04 / Python Concepts

Classes Modules Comprehensions Static Methods Context Managers Type Hints Exceptions Pillow (PIL) Tkinter Event Binding File Dialogs Image Filtering

05 / Image Processing Concepts

  • →Pixel-level adjustment — brightness and contrast are applied by transforming each channel value while preserving the image's proportions.
  • →Gaussian blur — a convolution kernel that averages neighbouring pixels to soften the image.
  • →Edge detection — a kernel that highlights regions of rapid intensity change, useful for finding contours.
  • →Resampling — Lanczos resampling is used when resizing to keep edges crisp.
  • →Compression — JPEG quality controls the trade-off between file size and visible artefacts.
  • →Non-destructive editing — the original image is preserved so a reset always returns to the starting state.

06 / Challenges

Space reserved for the real development challenges encountered while building this project. Each entry will be written up as it actually happens.

  • →Keeping the Tkinter canvas responsive while processing larger images.
  • →Preserving aspect ratio when the preview is scaled to fit the window.
  • →Deciding where to apply adjustments — on the original or on a working copy.
  • →Handling files that aren't valid images without crashing the app.
  • →Choosing sensible defaults for compression quality.
  • →Keeping the code layered as the feature set grows.

These are the areas to be documented. Nothing here is presented as a solved problem until it has actually been solved.

07 / Results

Final screenshots

To be added on completion.

Demo video

To be added on completion.

Technical results

Measurable outcomes and behaviour notes.

Lessons learned

Written up after the build is finished.

Future improvements

Batch processing, presets, and an adjustment history panel are candidates for a future iteration.

08 / Source Code

View source on GitHub Coming soon →

The repository link will be added here once the project is published.

[ CASE 11 — EXTENDED ] PYTHON PROCEDURAL

Procedural World Generator

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.

Language
Python 3
Focus
Procedural Generation
Concepts
Algorithms, Randomization
Output
Tile Grid · PNG
Status
In Development
main.py
PYTHON

Placeholder Python structure shown to illustrate the project layout. The real implementation will replace these files.

Procedural World Generator — Tkinter Application

Generated World

Idle
World Size
— × —
Terrain Types
—
Water
— %
Forest
— %
Mountain
— %
Structures
—

World Parameters

World Size 80 × 80
SmallLarge
Mountain Density 50
Forest Density 50
Water Level 35
Number of Structures 8

Seed

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.

01 / Concept

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.

02 / World Representation

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.

data model
# 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.

03 / Generation Algorithm

The generator uses fractal value noise — not Perlin noise, not cellular automata, and not wave function collapse. Two independent value-noise fields are produced:

  • →an elevation field — used to decide water, mountains, and general land shape.
  • →a moisture field — used to decide forests and deserts.

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.

generation/terrain.py — core idea
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.

04 / Randomization

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.

05 / Deterministic Seeds

A seed is a single integer that is mixed into every noise-hash lookup. Two consequences follow:

  • →Same seed + same parameters → identical world. Nothing is stored between runs; the world is re-derived from the seed every time.
  • →Different seeds → visibly different worlds. Even a change of ±1 in the seed reshuffles the entire map.

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.

06 / Terrain & Biomes

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.

Water

elevation < waterLevel

Mountain

elevation > 0.72 − mountainDensity × 0.2

Forest

moisture > 0.58 − forestDensity × 0.25  and  elevation > waterLevel + 0.03

Desert

moisture < 0.35  and  elevation > 0.55

Plains

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.

07 / Challenges

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.

  • →Tuning fBm octave counts so the world reads as terrain instead of static noise.
  • →Choosing thresholds that produce balanced biome coverage across every seed.
  • →Making sure neighbouring cells with similar elevation still produce readable boundaries.
  • →Placing settlements so they feel intentional (near water, spaced apart) rather than purely random.
  • →Rendering a large tile grid efficiently inside a Tkinter canvas.
  • →Keeping the generator fast enough to feel interactive at 120 × 120.

08 / Results

Sample worlds

Generated maps to be exported and linked here.

Demo video

To be added once the Tkinter app runs end to end.

Observations

Notes about how parameters affect the world — written after enough real runs.

Lessons learned

To be written after the project is finished.

09 / Source Code

View source on GitHub Coming soon →

The repository link will be added here once the project is published.

03 / Toolbox

Skills & Technologies

[ HANDS-ON WITH EVERY TOOL BELOW ]

HTML5 HTML5
CSS3 CSS3
JavaScript JavaScript
PHP PHP
MySQL MySQL
Java Java
Python Python
Linux Linux
Git Git
Design Design
VS Code VS Code
HTML / CSS100%
JavaScript100%
PHP / MySQL100%
Java / Python100%
04 / Academic

Education & Academies

2025 — PRESENT

Computer & Information Technology (CIT)

American University of Kosovo (AUK / RIT Kosovo)

Currently in second year of study focused on programming, network architecture, and software systems.

2024 — 2025

Programming Academy Certification

Future Minds Academy

Specialized coursework in HTML, CSS, JavaScript, Java, and Python.

2021

IT & Python Certification

Cisco Networking Academy

IT Essentials, Python Essentials, and Java fundamentals.

2023

Graphic Design Program

Mova Academy

Visual design principles, composition, and visual assets creation.

05 / Background

Work Experience

3+ YEARS EXPERIENCE

Web Development & Digital Projects

Hands-on experience developing functional websites, working with frontend/backend technologies, and delivering client and personal projects.

PROFESSIONAL ROLES

Client Communication & Administration

Developed strong communication, team coordination, customer support, and organizational skills across various professional settings.

06 / Developer Sandbox

Developer Lab

07 / Connect

Let's build something great together.

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.

Email
olsaa.salihu.2007@gmail.com
→
Phone
+383 46 180 760
→
LinkedIn
olsa-salihu-787518439
→
Location
Prishtina, Kosovo
GMT+1