The Hague, Netherlands

I design integrated circuits, and I build the software around them.

Microelectronics MSc at TU Delft, working on analog and mixed-signal design and taking digital designs through to signed-off GDS. Founder and CTO at Vindi Biosystems, where we are developing photonic biosensor chips for continuous biomarker monitoring. Seven years of backend and platform engineering runs alongside all of it.

Projects
24
Open-source tools
12
Roles
15
Years shipping software
7
Daniel Tyukov

Currently

  • Teaching Assistant, Data Science & AI EducationDelft University of Technologysince Jul 2026
  • Founder & CTOVindi Biosystemssince Sep 2025
  • Senior Software Engineer & Technical LeadAlpha Technologies Inc.since Jan 2022

01 / Work

Roles

2019 to now

The top three run at the same time and are separate commitments, each with its own employer, subject and deliverables. The list below is every role, current first.

  1. Jul 2026 - Present4 mos

    Teaching Assistant, Data Science & AI Education

    Delft University of TechnologyPart-timeHybrid

    Building an open repository of real-world AI cases for BSc engineering students, with industry and NGO partners.

    • Develop AI and machine learning cases and student assignments with industry partners
    • Create educational material that embeds ethical reasoning directly into the technical workflow
    • Maintain the GitHub repository structure and the open-access publication of the material

    Teaching assistant for the NRO Comenius Senior Fellows project “From Classroom to Reality: Integrative Data Science and AI Challenges for Real-World Ethical Practice”. The project builds an open, Creative Commons licensed repository of real-world AI cases, co-created with students, companies and NGOs, to prepare BSc engineering students for responsible data science and AI practice.

  2. Sep 2025 - Present1 yr 2 mos

    Founder & CTO

    Vindi BiosystemsPermanent

    Building a wearable continuous-biomarker monitor around a patent-pending sensing technology.

    • Developing PICTURE, a patent-pending sensing technology that measures up to 24 biomarkers continuously
    • Wearable form factor in the style of a continuous glucose monitor, so readings come without hospital visits or invasive tests
    • Owning the technical direction from sensing front end through to the data path clinicians see

    Vindi Biosystems is building a wearable device, similar to what diabetes patients already use, that reads up to 24 biomarkers 24/7 and gives the wearer and their doctor a real-time window into heart, kidney and liver function. The aim is to catch early warning signs before symptoms appear.

  3. Jan 2022 - Present4 yrs 10 mos

    Senior Software Engineer & Technical Lead

    Alpha Technologies Inc.Full-timeRemote

    Backend infrastructure lead for a portfolio of client projects, and manager of the Python and ML team.

    • Built the backend infrastructure for a portfolio of client projects and carried them from development into production
    • Set the DevOps practice, covering deployment, environments and release process
    • Manage a team of Python and machine learning developers

    Backend and infrastructure work across a wide range of client projects, from first commit to production deployment, alongside line management for the Python and machine learning developers.

    StackPythonFlaskJavaScriptNodeJSMongoDBSQLPostgreSQLReactJS

  4. Feb 2026 - Aug 20267 mos

    Research Engineer, Micro-LED Bonding Characterization

    Delft University of TechnologyVolunteer

    Designed the v2 characterization board for a pressureless micro-LED die bonding study at TU Delft ECTM.

    • Designed the v2 characterization board in KiCad with Van der Pauw and TLM structures for sheet and contact resistance
    • Laid out a 6x6 design-of-experiments bond-pad array and daisy-chained micro-LED test strings
    • Added NTC thermistors and thermocouple pads for temperature monitoring during bonding
    • Prepared the fabrication outputs and the solder-paste stencil for cleanroom assembly
    • Ran the electrical characterization that separated eight blind-coded assembly conditions across 120 channels

    Contributor to a TU Delft (ECTM / Microelectronics) research project studying how small (~1 mm²) micro-LED dies bond to a PCB using a pressureless pick-and-release method, in collaboration with ITEC B.V. / Nexperia and co-financed by the Netherlands Enterprise Agency (RVO). Alongside the board design I supported the electrical characterization of the bonded dies.

    StackKiCad

  5. Aug 2023 - Jun 20262 yrs 11 mos

    Software Engineer

    ComChampFull-timeRemote

    Backend and frontend development on a unified CRM and workflow platform for multi-channel communication.

    • Developed multi-channel communication software across CRM, web, call centre and face-to-face channels
    • Worked on the NestJS and PostgreSQL backend with Prisma, RabbitMQ and Redis, plus the ReactJS frontend
    • Presented "How ComChamp ships with Claude" at an Anthropic organized event in Eindhoven

    Development on a workflow platform used by Dutch brands to run customer communication across several channels at once. The work spanned queueing and caching in the backend through to the React interfaces agents use day to day.

    StackTypeScriptNestJSReactJSPostgreSQLPrismaRabbitMQRedis

  6. Sep 2023 - Aug 20252 yrs

    Founder & CEO

    LeenLoketPermanent

    An app-based borrowing system for tools and household items, running on smart lockers placed around the city.

    • Built the mobile app and the locker firmware, reserve, borrow and return by QR or PIN code
    • Added RFID item verification and a transparent late-return system to the locker flow
    • Partnered with municipalities so low-income households get free or discounted access
    • Top 10 qualifier at the TU/e Contest 2025

    LeenLoket is an automated borrowing system powered by smart lockers placed around the city. Users reserve, borrow and return tools or household items through the app, with self-service access 24/7. The municipality partnerships were the point: shared access to tools works only if the people who benefit most can afford it.

  7. Oct 2024 - Dec 20243 mos

    CBL Student Team Coach, Programming and Engineering Challenge (5EWC0)

    Eindhoven University of TechnologyPart-time

    Coached two student teams through the Rock Your Baby challenge-based learning course.

    • Coached two teams through the embedded design and control algorithm work for the Rock Your Baby challenge
    • Reviewed team progress against the course milestones and the competition criteria

    Coach for two student teams in 5EWC0, the same Rock Your Baby challenge I had competed in two years earlier. The course puts first-year teams on an embedded sensing and control problem with a competitive endpoint, so most of the coaching is about narrowing the approach early enough to leave time to measure it.

  8. Jan 2023 - Sep 20241 yr 9 mos

    Avionics Engineer

    Aero Team EindhovenVolunteer

    Worked on the drone avionics system, from PX4 flight control through to the power train.

    • Worked with PX4 flight controllers and the actuators driving the aerodynamic control surfaces
    • Selected motors and power-train equipment, including battery management
    • Contributed to the electrical circuit design for the avionics stack

    Student team work on the drone avionics system: flight control, control-surface actuation, and the electrical design and component selection behind them.

    StackPX4

  9. Sep 2023 - Mar 20247 mos

    Founder & CTO

    DishrPermanent

    An AI meal planner that reads a local grocery store's catalogue and turns a nutrition goal into a shopping list and recipes.

    • Built the planner that maps a user's nutrition goals onto what a specific local store actually stocks
    • Generated the weekly recipe set and the matching purchase list from one plan

    Dishr interfaced with a local grocery store and recommended exactly what to buy and what to cook to meet a nutrition goal. The interesting constraint was the store catalogue: a plan is only useful if every ingredient in it is on a shelf nearby this week.

  10. Sep 2022 - Jan 20235 mos

    Software Engineer

    SimbukaFull-timeHybrid

    Development on a cloud loan management platform.

    • Built features for a cloud-hosted loan management solution in Laravel
    • Worked on the SQL data model and the Docker-based development environment

    Feature and maintenance work on a cloud loan management product, across the Laravel application and its containerised development setup.

    StackPHPLaravelSQLDocker

  11. Jun 2022 - Sep 20224 mos

    Technical Lead

    Reyo Media CyprusFull-timeRemote

    Led the technical teams, covering delivery structure, staff progress and recruitment.

    • Took charge of the technical teams and the day-to-day running of technical operations
    • Monitored and evaluated staff progress, set goals and assisted with training and recruitment

    Technical lead over the delivery teams: setting goals, structuring the work, and handling training and recruitment alongside the engineering itself.

    StackPHPLaravel

  12. Sep 2021 - Jun 202210 mos

    Founder & CEO

    CobaltcupPermanent

    A digital agency that sold digital services to companies and placed the work with digital nomads around the world.

    • Led the team as CEO through the Junior Achievement Cyprus company programme
    • Presented the company to the JA judges and at the JA Cyprus event at the Mall of Cyprus in Nicosia
    • Won the Leadership Award 2022 at the JA Cyprus finals in May 2022

    Cobaltcup was a digital agency built in the Junior Achievement Cyprus company programme. Companies bought digital services from it, and the work went to digital nomads wherever they happened to be. The award announcement has photographs from the JA Cyprus event.

  13. Oct 2020 - Jan 20221 yr 4 mos

    Web Developer

    Technology VectorContractRemote

    Built and maintained client websites with a focus on SEO, plus work on an in-house CRM.

    • Developed and maintained a range of client websites, with SEO optimisation as the main brief
    • Contributed to an in-house CRM system

    Client website development and maintenance over about fifteen months, with SEO as the recurring requirement, alongside work on the company’s own CRM.

    StackPHPWordPress

  14. Aug 2019 - Oct 20201 yr 3 mos

    Web Developer

    UpworkFreelanceRemote

    Freelance web development for clients found through Upwork, from full web applications down to plain informational sites.

    • Built fully fledged web applications, among them a cryptocurrency exchange platform and CRM systems
    • Delivered a run of smaller information-based websites end to end, remotely

    Fifteen months of remote freelance work through Upwork. The jobs ranged from large web applications, a cryptocurrency exchange platform and CRM systems among them, down to straightforward information-based websites.

    StackJavaScriptPythonHTML/CSSReactNode.jsFlaskMongoDB

  15. Jun 2019 - Aug 20193 mos

    Web Developer

    Fidelity Technology SolutionsInternshipOn-site

    Summer internship on the company's main e-commerce site, adding pages and features and stabilising its Django backend.

    • Adjusted requested features and built the new pages the e-commerce site needed
    • Refined the Django backend that had been crashing the site intermittently

    A three-month internship on the main e-commerce website. Alongside the requested feature changes and new pages, the Django backend had issues that occasionally took the site down, and refining that was part of the job.

    StackJavaScriptPythonHTML/CSSDjango

02 / Projects

Things I have built

24 projects

Silicon, circuits, boards and software. Every number here was measured, not estimated: post-route rather than post-synthesis, on the bench rather than in simulation, and where a hypothesis failed it is written down as a failure.

Oct 2026 to Oct 2026

Reverse-Engineering Jane Street's Puzzle Chip from Its GDS (SKY130)

Jane Street's 2026 puzzle chip read back from its layout alone: a custom netlist extractor, a bit-parallel gate simulator and z3 show it is an 11x11 Star Battle checker that prints (* TWO STARS *).

Digital / ASIC

  • 1,618standard cells recovered from bare polygons, with no via landing on nothing
  • 230 of 230warm-up instances matched to the reference DEF, and 84 of 84 nets
  • 1,248sample-waveform outputs replayed through the extracted netlist, none wrong
  • 7 of 7Easter eggs found, including why the floating wire is not floating

In August 2026 Jane Street published the final GDS of a small SKY130 chip with no netlist and no signal names, and asked what it does. This solve was done in October, after the submission window had closed, with every step built as a script so the whole thing reruns in about 15 s.

