Skip to content

Project Portfolio

A closer look at the architecture and technology stack behind the software listed on the Software page.


Digital Twin as a Service (October 2020 – Present)

Digital Twin as a Service is a multi-tenant platform for cyber-physical systems, digital twins, and Internet of Things systems. It is implemented with TypeScript, React, Node.js, and Python.

System Architecture Block Diagram:

DTaaS system architecture

C4 Level-2 Diagram:

DTaaS C4 level-2 diagram

Technology Stack:

Category Details
Architectures Microservices, multi-component platform, scenario-based deployment
Languages TypeScript, JavaScript, Python, Bash
Frameworks React, NestJS, Redux Toolkit, MkDocs Material
Infrastructure Docker, Docker Compose, Traefik
Testing Jest, Playwright, pytest
Security OIDC, Keycloak, TLS

Chitragupta

Chitragupta is a local-first command-line tool for writing scholarly prose (surveys, thesis chapters, textbook chapters, tutorials, research reports, and books) from a BibTeX bibliography. Its central guarantee is that a citekey can be used only if it appears in the user's exported .bib file and was parsed from a real PDF. A citation gate sits on the only path from draft to rendered output, and a failing gate sends the draft back for rewriting. The tool never fetches papers, invents citekeys, or renames them. It is published on PyPI as chitragupta-cli (MIT licence).

Workflow:

  1. Export a Zotero library as BibTeX with attached PDFs.
  2. Run chitragupta corpus sync to build a local ledger of the corpus.
  3. Ask a supported coding agent (Claude Code, Codex, or OpenCode) for a draft; the matching genre skill runs the citation gate, reference generation, and render chain.

System Architecture Block Diagram:

Chitragupta system architecture

The system has four layers. The corpus layer is deterministic and uses no LLM: it syncs the Zotero export into a ledger, extracts PDF text, reports duplicate and stale citekeys, and offers topic discovery over the corpus. The drafting layer provides eleven skills (six for new drafts, three for revisions, one for book assembly, one for TikZ figures). It keeps a nine-file dossier per draft that records scope, evidence, rejected sources, and steering decisions, so a draft can be resumed months later. Evidence is stored as paraphrased claims, separate from optional exact quotes. The review layer provides eleven advisory aids (provenance, verbatim overlap, coverage, synthesis depth, quotation accuracy, NLI-based claim support, and others) that merge into a ranked worklist; none of them blocks output. The optional enrichment layer adds layout-aware parsing, semantic search, and topic modelling, and costs considerable time and disk space. Missing optional packages degrade gracefully to a lower tier. Output is rendered to Markdown, LaTeX, PDF, or DOCX, with IEEE reference lists built only from cited keys.

Technology Stack:

Category Details
Architectures Layered pipeline (corpus, drafting, review, enrichment), citation gate, dossier-based resumable drafting
Languages Python (3.12 and later), TeX/TikZ
Parsing and Retrieval pdftotext, Docling, BM25, bibtexparser
Enrichment (optional) PyTorch, sentence-transformers, ChromaDB, BERTopic, SciPy, NetworkX
Output Pandoc, TeX Live, Poppler; Markdown, LaTeX, PDF, DOCX
Tooling Poetry, pytest, MkDocs Material, Docker, chitragupta and cg CLIs
Integration Claude Code, Codex, OpenCode agent skills and hooks

Simulation Bridge (May 2025 – Present)

Simulation Bridge is a Python-based middleware for distributed simulation of digital twins and IoT systems. It provides interfaces to MATLAB and Simul8 and can also serve as a backend for Manufacturing-as-a-Service platforms. The system follows a plug-in-based protocol adapter architecture, enabling seamless future integration of additional protocols. It currently supports MQTT, RabbitMQ, and RESTful interfaces, allowing external clients to communicate with the simulation bridge through these channels. All system components follow an event-driven architecture.

System Architecture Block Diagram:

Simulation Bridge system architecture

Technology Stack:

Category Details
Architectures Distributed simulation middleware, plug-in protocol adapters, bidirectional routing
Languages Python, MATLAB
Protocols REST, MQTT, RabbitMQ, in-memory API
Frameworks FastAPI, Quart, Hypercorn, Uvicorn, Pydantic
Tooling Poetry, pytest, pylint, performance metrics
Security TLS, JWT, structured error handling

P.I Games (December 2025 – Present)

P.I Games is a browser-based game platform that ships with Mini Royale and The Argonauts as two distinct experiences built on different rendering and gameplay stacks. The platform supports telemetry, player-vs-player play, and saving of game state.

  • Mini Royale. A Clash Royale-inspired 3D card battle game with strategic deck building and real-time AI opponents. The browser client combines Three.js rendering, event-driven match logic, wallet and leaderboard flows, and optional PvP synchronisation over WebSockets.
  • The Argonauts. Navigate the seas of Greek mythology in this epic text adventure where legend and strategy collide. The game layers PixiJS-rendered scenes with chapter progression, riddles, inventory, metrics, and local save-management systems.

