// subpages.jsx — Markaloud, Work, About, Contact full pages // Edit this line whenever — it shows on the home page as the "Now" status. const NOW_LINE = "Now (May ’26) — closed beta with university pilots; booking engagements from July"; const PUBLICATIONS = [ { year: "2026", title: "The Influence of Vapour Post-Processing of ABS 3D Printed Parts on Impact Strength", authors: "Griffiths, C., Rees, A., & Morgan, A.", venue: "Rapid Prototyping Journal · 32(2) · 410–421", doi: "https://doi.org/10.1108/rpj-09-2024-0373", repo: "https://cronfa.swan.ac.uk/Record/cronfa70815", }, { year: "2025", title: "Automated Cold Embossing for the Integration of Optical Lenses onto the Surface of ABS 3D-Printed Parts", authors: "Griffiths, C., Rees, A., Morgan, A., & Thomas, A.", venue: "Polymers · 17(13) · 1745", doi: "https://doi.org/10.3390/polym17131745", repo: "https://cronfa.swan.ac.uk/Record/cronfa69862", }, { year: "2023", title: "Optimisation of 3D Printing for Microcellular Polymers", authors: "Griffiths, C., Rees, A., Morgan, A., & Korkees, F.", venue: "Polymers · 15(19) · 3910", doi: "https://doi.org/10.3390/polym15193910", repo: "https://cronfa.swan.ac.uk/Record/cronfa64691", }, { year: "2021", title: "Comparison of a BAT and Genetic Algorithm Generated Sequence Against Lead-Through Programming When Assembling a PCB Using a 6-Axis Robot", authors: "Griffiths, C., Giannetti, C., Andrzejewski, K., & Morgan, A.", venue: "IEEE Transactions on Industrial Informatics · 18(2)", doi: "https://doi.org/10.1109/tii.2021.3082877", repo: "https://cronfa.swan.ac.uk/Record/cronfa56974", }, { year: "2021", title: "Environmental Effects on Reliability and Accuracy of MFCC-Based Voice Recognition for Industrial Human-Robot Interaction", authors: "Morgan, A., Birch, B., Griffiths, C., & Morgan, A.", venue: "Proceedings of the IMechE, Part B · 235(12) · 1939–1948", doi: "https://doi.org/10.1177/09544054211014492", repo: "https://cronfa.swan.ac.uk/Record/cronfa56932", }, { year: "—", inProgress: true, title: "Introducing RSIPI: A Python Interface for KUKA Robot Sensor Interface", authors: "Morgan, A.", venue: "In preparation · companion to the rsi-pi library", repo: "https://github.com/otherworld-dev/rsi-pi", }, ]; function PageHead({ kicker, title, sub }) { return (
{kicker}

{title}

{sub &&

{sub}

}
); } // ─── Markaloud product page ────────────────────────────────────────────── function MarkaloudPage({ go }) { return (
Markaloud — the academic audio-marking tool.} sub="Markers record. Markaloud transcribes, timestamps, and structures feedback against your rubric — so students get constructive coaching, not just a grade." />
How it works
01 → 03
01 / Capture

Record once, in the room.

Markers speak naturally during or after the viva. No transcription, no templates, no second admin pass.

02 / Structure

AI maps against your rubric.

Audio is timestamped, diarised, and aligned to your assessment criteria. Strengths, gaps and actions get separated.

03 / Deliver

Constructive, not corrective.

Students receive feedback as a structured, listenable artefact — with the moments to revisit pinned in time.

Inside the app

A rubric-aware audio review surface, designed for the way markers actually work.

Markaloud isn't a transcription tool with a chat slapped on. The model is trained on constructive-feedback patterns, and the UI is built so educators stay in flow — keyboard-first, fast scrub, comments that pin to time.

What's inside
Capabilities
{[ ["WAV / MP3 / m4a", "Recordings up to 90 min · multi-speaker diarisation"], ["Rubric-aligned", "Import QAA, university-specific or custom rubrics"], ["Time-pinned comments", "Strengths · Actions · Next — pinned to seconds"], ["Reviewer-in-the-loop", "Drafts are suggestions; you stay in control"], ["Cohort analytics", "Spot common gaps across a cohort, not just individuals"], ["GDPR & DPIA-ready", "EU/UK data residency, full audit trail"], ].map(([h, p], i) => (
{String(i + 1).padStart(2, "0")} ▸

{h}

{p}

))}
); } // ─── Work / portfolio page ─────────────────────────────────────────────── function WorkPage({ go }) { return (
Things I've built — across software, hardware and the spaces in between.} sub="A non-exhaustive list. Most of my engagements are under NDA; the cases below are public or anonymised summaries." />
); } // ─── About page ────────────────────────────────────────────────────────── function AboutPage({ go }) { return (
I work across the stack — and across the bench.} />
Adam Morgan in front of a KUKA robot arm
● ADAM MORGAN KUKA · ARM-04

