London · open to cyber/IT apprenticeships & junior roles

Noorun Nobi

Entry-Level Cybersecurity and IT Support
CompTIA Security+ certified, based in London. Currently a Security Officer at the British Museum and moving into tech. I run a hardened Linux server at home and host everything I build on it.

This site is served from a server in my house that I built and secured myself.

01 About

I built a server in my house and now my wife and four of my friends won't get off it.

It started because I didn't want to keep paying Google and Apple to hold our photos. Now every photo the two of us take backs itself up at home overnight, there's an ad blocker running for the whole house, and I host the things I build on it: a daily puzzle game, and a board my wife keeps her knitting and clothes-making ideas on. Plex runs on it too, and four of my friends are on it constantly. Honestly, that's the best part of the whole thing. People I know use something I built, every day, and none of them are paying a subscription for it. It's just fun.

Securing it is the part I got properly into. Key-only SSH, a default-deny firewall, fail2ban, two-factor auth on the management interface, TLS on anything reachable from outside, and backups on more than one drive. Everything I learned for CompTIA Security+ I've now configured myself, broken myself and fixed myself, which is a different thing from having read about it.

Right now I'm a Security Officer at the British Museum. It's genuine responsibility, and it's taught me to stay calm and write an incident up properly while it's still going on, which counts for more on a service desk or in a SOC than people expect. But I want work that keeps teaching me things. I try to talk about tech with my colleagues at lunch and I've yet to find anyone who's interested, which is a fair sign I'm in the wrong room. I love computers and servers. I love researching parts, building the thing, and then working out why it isn't doing what I expected. I want to do that with people who feel the same way, somewhere with a path to keep climbing.

I studied Computer Science at London South Bank University and completed two of the three years. I build my own PCs, I fix my own things when they break. I've had a PS4 in pieces on the kitchen table, and the house is wired up with Alexa and Google Home routines and motion sensors that I maintain when they inevitably drift.

English — fluent Bengali — fluent Eligible to work in the UK — no sponsorship required

02 Skills

Cybersecurity & IT

  • Security+ fundamentals
  • Threats & vulnerabilities
  • Access control
  • Network security
  • Incident response & reporting
  • Access-control systems
  • Service-desk / ticketing workflows
  • System hardening
  • Governance & compliance principles

Programming & Data

  • Python
  • Java
  • C
  • JavaScript
  • Bash scripting
  • Git / GitHub
  • Linux command line
  • Windows 10/11
  • TCP/IP · DNS · DHCP
  • Data cleaning (Python)
  • Excel / Microsoft 365

Operations & Facilities

  • Fault intake & escalation
  • Contractor access coordination
  • Shift logs & incident records

Professional

  • Attention to detail
  • Calm under pressure
  • Clear communication
  • Reliability & discipline
  • Customer service
  • Stakeholder handling

03 Projects & Home Lab

Everything here is running right now, and most of it is used daily by people I know.

Flagship

Self-Hosted Home Server & Security Lab

A Linux server in my house running seven isolated containers, locked down with key-only SSH, a default-deny firewall, fail2ban, 2FA, TLS and backups across more than one drive. My family and friends use it every day.

I got tired of paying Google and Apple to hold our photos, so I put Proxmox on a refurbished Dell OptiPlex and started moving things onto it. It now runs seven isolated containers: Plex, network-wide DNS filtering, private photo backup, an e-book library, one holding the apps I've built, a read-only operations console, and one that holds nothing but the public demos, deliberately kept away from everything else. I specced the console and had an agent write it. This website is served from the same container as the apps.

A reverse proxy sat in the middle of all this for a while and did the TLS. The tunnels took that job over, so I checked nothing was still pointing at it and deleted it.

The hardening is where most of the time went: the lockdown described above, plus Cloudflare in front of anything public. Backups run on a schedule to more than one drive, and a watchdog checks nightly that they can actually be restored. I added that last part after finding out the hard way that a backup you haven't tested isn't really a backup.

Full case study

Why I built it

To stop renting our own photos and files back from cloud companies, and to have somewhere real to learn on. Reading about hardening is not the same as running something that other people depend on and that is reachable from the internet.

What I built

  • Platform: Proxmox VE (enterprise type-1 hypervisor) on a Dell OptiPlex: Intel i5-9500, 16 GB RAM, multi-disk storage.
  • Architecture: 7 unprivileged LXC containers, each service isolated to contain the blast radius of any compromise, plus the hardened host.
  • Services: Plex (hardware-transcoded media streaming), AdGuard Home (network-wide DNS filtering of ads/trackers/malware), Immich (private photo backup, reachable only on the home network), Kavita (e-book library), and Signal Room (a read-only operations console that watches the rest, which has its own case study further down this page), plus the apps I've built and host myself.

