Muhammad Subhan Rauf

Software engineer. Most of what I ship is the part that makes shipping safe, secrets management, authentication, deployment, CI gates, backup verification, and the systems I build for myself are agentic ones that keep working when I am not watching them.

01

The engineering record

54 of 85 production pull requests in four months were platform hardening, security, infrastructure, and CI governance, rather than feature delivery. I am not primarily the person who ships the feature. I am the person who makes it safe to ship, and then automates the thing that keeps it safe.

The work below was done on a production platform over four months. It is described by category only: the repositories are private and belong to my employer, so no company, product, client or repository name appears anywhere on this page. The engineering is described precisely because that is the part you need in order to judge it.

Production pull requests by theme, over four months
ThemePRsWhat that work was
Security26Clearing critical CVEs from a production image, stripping hardcoded credentials into managed secrets, mandatory TOTP two-factor with recovery codes, secret scanning, an automated key-rotation service.
Feature20Turning a feedback popup into a real ticketing pipeline, attachments, contact flows, CMS pages.
Infrastructure and deploy14Single-container serverless deploys, identity-proxy-gated staging, VPC connectors, private database networking, keyless CI-to-cloud authentication.
CI and governance14Pull-request check gates, dependency automation, two linters brought to zero findings, pre-commit and pre-push hooks.
Fixes12Crash and correctness work.
Backup and disaster recovery5Production data store backup, verification, and failure alerting to a dedicated channel.
Distinct PRs85Across 17 repositories, in the first four months on the platform. The rows above sum to 91, not 85, because a pull request can carry more than one theme, a deploy change that also moves a hardcoded credential into a secret store is counted under both infrastructure and security.

What that means in practice

  • Credentials. Hardcoded secrets removed from source into a managed secret store, secret scanning added so they cannot come back, and an automated key-rotation service so the remaining ones expire on a schedule rather than on someone remembering.
  • Authentication. Mandatory TOTP two-factor with recovery codes, mandatory being the load-bearing word, because optional two-factor protects the people who were never the risk.
  • Supply chain. Critical CVEs cleared from a production container image, dependency updates automated, two linters brought from a backlog of findings to zero and then gated so they stay there.
  • Deployment. Single-container serverless deploys, staging behind an identity-aware proxy, VPC connectors and private database networking so the database is not reachable from the internet, and keyless CI-to-cloud authentication that removes the long-lived deploy credential entirely.
  • Recovery. Backups for the production data store, verification that the backups restore, and alerting to a dedicated channel when the verification fails. An unverified backup is a belief, not a backup.
  • Gates. Pull-request checks, pre-commit and pre-push hooks, so the standard is enforced by the pipeline rather than by review attention.
02

What the work has in common

Across 61 personal repositories and four months of production work, the through-line is not a language or a domain. It is that the thing I build is usually the thing that then runs without me.

The oldest surviving code is a GPA calculator and a timetable generator, chores handed to a machine. Then autograders that mark without me. A command-line agent that plans and executes without me. An agentic platform that dispatches responders without me. Secret scanning, dependency automation and key rotation that enforce a standard without me. Same instinct, seventeen times, in domains that have nothing else in common.

The second pattern is the counterweight, and it is equally old: I restart rather than abandon. The first repository contains two independent passes at one algorithm and two at one tool. A command-line assistant is rebuilt across five repositories in eight months. A client site is rebuilt across three. Two autograders exist because the first stopped at three commits. Handing work to a machine is not the same as losing interest in it.

The third is the one that took longest to arrive and is the most useful. In three separate domains, an agentic dispatch system, a retrieval pipeline, and a test-script generator, the architecture converges on the same shape: the model proposes, and a deterministic component with its own tests decides whether the proposal is allowed. A policy module. A halt validator. A command schema. None of these were copied from the others.

03

How it got here

Dated from repository creation timestamps, with one exception noted below.

Before the account

Plain Python, printing to a terminal

Every program is a chore someone no longer has to do.

The oldest surviving code is eighteen files of plain Python with no version control behind it, recovered from a backup and pushed in March 2024, which means the repository timestamps record the rescue rather than the work. The first-push date on this account is not the date I started programming.

