Senior support · RCA
Cloud-desktop (DaaS) provider · Windows Server VDI
L3 escalations closed with root cause analysis, and runbooks so they stay closed
Complex, recurring escalations across Windows Server VDI, SQL Server, GPUs and Linux desktops needed a confirmed root cause and a repeatable fix, not another one-off workaround.
8runbooks and guides for recurring incidents and changes
Root causeconfirmed with evidence before the fix is documented
L1/L2runbooks that let first-line teams resolve repeat issues
How I did it
- SQL Server setup failing with 0x84B10001: traced to a corrupted Setup Bootstrap cache, validated the fix and documented it
- VDI "freezes": correlated user reports with GPU driver-reset events and the Remote Desktop graphics policy
- Webcam redirection failing from macOS and Linux clients: proved the brokered session exposed only the camera bus, not a camera
- Disks filling up: persistent VSS shadow copies held by an endpoint-security agent, resized safely in a maintenance window
- Broken Windows Update datastores and XRDP clipboard failures on Ubuntu, each turned into a step-by-step runbook
Windows ServerRDP / VDISQL ServerEvent ViewerPowerShellUbuntu / XRDPRCA / PIR
Web performance
Investor community site · Prebid + server-side bidding
Cut an ad stack's first-visit browser memory by 72% on an investor community site
The ad stack used gigabytes of browser memory on a first visit, mostly from cookie-sync iframes, which slows pages and costs viewability.
−72%first-visit memory, 4.2 GB → 1.2 GB (preview build)
3.9 → 7.6memory score out of 10
+11%page-view RPM for the new release in a split test
3.5 → 5.8user IDs per bid
How I did it
- Measured renderer memory against an ads-blocked floor and graded each build on a 0–10 scale
- Found that server-side cookie sync treats a missing iframe filter as "allowed", so set it to exclude explicitly and cleaned up sync iframes
- Added lazy loading below the fold
- Confirmed there was no leak: 8 minutes of ad refresh added only 36 MB
- Shipped as 10% split tests judged on revenue per 1,000 page views. On a second forum the same fixes lifted viewability by 17 points and cut unfilled impressions from 16.1% to 3.3%
Prebid.js userSyncPrebid ServerLazy loadingChrome memory profilingSplit testing
Service delivery
Cloud-desktop provider · service delivery team
Designed the service delivery operating model, with QA as a gate before any customer handoff
Implementations, onboarding, quality checks, root-cause work and automation needed one way of working, with a single owner per task and quality that can be measured.
5specialist roles: implementation, QA, onboarding, RCA, automation
8standard work statuses, from Ready to Completed
QA gatenothing reaches the customer before it passes
How I did it
- Wrote the Service Delivery Team SOP: intake requirements, assignment rules and a step-by-step procedure for every role
- Set the principles: one owner at a time, no undocumented work, fix the cause and not only the symptom, automate only after standardizing
- Required objectively testable acceptance criteria, a baseline and a rollback expectation before any production change
- Separated technical completion from customer readiness, so both are confirmed before a request is closed
Service delivery managementSOPsQuality assuranceChange managementProblem management
Web performance
Stock-research web app · server-side demand partner
Traced 6,241 first-visit requests to one nested cookie-sync chain, and got it removed
Cold page views were making thousands of requests across 300+ domains and freezing the main thread, and nobody could say where they came from.
6,241sync requests on page 1, traced to one chain
7.4 → 1.7 sTotal Blocking Time with the chain blocked
498 → 43 MBJavaScript heap with the chain blocked
34%of all main-thread work from one partner
How I did it
- Ran cold-profile Playwright sessions and stream-parsed the Chrome performance traces
- Attributed every request through the frame tree, counting each redirect hop through iframes nested 13–17 levels deep
- Compared runs with third-party cookies blocked vs allowed to isolate the cascade
- Dissected the sync pages with curl and wrote the evidence-backed ticket for the demand partner
- After the escalation, the partner removed the nested sync from its chain
Chrome DevTools tracesPlaywrightPythonCookie-sync forensicsPartner escalation
Sales engineering
Cloud-desktop provider · trials and proofs of concept
A proof-of-concept process built to show value fast and convert
Trials have to prove value quickly, with one clear owner per step and no customer bounced between sales, implementation, onboarding and support.
8stages from discovery to early-life follow-up
≥75%handoff completeness required before implementation starts
6health measures, from time to value to 90-day stability
How I did it
- Mapped the journey as Qualify → Deliver → Adopt and convert, with one owner and an exit condition per stage
- Sales engineering hands over a structured package, so implementation starts without re-discovery
- QA approves every environment before the customer sees it; onboarding walks the customer through; support owns the live trial
- Weekly green, yellow or red trial health, then early-life follow-ups at 7, 15, 30, 45, 60 and 90 days
- Wrote the discovery and implementation questionnaire used to qualify each trial
Pre-sales discoveryProof of conceptOnboardingCustomer KPIs
Full-stack
K-12 private school · 3 portals on one database
Rebuilt a live school ERP side by side, with zero risk to production
A 15,000-file system grown since 2013 (staff intranet, family portal, teacher portal) carried years of security and correctness debt, and the school uses it every day.
426production files verified untouched
144 + 57automated tests + smoke checks
98tables created by a one-command installer, 0 warnings
How I did it
- Built an independent version 2 with a shared core, starting from a copy proven identical to production file by file
- Put every query behind a guarded data layer: an allow-list schema lock (no DDL) and an optional read-only mode
- Moved school identity, hard-coded links and secrets into a single config file outside the web root
- Added a local dev server, a fictitious model-school data set and a test runner that refuses any non-local database
- Packaged an installer so a new school starts from an empty, migration-built database
PHP 8PDOMySQLBootstrap 5.3BashMigrationsTest design
Support analytics
Support team of a cloud-desktop provider
Mined 6,000+ support tickets for root causes and automation targets
The team handled connectivity and access issues ticket by ticket, without a view of what kept coming back.
6,453tickets classified by symptom and likely cause
11root-cause groups in the connectivity report
5 vs 230tickets fetched by incremental sync instead of a full pull
How I did it
- Built a classification userscript that tags each ticket by symptom and location (client network, provider infrastructure or the VM), with evidence and confidence
- Identified the recurring issues and the recurring agent tasks worth automating
- Built a daily helpdesk dashboard (hourly refresh, filters by status, agent, sentiment and CSAT, CSV/Excel/HTML export)
- Wrote an issue-tracker exporter with resumable runs and incremental sync
JavaScript userscriptsPHPREST APIsClassificationBootstrap
Customer onboarding
Publisher new to JavaScript and Prebid
Yield management platform implementation
A customer needed to implement a yield management platform while having limited experience with JavaScript, Prebid, and the surrounding AdTech stack.
OutcomeThe customer completed the implementation, better understood the platform, and became more independent in managing and troubleshooting the solution.
How I did it
- Reviewed the JavaScript and advertising configuration
- Explained Prebid and Google Ad Manager concepts in practical language
- Identified integration and configuration issues
- Created clear implementation and testing steps
- Acted as both the engineering and customer-facing technical resource
Prebid.jsGoogle Ad ManagerJavaScriptTraining
AdTech
Publisher network · 40 bidding codes
Cut bid requests by 26% at a cost of 0.7% of revenue or less
Many bidders and routes cost requests, latency and browser work while returning little or nothing.
−26%bid requests
−16%browser calls
≤0.7%of Prebid revenue affected
94,705dashboard rows reconciled to 0.0001%
How I did it
- Ran a value-vs-cost analysis per bidder code, route and site
- Listed 13 codes to remove, 7 dead routes and 135 site × bidder × route combinations to clean
- Built a daily "who bids" heatmap and a site × bidder workbook tracking 448 non-bidding pairs (17.7% of requests)
PythonXLSXDashboardsPrebid analytics
Service delivery
Cloud-desktop provider · support and implementation teams
A 24-hour support-to-implementation handover rule that keeps the queue moving
Project-style work (application and SQL upgrades, migrations, licensing, multi-user rollouts) needs a clear owner instead of open-ended troubleshooting in the support queue.
24 hmaximum time project-style work stays with support
5steps: triage, classify, fix window, handover, validate
1named owner, with written acceptance by the receiving team
How I did it
- Defined the handover triggers: installs and migrations, database restores, licensing, authentication design, vendor coordination, multi-user rollouts
- Created a minimum handover package: environment, versions, troubleshooting timeline, logs, risks, rollback status and next action
- Scripted the customer message at handover: what is done, what remains, who owns the next step and what is needed from them
- Closed tickets only after the customer validated the fix through their normal access method
Escalation managementProcess designCustomer communicationZendesk
Data integrity
School finance & academic reporting
Made the finance and grade dashboards tell the truth
Dashboards, the delinquency list and the final-results report silently disagreed with the database, and nobody could trust the numbers.
6,553installment records restored to the finance dashboard
171students no longer shown debt that did not exist
35%false positives removed from the delinquency list
6.62 → 7.92school-wide average, corrected
How I did it
- Traced a zeroed dashboard to a column no code had filled since 2022 and derived the month from the installment code instead
- Fixed paid-in-full and partly paid installments being shown with the wrong status
- Moved the pass/fail rule from front-end JavaScript to a server-side service with a configurable passing average
- Counted early-childhood pupils separately, so the headcount matched the 516 active students
- Prepared a float-to-DECIMAL migration for money columns
SQLMySQLData reconciliationPHP servicesAutomated tests
AI & automation
Two YouTube channels · products and travel
A YouTube Shorts engine that learns from its own analytics
One channel ran on a single 813-line script with no AI, the other was manual, and nothing learned from results.
5 / dayShorts published across two channels
841 vs 166average views: best angle vs the one weighted highest
132Python tests across 30 modules
How I did it
- Built a 10-stage pipeline: candidate scoring, slot selection with diversity, hook tournament (10 scored, 1 chosen), storyboard, similarity check against the last 100 videos, quality gate, render and resumable upload
- Captured metrics at 1 h, 6 h, 24 h, 48 h, 7 d and 30 d through the YouTube Data and Analytics APIs
- Separated OAuth per channel after finding the wrong token silently returned zero videos
- Recalibrated story-angle weights from real performance data
- Runs a 24/7 live stream of a 119-video playlist from a systemd service
PythonYouTube Data & Analytics APIsOAuth2ffmpegPILText-to-speechsystemd
AdTech
Stock-research single-page app · mobile
Full ad-stack audit of a single-page app: median requests 2,666 → 939
Client-side navigations fired no new ad requests, a parser-blocking third-party head script delayed every page, and a mobile sticky unit sent empty bidder parameters.
2,666 → 939median requests per cold mobile visit (preview vs production)
3.9 → 5.9performance score
18 / 18mock tests passed by the new out-of-page unit
How I did it
- Proved the SPA fix by calling the page-change API by hand, so every client-side navigation now re-auctions
- Measured a third-party head script present on 11 live configs: 775 ms parser-blocking, starting a ~2.6 s request chain
- Built a single-request out-of-page unit and covered it with mock tests
- Showed a first visit costs bytes (680 KB vs ~122 KB), not latency, so the fixes target the right thing
- Wrote a prioritized P0/P1 action list for engineering and business owners
Google Ad Manager / GPTPrebid.jsSPA ad lifecycleCore Web VitalsUnit tests
Web performance
Commodity-price site · 85% smartphone traffic
Brought the first ad 4.4 seconds sooner on a mobile-first site
The ad stack started late in the page, so many smartphone visits ended before a single ad loaded.
−4.4 sto the first display ad, desktop and mobile
~1.9 ppfewer no-ad smartphone views per second saved (sister site)
1 rung at a timeeach fix measured on its own
How I did it
- Found the consent manager released the ad script only at document readyState "complete"
- Found a charting widget's 2-second timer racing window.load
- Built an experiment harness that rewrites HTML, blocks scripts and replaces responses, then measured each fix in isolation
- Also flagged a parser-blocking translation widget (~1.2 s), 7 legacy analytics tags and GPT loaded twice
- Grouped the low-risk changes into a "safe package" the site team could ship first
Consent-gated loadingPlaywrightPython trace parsingRUM analysis
Web performance
Financial-publisher network · 23 sites
Timed the tag-loader chain on 23 sites and mapped a path to about 1 second
The yield platform only requested its stack 1.8–8.6 s into the page, and nobody could see where the time went.
23sites timed request by request
314 of 382 KBof the core loader unused
1.5–1.8 searlier stack request without the loader, 8 of 8 lab loads
How I did it
- Captured per-request initiator stacks across the loader chain (median chain 1.35 s)
- Found a legacy Prebid build preloaded but never executed on all 10 top sites
- Uncovered a hidden dependency and built a stand-in, so a no-loader variant could be tested safely
- Modeled a path-to-1-second waterfall (4.73 s → ≈0.9 s, estimated)
- Delivered a 19-slide deck for the loader team and a gap workbook with 11 gaps
Network waterfall analysisPreconnect & async strategyLab A/BDecks & workbooks
AdTech
High-traffic financial-data site · network flagship
17 production releases on a network's flagship site in about two months
The flagship site needed a steady release cadence for its yield setup, with clean A/B arms to prove what worked.
17yield-manager releases, all deployed
1.87 → 3.21bids per auction, July → late September
+15%Prebid eCPM, same period
1.58 → 1.29 sLargest Contentful Paint
How I did it
- Built a 4-arm Variant/Control A/B framework
- Certified an identity-vendor integration and shipped a first-auction identity fix
- Rolled out an ad-quality vendor at 100% on every arm, keeping a clean control
- Added ID modules and IAB content categories, removed duplicate calls, tuned bid adjustments and fixed a Prebid global-alias issue
- Period over period (July vs late September, not a controlled test): page RPM +7.5%, AdX eCPM +14%, revenue per day +3% on 4% fewer page views
Prebid.jsGoogle Ad ManagerRelease managementA/B design
Revenue forensics
Financial-data site · 6 SSP reporting connections
Solved an SSP-vs-platform impression gap and built a reconciliation model
SSPs were recording far fewer impressions than the yield platform, and partners wanted to know why.
~117bid requests per cycle for at most 2 rendered slots, found and fixed
46% vs 23–24%bid-cache rate: the tell-tale of the broken build
−29% → −14%unexplained gap after the reconciliation model
How I did it
- Diffed configs about 40 versions apart to find a stacked unit running three auctions per one or two renders
- Showed that a 0.8 bid adjustment makes two SSPs report exactly 25% higher by construction
- Verified the GPID live, which stopped a "fix" that would have made things worse
- Mapped SSP placements to sites with a bounded least-squares fit
Prebid.jsPrebid ServerDiscrepancy analysisPythonLeast squares
AdTech
National news publisher · two Prebid Servers in a split test
Audited a new Prebid Server against the incumbent, and found a silent video failure
A second Prebid Server ran in a split test against the incumbent. The publisher needed to know whether it was healthy, and why the uplift was only about 3%.
12 vs 9bids on the same display slot, with a 2.4× higher top bid
0%video requests answered: defect isolated
9independent ways the defect was reproduced
How I did it
- Mapped the integration end to end: two s2sConfig entries, stored requests, cookie-sync endpoints and a sticky A/B bucket labelled through to ad-server key-values
- Compared display auctions side by side: the new server returned more bids and a higher top bid in every observed auction
- Isolated a blocking defect: zero bids on 100% of instream video requests, without a single adapter being called
- Audited OpenRTB signal quality (content, placement, bid status) and page latency
- Delivered an issue register and prioritized actions explaining the ~3% uplift
Prebid Servers2sConfigOpenRTBInstream video / IMAGAM key-values
Ad operations
National news publisher · multi-flight sponsorship plan
Forecast whether a year-long sponsorship plan could deliver, with read-only access
Sales needed to know if a multi-flight plan (audience-targeted banners plus a homepage takeover) could deliver, without anything being created in the ad server.
8 of 8takeover flights confirmed to clear
~12%inflation removed from the baseline forecast
~22audience segments measured, not estimated
How I did it
- Rebuilt the forecast baseline from live, delivering line items instead of assumptions
- Applied the network's mandatory invalid-traffic key and the right inventory scope
- Measured the audience layer on the line that actually carries it, using read-only traffic forecasts
- Issued a clear revision note so sales knew exactly what changed and why
Google Ad Manager 360Traffic forecastingAudience segmentsKey-values
AdTech
Major SSP partner · client, server and S2S paths
End-to-end supply-chain (schain) verification for a major SSP
An SSP reported a missing or invalid supply chain on part of the traffic, putting demand at risk.
3bidding paths captured live
18server-side bidders found at runtime, invisible in the static config
2small split-test variants isolated as the cause
How I did it
- Captured live bid bodies on the Prebid client, Prebid Server and S2S paths and checked the schain node by node
- Confirmed the main path was correct, and isolated two 5% variants that dropped the SSP
- Traced a wrong seller ID spread by a shared config template
- Showed a DSP bidder received twice the bid requests per auction yet kept the site's highest bid rate (37.9%)
OpenRTB schainsellers.jsonads.txtPrebid s2sConfig
Identity
Publisher network · Prebid 10 user-ID and RTD modules
Identity on the wire: 5 IDs per bid, zero duplicates, priced 35% higher
Identity integrations looked fine in dashboards, but bid requests were reaching bidders with few or no user IDs.
5EIDs per bid: 0 duplicates, all 5 bidders, both auctions
1 → 3EIDs on a charting site by configuration alone
+35%CPM for bids with a resolved ID (same browser, 4 sites)
How I did it
- Proved an identity bridge writing in beforeRequestBids did nothing on the wire in Prebid 10, and shipped a mergeConfig ORTB2 fix
- Showed ID modules can be added by configuration alone, because the platform compiles modules from the configured user IDs
- Benchmarked against a reference publisher: 10 modules returned 15 EIDs vs 3 modules returning 2
- Designed a multi-vendor EID de-duplication policy and shipped contextual IAB-category enrichment
Prebid userId & RTD modulesOpenRTB user.ext.eidsHashed-email IDs
Identity
Identity vendor integration · 5 sites
Debugged an identity integration down to a bug the vendor then confirmed
The vendor reported a healthy "resolved rate", yet the cached ID was not reaching bidders.
0 → 40 of 40bidder requests carrying the cached ID
28 vs 63 msmedian first-auction hold, fix vs production
1,042 → 593lines in the refactored pre-script
How I did it
- Showed the 71% "resolved rate" measured return visits, not addressability
- Found an SDK race: the right site key was set about 700 ms too late
- Wrote a loader whose explicit fetch beats the auction by 569 ms
- Scanned 1,628 page scripts, then refactored the pre-script in 4 tested steps
- The vendor confirmed the provider bug I had measured, and step 1 went to production
Prebid RTDlocalStorage forensicsSHA-256 email normalizationStaged rollout
Consent & privacy
Publisher network · US privacy, GPP and TCF
Found why some page loads never asked the ad server for a single ad
On 11 of 58 lab loads, the ad tag never sent an ad request, and nothing showed an error.
11 of 58silent no-ad loads explained
13/14 → 8/8failure reproduced on demand, then fixed by config
100% / 0%error beacon on failed vs healthy loads
How I did it
- Showed a legacy US-privacy stub pre-empted the ad server's CMP, so GPP never became ready and GPT held every request
- Reproduced the failure deterministically by delaying GPT (controlled fault injection), then fixed it with a configuration change
- Audited privacy signals estate-wide: a US-privacy module gate, empty GPP strings reaching server-side bidders, opt-out propagation and ownership
- Mapped CMPs across the top sites and measured the UK flow: no ads until consent, first ad 2.7–4.7 s after it
USP / CCPAGPPTCFGPTPrebid consentManagement
Revenue forensics
Financial-data site · bidder and experiment reporting
Explained an overnight revenue jump, and caught 4 reporting traps before they reached a deck
Revenue jumped overnight and one split-test arm looked like it was losing. Both needed a real explanation before anyone acted.
~10% → ~70%one bidder's bid rate, pinned to the hour
~70%of the new revenue confirmed incremental
12.3% → 53.5%corrected win rate (the blended view read 0.8% → 10.7%)
How I did it
- Pinned the bid-rate jump to the hour and ruled out every config version
- Pulled advertiser domains and flagged the new demand to the business as an ad-policy decision
- Found an A/B arm that logged almost no wins (300k bids → 108 wins) while the ad server showed real ones
- Caught a null experiment bucket with 10–40× RPM and an unfilled "0x0" artifact before they reached management
Report queriesAd-server vs sampled dataExperiment analysis
AdTech
Investor forum and a sister site · ad refresh
Verified a view-time refresh lift at +9.9%, then shipped a capped v2
A new view-time refresh trigger reported a large lift, but the test arms were unbalanced and one slot could refresh without limit.
+9.9%verified desktop lift after correcting a +15.6% page-view imbalance
21 / 21tests passed by the capped v2
4.5 → 9.5implementation scorecard
How I did it
- Rebalanced the arms before reading the lift
- Fixed a double unfilled call and added the missing cap (one slot could refresh up to 1,341 times per page view)
- Modeled the revenue cost of each cap option so the business could choose
- Tested v2 with a Node stub harness at default and strict settings
JavaScriptIntersectionObserverNode test harnessExperiment design
Ad-unit strategy
Publisher network · mobile and desktop anchor units
Audited the sticky-ad line behind 12% of network revenue
Adhesion units were a large revenue line, but nobody had compared formats, refresh decay or competitors side by side.
12%of revenue covered by the audit
86–96%viewability on most sites
~2×eCPM of 320×50 vs 320×100
~20%eCPM decline from first view to 30th refresh
How I did it
- Measured viewability and refresh decay per site and format
- Benchmarked against competitors running 19–32 bidders
- Found a site with tens of millions of desktop page views a month and no desktop anchor
GPTAd-unit designCompetitive teardown
Revenue modeling
Publisher network · 9 sites · executive decision
Sized the revenue upside of faster ads, without inflating the case
Leadership needed to know what page-speed work was worth before funding it.
+4–7%modeled revenue from speed fixes
+6–11%modeled with identity fixes included
500M+impressions in the model
How I did it
- Modeled gain = revenue × rate × seconds saved, using a published 4-billion-impression study and capping savings at 3 s per site
- Rejected an unsupported vendor claim (~10% per second) rather than inflate the business case
- Made the model channel-aware (programmatic vs direct-sold) and cross-checked it two independent ways
- Presented it as an executive deck with four rollout scenarios
Revenue modelingPythonExecutive decks
Partner reporting
Publisher network · SSP partners and management
A partner and management reporting suite: 281 slides covering 36 SSPs
Partner meetings and management reviews needed consistent, decision-ready numbers for dozens of demand partners.
281slides across 36 per-SSP sections
36 of 59bidder codes in the monthly partner report
#3 of 28a partner's rank, shown in its deep-dive deck
How I did it
- Defined inclusion, alias and threshold rules so every SSP section is built the same way
- Built the monthly workbook with fixed source and benchmark definitions
- Drew charts from shapes so decks keep their labels when imported into Google Slides
- Checked the deck in four independent QA passes
XLSX / SUMIFSExecutive decksGoogle SlidesData QA
Market analysis
Publisher network vs 6 managed-monetization providers
Benchmarked a publisher network against 6 managed-monetization providers
The network needed an objective view of where it stood on speed and pricing against the managed providers that publishers compare it with.
~250domains swept with HTTP probes
3.6–4.9 swrapper to first ad, level with the leader
13scorecard items level or ahead
How I did it
- Captured reader-style sessions on competitor sites
- Mapped which providers run which publishers with lightweight HTTP probes
- Compared banner pricing within a few percent of the leading provider
- Delivered a 27-slide deck with a scorecard and priorities
Competitive analysisHTTP probingPlaywrightExecutive decks
Config engineering
64 yield configs and 5 publisher codebases
Config symmetry audit, a reverse-engineered macro engine and publisher code reviews
Dozens of near-identical configs had drifted apart, and publisher tag code hid units that cost requests for no return.
64yield configs audited (34 live, 18 dormant)
35shared globals, bridges and wrappers, identical on 34 live configs
12ranked actions from a multi-domain portal review
How I did it
- Reverse-engineered the platform's macro rules and built a global-variable pack (15 globals, 8 bridges, 12 wrappers)
- Reviewed 4 publishers against a shared code-review template
- Found 11 of 26 units with zero bidder parameters, and 8 units serving 2.43M impressions for almost no revenue
- Flagged lazy loading switched off on all 28 placements of a message board
JavaScriptConfig managementCode reviewPrebid.js
Lab methodology
8 top sites · US vs UK
Built a reproducible ad-stack lab, then audited 8 sites from the US and the UK
Headless browsers don't behave like readers: they skip consent, get no bids and distort CPU numbers.
9 vs 613third-party cookies: blocked vs normal profile
87%of ad frames found to be friendly iframes
67% vs 13%international share of page views vs revenue
How I did it
- Seeded consent so headless runs request ads the way real readers do
- Built a third-party-cookie-blocked profile to compare against normal browsing
- Showed 4× CPU throttling inflates renderer CPU (57–60 s vs 4–6 s), so it is not a measure of work
- Measured that waiting, not CPU, dominates ad latency (3–7.5 s of main-thread CPU out of 23–30 s)
PlaywrightChrome tracesConsent seedingMethodology
Customer success partnership
Cloud-desktop provider · Support and Customer Success
A joint Support and Customer Success model for service reviews, QBRs and major incidents
Account managers own the relationship, but service reviews, QBRs and major incidents need a technical owner who brings evidence, risks and recommendations.
4shared moments: service reviews, QBRs, major incidents, adoption and growth
5areas with success measures, from L3 support to delivery
MTTRplus reopen rate, RCA completion and recurring-issue reduction
How I did it
- Split responsibilities clearly: Customer Success owns the relationship and the commercial agenda; the technical owner brings service health, incidents, capacity and risk
- Defined technical deliverables: discovery and readiness summaries, deployment and rollback plans, RCAs and monthly service summaries
- Set measurable targets for each area: MTTR, reopen rate, tickets deflected, time to readiness, handover completeness
- Protected time for automation, documentation and onboarding, so the senior role does not become the overflow queue
Customer successQBRsService reviewsIncident managementKPIs
Security & privacy
Family portal with children's records · LGPD
Hardened a family portal that stores children's documents and data
A security review of legacy authentication, password resets and document delivery had to close real exposures without locking a single family out.
31,798student documents moved behind owner-checked, audited access
99.9%of documents opening again after a filename-check fix
3portals with rate-limited logins
How I did it
- Moved password checks into PHP with constant-time comparison and an automatic upgrade to bcrypt
- Scoped password resets to a single enrollment, confirmed every write and recorded it in an audit log
- Added a private-documents switch that returns 404 and logs the attempt, plus ownership checks on photo delivery
- Fixed session fixation, took the client IP from the last proxy hop, blocked SVG uploads and symlink paths
- Measured timetable completeness (99.3%) before switching the teacher grade-entry rule from audit to enforce
Secure PHPbcrypt / hash_equalsCSRFRate limitingAudit loggingLGPD
Full-stack
Tuition billing · Brazil's instant-payment standard
One billing engine: configurable renewal discounts and instant-payment collection
Renewal discounts were rewritten by hand every cycle, the renewal endpoint never generated installments, and the installment math lived in two places that had drifted apart.
0 → 90pending renewals made visible to the team
51 + 107installment and instant-payment tests
CRC16 ✓payment codes validated against the standard test vector
How I did it
- Built configurable discounts (by seniority and by date window) with an admin screen, applied the same way to every fee
- Rewrote renewal with a mandatory before/after preview, row locking (SELECT … FOR UPDATE) and reversal blocked once anything is paid
- Unified installment math: leftover cents go to the last installment, and Brazilian money parsing stops "1.500" becoming 1.50
- Built and tested instant-payment (PIX) collection: payload generator with a validated CRC16, HMAC-SHA256 webhook with idempotency, and bank-statement reconciliation
PHPMySQL transactionsPIX / EMV QRWebhooks + HMACRules engineUnit tests
APIs & reporting
Coordinators and BI tools needing school data
A self-service reporting API that never accepts SQL
Coordinators and external spreadsheet and BI tools needed data, without anyone exposing SQL or the database schema.
5report entities (students, classes, teachers, assessments, report cards)
0raw SQL accepted: every query is built server-side
5client examples: curl, Python, Power Query, Sheets, Power BI
How I did it
- Designed a whitelist report engine: the client picks entity, fields and filters; the server builds a parameterized, read-only query
- Added a query builder for coordinators with CSV export, session login and CSRF protection
- Shipped a POST-only JSON/CSV Data API: keys in the header or body (never the URL), stored as SHA-256 hashes and shown once
- Generated the API documentation inside the admin area, next to key management
REST / JSONAPI-key securityPHPSQLPower BIGoogle Sheets
Data migration
Irreversible operations on a live school database
Safe data-migration tools: teacher-history takeover and a new-school importer
When a teacher leaves, the replacement must inherit the full history; new schools arrive with their data in messy spreadsheets.
12tables migrated in one guarded operation
3.6Mrows in the largest table handled
23real timetable clashes caught by the preview
How I did it
- Built a replace-teacher tool with candidates filtered by subject and timetable, and a stricter permission than the rest of the module
- Made a before/after preview mandatory, including a merged weekly timetable that flags clashes
- Wrote a CSV importer for typical exports: semicolons, Windows-1252 and BOM, dd/mm/yyyy dates, "R$ 13.000,00"
- Found and fixed 3 defects in the schema file that would have broken every new install
MySQLTransactionsCSV & encodingsUX for irreversible actions
Product build
Early-childhood education · national curriculum framework
Designed an early-childhood module around descriptive assessment
The platform was built around grades and rankings, which do not fit early-childhood education: progress is described, not scored.
5phases delivered, staff and family sides
12dedicated tables shipped as a migration
Consent-firstphotos visible only with signed image consent
How I did it
- Development reports by the framework's experience fields, with objectives per age band and a draft/publish step
- Daily routine log (sleep, meals, mood, activities) and school-to-family notices with read receipts and e-signed consent
- Photo portfolio stored outside the web root and streamed through a logged-in, ownership-checked route
- Lesson planning with curriculum-coverage bars and a transition report pre-filled from earlier reports
PHP MVCMySQLPrivacy by designSecure file deliveryParent-facing UX
Product build
Spaced-repetition prep for a national entrance exam
Turned an in-school exam-prep tool into a standalone product
A spaced-repetition review tool worked inside one school's portal; the goal was a product anyone could subscribe to.
40–60topics ranked by a short diagnostic
15–25questions per micro-test, from a 160-question bank
Real studentsvalidated the review-scheduling engine
How I did it
- Integrated the tool into the student portal with a shared login session
- Fixed coordinator edits never reaching students by serving a single read-only catalog API
- Wrote the spin-off roadmap: decoupling, external sign-up, payment-platform webhook for access, adaptive diagnostic
- Started the standalone app on Laravel 13 with Inertia/React and Tailwind
LaravelReact / InertiaTailwindPayment webhooksData modeling
AI & automation
Children's animated-music channel + companion books
An end-to-end AI production line, from script to video, Shorts and books
Each classic tale needed a music video, vertical Shorts and printable books, on a fixed monthly AI-credit budget.
8deliverables per story
13Shorts cut from one clip
−14 LUFSstreaming loudness target, two-pass normalized
How I did it
- Standardized the flow: script and lyrics, a ~24-scene shot list, AI images, song and scenes generated in batches
- Word-level lyric timing with faster-whisper; ffmpeg assembly cut on the beat with two-pass loudness normalization
- Built books from the same assets: 4× upscaling, PDF and EPUB editions, print edition with bleed and spine, coloring books
- Automated YouTube metadata, thumbnails, captions, playlists, made-for-kids flag and scheduling through the API
- Every story's credit estimate is approved before anything is generated
Pythonffmpegfaster-whisperReal-ESRGANreportlabYouTube Data APIGenerative AI
Full-stack
Consumer quiz and curious-facts site
A trivia platform that publishes a fresh edition every day
Years of quiz archives across two older sites had to become one fast platform that publishes daily without repeats.
112,000+de-duplicated questions
272topics × 60 questions (easy, medium, hard)
22command-line tools
How I did it
- Evolved the product from static HTML/JS to server-rendered PHP to a dependency-free PHP 8.4 platform
- Wrote a legacy importer that normalizes and de-duplicates every past archive
- Daily publisher prefers the least recently used questions, never overwrites a finished edition and logs every run
- Encoded editorial rules in code, plus a readiness gate that keeps a topic out until it has enough source-checked questions
- Prototyped a verification-first publisher on local open-weight LLMs that separates confirmed from uncertain claims
PHP 8.4MariaDB / MySQLNode.jsLocal & hosted LLMsBootstrap 5.3
Full-stack
Product-review and price-comparison site
A Next.js review and comparison site that publishes four pieces a day
An editorial product-discovery site needed several merchants per product, clean data and a daily publishing routine.
4 / dayreview, guide, ranking and comparison
23data models
77TypeScript test cases
How I did it
- Built on Next.js (App Router), React and strict TypeScript, with Prisma on MySQL, Auth.js and Zod
- Designed a multi-merchant affiliate layer: provider registry, several offers per product, click tracking
- Made the daily routine safe: transactional batch inserts and a 3-way duplicate check on ID, slug and name
- Generated llms.txt and structured data for search and AI crawlers
Next.jsReactTypeScriptPrismaMySQLVitestSEO
Full-stack
Public invitation, RSVP and supplier-directory platform
An invitation and RSVP platform built privacy-first
Anyone can create an invitation and share a link, but the party address must never reach people without access.
3address-privacy modes
9 + 7invitation templates and fonts
11partner categories in the directory
How I did it
- PHP 8.3 front controller with Post/Redirect/Get and CSRF checked once, in the router, for every POST
- Signed 90-day access cookies, lockout after 5 wrong codes, IPs stored only as hashes
- First-party analytics with a daily salt: counts unique visitors without tracking them across days
- Guest exports to xlsx, PDF, CSV and .ics; gift showcase synced daily from a marketplace API, with a fallback
PHP 8.3MySQLGDLeafletPrivacy engineeringCron
Reliability
Content site, web app and 7 scheduled routines on shared hosting
Kept production sites up inside strict shared-hosting limits
The host caps database connections per hour, and going over returns HTTP 500 on every page. Later, the host blocked all local TCP connections.
500 / hconnection cap diagnosed from MySQL error 1226
19 of 20test runs where the old lock let two routines in, now fixed
7routines behind a shared connection budget
How I did it
- Batched queries onto one connection and added a test that fails if any connection is opened inside a loop
- Added a shared hourly budget that stops scripts long before the cap
- Rewrote locking so it is tied to the owning process, with a regression suite in a throwaway folder
- Restored a Node.js app after a host-side TCP block by moving it to a Unix socket behind a PHP proxy, with an hourly watchdog
- Mapped the 5-minute edge cache and a firewall rule so deploys are checked at the origin first
LinuxBashNode.jsPHPMySQLCDN cachingIncident response
SEO & growth
Content, affiliate and event sites
Content-quality cleanup and search readiness, measured before acting
A content site needed ad-network approval and better search quality, but nobody knew which pages were holding it back.
536articles audited
69%of articles were thin, and drew only 23% of views
700words: new publishing floor, enforced in code
How I did it
- Measured length and traffic for every article before touching anything
- Unpublished thin pages reversibly (draft status, editor note, undo SQL script)
- Enforced the quality gate on all three publishing paths: API, admin list and review screen
- Added schema.org markup (Article, FAQPage, Event, Place, Product, ItemList…), dynamic sitemaps and llms.txt
Technical SEOschema.orgSearch ConsoleGA4SQL
Infrastructure
Production firewall at a cloud-desktop provider
Verified a production VPN change before it went live
Six IPsec tunnels on a busy production firewall had to change without breaking any of the others.
136IPsec tunnels reviewed
189Phase 2 entries checked for overlaps
6 of 6intended changes confirmed, nothing else touched
How I did it
- Checked each edited tunnel against the right remote networks, with Phase 1 settings unchanged
- Confirmed no subnet was assigned to two tunnels and no firewall-rule reload was pending
- Read the configuration history to make sure only the intended saves were present
- Wrote the post-apply verification steps
IPsec / VPNFirewallsChange managementWindows ServerRDP
Customer escalation
Publisher after a major Prebid upgrade
Programmatic revenue troubleshooting
A publisher experienced a measurable performance change after a major Prebid upgrade.
OutcomeThe investigation isolated the most likely contributors and gave both technical and business stakeholders a clear action plan.
How I did it
- Compared behavior across browsers and environments
- Reviewed identity, bidder, server-side, and consent configurations
- Analyzed auction data and reporting differences
- Separated technical findings from business impact
- Delivered recommendations to improve performance and monitoring
Prebid.jsPrebid ServerConsentIdentity
Automation
Customers and internal teams
Reporting and proactive performance monitoring
Customers and internal teams depended on manual reporting and reactive investigation.
OutcomeFaster analysis, less manual work, earlier awareness of issues, and more proactive customer communication.
How I did it
- Used SQL, Python, APIs, and dashboards to automate reporting
- Reduced repetitive data collection and comparison
- Created visibility into performance changes earlier
- Translated metrics into clear customer-facing explanations
- Improved follow-up through repeatable processes
SQLPythonAPIsDashboards
Infrastructure
Systems and cloud environments
Technical support across systems and cloud environments
Complex incidents often require investigation across several layers rather than one isolated tool.
OutcomeIssues were translated into understandable next steps, ownership remained clear, and technical teams received actionable evidence.
How I did it
- Windows Server, RDP, Linux, and macOS support
- SQL Server installation, upgrades, and troubleshooting
- Networking, firewall, port, and connectivity investigation
- REST API, JSON, HTTP status, and authentication analysis
- Customer communication from first report through resolution
Windows ServerSQL ServerNetworkingREST APIs