Security hardening

  • Access control: key-only SSH (passwords disabled), hardened sshd, TOTP 2FA on the management interface, least-privilege read-only API tokens.
  • Network: default-DROP host firewall, services restricted to the LAN subnet, segmentation via isolated containers, unnecessary services disabled. No inbound ports at all. Anything public is reached through outbound-only Cloudflare Tunnels, so there is nothing on the router to forward or to find.
  • Intrusion prevention: fail2ban auto-bans brute-force attempts, and I review the logs.
  • Perimeter: Cloudflare sits in front and hides the home IP, and its DDoS protection is always on. TLS is terminated there, so the origin has no certificate to renew and no port open to present one on. The tunnel only ever dials out. The demo containers do their own connection limiting at the origin.
  • Data & endpoint: BitLocker full-disk encryption on the workstation I administer the server from, and credentials kept out of scripts and configs.
  • Operations: regular patching cadence and security audits of the host and every container. I also take things out when they don't earn their place. I ran an *arr media-automation stack for a while, couldn't get it behaving reliably, and took it out instead of leaving a half-working service running and exposed.

Data protection & recovery

  • Backups: automated weekly full-system backups to a dedicated SSD, photo libraries mirrored to a separate drive, six-hourly snapshots of the apps I host, and a nightly watchdog that checks each one is genuinely restorable, not just present.
  • Documents are a real 3-2-1: the originals live in Google Drive, which is my off-site copy; they're mirrored nightly onto the server, and copied again onto a second physical drive. That second copy is deliberately made without --delete, so a file deleted in Google Drive doesn't disappear from the backup with it.
  • Photos and artwork are covered off-site too: our phones back up to Amazon Photos independently of the server, and my wife's artwork is mirrored to cloud storage as well as living on the server as a read-only archive.
  • The media library is deliberately not backed up. It's the largest thing on the server and the only part I could reacquire, so backing it up would cost more than it's worth. What I do keep off-site is an index of everything in it, so if a drive dies or the house burns down, I rebuild the server and work back from the list instead of trying to remember what was there.
  • Reliability: SMART disk-health monitoring via smartd, UUID-based mounts, and cron-driven scripted automation.

The backup that wasn't

One evening a backup drive wasn't showing up. I assumed it had died. It turned out to be a loose connection. But rather than plug it back in and move on, I went and checked whether the backups on it were any good. A month of one app's snapshots were zero bytes. The cron job had been writing empty files and reporting success the entire time, and nothing had ever told me. A copy on a second drive covered most of it; one app's history was gone for good.

So I rewrote both backup scripts to verify a snapshot before publishing it and to refuse to run at all if the target isn't mounted, then added a watchdog that checks every night that each backup is genuinely restorable. Then I broke it on purpose to make sure the watchdog actually complained. Reading the other scheduled jobs afterwards turned up a worse version of the same bug: two of them were mirrors that would have copied "empty" over the only other copy of our family photos if their source ever went missing. Both now check both ends before they run.

The lesson I actually took from it: a backup you have never restored from is a guess, and monitoring that only reports success is not monitoring.

  • Linux administration
  • System hardening
  • Network security & firewalls
  • Virtualisation / containers
  • Intrusion prevention
  • TLS / PKI
  • DNS filtering
  • Reverse proxy
  • 2FA / access control
  • Backup & recovery
  • Defence-in-depth
  • Bash & automation
  • Log review

Retro Snake Arena — Browser Game Built with AI Agents, Then Security-Reviewed

A browser game I built by directing AI coding agents, deployed on my own server, and then reviewed for security myself. The review found three real problems, which was the point of doing it.

Three modes, all single-player: an open arena with about twenty bot snakes, classic grid Snake, and a maze run. The server is Node and Express. The game itself is plain JavaScript on a Canvas, with no framework and no build step, and the whole thing has two dependencies at runtime. It started out multiplayer, because I wanted something to play with friends. Single-player turned out cooler and more stable, and it means the scores actually compare.

Full case study