The extractor merges li1 and the five metal layers into polygons, joins them across the 33,323 via cuts with a union-find, and attaches pins from the labels left inside each standard cell. It was tested on the warm-up first, where the post-route DEF still has the real names, and only then pointed at the puzzle. Cell functions come from the SKY130 Liberty file and are compiled into one Python function over integer bit-vectors, so a single pass simulates hundreds of inputs. Icarus Verilog running the official cell models agrees on 1903 cycles across 13 boards.

The useful experiment was 122 simulations at once, each placing one star at one board position. The flops that change separate eleven column counters, eleven region counters whose position sets are the region map, a 12-stage delay line for the adjacency rule and an 8-bit LFSR. z3 finds exactly one valid board, and fed to the extracted chip it raises success and prints (* TWO STARS *). Two independent routes give the same string: a SAT unroll of the raw netlist, and a brute force of the LFSR’s 256 seeds against the 15-byte message ROM (x8 + x6 + x5 + x4 + 1, recovered from traces).

The most interesting part was the seventh Easter egg. A metal-only extraction finds two inputs with no driver, which prints TWO“NOT TOUCH. The SKY130 LEF defines that a31oi_2’s A1 pin as two li1 rectangles that meet only through gate poly, and the router landed a different net on each half. Following poly joins exactly that one pair of nets, the message comes out right, and the result is graph-identical to an independent Magic extraction.

Oct 2026 to Oct 2026

Reverse-Engineering Jane Street's Neural Network Puzzles

Jane Street's two neural network puzzles solved from the raw weights: a 2721-layer ReLU network read back as a hand-built MD5 circuit that only accepts bitter lesson, and a residual network dropped into 97 shuffled layers put back together exactly.

ML & computing

  • 64 of 64MD5 steps located inside the network, one every 42 layers
  • 77%of 876,285 neurons are plain wires; the rest are logic gates such as AND, NOR and NOT written as ReLUs
  • 1.6 × 10−6largest gap to the original model's predictions after reassembling 97 layers, over 10,000 rows
  • 0.64 MBthe 1.16 GB model as sparse integer matrices, read without running its pickle

Jane Street has published two puzzles built from neural networks. In the first, a 1.16 GB PyTorch model with every weight visible returns 0 for almost any text. In the second, a trading model has been dropped into 97 linear layers, and the job is to put them back in order. Both were solved in October 2026, after the puzzles had closed, with every step written as a script that reruns in about 30 s and a test for every number in the write-up.

The first model is a pickle that rebuilds a Python function, so it is opened with an inert unpickler that never runs anything, and the function is decompiled from its CPython 3.10 bytecode. All 2721 layers have power-of-two weights and integer biases, which makes them a logic circuit: wires plus AND, NOR, NOT and a few other gates written as ReLUs. The last two layers compare 16 bytes against a constant, and probing random inputs finds all 64 MD5 steps inside, with two Kogge-Stone adders per step. Some intermediate sums never sit in a single neuron, only in linear combinations of them, which a linear probe recovers exactly. The same probes explain a known bug: the network counts characters instead of finding the end of the string, so anything over 31 characters overflows its length field. A word-frequency search over pairs of English words finds the preimage, bitter lesson, in a few seconds.

For the second puzzle, the trace of Wout Win pairs every input layer with its output layer, and the norm of the output layers rises with depth. Sorting by it and swapping neighbours rebuilds a network that matches the original predictions to 1.6 × 10−6, and the answer’s SHA-256 equals the hash in Jane Street’s checker. A slower search that assumes nothing reaches the same answer in about 13 minutes, and PyTorch running the original class definitions agrees with both reimplementations.

Sep 2026 to Oct 2026

tudelft-mcp: Brightspace, OSIRIS and MyTimetable for AI Assistants

Gives Claude, ChatGPT and other AI assistants your TU Delft courses, grades and timetable after one sign-in, and previews every change before making it.

Software

  • 66tools across Brightspace, OSIRIS, MyTimetable and the Study Guide
  • 171tests, run on Linux, macOS and Windows under Node 20 and 22
  • 9MCP clients the setup command detects and configures

An MCP server that runs on a student’s own machine and connects an AI assistant to four TU Delft systems: Brightspace for courses, materials, assignments, grades and discussions, OSIRIS for official results and registrations, MyTimetable for the schedule, and the public Study Guide. You can ask what is due this week, what changed since yesterday, or where a topic is covered in the lecture slides.

Sign-in happens once, in a window of your own browser, and OSIRIS and MyTimetable connect in the same window after single sign-on. When a token later expires, the server reopens that browser profile headless and lets single sign-on finish without a window; only a fresh password or MFA prompt needs you again. Tokens are kept in owner-only files (DPAPI on Windows), never returned to the model, and stripped from every link a tool returns. Every write, from submitting an assignment to registering for an exam, is split into a prepare step that returns a preview and a confirm step that acts on it. Course materials can be synced into a local full-text index, with text pulled from PDF and Office files and ranked by BM25 with fuzzy matching.

Published on npm with one-line installers for macOS, Linux and Windows. ChatGPT, which cannot launch a local process, connects over HTTP through a tunnel with a bearer token. Not affiliated with TU Delft.

Sep 2026 to Sep 2026

Anti Brainrot: Feeds and Shorts Behind a Friction Timer, in the Browser and on Your Phone

Hides YouTube Shorts and puts social feeds, distracting sites and apps behind a countdown and a timed pass, in the browser and on your phone.

Software

  • 20site presets covering the feeds of 16 platforms, plus custom patterns
  • 88extension tests in CI, beside a separate Android build job
  • 6search engines held to their strictest safe-search setting

Anti Brainrot puts the things that eat a day behind friction rather than a wall. In Chrome it hides YouTube Shorts, can replace the home feed with Subscriptions, and pauses the feeds of TikTok, Instagram, X, Reddit and the rest behind a countdown, a one-line intention and a timed pass drawn from a daily budget. On Android the same rules cover whole apps. One switch, the filter, sits over everything: restrictions can be tightened at any time, but loosened only after a countdown whose length was chosen when the filter went on.

The extension is Manifest V3 with no build step. Site blocking, forced safe search and YouTube Restricted Mode are declarativeNetRequest rule sets, in-page navigation is caught by content scripts, and an optional educational mode only plays videos from allowed categories or channels. Locked hours turn the filter on by schedule, and the browser’s own extensions page is blocked while it is on, so it cannot simply be removed. The Android app, in Kotlin and Jetpack Compose, blocks apps through an accessibility service, filters sites at the DNS level through a local VPN service, and can register as a device admin to refuse uninstalling.

Version 1.8.4, with the extension as a zip and the app as an APK on the releases page. It makes no network calls of its own and has no accounts or analytics. The Chrome Web Store listing is not live yet.

ToolsJavaScriptChrome Manifest V3declarativeNetRequestKotlinJetpack ComposeAndroid AccessibilityServiceAndroid VpnServiceNode test runner

Aug 2026 to Oct 2026

Screen Side Switcher: Move the External Monitor to the Side It Stands On, in One Click

Puts your external monitor left, right, above or below the laptop screen in one click, and brings each desk's layout back when you plug in there.

Software

  • 6display backends behind one Rust core, from Mutter over D-Bus to Quartz
  • 229tests in CI, 180 of them in Rust, with the core also run natively on Windows and macOS
  • 2 sbetween checks for newly connected screens, which get their saved layout back

Plug a laptop into a monitor and the computer guesses which side the monitor is on. When the guess is wrong, the pointer has to leave through the edge facing away from the monitor. Screen Side Switcher fixes that with one click, a tray menu, a keyboard shortcut or a command (screen-side left), and remembers the arrangement at each desk so it comes back by itself when those screens are plugged in again. It handles several external screens, alignment by top, centre or bottom, and which screen is primary.

The app, Screen Side, is a Rust core with a Tauri window and a command line tool on top. The core asks one of six backends for the screens, works out the arrangement in force, changes the intent rather than the coordinates, and recomputes every position from there; an arrangement whose screens would overlap is refused instead of being nudged into a gap the pointer cannot cross. Each backend sizes screens exactly as its compositor does, because a rounding difference leaves adjacent screens a pixel apart and the pointer stops at the seam. Saved layouts store the intent against each monitor’s identity, not coordinates, so they survive a change of resolution or scale, and two identical monitors without serial numbers are told apart by connector order.

Version 2.0 is a rewrite of a GNOME-only Python tool from August, and now covers Windows, macOS, GNOME, KDE Plasma, wlroots desktops such as Sway and Hyprland, and other X11 desktops. The README is plain about testing: reading and checking are verified on GNOME 46, reading on Windows and macOS runs in CI, and the other Linux backends are written against their tools’ documented output, with reports welcome.

ToolsRustTauri 2React 19TypeScriptzbusWin32 display configurationQuartz Display ServicesVitestPlaywright

Aug 2026 to Sep 2026

ToHoot: A Task List and Time Tracker That Syncs Through a Private GitHub Repository

Tracks tasks and time on your computer and phone, synced through a private GitHub repository you own and reachable from Claude.

Software

  • 1,178unit tests in CI, plus 24 Playwright end-to-end tests
  • 15MCP tools over the same event log the app writes to
  • 15releases in four weeks, each an AppImage, a deb, Windows installers and an APK

ToHoot is a task list that tracks time against the day you actually had. One list runs on a Linux or Windows desktop and an Android phone, sits beside your real calendar, and can be read and edited by Claude. There is no server of its own: sync, calendar and the Claude endpoint run in accounts you already have, on free tiers that fail rather than bill.

One React app runs unchanged in a Tauri window, a Capacitor WebView and a plain browser under test, with each shell supplying a single platform adapter. The datastore is an append-only event log in a private GitHub repository. Every device writes only under its own prefix, so merging is replay rather than reconciliation, and events are put in a total order by timestamp, device id and ULID, so every device computes the same state. Time is stored as increments, which makes two devices timing the same task add up instead of overwriting each other, and a rejected ref update is the only concurrency check: nothing is ever force-pushed. An MCP server exposes fifteen tools over the same log, locally or as a Cloudflare Worker the app deploys into your own account.

Fifteen releases shipped in four weeks, built by GitHub Actions for Linux, Windows and Android, with an architecture document written so anyone storing their data in it can audit the format.

ToolsTypeScriptReact 19Tauri 2Capacitor 8GitHub REST APIGoogle Calendar APIMCPCloudflare WorkersVitestPlaywright

Jul 2026 to Oct 2026

garmin-hevy-sync: Two-Way Sync Between a Garmin Watch and Hevy

Keeps strength workouts, routines and weigh-ins in sync between a Garmin watch and the Hevy app, in the background on your computer or a home server.

Software

  • 5sync flows run in order on every pass, three of them written here
  • 235offline tests, run in CI on Linux, macOS and Windows
  • 30 minbetween background runs on systemd, launchd or Task Scheduler
  • 1command to install it, from the project site

Garmin and Hevy have no official integration. The common case it fixes: you start a strength activity on the watch for heart rate and training load, but log the actual sets in Hevy on your phone, and end up with half the session in each app. garmin-hevy-sync runs five flows every 30 minutes in the background: Hevy workouts merged into the matching watch activity, Hevy routines pushed to Garmin as planned workouts, watch-only sessions copied back to Hevy, Garmin weigh-ins copied to Hevy’s body measurements, and a repair pass for exercise names.

That repair pass is the interesting part. Sets merged into Garmin Connect all showed as “Choose an Exercise” even though the API returned a correct name for each one. The cause was the confidence field Garmin’s own rep detection writes: merged sets carried 0.0, which Garmin Connect reads as “nothing identified”. Rewriting only that field, and only on sets that already carry a name, makes the names, the volume column and the muscle map appear. Going the other way, Garmin’s exercise constants are matched to Hevy’s titles by scoring normalised token sets, with missing equipment words weighted as nearly free, a cached map and manual overrides.