Two habits are already fully formed in that one repository. The first is what the programs are for: a GPA calculator, a timetable generator, a spreadsheet writer, a binary encoder and decoder. Every one of them takes a repetitive task off a person. The second is that the same problem gets solved twice, there are two independent passes at the timetable tool, and two at a longest-run algorithm, the earlier of which is named after its own complexity.

Learning_python

2024-02 → 2024-05

The first output that was not text

Games are where the terminal ended.

Three months, two engines. Pygame for a Doodle Jump clone, then Godot with C# twice, a platformer and a 2D portal game whose levels are authored in Tiled and imported as tilesets. This is also the first work committed to GitHub at all.

The first AI project lands in April 2024 at the end of this window: an intent-classification chatbot with a trained Keras model, a pickled vocabulary, a desktop GUI and speech input.

doodle_jump · Platformer · 2dPortalGame · chatbot

2024-07 → 2024-12

Things that do a job while I am not there

The first delegation, and it arrives three times in one month.

Three autograder repositories inside a single month, September 2024: a course site, a first autograder, and then the one that kept going. An autograder is the purest form of the pattern that runs through everything after it, you write the marking logic once and it marks without you, at three in the morning, for people you never meet.

The first command-line assistant repository appears in November, two files long.

Programming1 · Programming1-Autograder · autograder · Ethics-Quiz · UniformChecker · VigiLinux

2024-11 → 2025-06

One idea, rebuilt five times

Eight months on a single problem, restarted rather than abandoned.

A command-line AI assistant grows from two files and 11 KB of Python into 322 KB across five repositories, ending as a final-year project with a context-aware interactive shell, a Docker module, a persona system, and an agent that plans and generates whole projects. The generations are legible: each repository is a fresh start rather than a branch.

In parallel, a client site is restarted three times under three names in the same window.

VigiLinux · VigiLinux-Langgraph · langgraph-vigi · vigi-hub · VigiLinux_FYP

2025-06 → 2026-05

Many systems, all running at once

Breadth, and the first projects with real operational weight.

A full offensive-security attack chain for coursework. A scraper. An XGBoost hyperparameter search with SHAP interpretation. A carpet-trade inventory and orders backend. An LLM-driven trading ledger. A drag-and-drop builder that emits Playwright test scripts. An HR performance platform that scores employees from live project-management data.

This is the period where projects stop being single-file scripts and start having migrations, Dockerfiles, CI workflows, and a service layer.

Offensive-Security-Playbook · webscraper · MLops · crypto-llm · crypto-interface · CarpetManagement · selenium-builder · pulse-kpi

2026-04 → now

Setting the bounds instead of pressing the button

Agents act; the job becomes deciding what they are allowed to do.

An agentic disaster-response platform where two reasoning loops detect incidents, rank resources, dispatch responders and cordon zones while operators watch the reasoning stream, with a policy module and a validator suite whose entire purpose is to bound what the agents may do. Retrieval pipelines built the same way in client work: the model proposes candidates, and a vector index with a similarity floor decides which of them are allowed to stand. The client work is described by stack only and is deliberately unnamed.

In the same window, four months hardening a production platform. That work is described by category at the top of this page and is deliberately unnamed.

range-alarm · sentinel-city

On the dates

The earliest repository is a March 2024 upload of pre-GitHub work recovered from a backup, so its timestamps record the rescue rather than the work. First push dates on this account record when I started using GitHub, not when I started programming.

04

Selected work

Fourteen entries covering 21 repositories. Each is written from the repository itself, file tree, dependency files, migrations, rather than from memory. Commit counts are from the default branch. Where a repository is private there is no link, because there is nothing you could open.

2026-05 → 2026-06

Sentinel-City

An agentic disaster-response platform where two reasoning loops detect, cordon and dispatch, and the operator sets the bounds rather than pressing the button.

Repos
Stack
FastAPI · PostgreSQL 16 · LangGraph · Vertex AI Gemini · React 19 · Vite · Leaflet · Expo / React Native · Docker Compose

Architecture