Security engineering

  • Sign-in: Google only. There are no passwords in the app at all, and if it ever finds an old email or password column in the users table it rebuilds the table without them. Session tokens are stored only as SHA-256 hashes, in HttpOnly SameSite cookies.
  • Web-vuln defences: parameterised SQL (injection prevention), input sanitisation and XSS output-escaping, allowlists for user input, and rate-limiting on authentication and actions.
  • Security review: I went through the codebase looking for what I'd learned to look for, and found three things worth fixing: a score endpoint anyone could call without logging in, a WebSocket with no cap on payload size, so one client could exhaust the server, and a rate limit that counted Cloudflare's IP instead of the visitor's, which meant it wasn't limiting anyone. I wrote them up in priority order and fixed them. Signed-out players can still submit a run, they just don't land on the board. The WebSocket one stopped mattering later, when I took multiplayer out.
  • Scoring, honestly: the browser reports the score, so I don't pretend the boards are verified. Each run gets a signed, single-use token, and the server throws a score away unless it arrives with a valid unused token and is possible under the game's own rules.

Extras

  • Automated smoke and browser tests, and it installs to a phone's home screen like an app.
  • Version-controlled on GitHub with incremental, documented commits.
  • Full-stack web development
  • Secure coding (OWASP-aligned)
  • Security code review
  • Vulnerability assessment
  • Git / GitHub
  • Threat modelling

Private Photo & File Migration

Moved thousands of photos off iCloud and Google onto my own server, using command-line tooling that de-duplicated them and kept the metadata intact. Our documents sync there too, backed up, with read-only access where read-only is all that's needed.

  • Data migration
  • CLI tooling
  • De-duplication & integrity
  • Automation
  • Privacy engineering

Bloom — Accessible Daily-Puzzle Web App

A calm daily-puzzle app with one real daily user. 17 puzzle types, no timers, no streaks, nothing that nags. The test suite fails the build if a countdown or a line of pressure language ever creeps back in.

The mainstream puzzle apps are built to drive engagement: ads, streak guilt, countdown timers, noise everywhere. I wanted the opposite. I didn't want to guess at what "calm" ought to mean, so I went and read the published research on ADHD- and autism-friendly design. It's the most rigorous work out there on interfaces that don't overwhelm people. I wrote the findings down as rules and held every feature to them. No timers, no streaks, no pressure language, sound off unless you turn it on. It runs privately on my own server, invite-only, with automated backups. It gets opened most days, which is the only metric I wanted.

Full case study

The brief

Something someone would happily open every day, with nothing in it designed to make anyone feel bad for missing a day. That's a harder brief than it sounds, because almost every convention in the genre exists to drive engagement. I worked from the research on how those interfaces land rather than trusting my instincts, and turned that into rules I couldn't talk myself out of.

What I built

  • 17 puzzle families (word search, picross, mini-sudoku, anagrams, memory pairs and more), all generated client-side, with the generators run against 2,100 seeds apiece to prove they stay solvable and don't repeat themselves.
  • Accessibility with tests behind it: 44 px minimum touch targets, visible focus everywhere, high-contrast, larger-text, reduced-motion and dark modes, and sensory feedback that only happens if you ask for it. All of it enforced by automated tests, so I can't quietly regress it later.
  • A "calm audit" before each release: a check that no countdown mechanic has crept into the codebase, and that no pressure words have crept into the copy.
  • No client-side framework and no trackers. The puzzles are plain JavaScript, generated in the browser. The server has two runtime dependencies: Express, and a JWT library it uses to check the tokens from the access proxy in front of it. Sign-in goes through Google, so I never hold anyone's password. Installable and works offline. The whole test suite has to pass before anything ships.
  • Private by design: runs on the home server above with the same security-first pattern as the flagship, plus identity-based invite-only access. Only invited accounts can reach the real one. The demo above is a separate copy with no accounts at all: the server refuses every write, and it runs its own puzzle seed, so it isn't showing anyone's day.
  • Accessibility engineering
  • Evidence-based UX
  • Progressive Web App
  • Automated testing
  • Secure self-hosting
  • Docker hardening

Patchwork — Mood-Board PWA, Built by Directing an AI Engineering Team

My wife wanted somewhere calm to keep her knitting and clothes-making ideas. I built it by running a team of AI coding agents: writing the specs, splitting the work between them, and reviewing every change myself before it went live.

The idea was my wife's, and she still directs it: what it looks like, how it should feel, what's allowed in. I engineered it. The part I find interesting is how: I ran the build like a small engineering team, except the engineers were AI agents. I wrote the specs and the acceptance criteria, gave each agent a bounded lane, made them review each other's code, then reviewed and tested every change myself in a real browser before it shipped.

Most of the code came from the agents. What I'd actually claim is the judgement around it: deciding what was correct, what was safe, and what was good enough to ship.

Full case study