Version 0.2 made it something anyone can run. A one-line installer for macOS, Linux or Windows brings its own Python, and an interactive setup checks the Hevy key, signs in to Garmin once (the password is used for that sign-in and never stored) and schedules itself with the system’s own scheduler: a systemd timer, a launchd agent or a windowless Task Scheduler task, or a loop inside a Docker container. A failed background run raises a notification, the ledger is written before the next request so a crash cannot duplicate a workout, and CI installs the tool and registers a real schedule on all three operating systems. hevy2garmin 0.12 now writes full confidence itself; the repair pass stays for activities merged before that.

Developed against a Venu 4. It needs Hevy Pro for the API and builds on the hevy2garmin project for the first two flows.

Jul 2026 to Sep 2026

Marine Debris Detection on Free Sentinel-2 Imagery (Spectral Indices, OWLv2, SAM 2)

A rebuild of NASA-IMPACT's marine debris detector on free Sentinel-2 imagery, which turned out to be a much better sargassum detector, at F1 0.948 on MARIDA without a GPU.

ML & computingSoftware

  • 0.948sargassum F1 on MARIDA's held-out scenes, same model, no retraining
  • 1.00debris precision on three open-ocean MARIDA scenes, at about 0.71 recall
  • 44%of detector calls skipped by the spectral screen, 11.1 min to 6.2
  • 20 dayslongest gap between usable looks at Lac Bay, over 64 Bonaire passes

A personal rebuild of the NASA-IMPACT marine debris detector, which ran TensorFlow 1.14 on commercial Planet imagery and no longer installs. This version reads free Sentinel-2 imagery over HTTP and runs from one pip install, without a GPU or API keys. Detection needs no training and runs as a cascade: spectral indices (FDI, FAI, NDVI, NDWI, PI, kNDVI, MNDWI) screen the scene in microseconds per tile, so OWLv2 detection (about 18 seconds per tile on CPU) and SAM 2 segmentation run only where something looks interesting. On a coastal scene off Accra that skipped 44% of detector calls, cutting 11.1 minutes to 6.2.

The vision model does not carry the signal at 10 m. The same OWLv2 weights score 0.794 on a COCO photograph and 0.210 on a Sentinel-2 chip, because a 30 m debris patch spans three pixels. So I also trained a gradient-boosting classifier over 11 bands and 7 indices on MARIDA, the public Sentinel-2 benchmark, using its scene-grouped split so no test scene leaks into training: 429,412 training pixels, 76 seconds to fit on CPU. Debris reaches a best F1 of 0.656, or precision 0.944 at recall 0.375, and the patch-bootstrap interval on that F1 runs from 0.27 to 0.78 because MARIDA has only 381 debris test pixels. On three open-ocean test scenes it reached precision 1.00 at about 0.71 recall with zero false positives.

The same run is a much better sargassum detector: F1 0.948 with no retraining, and its sargassum probabilities are calibrated (expected calibration error 0.003). Sargassum floats in mats tens of metres across and fills whole pixels; debris is thin filaments. A band ablation shows the same split: on the four PlanetScope bands NASA-IMPACT used, debris F1 drops to 0.080 while sargassum keeps 0.928.

I then ran it over all 64 Sentinel-2 passes of Bonaire’s January to August 2025 season. The windward coast was usable on 64 to 73% of passes, and Lac Bay went up to 20 days between usable looks, which is the number a monitoring plan has to be built around. The run also exposed two defects in the pipeline itself, including a water mask, there to keep bright sand out, that removed the sargassum as well. 894 tests run in CI.

ToolsPythonPyTorchOWLv2SAM 2rasterioSTACscikit-learn

Jul 2026 to Aug 2026

Two Synthesizable IP Cores Taken to Post-Route Silicon Numbers (IHP SG13G2)

A colour VGA text controller and an OBI CORDIC accelerator routed to signed-off GDS on IHP SG13G2, where routing reversed which CORDIC variant synthesis said was faster.

Digital / ASIC

  • 0.477 mm²VGA controller die, 2.72x its synthesis cell-area estimate
  • 90.9 MHzfolded CORDIC post-route at the slow corner, against a 48.5 MHz estimate
  • 25.1xpipelined CORDIC throughput over folded, for 4.4x the cell area
  • 307,200gate-level VGA pixels identical to the Python reference

Two open-source IP cores, each checked against an independent software model and then taken through LibreLane to a routed, signed-off layout on IHP’s open SG13G2 130 nm process. Every number below is post-route unless it says otherwise. Neither core has been fabricated.

The VGA controller drives four VESA modes (640x480, 800x600 and 1024x768 at 60 Hz, 720x400 at 70 Hz) from a timing table, with per-character colour from a 16-entry palette, a hardware cursor, blink, reverse video, underline and runtime-selectable 8x8 and 8x16 glyphs. Routed, the die is 476,640 µm² at 60.3% utilisation, 2.72x the synthesis estimate, and draws 10.5 mW at 65 MHz. DRC and LVS are clean with no setup or hold violations at any of the three corners.

Synthesis had flagged a load-limited path in the pixel domain. Place and route spent 73,282 µm² on timing-repair buffers, 27% of the routed cell area, and the 1024x768 slack at the slow corner grew from +4.965 ns to +7.585 ns. The slow-corner gate-level netlist renders 307,200 pixels identical to the Python reference renderer, and the eight sync-generator assertions are proved unbounded by an inductive invariant.

The CORDIC accelerator is an OBI peripheral for the Croc RISC-V SoC that computes eleven functions without a multiplier, which the build asserts by checking that the synthesized design holds no multiply, divide or MAC operator before cell mapping. One stage module feeds a pipelined core (one result per cycle, 1.954 mm²) and a folded core (one result per 29 cycles, 0.383 mm²), bit-identical over 900 operations. Synthesis ranked the pipelined core faster by 27%. Routed, the folded core is faster by 16% (90.9 against 78.6 MHz at 1.08 V and 125 °C), because the larger die spends 2.69 of its 12.72 ns critical path in buffers. The folded die is DRC and LVS clean; the pipelined one passes LVS with one Metal2 minimum-area violation left.

Jul 2026 to Aug 2026

Two Tiny Tapeout Tiles Hardened to DRC-Clean GDS (IHP SG13G2 130 nm)

Two Tiny Tapeout tiles hardened to DRC- and LVS-clean GDS on IHP SG13G2: eight VGA patterns chosen by a ring-oscillator TRNG, and a signed INT8 systolic NPU.

Digital / ASICML & computing

  • 31,318 µm²VGA TRNG tile die at 82.7% cell density, DRC and LVS clean
  • 44.91 MHzTRNG tile post-route at the slow corner, for a 25.175 MHz pixel clock
  • 0.883INT8 accuracy on scikit-learn digits, equal to float32
  • 35 of 35formal proofs that every adder and multiplier variant is exact

Two designs taken from RTL to a signed-off layout on IHP’s open SG13G2 130 nm process with LibreLane 3.0.0.dev44, the version the Tiny Tapeout IHP shuttle pins. Both are DRC and LVS clean, pass Tiny Tapeout’s precheck, and pass their cocotb suites a second time on the hardened gate-level netlist. Neither has been fabricated, which would go through a Tiny Tapeout shuttle; both can be opened in the 3D GDS viewer.

The 1x1 tile drives a TinyVGA PMOD with eight 640x480 pattern generators. Six are pure functions of pixel position and frame count, because 142 flip-flops leave no room for a framebuffer. A TRNG picks the pattern: two ring oscillators into von Neumann debiasing, an LFSR conditioner and SP 800-90B style health tests on the raw samples. The build counts all 12 ring stages after synthesis and again after routing, since a ring the optimiser collapsed would still give a clean GDS. Synthesis put the cells at 57.6% of the tile; routed they fill 82.7% of its 31,318 µm², with hold buffers alone taking 23% of the cell area. Setup closes with +17.45 ns of slack at the slow corner, 44.91 MHz against the 25.175 MHz the pixel clock needs.

The NPU is a 4x2 weight-stationary systolic array of signed INT8 MACs with 24-bit saturating accumulators and integer-only per-channel requantization, driven over a framed byte protocol. Five adder architectures (ripple-carry, Brent-Kung, Kogge-Stone, Sklansky, Han-Carlson) and three multipliers are parameterized generators, and 35 SymbiYosys proofs show each one is exact over its whole input space at the widths the core uses. A 16-12-10 network run on the RTL scores 0.883 on scikit-learn digits in INT8 and float32 alike: quantization moves the outputs by up to 1.81 LSB and flips no prediction. The 4x2, 6x2 and 8x2 tiles were all hardened to signoff, and 6x2 ships with the best setup slack, +12.54 ns at 40 MHz.

Jul 2026 to Jul 2026

INT8 Matmul PPA Test Chip: Five Engines Measured Post-Route (IHP SG13G2)

Five INT8 matmul engines routed to signoff-clean GDS on IHP SG13G2 under one constraint, where Booth radix-4 beats every other single-cycle design on area, Fmax and energy.

Digital / ASIC

  • 419 pJper 64-MAC tile, Booth radix-4, on the routed netlist
  • 0.796 mm²Booth radix-4 routed die, smallest single-cycle candidate
  • 10.1%energy sign-magnitude saves over its identical twin, for 11.2% lower Fmax
  • 0 of 191metrics that differ between two identical place-and-route runs

An open-source test chip design that asks two questions by measurement: which INT8 multiplier is best in silicon, and does sign-magnitude operand encoding save power? Five candidates (inferred *, Wallace tree, Booth radix-4, sign-magnitude and bit-serial) sit behind one identical interface and run the same 32x32x32 GEMM in 4x4x4 tiles of 64 MACs. Each was placed and routed on its own on IHP SG13G2 at the same 20 ns period and 40% target utilisation, and all five signed off with zero DRC and LVS errors. Power is measured on each routed netlist with extracted parasitics, only after that netlist has been checked bit-exact against a NumPy reference.

Post-route, Fmax at the slow corner (1.08 V, 125 °C), power and energy at the typical corner with a 20 ns clock and half the operands negative:

Candidate Routed cell area Die Fmax Power Energy/tile Cycles
Booth radix-4 383,415 µm² 0.796 mm² 83.0 MHz 8.21 mW 419 pJ 3,904
Sign-magnitude 394,146 µm² 0.819 mm² 69.2 MHz 8.41 mW 429 pJ 3,904
Inferred 443,933 µm² 0.939 mm² 81.4 MHz 8.73 mW 446 pJ 3,904
Wallace tree 476,959 µm² 0.994 mm² 77.9 MHz 9.35 mW 477 pJ 3,904
Bit-serial 185,463 µm² 0.356 mm² 77.3 MHz 6.51 mW 1,245 pJ 7,488

Among the single-cycle designs Booth radix-4 wins outright: 20% smaller, 12% cheaper in energy and 6.5% faster than the hand-written Wallace tree, which in turn loses to the inferred baseline on area, speed and energy. Bit-serial draws the least power but needs nearly twice the cycles, so it spends 2.6 times the energy of the Wallace tree.

Sign-magnitude is a qualified result. Against the identical two’s complement datapath it routes 17.4% smaller and 10.1% cheaper in energy, but closes 11.2% slower, and Booth still beats it on all three. At synthesis it costs 4.2% more power on an all-positive operand stream, the common post-ReLU case, and a transition-count proxy would have overstated its saving by about a factor of two. Nothing has been fabricated: every number is a routed block, and the wrapper that holds all five engines still fails DRC signoff.