Three clients over one system of record. A React 19 operator console on Leaflet, an Expo React Native app carrying three distinct roles, citizen, responder, admin, and a FastAPI backend holding disasters, citizen reports, field reports, emergency calls, stations, and simulated weather and traffic that react to whatever is currently active. Postgres is the single source of truth, migrated by numbered SQL files rather than an ORM migration tool, which keeps the schema legible as a document.

The agent work is a package, not a script. backend/pipeline/ separates the stages that a naive implementation would fuse into one prompt: extract pulls structure out of incoming reports, cluster groups them spatially, decide makes the call, dispatch_agent and execute carry it out, world_slice assembles the bounded view of the city that a model is allowed to reason over, and operator handles the human side. prank_check exists because a system that accepts citizen reports will receive false ones, and that filter is a separate, testable module rather than an instruction buried in a prompt.

Provenance is enforced at the write layer. Every agent-originated write is stamped with its source, and the mobile warning feed is server-filtered to agent-authored records only across five different tables, alerts, cordons, declared incidents, active dispatches, weather. Operator-drawn entries never reach citizens. That is a data-model decision rather than a UI decision, which is why it holds.

The bounding is explicit. backend/safety/policy.py is a standalone policy module with its own test file, test_policy_validators.py, sitting alongside eight further test modules covering extraction, clustering, decision, execution, geometry, world slicing, citizen reports and wiring, plus a separate stress test. The agents are the part that improvises; the policy layer is the part that does not.

The frontend does real work offline. A 6.4 MB road graph for the target city is baked at build time by a script and shipped as a static asset, so routing and avoidance run against a local graph instead of a round trip. A service worker caches map tiles. A 135 KB citizen simulation engine with its own spatial index drives the synthetic population.

Trade-offs

  • Numbered SQL migrations instead of an ORM migration framework: harder to generate, trivial to read and to reason about in review. For a schema that four different clients depend on, being able to read the whole history as twelve short files is worth losing the generator.
  • Baking the road graph into a static asset costs 6.4 MB of transfer and a build step, and buys routing that does not depend on an external service being up during an incident. For a disaster-response demo, the failure mode you are showing off must not itself depend on the network.
  • Splitting the pipeline into nine modules is more code than a single orchestrating prompt and considerably more test surface. It is what makes the behaviour attributable, when a dispatch is wrong you can tell whether extraction, clustering or the decision produced it.
  • Simulated weather and traffic that respond to active events add a whole subsystem that a real deployment would replace with feeds. Without it there is nothing to demonstrate, because real disasters cannot be scheduled.
What is not claimed here

The repository README describes an earlier structure (orchestrator.py, agent_tools.py, api_client.py) that no longer exists. The description above follows the current file tree.

2024-11 → 2025-06

Vigi, a command-line assistant, five times

Two files and 11 KB in November 2024. 322 KB and a project-generating agent by June 2025. Five repositories, each a restart rather than a branch.

Repos
Stack
Python 3.9+ · LangGraph · Google Gemini · Groq · Typer · rich · questionary · Docker SDK

Architecture

The final generation is a CLI that dispatches to four substantially different subsystems behind one entry point. shell_smart is a LangGraph-driven interactive shell that generates commands from intent, explains them, validates them for safety, offers execution, summarises the output, and checks and installs missing dependencies with approval. developerch is a software-development agent that plans a project, generates its files, and can then be talked to about the codebase it produced. docker_part handles Docker in natural language, including interactive Dockerfile generation. chat_manage and convo_manage run persistent REPL sessions with history.

The persona and procedure system is the piece that generalises. Personas are JSON files on disk that the user can create; procedures are user-written Python functions in a known directory that the model is allowed to call as tools. Extension does not require touching the codebase, which is the same delegation instinct as the autograders, applied to the tool itself.

Approval is a structural boundary throughout. Commands are explained before they run, dependency installation asks first, and generated project state is written to a .vigi_dev_meta folder inside the target project so the agent's working memory lives next to the thing it is working on rather than in a global store.

The lineage is legible because each generation is a separate repository. Generation one is main.py plus temp_storage.py, 11 KB of Python total. Generation two is the first LangGraph rewrite. The final one is 322 KB across seventeen modules, with two different shell implementations kept side by side, shell_smart for the current one and shell_part for the older, still reachable under a different flag.