The orchestration discipline

  • Specs before code. Every feature got written down with acceptance criteria before an agent touched it. Vague instructions were far and away the biggest cause of wasted work, so I stopped allowing them.
  • One agent's code reviewed by a different agent, then by me. I threw out reviews when the reasoning didn't hold up, including overruling an agent that insisted on blocking a change. I tested it myself and it was fine.
  • A passing build was never enough. Every change got exercised in a real browser against a production build before it shipped. That caught things the type checker and the unit tests were happy with, including a race condition that would have quietly broken a feature forever.
  • I kept the parts that carry risk. Privacy, security, deployment and the final call on whether something was good never went to an agent.

What shipped

  • A touch-first infinite canvas (React, TypeScript, tldraw) with photos, notes, drawing, stickers and board export, synced between her iPad and iPhone through a Node/Express and SQLite API.
  • Background removal with no cloud service involved. A quick cut-out runs on the device itself, in a Web Worker using ONNX runtime. If she wants a sharper one, the photo goes to a container on my own server: hardened, non-root, read-only, and not reachable from the internet. Either way her photos never reach a third party.
  • Two separate instances on my server: a private one behind identity-based access, and a public demo that is deliberately less capable. The server refuses every write, its four boards are made up, background removal only runs in the browser, and the public build ships without my tldraw licence key, so it carries their watermark. The public source release is generated by an allowlist exporter with a leak scanner that refuses to publish if it finds an IP, a credential or a private name.
  • AI orchestration
  • Technical project management
  • Full-stack TypeScript
  • Code review
  • In-browser ML
  • On GitHub

Signal Room — Read-Only Operations Console, Built with an AI Coding Agent

It watches the server and it cannot touch it. Ten of the things it tracks sit on one machine, so when that machine goes they all go red together. I get a single incident with a timeline, rather than ten alerts and a guess about which came first.

I wanted to know when something broke without going and looking. I built it with an AI coding agent working to my spec, and the read-only rule was the one line of that spec I would not let move. Anything that can fix the server can also break it, and I didn't want that running unattended. So this one can't. It reads Proxmox telemetry, backup job state, HTTPS responses and certificate expiry, and it has no Docker socket and no service account with a shell, every one of them nologin. There isn't one subprocess call in the whole backend, so it cannot run anything on the box even if it wanted to, and you can check that yourself.

Full case study

The constraint it was built around

Read-only was the requirement from the first line, not a decision I came to later. There is no way for it to restart a service and nothing happens automatically. If it finds a problem, I go and fix it. That reads like a limitation and it is the entire point, because the worst thing a monitoring tool can do is become the reason the server went down.

What I built

  • One process owns the database. The collector, the web server and the notifier never open SQLite. They reach it over Unix sockets, each with its own group and env file. The web server's socket accepts sixteen named methods and no SQL, holds no file handle on the database, and never holds the Proxmox token. Compromise it and the worst it can do is close an incident it can already see.
  • It works out what caused what. It knows which service sits on which machine, so one container falling over produces a single incident with an evidence timeline. Everything stacked on top of it gets attached to that same incident.
  • A release isn't finished when the tests go green. Nothing counts as supported here until that exact build has survived restore, rollback, resource, access, tunnel and firewall checks, and then a full day of running without a restart. A tag on its own doesn't mean it is running anywhere.
  • 115 backend tests covering the API, the collector, the database and its migrations, and the notifier, with a separate suite on the front end.
  • The public version is a drill, not the real console. Every server, incident and alert in the demo above is invented. It is a static build with no analytics, no cookies and no storage, and it cannot reach anything on my network.
  • Python
  • FastAPI
  • SQLite
  • Privilege separation
  • Monitoring & alerting
  • Threat modelling

LocalPhotoPDF — Offline Windows App for Turning Photos into PDFs

I scan a lot of paperwork, and every tool for turning it into a PDF wanted me to upload it somewhere first. This one does the job on the machine, with no account, and the files never leave.

I built it with AI coding agents and then went through the result myself, which turned up seven defects the tests had missed. One could leave the window permanently unresponsive, with Task Manager the only way out. The eighth is the one I would have hated to ship: the binary carried the full path it was built from, so running strings on a download would have shown the account name and folder layout of my machine. A checksum does not catch that. It only proves the file is the one that was built. It is all in the changelog, because agents writing the code is not the interesting part. What reviewing it turned up is.

Full case study

What it does

Pick photos or scans, put them in order, get a PDF. It runs offline and there is no account to make. The one thing it reaches the internet for is checking whether a newer version exists, and only when you press the button.

