File TL-2026 / Portfolio Morocco — Moldova / Remote Est. 2014, still shipping
Taoufiq Lotfi — halftone dossier portrait
Subject / T. Lotfi Issued — Agadir · Souss‑Massa

Taoufiq Lotfi

From freelance Android apps in Morocco to the CTO seat — I architect, build, and operate every layer: mobile apps, web platforms, ML pipelines, and the self-hosted infrastructure they run on.

CTO @ Veedoo Founding engineer @ Baseloop Whole systems, end to end

Open the file ↓

ParliamentConnect, built solo — every parliamentary speech found, clipped, and attributed at 98%. At Baseloop, I moved a live product off its SaaS stack with zero downtime — 70% cheaper, 3,000+ concurrent runs. Exhibits below.

Commit log / last 365 days

10,758 contributions in the last year

Volume isn't the point — generating code is cheap now. This is here for one reason: consistency. Showing up to the hard problems almost every day is the habit behind everything below.

the year before — how I ship five times more with AI github.com/tao101
2025 → 2026 — real data
active days
333 of the last 365
day streak
150 longest run, no gaps
busiest day
224 Aug 10
weeks logged
53 2025 → 2026

Career route / 2014 → now

Ten years, five turns.

  1. 01 / 05

    2014–2017

    Morocco · المغرب

    Freelance Android beginnings

    Built native Android apps with Java while studying at Université Ibn Zohr, learning client communication and shipping discipline through real freelance work.

  2. 02 / 05

    2017–2019

    Kharkiv, Ukraine

    The move to Ukraine, and React Native

    Moved from Morocco to Kharkiv for Computer Engineering, went cross-platform with React Native, and managed full app lifecycles from development to store submission.

  3. 03 / 05

    2019–2022

    Joined Veedoo

    Full-stack web and mission-critical platforms

    Moved from mobile to React, Next.js, Node, PHP, Docker, CMS architecture, Lifeline Ukraine, Ukraine Shelter, and EUvsDisinfo.

  4. 04 / 05

    2023–2025

    Remote

    Solo scale, self-hosting, and AI systems

    Scaled EveryRun solo, adopted Coolify and Hetzner, built text-to-SQL and AI research systems, and made architecture the center of delivery.

  5. 05 / 05

    2025–Now

    CTO / Founding Engineer

    Setting the technical direction

    Made self-hosting the default across every project, put AI tooling in every repository, and took the delivery stack off SaaS — while building ParliamentConnect solo on serverless GPUs.

The evidence / exhibits 01–04

The work is the proof.

Four real systems, shipped and live. Each exhibit opens with the name, then the evidence: the screenshots, the numbers, and the architecture that made it work.

Exhibit 01 — AI/ML pipeline · solo

Case 01 / 04 speaker-attribution accuracy Status — live

The ParliamentConnect workspace: cross-party speech clips populating a dashboard, then AI search returning matched clips.

98% speaker-attribution accuracy

parliamentconnect.com — live

Parliamentary speech, automatically discovered, attributed, and published.

A six-stage pipeline on RunPod serverless GPUs (RTX PRO 6000, 96GB): pyannote diarization, faster-whisper transcription, custom lip-sync active-speaker detection, and pgvector face recognition with three-tier thresholds — a full session becomes attributed, publishable clips in 30–45 minutes at 98% accuracy.* I built the pipeline, the Next.js platform it publishes to, and the MCP server that opens the clip library to AI assistants, from zero prior ML experience.

  • Python
  • CUDA
  • RunPod GPUs
  • pgvector
  • Face recognition
  • Next.js
Visit ParliamentConnect

98% is a ceiling, not a rounding. Some passages cannot be resolved from voice and face alone, and some clips are pure chamber noise — a “hear, hear” with no identifiable member to attribute.

System schematic — six-stage GPU pipeline

  1. Ingest — Session video
  2. Diarize — Who speaks when
  3. Transcribe — Faster-whisper
  4. Detect — Active-speaker detection, in-house
  5. Face-ID — pgvector match
  6. Attribute — Clips then added to the DB