System Architecture:

Browsers reach both games through a shared games portal, which is served by a NestJS backend handling authentication, admin, leaderboard, storage, chat, PvP, and monitoring. Mini Royale (Three.js, ECS, wallet, leaderboard, PvP) and The Argonauts (Pixi scenes, chapters, inventory, riddles) each save progression and metrics to browser localStorage, while the NestJS server persists users, wallets, telemetry, and match progress to SQLite via TypeORM. An admin module built on a distilbert-base language model also talks to the server over HTTP.

Technology Stack:

Category Details
Architecture Entity Component System, MVC, full-stack
Languages TypeScript, JavaScript, HTML, CSS
Mini Royale Vite, Three.js, ECS-style gameplay modules, Web Audio, service worker support
The Argonauts PixiJS, scene and chapter managers, inventory and riddle systems, localStorage-backed saves and metrics
Backend NestJS, PassportJS, TypeORM, ExpressJS
Networking and Data REST, WebSocket, telemetry, SQLite
Testing and Tooling Vitest, Playwright, Supertest, ESLint, Prettier, Nest CLI

Please note that this game has been developed by my son (12 years) and me using LLM agent workflows over three weeks. Only the architectural and game feature requirements were provided as prompts to the LLMs.

Effort Estimate (based on 68,504 physical source lines of code; estimated calendar time is 18.8 months):

Estimation Model Effort (PM) Cost (DKK)
COCOMO Organic 203.1 8,124,057
Walston-Felix 243.5 9,740,132
Bailey-Basili 103.8 4,153,810
Industry Average 124.6 4,982,109
Function Points 62.3 2,491,055
Average 147.5 5,898,232

Transport Scheduler (August 2015 – May 2018)

Transport Scheduler provides search services for travellers using multimodal transit networks. It uses Elixir's actor framework to implement the transit search algorithms within a quasi-neural network model. The application is implemented in Elixir, a functional, concurrent programming language. Elixir, together with the Erlang Open Telecom Platform, made it possible to implement station entities using the actor concurrency model.

System Architecture Block Diagram:

Transport Scheduler system architecture

Technology Stack:

Category Details
Architectures and Design Actor-based concurrency, finite state machines
Languages Elixir
Runtime Erlang OTP, GenStateMachine, ExActor
API Maru REST API, JSON-based queries, user preference filters
Libraries HTTPoison, CSVLixir
Tooling Distillery, EDeliver, ExDoc, ExCoveralls, Credo

AutolabJS (January 2015 – December 2018)

AutolabJS is distributed evaluation software for programming projects and assignments. It supports C, C++, Java, and Python submissions through a modular microservice platform with GitLab-backed repositories, live result updates, and persistent scoreboards. In the LLM agentic landscape, this project is equivalent to a platform for in-depth test harnesses on which code competitions could be held.

System Architecture:

A web browser submits code to the frontend, which dispatches evaluation jobs to a load balancer. The load balancer forwards jobs to a pool of execution nodes and maintains a best-commit cache, while the frontend reads configuration from and the execution nodes clone labs and commits from GitLab. Both the frontend and load balancer read from and write scores to a MySQL database of labs and scoreboards.

Technology Stack:

Category Details
Architecture Microservices, MVC, distributed caching
Languages JavaScript, Bash, C, C++, Java, Python
Backend Node.js, Express
Protocols Socket.IO, HTTPS
Data and VCS MySQL, GitLab, Git
Deployment Docker, Ansible, Vagrant, VirtualBox
Testing and Quality Mocha, Chai, Sinon, Nock, NYC/Istanbul, ESLint, Codecov, Travis CI

IRCLogParser (January 2016 – April 2018)

IRCLogParser analyses and visualises real-time online chat communities such as IRC channels. It uses analytical models from statistics, network science, and data mining to derive local and global communication patterns from multi-channel log data.

System Architecture:

IRC channel logs (Ubuntu, Slack) feed into a parser, which passes structured data to an analysis core made up of network, channel, user, and community modules. The analysis core produces derived metrics and graphs and statistics (CSV, NET, JS) for output, communities for visualisation (matplotlib, Plotly, PyGraphviz), and model parameters for a validation and profiling stage; output artefacts also feed the visualisation stage.

Technology Stack:

Category Details
Architecture and Design Pipes and filters, SOLID principles
Languages Python, Shell
Parsing and Data Prep BeautifulSoup
Analytics NetworkX, scikit-learn, pandas, NLTK
Visualisation matplotlib, Plotly, PyGraphviz, Protovis
Docs and Quality Sphinx, Travis CI, Codecov, Code Climate