ToolsSystemVerilogcocotbVerilatorYosysOpenROADLibreLaneKLayoutPython

Jun 2026 to Oct 2026

Meeting Copilot: A Live Transcript and a Drafted Reply on One Keypress

Transcribes the conversation you are in and, on one keypress, drafts a first-person answer or talking points grounded in your own codebase.

SoftwareML & computing

  • 294Python tests in CI on 3.10 and 3.12, plus the extension's own suites
  • 3answer backends that fail over mid-meeting, API to CLI to a local model
  • ~1 sto a drafted answer with an Anthropic API key, as the README states

Meeting Copilot runs in the terminal during live conversations about code, built for the moment when you know the answer but the words will not come fast enough: a stammer or another speech difference, brain fog, nerves, or a second language. Launched inside a project, it transcribes the room, and on one keypress drafts what to say next in the first person, grounded in that repository: an answer if a question was just put to you, a few talking points otherwise. A Chrome side-panel build does the same on Google Meet and Teams calls.

Audio comes in through ffmpeg, and transcription and drafting run off the capture loop, so the interface never blocks. Transcription streams to Deepgram and falls back to local Whisper when the key is missing or the connection drops. Answers go to the Claude API, then the claude CLI, then a local Qwen model through Ollama, and the header shows which backend is live as it switches mid-session. Offline, voices are told apart by a NumPy MFCC and pitch fingerprint clustered into two speakers, gated on silhouette score so a weak split falls back to one, and they are named from their own introductions or a calendar invite’s attendees.

Version 0.4.2 runs 294 Python tests in CI and ships a changelog and a privacy note listing everything that leaves the machine. Cloud transcription sends audio to Deepgram; --stt local keeps everything on the device. The extension is loaded unpacked rather than from the Chrome Web Store. Once installed it appears as Sparky, the interface it shares with Portable Copilot.

ToolsPythonffmpegDeepgram Nova-3faster-whisperClaude APIOllamaNumPyscikit-learnRichJavaScriptChrome Manifest V3

Jun 2026 to Oct 2026

Portable Copilot: Open-Weight AI on a USB Stick, Offline on Any Computer

Puts open-weight AI models on a USB stick that runs on any computer it is plugged into, offline, with nothing installed and no account.

SoftwareML & computing

  • 39open-weight models from 12 makers in the catalog, picked by purpose and memory
  • 24 MBdownloaded for the Windows runtime instead of 1.5 GB, by fetching only its CPU files
  • 96tests in CI on Windows, macOS and Linux under Python 3.10 and 3.12
  • 7purposes setup recommends models for, from coding to translation

Portable Copilot puts open-weight language models on a USB stick. Plug it into a Windows, macOS or Linux computer, run one file, and you can chat, write, code, ask about your own documents or read images, with nothing installed on the computer and no internet: the model runs on the machine in front of you. Setup asks what the stick is for and how much memory its computers have, then picks models that fit from a catalog of 39, adding a small quick one beside any large one so there is always something fast to switch to.

One launcher, sparky.cmd, is both a shell script and a Windows batch file. It points the home folder, caches and settings at the stick, starts a portable Python for whichever OS it finds, and runs a bundled Ollama on its own port against one set of weights shared by every OS. Setup downloads pinned releases and checks them against their published checksums. The Windows Ollama build is 1.5 GB, nearly all of it GPU libraries a portable CPU build never uses, so setup reads the zip’s index over HTTP range requests and fetches only the 24 MB it needs. The context window is set on every request, because Ollama’s CPU default of 4096 tokens cuts long conversations off without saying so, and when a computer lacks the memory for the chosen model the reply comes from the next smaller one instead of failing. The browser front end listens on 127.0.0.1 only and needs a token printed in the terminal at launch.

Version 0.4.0. It began in June 2026 as a coding agent that fell back from the Claude API to a local model, went fully local in 0.3, and in 0.4 opened up to any open-weight model, chosen by purpose. The bundled Ollama runs with its cloud features off, so nothing leaves the computer except model downloads you ask for. Once installed it appears as Sparky, the interface it shares with Meeting Copilot. Models small enough to carry make more mistakes than large cloud models and are slower on most laptops, which the README says plainly.

ToolsPythonOllamapython-build-standaloneRichprompt_toolkitJavaScriptpytestRuffGitHub Actions

May 2026 to Aug 2026Delft University of Technology

Micro-LED Solder-Bond Characterization: PCB Test Vehicle and Eight Assembly Conditions Measured

A micro-LED bond test board and 120 measured channels: yield and failure mode separate eight assembly conditions at p = 2.2 × 10−4, series resistance cannot.

Devices & processHardware & embedded

  • 2.2 × 10−4chi-square p-value on yield and failure mode across eight conditions
  • 100%channel yield in conditions 5 and 7, against 25% in condition 3
  • 0.84 ΩR_s scatter from re-seating alone, 85% of the die-to-die spread
  • 2.9 kΩshunt the ideality check caught after the DMM passed the die at 1.781 V

With TU Delft ECTM and ITEC B.V. / Nexperia, I designed the PCB test vehicle for a micro-LED die-bonding study, extending the v1 board published at ECTC 2025. It is a 93 × 93 mm two-layer FR-4 board with ENIG on every pad, carrying a 6 × 6 bond-pad design of experiments at 3.5 mm pitch, TLM ladders, van der Pauw cloverleaves, 26 Würth RGB LED sites, four NTCs and an LCR calibration set, laid out in KiCad 9 from Python generators. The LED pads ship as bare gold, because the joint is the thing under test. Five of the fabricated boards carried the eight samples.

In the cleanroom, Sn42Bi57.6Ag0.4 paste was printed by hand through a 100 µm stencil, dies were placed on a Tresky T-3000-PRO and the joints formed on a hot plate. Read against the capillary self-alignment literature, the observed alignment and tilt point to solder volume as the dominant variable, and manual printing does not meter it.

The electrical work covered eight blind-coded conditions: 40 dice bonded, 36 measurable, 120 channels. A DMM screen called six channels bad, and an Arduino rig sweeping 63 current levels per channel agreed on all six. Yield and failure mode separate the conditions at χ² p = 2.2 × 10−4, with conditions 5 and 7 at 100 percent and condition 3 at 25. Series resistance does not: re-seating the same jumpers scatters R_s by 0.84 Ω, 85 percent of the apparent die-to-die spread, while the bonds in question are 10 to 100 mΩ, so the limit is reported instead of a ranking. The ideality-factor check caught a 2.9 kΩ shunt that the DMM had passed at 1.781 V.

The board was designed for more than was measured: the TLM, van der Pauw and impedance structures went unmeasured for lack of instruments, and the daisy chains read open on every coupon because the dice sit rotated 90° from the footprint, a layout fault found by lighting each die.

ToolsKiCad 9PythonMATLABArduinoTresky T-3000-PROEurocircuits

May 2026 to Jun 2026Delft University of Technology

NMOS and PMOS Transistors in BICMOS5: Simulation, Cleanroom and Characterization

NMOS and PMOS transistors in the EKL BICMOS5 process, followed from hand calculations and Sentaurus TCAD through cleanroom metal etching to probe-station extraction.

Devices & process

  • +0.82 VNMOS threshold at the top VT-adjust dose, up from -0.03 V at zero
  • 750 cm²/V·slong-channel electron mobility, 230 for holes
  • 0.16 to 1740 Ω/sqsheet resistance by Van der Pauw, aluminium through to n-well
  • 3.2xfaster BHF etch of PECVD oxide than thermal oxide

In a group of three, we followed NMOS and PMOS transistors through the BICMOS5 process at the Else Kooi Laboratory (EKL): theory, simulation, the last process steps in the cleanroom, and measurement. The course wafer carries five masks plus an unmasked boron threshold-adjust implant whose dose changes by quarter, from 0 to 9 × 1011 cm−2, so one wafer shows the dose dependence directly.

Sentaurus process simulations of P, As, B and Sb put the junctions at 0.537 µm (SN), 0.594 µm (SP) and 2.085 µm (n-well), far deeper for SN and SP than the hand estimates, which ignore the later thermal steps. In a 2.5 day session in the class-100 cleanroom we mapped sheet resistance on the implanted monitor wafers, measured oxide etch rates by ellipsometry (thermal 1.71 nm/s, PECVD 5.53 nm/s in buffered HF), and patterned the aluminium interconnect of a BICMOS5 wafer both wet and dry. Under the microscope the wet etch undercuts the lines while the dry etch keeps them straight but eats into the field oxide.

On a Cascade probe station with a Keysight B1500A, re-analyzed in one MATLAB script, the Van der Pauw structures gave 1740 Ω/sq for the n-well down to 0.16 Ω/sq for the aluminium, and doping that only agrees with the simulated junction depths. The NMOS threshold climbs from −0.03 V to +0.82 V with implant dose while the PMOS moves from −3.70 V to −3.30 V, the trend Sentaurus predicts, though the simulated values sit offset from the measured ones. Long-channel mobility comes out at 750 cm²/V·s for electrons and 230 for holes, and the 1 µm devices show threshold roll-off and, in the PMOS, punch-through.

ToolsSentaurus TCADMATLABKeysight B1500ACascade probe stationEllipsometryFour-point probe

May 2026 to Jun 2026Delft University of Technology

MEMS Optical Phase Shifter: Multiphysics Design and Modeling

A comb-drive MEMS optical phase shifter modeled by hand and in 2D and 3D COMSOL, then redesigned so its sensitivity peak sits below pull-in, 8.7 to 73.9 mrad/V.

Devices & process

  • 8.5xanalytical sensitivity gain at a stable bias, 8.7 to 73.9 mrad/V
  • 224 VFEM pull-in, a rotational side mode, below the 347 V lumped estimate
  • 20 kHztrue fundamental of the 200 nm device, an out-of-plane flap
  • 106candidate designs searched, about 47,000 of them feasible

The device is the actuator of an integrated optical phase modulator. A voltage on a comb drive pulls a suspended silicon shuttle, which moves a bar sitting 200 nm from an optical waveguide and shifts the phase of the light inside it. Starting from the course geometry, I modeled it three ways, each checking the last: a lumped spring-mass-damper derived by hand (40.3 N/m, 537 kHz, Q of 81, 145 µs settling, 347 V pull-in), a 2D COMSOL model coupling solid mechanics, electrostatics and a moving mesh, and a 3D model. Every COMSOL model is built and solved from Python through MPh.

The finite-element models found what the hand model could not. Damped settling agreed to 0.7% (158 against 159 µs), but pull-in arrives at 224 V as a rotational rocking mode, not the axial collapse the lumped model predicts, confirmed on a 51,000-element mesh. In 3D, the 200 nm device’s real fundamental is an out-of-plane flap at 20.0 kHz, 26 times below the working mode. Thickening to the beam width does not fix it, because the lowest out-of-plane mode is a see-saw pitch; a 10 µm device layer does, with 18% margin.

For the redesign I reduced sensitivity to a closed form, which showed the old design’s peak sat at 1377 V, far past pull-in, and that stiffening it could never help. A constrained grid search over about 106 candidates picked a softer suspension and short comb fingers with a large tip clearance: an analytical peak of 73.9 mrad/V at 627 V, against 8.7 mrad/V before. COMSOL confirmed the frequency, settling and a pull-in raised to about 876 V, and also found 45% less stroke than the lumped model from shallow comb engagement and beam stiffening, putting the simulated sensitivity at 54.9 mrad/V at 760 V and still rising.