Shipping it properly

  • The build now refuses to package a binary containing that path. It fails the build. A checklist would only have worked for as long as somebody remembered to read it.
  • Every release is checksummed and attested. The installer, a portable zip, a SHA256SUMS.txt and a software bill of materials, all produced by the tagged build. I checked it by downloading the release back the way a stranger would. The copy sitting on my own disk proves nothing.
  • The version tags cannot be moved or deleted. Blocking force pushes turned out not to be enough on its own. Deleting a tag was refused, but moving one forward still went through, because moving a tag onto a later commit counts as a fast-forward. Closing it properly took a second rule.
  • C#
  • .NET / WPF
  • Windows desktop
  • Supply-chain security
  • Built with AI agents
  • Open source

Smaller builds & experiments

South London Law Society

A university team project: a case-management site where the public submit legal cases, solicitors pick them up and admins oversee the lot. React, Node/Express and MySQL. The team's source was never published, so there's no repo worth linking.

  • React.js
  • Node.js / Express
  • MySQL
  • University team project

StudyTrack — Android App

You paste in a plain-text weekly study plan and it works out the days and tasks for itself, then nags you about them each morning. Built it because I wanted it. Widgets, progress tracking, no accounts, nothing leaves the phone.

  • Android
  • Mobile dev
  • On GitHub

Custom PC Build & Hardware Repair

I picked the parts and built the PC I use every day, and I fix my own things instead of replacing them. A PS4 taken apart on the kitchen table and put back together working, an iPhone battery swapped out.

  • PC hardware
  • Diagnostics
  • Repair

Smart Home Automation

Alexa and Google Home routines running off motion sensors and IoT devices. The bathroom has no window, so a sensor handles the light, and when it drifts or the clocks change and it stops behaving, I go and find out why.

  • IoT
  • Automation

Raspberry Pi Music Controller

A Raspberry Pi running Python that controls a music player from a sound sensor. My first go at making something in the physical world trigger something in software, over GPIO. The original code was lost years ago, so what's on GitHub is me rebuilding it.

  • Python
  • Raspberry Pi
  • Sensors / GPIO
  • On GitHub

Exam Timetable Website

Exam timetables are almost always laid out badly, so I rebuilt ours as a site you could actually read at a glance. Front-end basics against a real annoyance. The original files are long gone, so the repo is a rebuild.

  • Web
  • HTML / CSS / JS
  • On GitHub

Data Cleaning & Processing

Python scripts for cleaning up messy datasets: stripping duplicates, checking things are consistent, and reshaping the data so a report built on it is actually right. That code is lost too, so the repo rebuilds the same idea.

  • Python
  • Data wrangling
  • On GitHub

Password Strength Checker

My first ever program, in C. My first ever git push silently failed and I didn't notice for years. The repo sat here empty. I rebuilt it and finally gave it its code.

  • C
  • Security
  • On GitHub

04 Experience

August 2024 — Present

Security Officer — The British Museum, London

  • Provide front-line physical security at a major, high-footfall cultural institution.
  • When something breaks, staff come to security. I take the report, get the details right and pass it to our control room, who bring in the facilities contractor. That's first-line intake and escalation, which is the same shape as a service desk.
  • Coordinate contractor access into restricted and high-security areas.
  • Work the access-control systems day to day (card readers for staff RFID passes), and respond to incidents to established protocols.
  • Compile accurate incident reports, daily logs and structured handovers; handle sensitive information with discretion and integrity.

November 2022 — August 2024

Door Supervisor — Regency Security Services UK Ltd, London

  • Monitored sites, enforced procedures and produced accurate incident records under pressure.
  • Made sound, defensible decisions and communicated calmly with the public.

January 2024 — March 2024

Sales Assistant — Charles Tyrwhitt, London

  • Delivered professional customer service in a premium retail environment; handled customer queries, sales and records accurately.

October 2021 — December 2023

Barista — Starbucks, London

  • Worked accurately at pace in a high-volume environment; supported colleagues.

05 Certifications & Education

Certified · Oct 2025

CompTIA Security+

Globally recognised cybersecurity certification — threats & attacks, security architecture, identity & access management, risk & compliance, incident response. Valid until October 2028.

Licensed

SIA & CCTV Licences

SIA Door Supervisor licence, CCTV (Public Space Surveillance) licence and First Aid certificate. These are professional monitoring and incident-response credentials.

Education

Computer Science — LSBU

Studied Computer Science at degree level, completing two of three years at London South Bank University.

Ongoing

Hands-On Learning

I run and defend my own server every day, which is where most of my practice actually comes from. TryHackMe SOC Level 1 is what I'm starting next.

06 Contact

I'm after my first role in cybersecurity or IT: an apprenticeship, a SOC Tier 1 / Security Analyst role, or an IT Service Desk position. I'd rather be somewhere I'm learning constantly than somewhere I've already got it figured out. If that sounds like your team, get in touch.

Based in London · Eligible to work in the UK (no sponsorship required)