Diagrammed above

The six-stage AI/ML pipeline, on RunPod serverless GPUs — a full session in 30–45 minutes.

Also mine

The Next.js platform it publishes to: auth and permissions, storage management, a web video editor, the clip creator, transcription, and an MCP server that lets AI assistants search clips and transcripts.

Exhibit 02 — EU platform

Case 02 / 04 documented cases · 13 languages Status — live

The EUvsDisinfo case database: a flagged disinformation case archived, hashed, and anchored to the Bitcoin blockchain as tamper-evident evidence.

19,000+ documented cases · 13 languages

euvsdisinfo.eu — live

The Disinformation Management System for the European External Action Service.

I own the backend and CMS architecture of the 13-language editorial platform — and the CMS itself, for the analysts and editors working in it every day, including the tools they use to find, document and publish cases. Under it runs an evidence pipeline triggered by a webhook with zero analyst intervention: full-page archives, screenshots at multiple viewports, and an OpenTimestamps proof anchored to the Bitcoin blockchain for every case.

  • Node.js
  • Multilingual CMS
  • OpenTimestamps
  • Bitcoin anchoring
  • Postgres
Visit EUvsDisinfo

Evidence chain — archive, hash, anchor

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

  1. Case flagged — One click
  2. Archived — Full HTML + screenshots
  3. Hashed — Tamper-evident
  4. Anchored — Bitcoin · OpenTimestamps

Diagrammed above

The evidence pipeline: a flagged case is archived, hashed, and anchored to the Bitcoin blockchain through OpenTimestamps — automatic on every one of 19,000+ cases, across 13 languages.

Also mine

The CMS the analysts and editors work in every day: a four-role permission model over a draft, submitted, awaiting-approval and published workflow; case discovery and URL capture that resolves the publisher and detects the language; GPT-assisted debunk drafting with switchable models; Buzzsumo reach data; live presence warnings for co-editing; bulk publish; and Excel reporting by state, outlet and publication status.

Exhibit 03 — scaled solo

Case 03 / 04 users scaled solo Status — live

The EveryRun events map filling with running-event pins, a runner joining an event, and the community counter climbing to 17,659.

80 → 17,659 users scaled solo

everyrun.world — live

Fourteen months as the only engineer behind a growing running platform.

Owned every layer: GPS-tracked runs with live leaderboards over Postgres LISTEN/NOTIFY, Stripe Connect routing donations to charities, Neon branch-per-PR previews, and a 30-page handover so the product outlived my involvement.

  • Next.js
  • Expo
  • Neon
  • Drizzle
  • Stripe Connect
Visit EveryRun

The stack — one engineer behind every layer

Fourteen months, one engineer on all five — then a 30-page handover so it outlived me

  1. Mobile — Expo
  2. Web — Next.js
  3. Realtime — Postgres LISTEN/NOTIFY
  4. Payments — Stripe Connect
  5. Infra — Neon branch per PR

Diagrammed above

The five layers, and the one pair of hands on all of them: GPS-tracked runs, leaderboards moving live over Postgres LISTEN/NOTIFY, Stripe Connect routing donations to charities, and a Neon branch for every pull request. Fourteen months, 80 runners to 17,659.

Where it is now

Rebuilt on Next.js 16 and self-hosted Supabase, bilingual across English and Ukrainian: a runner dashboard and run history, an admin side for locations, partners, reviews, orphan runs and t-shirt claims, LiqPay payments, and around twenty Trigger.dev jobs running awards, result publishing, weather backfill and every transactional email.

Exhibit 04 — founding engineer

Case 04 / 04 and a 15× higher concurrency ceiling Status — live

Baseloop — product screenshot

70% cheaper and a 15× higher concurrency ceiling

baseloop.io — live

Go-to-market teams describe an enrichment workflow; an agent builds the table.