ToolsCOMSOLPython (MPh)MATLABLaTeX

May 2026 to Jun 2026Delft University of Technology

2-D Vernier Time-to-Digital Converter (15 ps LSB, 180 nm BCD)

A hand-sized 5-bit 2-D Vernier TDC in TSMC 180 nm BCD whose 15 ps LSB, finer than one gate delay, holds within 0.85 ps across five process corners.

Analog & mixed-signal

  • 15 psLSB, where one loaded FO4 stage bottoms out at 97 ps
  • 0.85 psLSB spread across five corners after MOSCAP trim, from 5.1 ps
  • 3.4xfewer delay stages than a 1-D line, scaled from a built 8-code row
  • 11.7 pJper conversion at TT, 0.50 pJ per conversion step

A full-custom 5-bit time-to-digital converter, designed with Joris Hoogeweegen, that digitises the time between two rising edges with a 15 ps LSB. In TSMC 180 nm BCD a conventionally sized FO4 stage bottoms out at 97 ps, so reaching the 20 ps specification needed a technique that resolves below one gate delay. Every gate was sized by hand in Cadence Virtuoso, with no standard cells, and verified in Spectre at schematic level. There is no layout.

The converter is a two-dimensional Vernier. A START line of 90 ps stages and a STOP line of 75 ps stages feed a 10 × 6 array of NAND SR-latch arbiters, so 16 logical stages cover 31 codes, and a bijective map sends exactly one latch to each thermometer bit with no combining logic. The other 29 cells hold dummy latches so every tap drives the same load. A 1-D row built from the same cells shows why that matters: with unequal loading its LSB came out at 28.6 ps instead of the predicted 16.6 ps.

With one fixed trim setting all five process corners pass, with LSB between 13.1 and 18.2 ps, DNL at most 0.90 LSB and no missing codes. Switchable MOSCAP banks on each delay stage then pull every corner to between 15.0 and 15.85 ps, tightening the spread from 5.1 ps to 0.85 ps without changing a device. The core uses 1120 active transistors and 11.7 pJ per conversion at TT, and the arbiter’s metastable dead zone is below 1 fs.

ToolsCadence VirtuosoSpectreTSMC 180 nm BCDMATLAB

Apr 2026 to Jun 2026Delft University of Technology

Hardware/Compiler Co-Design of AES-128 on a RISC-V Soft Core

AES-128 on a CV32E40P RISC-V soft core cut from 61,184 to 4,104 simulated cycles, plus a masked S-box that held its key through 20,000 traces of CPA.

Digital / ASICSoftware

  • 15xfewer cycles, 61,184 down to 4,104 in cycle-accurate simulation
  • 44 to 1.4TVLA leakage t-statistic after 2-share masking, threshold 4.5
  • 20,000CPA traces the masked S-box survived; unmasked fell in about 100
  • 5,506cycles per AES block for the masked core, measured on the FPGA board

In a team of four, we accelerated and hardened AES-128 on a CV32E40P (RI5CY) RISC-V soft core on a Zynq-7020 PYNQ board, working on the RTL, the LLVM compiler and side-channel security. Profiling put 83.8% of all cycles in mix_columns. We added the RISC-V scalar-crypto instructions aes32esmi and aes32esi to the core’s ALU and decoder, which took the workload from 61,184 to 6,260 cycles. A custom LLVM pass that fully unrolls the 9-round loop brought it to 4,800, and a teammate’s two-lane masked S-box instruction to 4,104. These counts come from the core’s cycle counter in Vivado XSim, and every build is checked against the AES-128 known-answer ciphertext.

My own track was side-channel resistance. I designed a 2-share Domain-Oriented-Masking S-box in the tower field GF((24)2), with registered DOM-AND gates and 20 bits of fresh randomness per evaluation, and built a simulation-based CPA and TVLA rig to attack it. The unprotected hardware S-box gave up its key byte in about 100 traces, with a TVLA t-statistic of 44. The masked one left the true key at rank 35 of 256 after 20,000 traces, with t = 1.4 against a threshold of 4.5, for 182 LUTs and 100 flip-flops.

Both my unmasked and masked S-boxes were built into bitstreams and run on the board. AES-128 finished in 4,369 and 5,506 cycles respectively, with the correct ciphertext and every instruction output matching a software reference. A teammate’s power capture on a CW305 board agreed with the simulation: with masking, the hardware TVLA peak fell to 3.98, below threshold.

ToolsSystemVerilogVivado 2024.2LLVM/clangRISC-VPython

Apr 2026 to Jun 2026Delft University of Technology

GPU Acceleration of an Inferior-Olive Neuron-Network Simulator

The de Gruijl inferior-olive simulator rebuilt around an O(N) gap-junction term, 316x faster on one CPU core and scaling to 100,000 cells on a T4 GPU.

ML & computingSoftware

  • 316xNumba backend against the sequential simulator at N = 100
  • O(N)gap-junction coupling, down from O(N²) all-to-all
  • 9.04 µsper step for 100 cells on one core, inside the 10 µs real-time budget
  • 99xT4 GPU against Numba at 100,000 cells

Accelerated the de Gruijl inferior-olive simulator, a sequential Python model of electrically coupled brain cells, on CPU and GPU. I wrote one vectorised simulation step with three backends: NumPy, Numba (@njit) and JAX (jit with lax.scan), the last running unchanged on an NVIDIA T4.

Profiling put the dendrite update, which holds the all-to-all gap-junction loop, at 49% of runtime. That sum collapses exactly to C_gap·(N·V_d − ΣV_d), so one global sum per step serves every cell and the coupling drops from O(N²) to O(N). Numba then runs 199x faster than the original at 30 cells and 316x at 100 cells, at 9.04 µs per step, the only backend inside the 10 µs real-time budget. The T4 stays near 46 µs per step from 2 to 10,000 cells because kernel launches, not arithmetic, set its cost, and at 100,000 cells it is 99x faster than Numba.

At N = 1 the vectorised step reproduces the reference trace to 1.1 × 10−13 mV. For larger networks the gap junction moves from a Gauss-Seidel sweep to a Jacobi update, which stays within 0.02 mV (correlation 1.0000 at 30 cells). The speed also exposed a limit the original code was too slow to reach: at the fixed coupling, forward Euler is only stable for N < 2/(δ·C_gap) = 4000, and the trajectory diverges at 4,000 cells.

ToolsNumPyNumbaJAXCUDAcProfilePython

Mar 2026 to Apr 2026Delft University of Technology

Hardware FFT Accelerator for a RISC-V SoC, Full ASIC Flow in 45 nm

Two FFT accelerators for a PicoRV32 SoC taken through synthesis, place-and-route and signoff in 45 nm, one cutting latency 33x and the other energy 9.5x.

Digital / ASIC

  • 33xlatency drop, 61.00 to 1.83 µs at 66.2 MHz
  • 9.5xless energy per FFT, 24.6 to 2.59 nJ at the unchanged 12 MHz
  • 732 to 121cycles per 32-point FFT in the high-performance design
  • 0setup and hold violations post-route on both designs

Hardware FFT accelerators for a PicoRV32 RISC-V system-on-chip, taken through the full ASIC flow on the gpdk045 45 nm kit in a team of ten: RTL, constraints, Genus synthesis, Innovus place-and-route, post-layout simulation with SDF back-annotation and VCD-annotated power analysis. The team delivered two designs against the same SoC, an unmodifiable testbench and a fixed 596.4 µm × 596.4 µm core.

The high-performance design replaces per-butterfly memory traffic with a register file and a four-phase pipelined butterfly. A 32-point FFT drops from 732 to 121 cycles and the clock rises from 12 to 66.2 MHz, so latency falls from 61.00 to 1.83 µs. The energy-efficient design keeps the 12 MHz clock and does less work: 32 real samples are packed into a 16-point complex FFT computed as two Radix-4 stages (the first needs no multipliers), with hardcoded twiddles, Hermitian recombination and manual clock gating. Energy per FFT falls from 24.6 to 2.59 nJ at 0.239 mW.

Both designs close setup and hold with zero violations post-route and pass DRC and antenna checks. Neither is fully DRV clean: max-transition violations remain on 10 nets in the high-performance design and 316 in the energy-efficient one, which the course brief accepts. My part was the low-activity twiddle handling, register implementation and manual clock gating on the energy-efficient design, the baseline full-flow bring-up, and reviews of every teammate’s branch.

ToolsVerilogCadence GenusCadence Innovusgpdk045PicoRV32

Feb 2026 to Oct 2026

ieee-xplore-mcp: IEEE Literature Search, Citations and Full Text for AI Assistants

Lets Claude, Cursor and other AI assistants search, cite and read IEEE papers, with no IEEE API key and paywalled papers through your library.

Software

  • 10tools, from boolean and semantic search to BibTeX for up to 50 papers
  • 150tests, run on Linux, macOS and Windows under Node 20 and 22
  • 8citation formats, from BibTeX and RIS to formatted IEEE and APA

An MCP server that runs on your machine and gives Claude Code, Claude Desktop, Cursor, VS Code, Codex or any other MCP client the IEEE literature: search with boolean, author, venue, affiliation and year filters or by meaning, full metadata, the citation graph in both directions, full text, and references in BibTeX, RIS, CSL-JSON or five formatted styles.

The first version wrapped the IEEE Xplore API and needed a key, which IEEE is slow to issue and deactivates after inactivity. Version 2 is a rewrite that works with no configuration: it searches OpenAlex restricted to IEEE as a publisher, uses the IEEE API only while a key is healthy, and when IEEE rejects the key or the quota runs out it switches over for the rest of the session and says so in the response. Open-access PDFs are checked against the paper’s title, because OpenAlex sometimes attaches the wrong one. Paywalled papers go through your institution’s proxy after one browser sign-in with MFA, and the session renews itself from the saved profile. Library licences forbid systematic downloading, so proxy downloads are spaced at least 10 seconds apart, capped per day and cached, and there is no bulk tool.

Released as 2.0.1 with CI on three operating systems, CodeQL, and design, client and security docs. Metadata comes only from documented public APIs; it never scrapes Xplore pages.

Feb 2026 to Apr 2026Delft University of Technology

Discrete-Time Fully Differential Folded-Cascode Amplifier (180 nm CMOS)

A gain-boosted, fully differential folded-cascode amplifier on 180 nm CMOS that settles a 1.2 V step to 63.32 dB accuracy in 2.8 µs while drawing 0.112 mW.

Analog & mixed-signal

  • 0.112 mWfrom 1.8 V, settling to 63.32 dB in 2.8 µs
  • 80.85 dBSNR, the binding spec, against 80.64 dB
  • 175.2 dBfigure of merit, against a 174.0 dB target
  • 76.9 µVrmsintegrated output noise, under a 78.8 µV ceiling

Designed a discrete-time, fully differential folded-cascode amplifier with ideal gain boosting on a 180 nm CMOS process, sized for the lowest power that meets spec. It sits in a switched-capacitor stage with a closed-loop gain of 8 (18 pF input, 2.25 pF feedback, 18 pF load) and must settle a 1.2 V differential output step to 63 dB accuracy within 2.8 µs from a 1.8 V supply.

The 80.64 dB SNR target caps integrated output noise at 78.8 µVrms, so noise, not speed, set the design. I gave the input pair a multiplier of 200, deep in weak inversion, for the most transconductance per microamp, used 18 pF of input capacitance to hold down kT/C noise, and swept bias current and capacitance for the minimum-power point. One LTspice testbench carries the bias generator, ideal common-mode feedback, the gain-boosting sources and a loaded replica, so the AC, transient and noise runs share one operating point.

