Skip to content
career_db

Prishtinë, Kosovo · CET · open to work

Gent Hulaj

Full-stack developer who builds Shopware 6 commerce platforms end to end — PHP and Symfony underneath, Vue and React on top, and the plugins that wire them to payment gateways, address validation, warehouse systems and revenue recovery.

Currently at Solution25 on Shopware 6 storefronts for US retailers — including one carrying 30,000+ items. Most of my work is plugins: three payment gateways, address validation, warehouse sync, abandoned-cart recovery, product bundles and shipping protection.

Fit at a glance
for whoever is screening

4+

years, paid

9

shipped, all live

10

Shopware plugins

3

payment gateways

Core stack

  • React4.5y
  • SQL / MySQL3.5y
  • TypeScript2.5y
  • Shopware 6
  • PHP
  • Symfony
  • Vue.js
Seeking
Full-stack developer · Backend-leaning full-stack · Shopware / e-commerce engineer
Availability
Open to new work
Based
Prishtinë, Kosovo
Hours
CET (UTC+1) — overlaps a full working day with the EU and UK
Languages
Albanian (native), English (professional)
Email GentRésuméLinkedIngentihulaj12@gmail.com

Or check the claims yourself

4 tables · 48 rows · SELECT only

Every write-up here lands on the same point: the render is almost never the problem, the query is. Click a question, or ask your own. Everything below is the same data, printed in full.

Query console
SELECT only · read-only

OK · 9 rows · read 9

Query result
#titlekindyear
1This SitePersonal site, V22026
2Miniature MarketHigh-catalogue retail2025
3Utah AirgunsSpecialist retail2025
4Lorik Zekaj PortfolioClient portfolio2025
5VaporBeastRegulated e-commerce platform2024
6Innovemia AcademyEducation platform2024
7Portfolio V1Previous personal site2024
8MetDaanDigital media publication2023
9PabauClinic & booking platform2022

SELECT · JOIN · WHERE · GROUP BY · ORDER BY · LIMIT · COUNT · MIN · MAX · AVG · SUM · LIKE · IN · IS NULL · EXPLAIN. Arrow keys walk your history.

Why me, with the evidence attached

4 written-up projects · every link is production

01claim

I ship commerce that has to satisfy regulators, not just users

VaporBeast is age-gated nicotine retail under the US PACT Act: adult-signature delivery, carrier restrictions, and address accuracy as a legal requirement rather than a conversion tweak.

Read how it is built
02claim

I extend platforms instead of forking them

10 Shopware 6 plugins on documented extension points — payment handlers, cart processors, event subscribers, custom entities with their own admin modules, scheduled tasks and the message queue. Three are payment gateways, because processing is the part of a store that most needs a second route.

See the plugins
03claim

I fix the query, not the symptom

At Pabau a slow calendar looked like a React problem. It was five chained requests per view. Collapsing them into one shaped query and subscribing for changes is what actually fixed it.

Read the case study

Schema

4 tables · 2 foreign keys

roles3 rows
  • companytext
  • titletext
  • startedint
  • endedint
  • currentbool
  • locationtext
projects9 rows
  • slugtext
  • titletext
  • kindtext
  • companytext

    roles.company

  • yearint
  • featuredbool
  • writeupbool
  • livetext
plugins10 rows
  • nametext
  • slugtext
  • categorytext
  • companytext

    roles.company

  • storetext
  • servicetext
  • surfacetext
  • platformtext
skills26 rows
  • nametext
  • areatext
  • leveltext
  • rankint
  • yearsint
Relationswhat you can join on
  • projects.companyroles.companyJOIN roles ON projects.company = roles.company
  • plugins.companyroles.companyJOIN roles ON plugins.company = roles.company

Projects

table projects · 8 columns

9

9 shipped, 4 written up properly.

SELECT * FROM projectsOK · 9 rows
All rows in projects
#slugtitlekindcompanyyearfeaturedwriteuplive
1vaporbeastVaporBeastRegulated e-commerce platformSolution252024truetruevaporbeast.com
2miniaturemarketMiniature MarketHigh-catalogue retailSolution252025truefalseminiaturemarket.com
3utahairgunsUtah AirgunsSpecialist retailSolution252025falsefalseutahairguns.com
4pabauPabauClinic & booking platformPabau Clinic Software2022truetruepabau.com
5metdaanMetDaanDigital media publicationMetDaan2023truetruemetdaan.media
6innovemiaInnovemia AcademyEducation platformSolution252024truetrueinnovemia.academy
7lorik-zekajLorik Zekaj PortfolioClient portfolioNULL2025falsefalselorikzekaj.info
8portfolio-v1Portfolio V1Previous personal siteNULL2024falsefalsegent-hulaj.vercel.app
9pirroxThis SitePersonal site, V2NULL2026falsefalsepirrox.dev

Shopware plugins

table plugins · 8 columns

10

Extensions written at Solution25 across three client storefronts. Three are payment gateways.