I'm Adam Morgan. After eight years in robotics research and teaching at Swansea University, I'm going independent in July 2026 to run Otherworld Dev Ltd — a software, AI & robotics engineering practice. This page is the foundation: the work I take with me, and the work I'm taking on next.

The route here wasn't linear. I started in logistics IT at UPS, moved into RockIT — an award-winning MSP — running proactive monitoring across ~3,800 machines, then joined Swansea as an IT technician and research assistant on ASTUTE2020. Eight years there pulled me through into a MSc by Research in Robotics and the academic post I currently hold.

The route turns out to be the value. As a full-stack software engineer with an AI & robotics specialism — and operations and infrastructure underneath — I know what it looks like when software meets the warehouse floor, when an MSP ticket queue meets a real deadline, when a research idea meets a department that has to actually run it. I ship across the stack: web apps in Vue and Next, robot control loops in Python and KRL, ML pipelines on Whisper and YOLO, firmware on ESP32 and RP2040. Otherworld is where I take that next — building Markaloud and other products like Shopping List, and taking on consulting and build engagements for teams that need a generalist who can cross hardware, firmware, ML and the people problem.

I care about systems that are honest with their users and tools that respect the people using them. If that sounds like your problem, we'll probably get on.

Software
Python · TypeScript · C / C++ / C# · Java · PHP
Web stack
Vue 3 · Next · React · FastAPI · SQL
ML / AI
PyTorch · Whisper · YOLO · LLM tooling
Robotics languages
KRL · ROS · Festo / Siemens PLC
Robots operated
KUKA KR16-2, iiwa, KMR · UR3 · Mitsubishi RV-4FL-D · Baxter · Unitree
Embedded
RP2040 · ESP32 · STM32 · Raspberry Pi
Manufacturing
FDM · SLA · Klipper · SolidWorks · PCB
Infra
MSP-grade ops · Linux · VMware · Hyper-V · Nextcloud
The route
{[ ["2008–2010", "UPS", "Tech support inside Europe's largest delivery hub"], ["2011–2014", "RockIT (MSP)", "Proactive engineer → team manager · 3,800 machines"], ["2015–2019", "Swansea IT", "Servers, domain control, 30TB+ backup ops"], ["2015–2022", "ASTUTE2020", "Robotics + photogrammetry research assistant"], ["2021", "MSc by Research", "Robotics — Swansea University"], ["2022–Jul '26", "Lecturer in Robotics", "Swansea · Mechanical Engineering · runs the robotics lab"], ["Jul 2026 →", "Otherworld Dev Ltd", "Going full-time independent — AI & robotics practice"], ].map(([y, k, v]) => (
{y}
{k}
{v}
))}
Selected publications · 5 published · 1 in progress
{PUBLICATIONS.map((p) => (
{p.inProgress ? "IN PROGRESS" : p.year}
{p.title}
{p.authors}
{p.venue}
{p.doi && ( DOI ↗ )} {p.repo && ( Repository ↗ )}
))}
); } // ─── Contact page ──────────────────────────────────────────────────────── function ContactPage() { const [state, setState] = React.useState({ name: "", email: "", subject: "consulting", message: "" }); const [status, setStatus] = React.useState(""); const [sending, setSending] = React.useState(false); const submit = (e) => { e.preventDefault(); if (!state.name || !state.email || !state.message) { setStatus("⚠ Please fill in name, email and a short message."); return; } setSending(true); setStatus("→ Sending…"); setTimeout(() => { setSending(false); setStatus("✓ Thanks — I'll reply within 48 hours."); }, 900); }; return (
Let's talk.} sub="The fastest way is email. The form below routes there too — pick whichever you like." />
setState(s => ({ ...s, name: e.target.value }))} placeholder="Eleanor Hughes"/>
setState(s => ({ ...s, email: e.target.value }))} placeholder="you@company.com"/>
{status}
Direct lines
Emailcontact@otherworld.dev
Markaloudmarkaloud.cloud ↗
LinkedIn/in/a-j-morgan ↗
GitHubgithub.com/otherworld-dev ↗
CompanyOtherworld Dev Ltd · England & Wales
LocationSwansea, UK · remote / hybrid
● Available from July 2026
Wrapping up my academic post and going full-time independent in July 2026. Now booking consulting and build engagements from that date onward.
); } // ─── Home composes everything ──────────────────────────────────────────── function HomePage({ go, treatment }) { return (
{NOW_LINE}
); } Object.assign(window, { MarkaloudPage, WorkPage, AboutPage, ContactPage, HomePage, PageHead, });