Employment record / chapter file

Veedoo

CTO 2019 – Present 10 exhibits

  • 19,000+cases · 13 languages
  • 98%speaker attribution
  • 3 daysinvasion to live platform
  • promoted, mid to CTO
  1. CTOMid 2025 – Present
  2. Lead Full Stack Developer2022 – 2025
  3. Mid Full Stack Developer2019 – 2022

Veedoo is a European digital consultancy building multilingual platforms for the public sector, nonprofits, and EU-funded projects. I never applied — they found me through five years of freelance reputation and reached out in 2019. I joined as a mid-level developer and was promoted three times in six years: mid to lead in 2022, on the strength of the EUvsDisinfo work, and to CTO in 2025.

As CTO I own technical strategy across the whole portfolio: I made Coolify on Hetzner the default deployment platform for every Veedoo project, wrote the company's AI usage guide, put Claude Code and a CLAUDE.md in every repository, set up MCP servers per project, trained every developer on Cursor, and turned invoices and reporting over to n8n automations.

The mascot stands on a run of flat interlocking floor plates and presses a tamper straight down to seat a fresh plate into the seam; three completely different machines run on the same floor.
The role, as floor work
Exhibit 01

EUvsDisinfo

EUvsDisinfo — a disinformation case page with evidence records
euvsdisinfo.eu — the public case database

Veedoo's flagship project for the European External Action Service — a nine-year platform documenting Russian disinformation for millions of annual readers, with 19,000+ cases published in 13 languages. I owned the backend and CMS architecture of the Disinformation Management System, the secure editorial platform behind it.

The part I'm proudest of is the evidence pipeline. When an analyst flags a page, a Sanity webhook fires and the system does the rest with zero human intervention: Puppeteer captures full-page screenshots at multiple viewport sizes, archives the complete HTML with inline assets, and anchors an OpenTimestamps proof to the Bitcoin blockchain. Disinformation gets deleted; the evidence doesn't.

I also carried the platform through two major Sanity migrations — v1 to v2 in 2022, v2 to v3 in 2024 — rewriting every custom Studio plugin and GROQ query with zero content loss across all 19,000+ documents, and built the cross-language validation that keeps 13 language versions of every case in sync.

Because the project is EU-funded, every byte had to live on EU servers. That data-residency rule is where my whole self-hosting philosophy started.

  • Node.js
  • Sanity CMS
  • OpenTimestamps
  • Bitcoin anchoring
  • Postgres
  • Puppeteer

Evidence chain — archive, hash, anchor

× 13 languages — automatic on every one of 19,000+ cases

Visit euvsdisinfo.eu
Exhibit 02

Lifeline Ukraine

Lifeline Ukraine — the national suicide-prevention hotline site
lifelineukraine.com — the hotline platform

Ukraine's national suicide-prevention hotline platform, at lifelineukraine.com — over 100,000 consultations since the service began. I built and maintained the platform from 2021: anonymous GDPR-compliant chat that stores no PII, a quick-exit button for people browsing in unsafe environments, WCAG 2.1 AA accessibility, and a free online suicide-awareness training course with progress tracking and completion certificates.

After the 2022 invasion, demand grew by orders of magnitude — including refugees abroad who could no longer dial the national number. Caching layers, query optimization, and monitoring kept a life-critical service at zero downtime, tested down to low-bandwidth rural connections.

  • Next.js
  • Node.js
  • Postgres
  • GDPR by design
Visit lifelineukraine.com
Exhibit 03

Ukraine Shelter

Ukraine Shelter — map-based search for host accommodation
ukraineshelter.com — hosts matched to displaced families

Russia invaded on February 24, 2022. We registered ukraineshelter.com on the 25th and the platform was live on the 27th — built in three days, while I was relocating out of Kharkiv myself. It matched displaced Ukrainians with people offering rooms in their homes: structured host and guest flows, a matching algorithm, and map-based geographic search, engineered for high availability because downtime meant someone didn't find shelter. Volunteer-run for as long as the need lasted; its mission is now served.

  • React
  • Node.js
  • Rapid deploy
Visit ukraineshelter.com
Exhibit 04

ParliamentConnect

ParliamentConnect — the clip workspace of the parliamentary speech platform
parliamentconnect.com — attributed speeches, live

A platform that automatically discovers, transcribes, attributes, and publishes parliamentary speeches — live at parliamentconnect.com. I built the entire thing solo, starting with zero Python, ML, or CUDA experience.