SELECT * FROM pluginsOK · 10 rows
10 rows
All rows in plugins
#nameslugcategorycompanystoreservicesurfaceplatform
1Sales Agentsales-agentb2bSolution25NULLNULLCustom entity and admin module, storefront context switching, order attributionShopware 6
2Curbstone Paymentscurbstone-paymentspaymentsSolution25NULLCurbstonePayment handler, order transaction state machine, checkout finalisationShopware 6
3Smarty Address Validationsmarty-address-validationcheckoutSolution25NULLSmarty (formerly SmartyStreets)Checkout address validation, storefront JS, cart error handlingShopware 6
4ShipHero Warehouse Integrationshiphero-integrationfulfilmentSolution25NULLShipHeroScheduled tasks, message queue, GraphQL client, webhook endpointsShopware 6
5NMI Paymentsnmi-paymentspaymentsSolution25NULLNMIPayment handler, browser-side tokenisation, order transaction state machineShopware 6
6Authorize.Net Paymentsauthorize-net-paymentspaymentsSolution25NULLAuthorize.NetPayment handler, browser-side tokenisation, refunds and captureShopware 6
7Abandoned Cart Saverabandoned-cart-saverrevenueSolution25NULLNULLScheduled task, message queue, cart persistence, mail templates, event subscribersShopware 6
8Sales-Channel Specific Contentsales-channel-contentmerchandisingSolution25NULLNULLEntity extensions with sales-channel association, CMS data resolver, storefront subscribersShopware 6
9Product Bundleproduct-bundlemerchandisingSolution25NULLNULLCustom entity and admin module, cart data collector and processor, price calculationShopware 6
10Shipping Protectionshipping-protectionrevenueSolution25NULLNULLCart data collector and processor, custom line item type, storefront toggleShopware 6
Why each one exists10 extensions
10 write-ups
  1. 01

    Sales Agent

    b2b

    Lets a sales representative work inside a customer's account — building and placing an order on their behalf, with the agent recorded on the order.

    Wholesale accounts do not self-serve. Orders arrive by phone and email, and someone has to enter them against the right account, at the right pricing, without handing that account's credentials around.

    Extension point

    Custom entity and admin module, storefront context switching, order attribution

    Written in

    PHP, Symfony, Shopware Administration (Vue), MySQL

  2. 02

    Curbstone Payments

    payments

    Curbstone

    Payment handler integrating Curbstone's gateway, so card data is tokenised remotely and never lands on the merchant's infrastructure.

    Curbstone is a PCI-validated Level 1 service provider. Routing card capture through remote tokenisation keeps the store's own systems out of PCI scope — which matters far more to a merchant than a few lines of checkout code.

    Extension point

    Payment handler, order transaction state machine, checkout finalisation

    Written in

    PHP, Symfony, REST, Shopware payment API

  3. 03

    Smarty Address Validation

    checkout

    Smarty (formerly SmartyStreets)

    Validates and normalises US addresses at checkout against USPS CASS-certified data, with autocomplete as the customer types.

    For a regulated shipper a wrong address is not a missed delivery, it is a compliance exposure. Smarty also returns whether an address is residential or commercial and whether it is deliverable at all, which is what decides the carrier and service level downstream.

    Extension point

    Checkout address validation, storefront JS, cart error handling

    Written in

    PHP, Symfony, JavaScript, REST

  4. 04

    ShipHero Warehouse Integration

    fulfilment

    ShipHero

    Two-way sync with the ShipHero warehouse management system: orders out for fulfilment, stock levels and tracking numbers back in.

    Once fulfilment moves into a real WMS, the storefront stops being the source of truth for stock. Orders have to reach the warehouse reliably and inventory has to come back, or the catalogue starts selling things that are not there.

    Extension point

    Scheduled tasks, message queue, GraphQL client, webhook endpoints

    Written in

    PHP, Symfony, GraphQL, Message queue, MySQL

  5. 05

    NMI Payments

    payments

    NMI

    Payment handler for the NMI gateway, with card details tokenised in the browser so they never reach the store's servers.

    A merchant needs more than one route to take money. Gateways go down, rates get renegotiated, and a high-risk category can lose an account with little notice — so the store has to be able to switch or run two in parallel.

    Extension point

    Payment handler, browser-side tokenisation, order transaction state machine

    Written in

    PHP, Symfony, JavaScript, REST

  6. 06

    Authorize.Net Payments

    payments

    Authorize.Net

    Payment handler for Authorize.Net, again tokenising in the browser and keeping the merchant out of PCI scope.

    Authorize.Net is what a lot of established US merchants already process on. Meeting them where they are is faster and cheaper than asking them to migrate their processing to suit a new storefront.

    Extension point

    Payment handler, browser-side tokenisation, refunds and capture

    Written in

    PHP, Symfony, JavaScript, REST

  7. 07

    Abandoned Cart Saver

    revenue

    Finds carts left behind after a set interval and emails the customer a link that restores the cart exactly as they left it.

    Most carts are abandoned, and a recovered one is the cheapest order a store will take all day. The work is in the details: send once rather than repeatedly, stop the moment the order completes, and restore the cart rather than dumping the shopper on the homepage.

    Extension point

    Scheduled task, message queue, cart persistence, mail templates, event subscribers

    Written in

    PHP, Symfony, MySQL, Twig

  8. 08

    Sales-Channel Specific Content

    merchandising

    Lets content, product data and category structure differ per sales channel, so one Shopware instance can serve several storefronts without duplicating the catalogue.

    A merchant running more than one storefront off one installation still needs each to look and read like its own shop. Forking the catalogue per channel is the obvious move and the wrong one — it doubles the maintenance and the two copies drift apart within a month.

    Extension point

    Entity extensions with sales-channel association, CMS data resolver, storefront subscribers

    Written in

    PHP, Symfony, Shopware Administration (Vue), MySQL, Twig

  9. 09

    Product Bundle

    merchandising

    Sells several products together as one purchasable bundle, with its own pricing and its own line in the cart.

    Bundles raise basket size, but only if the maths is right. The bundle has to price as a unit while still drawing down stock on each component, and it has to survive partial refunds — which is why it belongs in the cart pipeline rather than in a template.

    Extension point

    Custom entity and admin module, cart data collector and processor, price calculation

    Written in

    PHP, Symfony, Shopware Administration (Vue), MySQL

  10. 10

    Shipping Protection

    revenue

    Adds an optional shipping-protection line item at checkout, priced from the cart total and toggled by the customer.

    It gives the customer a remedy when a parcel is lost or damaged, and the merchant a margin line that costs nothing to stock. It has to be added as a real line item so tax, totals, refunds and the order record all stay correct.

    Extension point

    Cart data collector and processor, custom line item type, storefront toggle

    Written in

    PHP, Symfony, JavaScript, Twig