I took the product off its SaaS stack and onto self-hosted Coolify and Hetzner — Supabase on a dedicated CCX43, the Trigger.dev webapp on a CPX52, four CPX42 workers — against live production, real users, and no downtime budget. That meant reading Trigger.dev's Go and TypeScript source where the docs ran out, and catching what nobody documents: Postgres sequence resets, auth sessions that have to survive the move, storage permissions that do not. Alongside the infrastructure I build the product itself in CedarJS.

  • CedarJS
  • GraphQL
  • Trigger.dev
  • Self-hosted Supabase
  • Coolify
  • Hetzner
Visit Baseloop

The bill went from $700–800+ a month to €205. The ceiling went from 200 concurrent runs to 3,000+ — the old one was a pricing tier, not a limit of the work.

Migration ledger — the SaaS stack against the self-hosted one

Migrated against live production — real users, real data, no downtime taken

  1. Was — $700–800 a month — Supabase 2XL, Trigger.dev Pro, concurrency bundles
  2. Now — €205 a month — Hetzner CCX43, a CPX52, four CPX42 workers
  3. Ceiling was — 200 concurrent runs — a pricing tier, not a limit of the work
  4. Ceiling now — 3,000+ concurrent runs, uncapped

Diagrammed above

The bill and the ceiling, before and after: off Supabase's 2XL tier and Trigger.dev Pro, onto Coolify and Hetzner. The old ceiling was a pricing tier rather than anything the work required — lifting it cost less than paying for it.

Also mine

The product itself, in CedarJS: the agent that assembles an enrichment workflow from one plain-language prompt, enrichment across 40+ data sources, and the sync back into HubSpot, Salesforce, Attio and Pipedrive. Three pieces of the migration are published as open source so the next person does not repeat it.

Capability wall / the working stack

One owner, from strategy to infrastructure.

The mascot turns a crank at the foot of a single drive shaft that runs straight up through five stacked plates — infrastructure, ML, backend, architecture and strategy — one pair of hands driving the whole stack instead of one layer of it.
One drive, five layers swipe to read
Own the whole system
Strategy Architecture Backend ML Infrastructure Interface
Product engineering
Svelte React Next.js React Native Expo TypeScript CedarJS GraphQL Stripe Connect PostHog Playwright Sentry
Backend and data
Node.js NestJS Python PostgreSQL Supabase Drizzle Neon Redis ClickHouse ElectricSQL MongoDB
AI and ML
OpenAI Claude RAG Embeddings pgvector faster-whisper pyannote Diarization Face recognition CUDA MCP servers
Infrastructure
Docker Docker Swarm Coolify Dokploy Hetzner RunPod Trigger.dev MinIO Traefik n8n
How I work
Claude Code Codex Superset worktrees Agentic SDLC Parallel agents Review gates Self-hosting

Every name above is in production somewhere I'm responsible for.

Witness statements / on the record

What the people I built with say.

Statement 01 / 09

Taoufiq had helped Veedoo deliver world-class software solutions for almost a decade. He's always matched his deep technical knowledge, with a flare for creative problem solving to deliver software solutions which are accessible, secure and designed to scale.

As we've moved into the AI era, Taoufiq has helped us setup, implement and manage our AI coding environment and constantly keeps ahead of the latest developments.

He's also a great person and committed team member, who is highly regarded by his colleagues.

Ian Bearder Owner, Veedoo On nine years at Veedoo, and the AI coding environment I set up and run

Commission / fixed scope

A working MVP, Live in 30 days.

Fixed scope, milestone payments, deployed product, source ownership, and handover. Starting from €8,000.

Start a build
  1. 01 Scoping call

    Define the build, agree scope and price

  2. 02 Week 1

    Design, architecture, first deploy

  3. 03 Weeks 2–3

    Core build with weekly demo links

  4. 04 Week 4

    Polish, launch, handover

Two paths / same owner

Bring me onto the team, or have me build the product.