The final circuit draws 62.2 µA, or 0.112 mW, and reaches 63.32 dB at 2.8 µs. Integrated noise is 76.93 µVrms for an SNR of 80.85 dB, and the figure of merit is 175.2 dB against a 174.0 dB target. The open-loop and closed-loop AC runs agree on a 329 kHz closed-loop bandwidth, and the time constant measured in the transient (497 ns) lands within 3 percent of the AC prediction (483 ns).

Dec 2025 to Sep 2026

OwlTransfer: Peer-to-Peer Folder Sync Between a Desktop and a Phone, With a Rust Engine

Keeps one folder identical on your computer and phone over your own Wi-Fi, with no account and no server.

Software

  • 330tests in CI, 112 of them in the Rust engine
  • 3platforms from one Rust engine and one React interface
  • < 1 sfor a dropped file to reach the other device, as the README states

OwlTransfer keeps one ordinary folder the same on a Linux or Windows desktop and an Android phone, over the Wi-Fi they already share. Drop a file in on one side and the other pulls it straight away. Both devices hold a full copy, so either works offline and they catch up the next time they see each other. It is deliberately not a backup or a cloud drive: nothing exists anywhere except on the devices you paired.

The engine is a Rust crate with no UI in it, tested on its own. Each device keeps an index with a BLAKE3 hash and a version vector per path, announces changes over one TLS connection and pulls missing bytes in 256 KiB blocks, so a rename moves no data and an edit made on both sides keeps both copies. A device’s id is the SHA-256 of a certificate it generated itself, and rustls runs with no system trust store. Pairing is a commit-reveal exchange: one side commits to a random nonce before seeing the other’s, and both then derive the same six digits from an HMAC over both nonces and both certificates, so neither side can steer the code. Discovery is a UDP broadcast treated as a hint, since acting on it means a handshake that fails unless the certificate is already trusted.

Version 0.1.4 ships an AppImage, a deb, Windows installers and a signed APK. It started as a Flutter prototype and was rewritten around the Rust engine. On Android, sync runs only while the app is open; there is no foreground service yet.

Dec 2025 to Jan 2026Delft University of Technology

Low-Noise Integrating Amplifier for a Hearing-Loop Receiver (180 nm CMOS)

A two-stage CMOS integrator for a hearing-loop receiver coil, with 7.48 µVrms of unweighted output noise against a 10.6 µV weighted budget, stabilised by one resistor.

Analog & mixed-signal

  • 7.48 µVrmsoutput noise before DIN-A weighting, under a 10.6 µV weighted budget
  • Q 0.70high-frequency pole pair after compensation, down from 5.4
  • 420 Ωthe only compensation part, a phantom-zero resistor
  • 600 Hz to 6 kHzaudio band, driving a 10 pF ADC input

Designed the first amplifier of a hearing-loop receiver on a 180 nm CMOS process: the block that turns a pick-up coil’s signal into a clean audio voltage for the ADC that follows. The coil output is proportional to the rate of change of magnetic flux, so the amplifier is an integrator, H(s) = 62.4 × 103/s, which keeps the 600 Hz to 6 kHz band flat while driving a 10 pF converter input on a 1 mW power budget.

I followed the structured design order: specification, transfer, noise, stages, poles and zeros, then compensation, with SLiCAP for the symbolic analysis and every result checked numerically in ngspice. A 79.97 kΩ termination critically damps the coil’s 150 kHz resonance. The source, termination and feedback resistors get 40 percent of the 10.6 µV weighted noise budget and the input device the rest, which fixes its transconductance. One common-source stage could not keep its loop gain above 0 dB across the band, so the final circuit is a PMOS differential input pair for noise followed by an NMOS common-source stage for loop gain. Output noise comes to 7.48 µVrms before DIN-A weighting, already inside the weighted budget.

On the EKV transistor model all five closed-loop poles sit in the left half-plane, but one pair near 51 MHz has a Q of 5.4 and peaks. A 420 Ω phantom-zero resistor in series with the load, with the feedback tapped before it, pulls that pair to a Q of 0.70 for a maximally flat response, with no compensation capacitor and no added noise in the signal path.

Nov 2025 to Oct 2026

Cheatsheet Maker: Screenshots, Lecture Slides and Formulas Packed Onto One Printable Exam Sheet

Turns screenshots, lecture slides, notes and LaTeX formulas into one dense, printable exam sheet, in the browser or as an app on a computer or phone.

Software

  • 232unit and component tests in CI, plus 16 Playwright tests against the built web app
  • 5platforms from one TypeScript app: the web, Windows, macOS, Linux and Android
  • 150 DPIthe print check's floor for images, with 5 pt the floor for text

Cheatsheet Maker is an editor for one kind of document: the single sheet you are allowed to take into an exam. Everything on the page is a box that can be moved, resized, rotated and cropped. Paste a screenshot, drag a box around part of a lecture PDF, type notes in a small Markdown subset with LaTeX typeset by MathJax, draw and highlight over it, then let auto-pack fit it all onto the page and export a PDF. A print check lists images that will print below 150 DPI and text smaller than 5 pt before the sheet goes to the printer.

The document model is plain TypeScript with no DOM. Edits are pure functions that return a new document and reuse every object that did not change, so undo keeps whole snapshots cheaply: images are referenced by id, never embedded. Auto-pack is a MaxRects packer. Its “fill the page” mode binary-searches the largest single scale at which everything still fits on one page, starting from the bound that no scale can exceed the square root of the page area over the total area of the boxes, and tries two placement heuristics at each step. One renderer draws the editor, the page thumbnails and both exports, so what is on screen is what prints, and in the PDF the strokes and shapes stay vector with each item placed by the same transformation matrix as on the canvas. Images are stored in IndexedDB under the SHA-256 of their bytes, so a lecture page cut into five crops is kept once, and a crop can be widened again later.

It started in November 2025 as a GTK3 app in C for Linux, about 1,800 lines, kept at the v0-gtk tag. Version 1.0, in October 2026, is the rewrite: the same build runs as a web app that works offline after one visit and installs from the browser, and inside Tauri on Windows, macOS, Linux and Android. The Rust shell is deliberately thin: the native save dialog and file writes (webviews do not download), and one command that reads the old app’s autosave, which the Linux build offers to import on first launch. One detail from the Android build: Android 15 draws apps edge to edge but the WebView reports no safe-area insets, so the activity pads it by the system bars itself.

There is no account and no server. Sheets stay in a library on the device and can be saved as a .cheatsheet file, a zip of the document and its images, to move them elsewhere. The README is plain that the Windows installer is not code-signed and the macOS build is not notarised, and says what to click the first time.

Nov 2025 to Oct 2026

nl-property-finder: A Local Rental Agent for the Dutch Housing Market

Watches 49 Dutch rental sites, messages landlords the moment a home matches, handles routine replies and sends you only the decisions that need you.

SoftwareML & computing

  • 49rental sources watched, 24 of them contacted automatically by default
  • 1,230tests in CI, including end-to-end runs against a sandboxed rental market
  • 21MCP tools, so Claude can read the inbox and draft replies

In the Dutch rental market the first reply to a listing often wins it. nl-property-finder is one background process on your own computer that checks every enabled source every one to three minutes, reads the alert emails the platforms send to a mailbox kept for the search, contacts the landlord as soon as a home matches, books viewings inside the times you are free, and puts only offers, contracts, payment requests and anything uncertain in one inbox, with buttons on your phone.

The same home on Funda, Pararius and the agent’s own site is clustered into one property, by postcode and house number or a fingerprint of street, price band and size band, and contacted once. Hard filters run first, so an AI call is only spent on a property that already passes; Claude then extracts the landlord’s requirements and classifies replies, and without a key rules and templates take over. Every match gets an estimate of the legal maximum rent from the official points system, flags for unlawful deposits and fees, and a scam check. State is one SQLite database with a keyed job queue, so a restart never repeats a message, and a send interrupted halfway becomes a task rather than a retry.

It runs as a login service on Linux, macOS and Windows, with a demo mode against a fake rental market and a CLI, REST API and MCP server beside the dashboard. It never pays, signs, shares a BSN or gets past a captcha, and on platforms whose terms forbid automation it only contacts landlords once you switch that on for that platform.

ToolsTypeScriptNode.jsSQLitePlaywrightHonoReact 19Claude APIMCPIMAPVitest

Jun 2025 to Jun 2025Eindhoven University of Technology

Multi-Terrain Mobility System: A Rover That Folds Into a Quadcopter

A four-legged robot that drives on its wheels, then turns each leg 90° so the propeller inside each wheel points up for flight, built by a five-person TU/e Honors team on ROS 2.

Hardware & embeddedSoftware

  • 8.7 Nstatic thrust per motor at 16 A, 1.2 times the hover need at 3 kg

A five-person project in the second year of the TU/e Honors Academy (High Tech Systems track). The long-term idea, which I proposed, is a rescue scout that can cross ground, air and water on its own; the goal for the year was one robot that both drives and flies. The design follows Caltech’s M4 and the FSTAR2 sprawl robot: four legs, each ending in a 3D-printed wheel with an 8 inch propeller inside it. A DC motor on the leg drives the wheel through teeth on its rim. For flight a servo turns the whole leg 90°, so the propeller faces up and the rim is held still, and a printed stop keeps the servo from being pushed past 90° under thrust.

The robot runs ROS 2 Jazzy on a Raspberry Pi 5. A keyboard node publishes joystick messages, a movement manager sends them to driving or flight depending on the current mode, and pressing Q starts a morph action that steps the leg servos so the body lowers smoothly. An Arduino Due running micro-ROS drives the four DC motors and hosts the servo service. Flight runs on a Pixhawk 6C with ArduPilot, still on its own radio controller.

My part was the wheel and the flight hardware. I designed the wheel, including a bearing of sixteen 17 mm steel rods in a printed cage, because a commercial bearing of that size (about 58 mm across) would have added several hundred grams. I chose and wired the flight stack: EMAX 2812 motors, 35 A ESCs, the Pixhawk and a 6S 4000 mAh pack. I soldered the power distribution board and its XT60 and telemetry looms, and checked the 5 V and 12 V rails under a 10 A load. While the parts were on order I ran ROS 2 on a small Crazyflie drone to show a take-off and landing from one command.

On the bench each motor gave 8.7 N of static thrust at 16 A, about 1.2 times what the 3 kg robot needs to hover. The prototype drove and changed modes from the keyboard, but drone regulations and the end of the year meant it was never flown free, so how well it flies is still an open question.

ToolsROS 2micro-ROSPythonC++PlatformIORaspberry Pi 5Arduino DuePixhawk 6CArduPilotFusion 360

Apr 2025 to Jun 2025Eindhoven University of Technology

Gold-Bump Flip-Chip Bonding Process for RF IC Applications

Solder-free flip-chip on glass, with 70 µm gold stud bumps on one Ti/Au layer, 84% bump yield and a lumped bump model fitted to VNA data to 10 GHz.

Devices & process

  • 84%per-bump yield across 22 flip-chipped lines
  • 3.4 Ωde-embedded bump series resistance at 10 MHz
  • 178 pHfitted bump inductance, with 249 fF of capacitance
  • 10 MHz to 10 GHzVNA range, Keysight PNA-X with GSG probes

I developed a gold-bump flip-chip process for RF dies that needs no solder, no under-bump metallurgy and no multilayer carrier, in the Integrated Circuits group at TU/e. The interposer is a single 50 nm Ti / 100 nm Au layer on glass, patterned by lift-off into ground-signal-ground coplanar lines drawn in KLayout to a 50 Ω closed-form design. Gold stud bumps are coined from 25 µm wire on a TPT HB16 bonder and land 65 to 75 µm wide. The die is thermo-compression bonded on a Dr. Tresky T-5300 at 20 g per bump, because 35 g made dies slip. Bumping and bonding both run outside the cleanroom.