Roles

table roles · 6 columns

3

3 teams since 2022: booking software, then publishing at scale, now commerce. Each move went further down the stack rather than sideways across it.

SELECT * FROM rolesOK · 3 rows
All rows in roles
#companytitlestartedendedcurrentlocation
1Solution25Software Engineer2024NULLtruePrishtinë, Kosovo
2MetDaanSoftware Engineer20232024falsePrishtinë, Kosovo
3Pabau Clinic SoftwareFull-Stack Developer20222023falsePrishtinë, Kosovo

Skills

table skills · 5 columns

26

Graded honestly, because a wall of identical 'expert' badges tells a reader nothing.

SELECT * FROM skillsOK · 26 rows
26 rows
All rows in skills
#namearealevelrankyears
1TypeScriptFrontendcore32.5
2ReactFrontendcore34.5
3Next.jsFrontendcore34.5
4Vue.jsFrontendstrong21.5
5Tailwind CSSFrontendcore31.5
6GSAPFrontendcore3NULL
7ZustandFrontendstrong21.5
8Three.jsFrontendworking1NULL
9Shopware 6Backend & Commercecore31.5
10Shopware pluginsBackend & Commercecore31.5
11PHPBackend & Commercestrong21.5
12SymfonyBackend & Commercestrong21.5
13LaravelBackend & Commerceworking11.5
14Node.jsBackend & Commercestrong2NULL
15PythonBackend & Commerceworking11.5
16SQL / MySQLDatastrong23.5
17GraphQLDatastrong22.5
18HasuraDatastrong21
19PrismaDatastrong21
20REST designDatacore3NULL
21Payment / WMS APIsDatastrong21.5
22Git / GitHubCraft & Toolingcore3NULL
23AccessibilityCraft & Toolingstrong2NULL
24Core Web VitalsCraft & Toolingstrong2NULL
25i18nCraft & Toolingstrong21.5
26Figma handoffCraft & Toolingstrong2NULL
About this pageno dependencies

Why a database

Every write-up here lands on the same point: the render is almost never the problem, the query is. Asserting that on a page of prose seemed hollow. So the CV is normalised into four tables with foreign keys between them, and the page is a client. EXPLAIN is the honest part — it shows how many rows were read to return the ones you asked for.

How it works

A tokeniser, a recursive-descent parser and an evaluator, hand-written for this page. It does inner joins with a hash build rather than a nested loop, GROUP BY with aggregates, qualified and aliased columns, three-valued NULL logic, and EXPLAIN. Shipping a megabyte of WASM to make a point about query cost would have been self-defeating.

It reads without JavaScript

Every table the console can query is server-rendered in full above. The console is the extra, never the way through — turn JavaScript off and the whole CV is still there, as tables.

Built with

Next.js and TypeScript. No component library, no icon library, no animation library — the entrances are CSS transitions driven by one shared scroll sweep. Source is on GitHub ↗.

Contact

open to work · replies within a day or two

Looking for full-stack work, and open to selected freelance — commerce platforms, Shopware extensions, or a backend that needs untangling. Everything gets an answer.

located
Prishtinë, Kosovo (CET)
INSERT INTO messages3 fields