The pipeline runs on RunPod serverless GPUs (NVIDIA RTX PRO 6000, 96GB VRAM) and turns a 2–8 hour parliamentary session into attributed clips in 30–45 minutes — work that takes human teams days. Six stages: pyannote.audio diarization (a 4-hour session segmented in 10–15 minutes), faster-whisper large-v3 multilingual transcription running 4× faster on CTranslate2, active-speaker detection with a custom lip-sync temporal model, RetinaFace face detection, and recognition against 128-dimension embeddings in pgvector — cosine similarity with three-tier thresholds: above 0.85 auto-attributes, 0.70–0.85 queues for review, below 0.70 skips. The result is 98% speaker-attribution accuracy.

Everything is event-driven — a Postgres trigger calls RunPod over pg_net, no polling anywhere — and clips land in the UI live over Supabase Realtime. Publishing goes through self-hosted Postiz: users connect X, Facebook, LinkedIn, and Instagram once and publish everywhere without ever seeing another tool.

  • Python
  • CUDA
  • RunPod GPUs
  • pgvector
  • Face recognition
  • Next.js
  • MCP server
  • Supabase

System schematic — six-stage GPU pipeline

Visit parliamentconnect.com
Exhibit 05

The Next.js rescue

In 2020 a client's content site — 500+ blog posts on a client-rendered React SPA — was invisible to search engines and slow for readers. I migrated it to Next.js static generation with incremental regeneration: time-to-first-byte went from 2–3 seconds to under 100 milliseconds, and rankings recovered almost overnight. It became the template for how Veedoo ships content platforms.

Exhibit 06

OptiGen

An AI lead-generation system for a pharmaceutical client: it monitors FDA, EMA, and PMDA regulatory databases for new drug approvals, then builds decision-maker dossiers from public sources with GPT-4 and scores their relevance. Node.js, Puppeteer, and Cheerio do the gathering; PostgreSQL and a React dashboard hold the results; a human feedback loop tunes the scoring. The AI researches, the human writes the outreach — human-in-the-loop by design, not as a fallback.

Exhibit 07

Veedoo Community Platform

A full community and learning platform in the Skool mold: Next.js server components on self-hosted Supabase, multi-tenant isolation enforced with Postgres RLS, AI thread summarization and course-content generation gated by the OpenAI Moderation API, and creator payouts on Stripe Connect Standard — with an idempotent webhook lifecycle handling checkout, failed payments, and cancellations without double-provisioning anything.

Exhibit 08

Runday

Runday — the running events platform with map search
runday.org — the nine-year platform

A nine-year Veedoo platform powering free community 5K events — 18,000+ runners across 5,000+ events in multiple countries, with race timing and a mobile app. My 2024 contribution: a "chat with our DB" feature that lets non-technical organizers ask questions in plain language. GPT-4 writes the SQL, but inside a cage — SELECT-only whitelist, read-only replica, query timeouts, result-size limits, and PII redaction.

  • Next.js 16
  • Self-hosted Supabase
  • Trigger.dev
  • Text-to-SQL
Visit runday.org
Exhibit 09

Icons of Ukraine

Icons of Ukraine — the 2021 cultural project site
Icons of Ukraine — 2021 cultural project

A 2021 cultural project — PHP MVC backend with MySQL behind a React front end. It broadened my backend range beyond the Node.js ecosystem at exactly the moment the harder platform work needed it.

Exhibit 10

Go Help Now

A two-year humanitarian engagement serving thousands of users: volunteer matching, donation processing, and housing coordination, plus the branding, visual identity, and modular design system it shipped with.

On the record

Who was there.

  • Ian Bearder Owner, Veedoo Taoufiq had helped Veedoo deliver world-class software solutions for almost a decade.
  • Roman Antonenko Director, Veedoo Taoufiq is a talented developer who is passionate about programming.
  • Paul Nailand Lifeline Ukraine I've been impressed with the level of professionalism of the Veedoo team and management since we began working together almost 5 years ago.
  • Alona Lashchenko Runday The company's dedication to excellence is reflected in every aspect of their work.
  • Chaimae Michich Colleague, Veedoo I've had the chance to see Taoufiq's work up close, and what stands out immediately is his rare combination of deep technical expertise and true ownership.
  • Adriana Mytsyk Designer, Veedoo I worked with Taoufiq in the same team, and it was a great experience.
  • Andrii Mazurenko Developer, reported to me I had the pleasure of working with Taoufiq — a skilled developer and excellent mentor.
  • Victoria Monastyrska Colleague, Veedoo It has been a pleasure working with Taoufiq.
All nine statements, in full