The assemblies were measured from 10 MHz to 10 GHz on a probe station with a Keysight PNA-X and GSG probes, and open and short structures de-embedded the line from the bumps. The bump reduces to a lumped model: 3.4 Ω in series at 10 MHz, with 178 pH and 249 fF taking over at higher frequency. The resistance is far above the closed-form estimate for the bump geometry, which points at the Au-Au interface and at contamination from how the interposers were stored rather than at the geometry.

Yield was measured on a separate structure, a small interposer flip-chipped onto a larger one so that 22 usable lines each close through two bumps. Three opens, two shorts and one deformed bump give 84% per-bump yield. Written up as a first-author paper at IEEE SIITME 2025.

ToolsKLayoutQUCSMATLABTPT HB16 bonderDr. Tresky T-5300Keysight PNA-X

Oct 2024 to Oct 2024Eindhoven University of Technology

Real-Time Collision Risk Field from LIDAR on an F1tenth Car

A collision risk field computed live from the LIDAR on an F1tenth car, fast enough to follow the scene once the grid was compiled with Numba, from 2 s per frame to 0.03 s.

SoftwareHardware & embedded

  • 0.03 sper frame of the 300 by 300 risk grid after Numba, from 2 s

A three-person project in the first year of the TU/e Honors Academy (High Tech Systems track), on the lab cars of the SymAware project. The question was how an autonomous car could warn the driver of an ordinary car about a hazard that driver cannot see yet. Rather than tracking obstacles one by one, the car builds a continuous risk field around itself, high wherever it is dangerous to go. We split the problem into assessing the risk, sending it to the second car and showing it to that driver, and built the first part.

The car carries a Hokuyo UST-10LX LIDAR and an NVIDIA Jetson running ROS, and streams its scans over Wi-Fi to a PC. A median filter smooths the ranges, and returns below a calibrated intensity threshold are dropped, because shiny surfaces gave false distances. Runs of neighbouring returns between 15 cm and 1.6 m become obstacles, each with a position and a width estimated from the angle it spans. The field follows the threat model of Cowlagi, Debski and Wyglinski (IEEE VTC 2021): each obstacle adds a lognormal threat whose reach depends on both vehicles’ speeds and a three-second separation rule, summed over a 300 by 300 grid centred on the car.

My part was the LIDAR and ROS side, and the speed. I wrote the ROS nodes that read and process the scans. The first version of the field took 2 seconds per frame, far too slow to follow a moving scene, and pooling and multiprocessing had not helped, so I compiled the grid calculation with Numba and ran it in parallel. A frame then took 0.03 seconds, and the field updated live on the laptop as obstacles moved in front of the car. Passing the field on to a second car was left for later; in the second year the three of us joined a larger team to build the Multi-Terrain Mobility System instead.

ToolsPythonNumPyNumbaROSHokuyo UST-10LXNVIDIA JetsonPygameMatplotlib

Apr 2024 to Jun 2024Eindhoven University of Technology

180 W Wireless Power Transfer System (10 cm Air Gap, 77% Peak Efficiency)

A 180.80 W wireless power link across a 10 cm air gap at 77.36% peak efficiency, built by a team of nine, for which I designed, built and brought up the boost converter board.

Hardware & embedded

  • 77.36%peak end-to-end efficiency, measured at the final demonstration
  • 180.80 Wdelivered across a 10 cm gap, against a 100 W target
  • 150 Wreached by my boost converter board in bring-up testing
  • 304 µHmeasured coil inductance, 0.65% from the 306 µH design

A nine-person team project with one brief: power a desktop PC wirelessly from a sustainable source across 10 to 20 cm, at 100 W or more. The chain is a generator and rectifier, a DC/DC boost converter, a full-bridge inverter, two series-resonant coils, a second rectifier and the load, with an STM32 setting the PWM duty cycle and switching frequency. The inverter drives the transmit coil at 80 kHz. The coils are 20 turns of Litz wire, 17 to 20 cm in radius, tuned with 16.3 nF; their measured inductance came in at 304 µH against 306 µH designed.

My part was the boost converter board, which lifts the generator’s rectified DC (up to 30 V, limited to 10 A) to 50 V for the rest of the chain. I captured it in KiCad and laid it out around an IRF640N MOSFET with an EL7104 gate driver, an MBR10100+ Schottky diode, an external inductor on screw terminals and a 220 µF output capacitor, with an LA 55-P Hall-effect current sensor and resistive dividers bringing current and voltage to the microcontroller. Power traces were sized for about 9 A at a 40 °C rise, over a ground pour covering almost the whole bottom layer.

I then assembled and tested it, starting at low voltage and checking the gate drive and output on a scope, with a breadboard copy of the circuit to isolate faults. That caught a diode footprint that did not match the part, input capacitors too far from the input terminal, wrong divider values, and a status LED and series resistor that loaded the divider. After the fixes the board ran up to 150 W with no hot spots.

The integrated system delivered 180.80 W across 10 cm at 77.36% peak efficiency, past the 100 W target. At 20 cm, with the resonance left tuned for 10 cm, it delivered 23.27 W. MPPT and load detection were written but never tested on the hardware.

ToolsKiCadMATLABSimulinkSTM32 (Nucleo F303K8, C)ESP32

Feb 2024 to Apr 2024Eindhoven University of Technology

Adjustable 10 kHz Low-Distortion Sine Oscillator

A Wien-bridge oscillator at 10 kHz, adjustable from 0 to 5 Vpp, whose output filter cut measured distortion at full scale from 2.69% to 0.96% THD.

Analog & mixed-signalHardware & embedded

  • 0.96%THD at 5 Vpp with the output filter, 2.69% without it
  • 10.04 kHzmeasured at 5 Vpp, and within 1% of 10 kHz from 0.5 to 5 Vpp
  • 5.019 Vppoutput amplitude at full scale, adjustable down to 0
  • 40.33 dBSINAD at 5 Vpp, up from 31.37 dB without the filter

An individual analog design project: a sine oscillator at 10 kHz with an amplitude adjustable from 0 to 5 Vpp and as little distortion as I could get. I compared RC phase-shift, LC and Wien-bridge oscillators and chose the Wien bridge for its clean output and simple frequency setting. Matched 10 nF capacitors and trimmer-tuned resistors set the frequency. One uA741 provides the loop gain, with a 1N4148 diode pair limiting the amplitude so the loop settles just above the oscillation condition instead of clipping, and a second uA741 stage sets the output level. A first-order RC low-pass (1.33 kΩ, 10 nF) at the output suppresses harmonics.

The Qucs simulation showed no significant harmonics. The breadboard did, so I measured the circuit with and without the filter on an NI ELVIS board with a LabVIEW instrument. At 5 Vpp the filter took THD from 2.69% to 0.96% and SINAD from 31.37 dB to 40.33 dB, with the second harmonic 51.65 dB below the fundamental. Across 0.5, 1, 2 and 5 Vpp the THD stayed between 0.42% and 1.13%, and the frequency within 1% of 10 kHz.

What limits it is component tolerance in the frequency network. An output buffer, so a load cannot upset the filter, and a second filter stage are the next steps.

ToolsQucsLabVIEW

Nov 2023 to Apr 2024Eindhoven University of Technology

LeenLoket: Self-Service Tool Library, Flutter App and ESP32 Locker Sharing One Database

A self-service tool library where a Flutter app and an ESP32 locker share a Firebase database and never talk to each other directly.

SoftwareHardware & embedded

  • 4 digitsone code that opens the locker for pickup and again for return
  • 9top-level database nodes, the whole contract between app and locker

LeenLoket (“lending desk” in Dutch) is a self-service tool library. Instead of buying a drill you use twice a year, you book one from your phone for a date range, walk to the locker it lives in, and open that locker with a PIN or a QR code. Two repositories: the Flutter app and the ESP32 locker firmware. There is no backend of our own. The app and the firmware are both Firebase Realtime Database clients, and that database is the entire integration surface between them. Nine top-level nodes hold users, items, reservations, codes, credit and locations. Either half can be replaced without the other knowing.

The app does email and password auth over Rive-animated onboarding, a date-range picker that filters the catalogue to items free for that window, a two-step booking flow priced at pricePerDay times days and paid from a prepaid balance, reservations each carrying a 4-digit PIN and a QR code, and a Google Map of locker locations. Admins land on a separate home screen with CRUD for items, categories, lockers and locations, plus credit top-ups.

The locker is an ESP32 driving a 4x4 keypad, an I2C QR reader, a PN532 NFC reader, an ST7920 LCD and eight WS2812B LEDs, plus a solenoid lock wired fail-secure so a power cut leaves the cabinet shut. The rule that makes it work: there is no “I am returning this” button. The firmware tells a pickup from a return by reading two fields, the reservation status and the item status, so the same four digits work twice. The first use flips the reservation to Completed, which is what makes the second read act as a return. A late pickup is the only path that does not open the door. A late return still opens, because refusing to accept an item back helps nobody.

Both READMEs list what the deadline left broken, including a return loop that spins forever waiting for the NFC tag. LeenLoket was also my startup, and a top 10 qualifier at the TU/e Contest 2025.

Sep 2023 to Jan 2024Eindhoven University of Technology

Pulse: Haptic Bicycle Navigation Device

A handlebar unit that reads the Google Maps turn notification on the phone and buzzes left or right over Bluetooth Low Energy, built for €49.20 in parts.

Hardware & embeddedSoftware

  • €49.20bill of materials, against a €70 target
  • 34Google Maps maneuver icons in the matching library

Pulse gives turn-by-turn directions as vibration on the handlebar instead of on a screen, so a cyclist keeps their eyes on the road. A five-person team built it, spanning electrical and mechanical engineering, computer science, mathematics and industrial design. I was the team’s electrical engineer and team lead: I chose the microcontroller, worked out power and charging, built the breadboard prototype and soldered the final unit.

On the phone, an Android notification listener reads the Google Maps navigation notification, takes the distance to the next turn, and classifies the maneuver by matching the icon bitmap against 34 reference icons. It packs the result into a short code such as r:120, turn right in 120 meters, and writes it to a BLE characteristic on the handlebar unit.

The unit is an Arduino Nano ESP32 running a NimBLE GATT server, with a vibration motor under each grip, a status LED and an 800 mAh LiPo charged over USB-C, in a 3D-printed case that clamps around the stem. The code picks which side buzzes and the pattern; the distance picks the length, 2 seconds beyond 100 m, 1 second inside 100 m and half a second inside 50 m. The parts came to €49.20 against a €70 target.

ToolsJavaAndroid SDKC++PlatformIONimBLEArduino Nano ESP323D printing

Jul 2023 to Sep 2026

StudocuHack: A Browser Extension That Lifts the Blur on Studocu and Saves Documents as PDF

Removes the blur, upsell banners and ads from Studocu documents in the browser and saves every page the site sends as one PDF.

Software

  • 108krelease downloads across 16 versions since July 2023
  • 389stars on GitHub, with 27 forks and five contributors
  • 63tests against fixtures of the four document shapes the viewer serves
  • 4Studocu sites covered: .com, Studeersnel .nl, .vn and .id