Trade-offs

  • Restarting in a new repository rather than refactoring in place: the history of what changed between generations is lost, and in exchange every generation stays runnable and comparable. The five repositories are a record of a learning curve that a single rebased branch would have erased.
  • Two shell implementations shipped in the same package is duplication, retained deliberately so the older behaviour stays available while the LangGraph one matures.
  • Multi-provider support, Gemini as primary, Groq optionally for the Docker module, costs an abstraction the project did not strictly need at that size, and buys the ability to move when a provider degrades.
  • Executing model-generated shell commands is the central risk of the whole idea. It is handled with explanation, validation and an interactive prompt rather than a sandbox, which is a reasonable trade for a personal tool and would not be one for a shared deployment.
2026-04 → 2026-05

Pulse KPI

An HR performance platform that pulls tasks from whichever project tracker the company happens to use, scores them, and keeps the scoring code ignorant of where the tasks came from.

Repos
  • pulse-kpi, private, 82 commits
Stack
Django 4 · Django REST Framework · Django Channels · SimpleJWT · React 19 · Vite · React Router 7 · Google Gemini · Redis · PostgreSQL · Docker

Architecture

The central design decision is an adapter seam. ClickUp and a self-hosted Plane instance are both reduced to the same internal task shape by separate clients, and generate_kpi_for_member() never learns which one it is looking at. The source is selectable per request through settings, a CLI flag, or an API field, so switching a company from one tracker to another is configuration, not a rewrite. Local database tasks are a third source through the same seam.

Scoring is a model call over structured input, across eight evaluable categories and seven non-evaluable ones. Weights live in the database with their own migration (0006_kpiweights) rather than in code, which means the thing most likely to be argued about is the thing easiest to change.

Attendance is a rules engine, not a timestamp log. attendance_rules.py and attendance_rules_views.py sit alongside a recompute-attendance management command, meaning rules can change and history can be recomputed against them, which is the difference between a policy system and a spreadsheet.

Authentication is cookie-based JWT rather than tokens in local storage. Real-time updates run over Channels, with Redis in production and an in-memory layer in development so the local setup does not require Redis to be installed.

Nineteen migrations across the visible history, including a project-hierarchy and roles migration that arrives late, the shape of an org model that was discovered rather than designed up front.

Trade-offs

  • A tracker-agnostic adapter is more code than integrating directly with one API, and it is the reason a second integration cost a client class instead of a fork.
  • KPI weights in the database rather than in code: no type checking, no code review on a weight change, and no deploy needed either. For a number that HR will want to tune, that is the right side of the trade.
  • SQLite in development with Postgres in production is a real correctness risk at the margins, taken in exchange for a zero-setup local environment.
  • Letting a language model produce performance scores about people is the significant judgement call in this system. The structure around it, fixed categories, database-held weights, separate evaluable and non-evaluable groupings, an assignment and notification model for who evaluates whom, reads as an attempt to make the model one input to a reviewable process rather than the arbiter.
2025-11 → 2026-04

Visual test builder

Drag nodes on a canvas, get a working Playwright script. A React Flow front end over a Django API, with the model providers behind a registry so none of them is load-bearing.

Repos
  • selenium-builder, private, 59 commits
Stack
Django 5 · Django REST Framework · React 19 · React Flow · Vite · Playwright (Python) · Docker Compose · GitHub Actions

Architecture

A monorepo with one job: let someone who does not write code assemble a browser test, and emit real Playwright Python from it. The canvas is React Flow; the backend owns the graph, the generated script, the test runs and their progress.

Model providers are a registry. ai/providers/ holds Anthropic, Gemini and OpenAI implementations behind a shared base class, resolved through registry.py. Nothing in the application imports a provider directly, so a provider change is a configuration change.

Generated commands are validated before they are trusted. ai/commands/schema.py defines the command vocabulary and ai/commands/validator.py, the largest module in that package, checks model output against it, with a pre_parser.py ahead of both. The model proposes a command; the schema decides whether it is a command at all. This is the same pattern as the retrieval work's confidence floor and Sentinel-City's policy module, arrived at independently in three different domains.

