business card

What I've built

A detailed look at the projects that make up my portfolio: what they are, the purpose behind each one, and the stack that makes them work.

View projects ↓
01
QA AUTOMATION · API & E2E TESTING

SecureGate

An automated QA suite that tests the Shipping Hub platform end to end — API, UI and BDD — in a CI pipeline that runs nightly and on pull requests.

See repository ↗
What it is

A professional QA automation suite that validates the Shipping Hub platform (project 02) the way a QA Automation Engineer would: API contract and functional tests with Karate, end-to-end UI journeys with Selenium under the Serenity Screenplay pattern, BDD scenarios with Cucumber/Gherkin, and a hand-runnable Postman/Newman collection — including security-oriented negatives such as rate limiting, broken authorization and tampered tokens. The Page Object Model was retired in favor of Screenplay (Actors performing Tasks, asking Questions), which stays maintainable as the UI surface grows. All layers run in CI: the pipeline spins up the API, the web app and a headless browser, produces Serenity living documentation plus a Karate report, and includes a SonarQube quality-gate step.

Purpose

To demonstrate professional QA automation against a real distributed system: designing a layered test strategy (API, BDD, UI), automating it in CI, and gating quality — reflecting hands-on experience testing production software rather than toy examples.

Stack used
Java · Karate
API contract & functional testing (Gherkin + match), with security negatives
Selenium · Serenity Screenplay
End-to-end UI journeys as Actors performing Tasks (replaces POM)
Cucumber (BDD)
Gherkin scenarios as living documentation
Postman · Newman
Hand-runnable API collection, headless in CI
GitHub Actions
CI pipeline: nightly and on-demand test runs
SonarQube
Static-analysis quality gate on the test framework
Serenity BDD
Living documentation reports with screenshots
Claude Code agents
Autonomous maintenance around the clock: uptime patrol, nightly QA regression, dependency updates and maintenance PRs, and a merge gate that merges only what passes every check — humans review the rest
02
FULL-STACK · DISTRIBUTED ARCHITECTURE

Shipping Hub

A reactive, bilingual interface on top of a distributed architecture that connects services written in different languages into a single system.

Live app ↗ See repository ↗
What it is

A UPS/FedEx-style parcel shipping & tracking platform. A reactive, SEO-optimized bilingual (es/en) web interface sits on top of a distributed backend: a transactional Node.js API — with JWT auth, a shipment state machine and a wallet backed by a double-entry ledger — talks to PostgreSQL, while stateless Python microservices handle pricing/ETA and PDF labels. Anyone can track a parcel with no account.

Purpose

To demonstrate end-to-end full-stack capability: designing a modern, fast frontend while orchestrating a distributed backend where different languages and services (Node.js and Python) communicate and share persistence. It reflects experience with real production architectures, not just a static site.

Stack used
Next.js · React
Bilingual SSR interface, full SEO and Leaflet route maps
TypeScript
Static typing across web, API and shared contracts
Tailwind CSS
Design system
Node.js · Express · Prisma
Transactional API: auth, state machine, ledger
PostgreSQL
Append-only tracking events and double-entry ledger
Python · FastAPI
Stateless pricing/ETA and PDF-label microservices
Docker · Railway
Single-container all-in-one deployment, live in production
Claude Code agents
Autonomous maintenance around the clock: uptime patrol, nightly QA regression, dependency updates and maintenance PRs, and a merge gate that merges only what passes every check — humans review the rest
03
BROWSER AUTOMATION · MEDIA INTEGRITY

DramaFetch

A carefully paced tool that downloads whole short-drama series your own TikTok account can already watch, for personal offline viewing — it never unlocks paid episodes or bypasses DRM.

See repository ↗
What it is

A downloader for whole short-drama series that your own TikTok account can already watch — several series in one run — for personal offline viewing, with three front ends: a Python CLI, a small local web page (usable from a phone or TV on the home network with an access token) and a Chrome extension for Windows, macOS and Linux. Episodes are saved as “<Series> - Episode NN.mp4”, exactly as served (nothing is re-encoded), with the cover embedded in the MP4; every file is verified — complete, with an audio track, the expected length — before it counts, and interrupted runs resume. Paid episodes the account has unlocked download like free ones; locked ones are listed and skipped. It never unlocks paid episodes or bypasses DRM or access controls: encrypted media is detected and never kept.

Purpose

To demonstrate careful, polite automation on a platform that guards against bulk downloading: it never tries to defeat that protection — no proxies, no stealth, no parallel requests — and instead behaves like one person watching: one request at a time, randomized pauses, rests, a hard stop on any refusal and a 30-minute cooldown. It also treats media integrity and testability as features, tested against fixtures and a local fake server, never the real site.

Stack used
Python · mypy · Ruff
CLI and shared engine: type hints everywhere, mypy in strict mode, Ruff
Playwright · Chromium
Reads the episode list the way TikTok's web app does
yt-dlp
Default download engine, one episode at a time
mutagen
Cover art embedded into the MP4; integrity checks on every file
Python http.server
Standard-library local web UI, reachable from a phone or TV with an access token
JavaScript · Chrome Extensions (Manifest V3)
The extension: zero dependencies, @ts-check, type-checked with TypeScript's checker
pytest · node:test
Unit tests, a local fake TikTok server, Python–JavaScript parity tests and real-Chromium integration tests
FFmpeg
In the tests: a frame-checksum proof that embedding a cover changes no frame
GitHub Actions
CI on every change: lint, strict type checks, unit tests and real-Chromium integration tests
Claude Code agents
Built with multi-agent workflows (implementers, adversarial reviewers and a fixer per build) and maintained around the clock: a nightly watch of yt-dlp's TikTok changes, new dependency releases and Chrome Stable, a weekly vulnerability watch, and a merge gate that merges a change only when every suite passes — humans review the rest
04
FRONTEND · VANILLA WEB

Personal Web Portfolio

This very site: a two-page portfolio built from scratch without frameworks — pure web technologies only.

See repository ↗
What it is

A personal portfolio made up of two connected pages: the main page — with my introduction, experience, and skills — and this projects page. Everything is built from scratch with plain HTML, CSS, and JavaScript, and includes a hero greeting that rotates through four languages, reveal and typing animations, a background that subtly shifts colors, and a fully responsive design.

Purpose

To demonstrate command of frontend fundamentals without relying on frameworks: building an interactive, polished experience using only native web technologies. It is also my calling card in action: the project you are evaluating is the very page you are reading it on.

Stack used
HTML5
Semantic structure of both pages
CSS3
Animations, dynamic gradients, and responsive design
JavaScript
All the interactivity — including the four-language rotating greeting — with no frameworks or libraries
Google Fonts
Typography: Space Grotesk, Space Mono, Inter and JetBrains Mono