Studocu, and Studeersnel in the Netherlands, blur most pages of a document for readers without a subscription and cover the rest in upgrade banners. StudocuHack is a Manifest V3 extension for Chrome, Brave, Edge and Firefox that removes the blur from every page whose content the site sends to the browser, strips the banners, badges and the modal over the document, hides the ads and the AI toolbar, and adds a Download button that captures every page and prints the whole document to PDF.

Studocu’s viewer is pdf2htmlEX output inside a React virtual scroller: each page is a figure image plus a positioned HTML text layer, fetched from a CDN with signed parameters embedded in the page’s Next.js data. The extension reads those parameters, fetches the full-resolution assets for the pages the server will serve, and keeps the blur off as React re-renders by patching the props in each page’s fiber. The limit was measured rather than guessed: on a premium document the text of a locked page is never sent to the browser, so no extension can recover it. A page missing from the signed list keeps its blurred preview and is labelled premium-locked, in the viewer and in the PDF, instead of printing as a blank sheet. One bug worth recording: figure images on the CDN are numbered in hex and text fragments in decimal, and until 2.11.0 the extension built both in hex, so text for page 10 onwards quietly failed.

Version 2.12.1 ships a zip for Chromium browsers and a Mozilla-signed xpi for Firefox. It started in July 2023 and was restructured in September 2026 into separate content scripts with a jsdom test suite and a release workflow that builds and signs on every tag; support for the Indonesian site came in as a pull request. It has no account, no server and no data collection, and its only host permission is Studocu’s asset CDN. Not affiliated with Studocu.

Jun 2023 to Jun 2023Eindhoven University of Technology

Venus Exploration: Sputnik-15 Autonomous Rover

An autonomous rover for a simulated Venus arena, built on one Arduino Uno with ultrasound and infrared sensing and a 38 kHz beacon on a 60 cm tower to find the lab.

Hardware & embeddedSoftware

A ten-person team project. On a walled arena the rover had to find rock samples, avoid mountains and craters, and bring the samples back to a laboratory, all on one Arduino Uno with no remote control. A PING ultrasonic sensor on a servo sweeps 105 degrees ahead and stops the rover about 16 cm from an obstacle. Five downward infrared sensors, each two emitters and a phototransistor, read the black tape at borders and craters and the white rock samples, and a servo gripper closes on a sample.

My part, with one teammate, was finding the laboratory. The lab carries three infrared LEDs in series on a 60 cm tower, driven at 38 kHz so the receiver can tell them from sunlight. The rover carries a matched receiver on its own mast, rotates until it sees the beacon, and drives toward it.

In final testing the rover collected samples and found its way to the lab’s surroundings, but it did not complete a delivery. The report puts that down to sensor thresholds that needed more tuning and a return route that needed more accurate movement than the rover managed. The team also prototyped a Raspberry Pi camera that thresholded lightness to find borders and samples and read ArUco markers on the lab walls, kept as an extra because it fell outside the assignment rules.

ToolsC++PlatformIOArduino UnoParallax PINGRaspberry PiOpenCV

Nov 2022 to Jan 2023Eindhoven University of Technology

Rock Your Baby: Autonomous Baby-Soothing Robotic Cradle

A cradle controller that searches 25 frequency and amplitude settings to calm a baby simulator, and won the course's Fastest Algorithm category in 01:42.

Hardware & embeddedSoftware

  • 01:42winning time in the Fastest Algorithm category
  • 25rocking settings in the frequency-amplitude search space

The course supplies a baby simulator in a rocking cradle that signals stress through crying and a heartbeat LED, together with the model behind it and a score monitor. Teams design the sensing, the motor driver and the decision algorithm. Our sub-modules were each developed as their own M5Stack (ESP32) sketch and then combined into one controller, which won the Fastest Algorithm category in 01:42.

A microphone counts signal peaks per second on a rising-edge interrupt and compares consecutive one-second windows; a drop of 150 peaks or more counts as quieter. A light-dependent resistor watches the heartbeat LED and turns the interval between changes into beats per minute, with rest at about 60. The motor driver sets rocking frequency and amplitude on two PWM channels, five levels each from 5 to 80% duty cycle.

The algorithm starts at the most vigorous corner, 80% and 80%, and lowers the frequency one step at a time. After each step it waits and checks: on the heart rate until it falls to 130 to 150 BPM, then on the crying. If a step did not help, it undoes it and lowers the amplitude instead. Once either setting reaches its lowest level it walks the other one down until the baby rests. Two years later I coached two teams through the same challenge.

ToolsC++ArduinoM5Stack (ESP32)PWM motor control

03 / Open source

Open-source tools

12 repositories

Software I wrote and published on GitHub, from MCP servers for research tools to apps for your computer and phone. Each one opens to a full write-up.

  • Desktop2026

    TU Delft MCP

    Gives Claude, ChatGPT and other AI assistants your TU Delft courses, grades and timetable after one sign-in, and previews every change before making it.

    GitHub
  • Mobile · Browser2026

    Anti Brainrot

    Hides YouTube Shorts and puts social feeds, distracting sites and apps behind a countdown and a timed pass, in the browser and on your phone.

    GitHub
  • Desktop2026

    Screen Side Switcher

    Puts your external monitor left, right, above or below the laptop screen in one click, and brings each desk's layout back when you plug in there.

    GitHub
  • Desktop · Mobile2026

    ToHoot

    Tracks tasks and time on your computer and phone, synced through a private GitHub repository you own and reachable from Claude.

    GitHub
  • Desktop2026

    Garmin Hevy Sync

    Keeps strength workouts, routines and weigh-ins in sync between a Garmin watch and the Hevy app, in the background on your computer or a home server.

    GitHub
  • Desktop · Browser2026

    Meeting Copilot

    Transcribes the conversation you are in and, on one keypress, drafts a first-person answer or talking points grounded in your own codebase.

    GitHub
  • Desktop2026

    Portable Copilot

    Puts open-weight AI models on a USB stick that runs on any computer it is plugged into, offline, with nothing installed and no account.

    GitHub
  • Desktop2026

    IEEE Xplore MCP

    Lets Claude, Cursor and other AI assistants search, cite and read IEEE papers, with no IEEE API key and paywalled papers through your library.

    GitHub
  • Desktop · Mobile2025

    OwlTransfer

    Keeps one folder identical on your computer and phone over your own Wi-Fi, with no account and no server.

    GitHub
  • Desktop · Mobile · Browser2025

    Cheatsheet Maker

    Turns screenshots, lecture slides, notes and LaTeX formulas into one dense, printable exam sheet, in the browser or as an app on a computer or phone.

    GitHub
  • Desktop2025

    NL Property Finder

    Watches 49 Dutch rental sites, messages landlords the moment a home matches, handles routine replies and sends you only the decisions that need you.

    GitHub
  • Browser2023

    StudocuHack

    Removes the blur, upsell banners and ads from Studocu documents in the browser and saves every page the site sends as one PDF.

    GitHub

04 / Research

Published and presented

Peer-reviewed work and talks. The packaging paper is my bachelor end project at TU/e, published at IEEE SIITME 2025.

  1. Talk20 May 2026How ComChamp ships with ClaudeClaude Community Meetup, EindhovenA talk on giving an agent the whole stack rather than just the codebase, and what that does to the distance between a stand-up and a demo.

    Most teams give Claude their codebase. The argument of this talk was that the codebase is the floor, not the ceiling: ComChamp routes one agent across six surfaces, repositories, Postgres, Slack, Jira and Confluence, Kubernetes and a browser, through a thin layer of rules, skills and slash commands.

    The worked example came from that morning’s stand-up. A task-filter feature flag went from a 9:30 stand-up to an 11:00 prototype demo. The interesting part is not that the agent is fast, because it is not. It is that nothing in between needed a human.

    One of six talks at the first Eindhoven meetup, hosted at Pipple and organised with the Anthropic Claude community team.

  2. Paper23 Dec 2025Development and Characterization of a Gold-Bump Flip-Chip Bonding Process for RF IC ApplicationsIEEE SIITME 2025A single-layer Ti/Au coplanar-waveguide interposer on glass, bonded to a GaN chip with 70 µm thermosonic gold bumps and reduced to a lumped bump model ready for PDK integration.

    Gold bump flip-chip interposers on glass offer the low-parasitic interconnects required for next-generation RF system-in-package (SiP) assemblies. Existing approaches often rely on multilayer metal stacks and complex bonding profiles. This work presents a simplified alternative: a single-layer Ti/Au ground-signal-ground coplanar waveguide interposer, bonded to a GaN chip using 70 µm thermosonically placed gold bumps. The process encompasses bump formation, flip-chip thermocompression, and open-short de-embedding. Broadband electrical measurements are reduced to a lumped-element bump model, which can be directly integrated into a process design kit, enabling cost-effective RF SiP prototyping on glass substrates.

    Presented at SIITME, the IEEE International Symposium for Design and Technology in Electronic Packaging, and published on IEEE Xplore. With acknowledgements to Vaggelis Zaoutis and Eugenio Cantatore.

    AuthorsDaniel Tyukov, Timo Matray, Marco Fattori, Vojkan Vidojkovic, Georgi Radulov

05 / Background

Education and awards

Education

  1. Delft University of Technology

    Master of Science, Electrical EngineeringMicroelectronics

    • Full-custom analog and mixed-signal IC design, digital ASIC flow and semiconductor processing
    • Teaching assistant for the NRO Comenius Data Science and AI education project
  2. TU/e Honors Academy

    Honors Academy, High Tech Systems

    • Year 1: SymAware research and implementation
    • Year 2: Multi-Terrain Mobility System (MTMS)
  3. Eindhoven University of Technology

    Bachelor of Science, Electrical Engineering

    • Honors Academy: High Tech Systems track
    • Bachelor End Project: Development and Characterization of a Gold-Bump Flip-Chip Bonding Process for RF IC Applications, published at IEEE SIITME
    • Student team: Aero Team Eindhoven
  4. Aspire Private British School

    High School Diploma

    • Apolytirion and A-levels: Mathematics, Computer Science, Physics, Economics, Russian

Languages

  • EnglishNative or bilingual
  • RussianNative or bilingual
  • DutchElementary

Awards

  1. 2025

    EHCI Research Project 2nd Place Award

    Eindhoven Hendrik Casimir Institute

    Toward terahertz hybrid/heterogeneous integrated photonics/electronics devices

  2. 2025

    Top 10 Qualifier, TU/e Contest

    TU/e Contest

    Team LeenLoket.

  3. 2024

    Aero Team Eindhoven Team Member

    TU/e Innovation Space

  4. 2022

    National Leadership Award

    JA Cyprus

    The Leadership Award 2022 at the JA Cyprus finals, won as CEO of the student company Cobaltcup.

  5. 2021

    Space Apps 2021 Global Nominee

    Cyprus Space Exploration Organisation

    Marine debris detection with commercial satellite imagery and deep learning, in Python and TensorFlow.

  6. 2020

    Space Apps 2020 Global Nominee

    Rotary Limassol-Berengaria Cosmopolitan

    AstroUnify, built in Flutter and Dart.

06 / Contact

Two ways to reach me

Pick a time from my actual calendar, or write instead. Both land in the same inbox and I answer everything from a real person.

Book a call

30 minutes, video. Times shown are the open slots left in my calendar, in your timezone.

Reading my calendar…

Send a message

For anything that does not need a call. You will get a copy back as a receipt.

Goes straight to contact@danieltyukov.com. No newsletter, no list, no forwarding.

A note

Thanks for reading this far. Most of these projects began as a question I could not leave alone, and the answer usually sat in the field next door. If you are building something like that, or need a hand with one part of it, write to me or book a call.

Daniel Tyukov, The Hague