System prompts are a 13 KB Python module kept separate from the code that calls them, with a context.py that assembles per-request context. Request throttling is applied at the AI views specifically rather than globally.

Multi-tenancy arrives through migrations rather than a rewrite: user profiles, teams and team membership in 0005, invitations in 0006. Test runs get a progress field in 0003, a small migration that marks the point where runs stopped being instant.

A separate worker Dockerfile alongside the API image, so test execution scales independently of the web tier.

Trade-offs

  • Generating Playwright Python rather than executing an interpreted graph directly: the output is a real file the user owns and can commit, run in their own CI, and edit by hand. The cost is that the generator has to produce code that is actually good, and every new capability needs both a node and a code template.
  • A provider registry over three model vendors, at a project size where one would have done. It is cheap insurance and it makes provider comparison a runtime question.
  • Schema-and-validator over trusting structured output: real work, and it is what stops a malformed generation from becoming a broken script the user has to debug without having written it.
  • A separate worker image adds an operational component. Without it, a long test run blocks a web worker.
2026-05

Range Alarm

A React Native alarm app that drops to a hand-written Kotlin module, because the one thing an alarm must do is the one thing JavaScript timers cannot.

Repos
Stack
Expo SDK 54 · React Native 0.81 · TypeScript · Kotlin · expo-router · expo-sqlite · Zustand · Reanimated · d3-geo · TopoJSON · Luxon

Architecture

The project ejects to a bare Android workspace and ships a local native module, native-alarm, linked from the filesystem rather than a registry. 58 KB of Kotlin sits under a TypeScript app, a deliberate drop out of the cross-platform layer at exactly the point where the cross-platform layer cannot deliver. A JavaScript timer in a backgrounded React Native app does not survive Doze; an Android alarm scheduled through the platform does.

Time zones are treated as geography. world-atlas TopoJSON rendered through d3-geo and react-native-svg gives a real projected world map, with Luxon doing the zone arithmetic, so selecting a range is a spatial act rather than a dropdown.

State is Zustand; persistence is expo-sqlite on the device. There is no backend, which means no account, no sync, no server to keep running for a utility that must work on a plane.

Reanimated with the worklets runtime for interaction, expo-haptics for physical feedback, expo-audio for the alarm itself.

Trade-offs

  • Writing and maintaining a Kotlin module inside an Expo project gives up the managed workflow, no Expo Go, a real Android build required. For an alarm, correctness at the moment of firing is the entire product, so the trade is not close.
  • Local SQLite rather than a synced backend: no cross-device continuity, and no infrastructure, no account, and no privacy surface.
  • Shipping a full world TopoJSON adds meaningful bundle weight in exchange for a map that works with no network, appropriate for an app whose main use case is travel.
  • iOS is not addressed by the native module. The app is Android-first by construction.
2025-08 → 2025-11

Carpet trade management

Stock, orders, lendings, contractors and payments for a physical business, with the money logic in a service layer instead of the route handlers.

Repos
Stack
Python · Flask · JavaScript · GitHub Actions

Architecture

A strict two-layer split. app/api/ holds seven thin route modules, contractors, lendings, orders, payments, stock, stock reports, stock transactions, and app/services/ holds the logic they call. The route files are between 0.8 and 5 KB; order_service.py alone is 21 KB. Nothing that decides anything about money lives in a request handler.

Stock is modelled as transactions with a separate reporting service over the top, rather than as a mutable quantity column. That is the difference between knowing what you have and knowing how you got there, and it is the thing an inventory system is usually missing.

lending_service.py at 10 KB is the domain-specific part: carpets go out to contractors and come back, which is neither a sale nor a stock transfer and needs its own vocabulary.

An Excel export service, because the business this serves runs on spreadsheets and a system that cannot hand work back to a spreadsheet does not get adopted.

A GitHub Actions build workflow, the earliest CI in the personal repositories.

Trade-offs

  • A service layer at this scale is more files than a small Flask app needs. It is what makes order and payment logic testable and reviewable in isolation, and it is the reason the largest module is a service rather than a view.
  • Transaction-log stock over a quantity field: every read costs more, and stock history becomes auditable rather than reconstructed.
  • Excel export is unglamorous integration work that is frequently the deciding factor in whether an internal tool is used at all.
2025-10

LLM trading ledger

A model proposes trades against live price data; a separate ledger module is the only thing allowed to record them.

Repos
  • crypto-llm, private, 5 commits
Stack
Python · LLM API · GUI

Architecture

Five modules with one boundary that matters: data_fetcher gets prices, llm_handler reasons, trading_ledger records, persistence stores, price_updater runs on its own cadence. The model never writes to the ledger directly.

A ledger as a distinct module rather than a list of trades in the model loop makes position and history the system of record, and reduces the model to something that produces proposals.

Settings are isolated in config/settings.py and there is a create_structure.py scaffolding script, a habit visible across several of these repositories, where the project layout is itself generated.

Trade-offs

  • A desktop GUI rather than a web interface: no deployment, no auth, no server, and it only runs where it is installed.
  • A separate price updater decouples market data from the reasoning loop, at the cost of a second thing that has to be running.
  • This is a small, early exploration of a pattern, model proposes, deterministic component decides and records, that shows up much more rigorously later in the retrieval and disaster-response work.
2025-07

Offensive security attack chain

A four-stage chain from ARP poisoning to a reverse shell inside a repackaged Android app, written for a university security course.

Repos
Stack
Python · Scapy · C · Android NDK · Smali · mitmproxy · BeEF

Architecture

Coursework for a cyber security module, built as a chain rather than a set of separate exercises: establish a machine-in-the-middle position by ARP spoofing both the victim and the gateway, use that position to answer DNS queries for a chosen domain with an attacker-controlled address, deliver a payload, and optionally inject a browser hook into unencrypted traffic with mitmproxy.

The payload stage is the substantial one, a native reverse shell compiled with the Android NDK, injected into a legitimate APK by decompiling it, adding the binary and Smali code to invoke it, then recompiling and signing. The repository contains both the C source and the Smali fragment.

The ARP spoofer restores both ARP tables in a finally block on exit. In a lab exercise that is a small courtesy; as a habit it is the same instinct as backup verification and key rotation, leaving the system in a state that does not require someone to come and fix it.

Trade-offs

  • Two DNS spoofer implementations are kept in the repository, the second roughly four times the size of the first, the restart-rather-than-replace pattern again.
  • Native C payload via the NDK rather than a framework-generated one: more work, and it demonstrates the actual mechanism rather than the tool that hides it.
  • Written for a controlled lab environment against machines belonging to the exercise. It is included here because understanding the attack chain is what the hardening work on the other side of this page is built on.
2024-09 → 2024-12

Autograders

Three repositories in one month, September 2024. The first code written to do a job while I was not present.

Repos
Stack
Node.js · Express · React · Vite · Docker Compose · nginx

Architecture

A submission service and a front end, containerised together. An Express backend exposes a submit route; a React and Vite front end is served by nginx from its own image; Docker Compose brings up both. The whole thing is small on purpose, a grader that is hard to run does not get run.

Two near-identical repositories exist because the first was abandoned three commits in and the second carried on to thirty-four. The pattern that shows up later across five assistant repositories and three client-site repositories starts here.

Programming1 is the course side of the same work: a React site with a JSON-driven calendar and per-course content. Teaching material and the machine that marks it, built in the same month.

An exclude.txt in the backend, the grader is expected to ignore parts of a submission, which is the first sign of the problem being messier than "run the tests".

Trade-offs

  • Containerising a student-facing tool early costs setup time and removes the class of problem where a grader works on the author's machine only.
  • Two repositories rather than a rewrite in place: the abandoned one is still there, which is why the month reads accurately.
  • A separate nginx image for a small front end is more infrastructure than needed, and it is the same shape as the production deployments that come two years later.
Before the account, pushed 2024-03

Learning_python

Eighteen files recovered from a backup. The pattern that runs through everything else is already in them.

Repos
Stack
Python

Architecture

A GPA calculator, two independent timetable generators, a binary encoder and a binary decoder, an xlsxwriter spreadsheet script, a Wi-Fi password reader, a text mangler. Then the games: hangman, tic-tac-toe, Ludo, rock-paper-scissors. Roughly 26 KB of Python.

Two of the files solve a problem that another file already solved. Longest_run_nSquared.py names its own complexity in the filename and sits next to longest run.py; TimeTableCreator.py sits next to timetable creator.py. Neither pair is a refactor, they are separate attempts, kept.

The repository description says the work predates the account and survived only because it was on OneDrive, and its README says plainly that the code is unoptimised and may not run.

Trade-offs

  • Included here because it is evidence rather than a portfolio piece. The two habits that everything else on this page is built from, automate the chore, and rebuild rather than abandon, are both visible before there was any version control to record them.
2024-03 → 2024-05

Games

Three engines in three months, the first work that produced something other than text.

Repos
Stack
Python · Pygame · Godot · C# · Tiled

Architecture

A Doodle Jump implementation in Pygame from a course skeleton, with custom art and fonts, decoy and jumpy platform variants, two enemy types and a persisted high score.

Two Godot projects with C# scripting: a platformer with coins, a kill zone and a game manager, and a 2D portal game at thirty-five commits whose levels are authored in Tiled and imported as tilesets.

Three months, and the through-line is the toolchain rather than the games, going from a library you call, to an engine with a scene tree, to an engine plus an external level editor.

Trade-offs

  • Course-provided skeletons rather than from-scratch engines: the work is in the gameplay and the integration, not the rendering loop.
  • Choosing C# in Godot over GDScript aligned the game work with the C# used elsewhere at the time, at the cost of the engine's better-documented path.
05

Everything else

The rest of the account, one line each. Included because the volume is part of the evidence, and because a portfolio that shows only the good repositories is describing someone who does not exist.

Public

  • gd42024Placeholder. A README and a single Python file.
  • webDevLab22024Web development lab exercise, sign-in and sign-up pages in HTML and CSS.
  • learningGit2024A terminal quiz game split into game mechanics, a question bank and a user-experience module. Named for the exercise it was written during.
  • Portfolio2024An earlier hand-built portfolio and CV in plain HTML and CSS, with an achievements page and certificate scans. Predates this one by two years.
  • chatbot2024Intent-classification chatbot: a trained Keras model, a pickled vocabulary and class list, a JSON intent corpus, a desktop GUI and speech input. The first AI project.
  • Website2024A responsive architecture landing page, SCSS, a Figma source file, and a small Express server.
  • Ethics-Quiz2024A single-page quiz in vanilla HTML, CSS and JavaScript.
  • UniformChecker2024Contains only a compiled web bundle, no source. Nothing further is claimed about it here, because a minified bundle is not evidence of what the source did.
  • Ai-nexus-spell-detector2025Audio spell recognition, a training script, a prediction script, a sound corpus and a speech playback module.
  • VideoCall2025Browser video calling front end, call, login and session pages in vanilla JavaScript.
  • VideoCallBackend2025The signalling server for the above. One Python file.
  • my_personas2025Persona definitions for the Vigi assistant, as standalone JSON.
  • webscraper2025Two small scrapers, a general web scraper and a news fetcher. Around 10 KB of Python.
  • hackathon_backend2025Flask API built during a hackathon: models, routes, auth decorators, config and a test file.
  • hackathon_frontend2025The Vite front end for the above.
  • portfolio-simulation2025A React and Vite simulation experiment.
  • llm_presentation2026A presentation on language models built as a Vite app, with the script kept in the repository as Markdown and PDF.

Private

Named where the name gives nothing away, described by category where it would identify a client.

  • GD502024Placeholder. Twenty-eight bytes of Python.
  • Client work2025Eleven repositories of commissioned production web work, public and private, described by stack only: React, Vite and TypeScript front ends including a multi-app monorepo with Biome, Husky, a dev container, GitHub Actions and deployment checklists kept in the repository; a containerised Django backend; Flutter and Dart with Firebase Data Connect targeting six platforms; and Figma-driven static builds, several shipped as compiled bundles with no source. Several briefs span two or three repositories, the restart pattern, applied to paid work.
  • game-voting2026A containerised voting application, separate backend and frontend with a migration script.
06

Contact

LinkedIn
msubhanrauf

If you are hiring for platform, security or agentic systems work, the first section of this page is the relevant one and the fourth is the evidence for it.