ShaafVorthryss Download CV
EnglishEspañolPortuguêsFrançaisالعربية

Shaaf · Software Engineer · UK-based, remote worldwide

Complex workflows. Working software.

I design and build integrations, internal tools and AI-enabled workflows. Python services, React interfaces and data processing—with demonstrations you can run and results you can inspect.

Python · SQL · FastAPI · TypeScript · React · Data engineering · AI & LLM integration · n8n · Docker · Linux

A clear route from problem to delivery

Bring the current workflow, the tools involved and the result you need. We agree a useful first milestone, then build against explicit acceptance criteria.

Connect business systems

APIs, CRM data and recurring workflows. Define the source of truth, handle duplicate events and make failures visible.

Build operational software

Internal tools, reporting dashboards and web applications with a usable interface and checked outputs.

Make AI useful inside a workflow

Document processing, knowledge retrieval and tool-connected features, with task-specific evaluation and a practical handover.

Selected work

See the work. Inspect the result.

Self-directed projects, with synthetic demonstration data clearly identified. Explore the working lab, the web application and the data outputs.

JavaScript · State machine · Idempotency · Recovery

Workflow recovery lab: break it, then inspect the recovery

An executable browser demonstration of event identity, queued work and a simulated CRM connector. Trigger duplicate input, a temporary timeout, an interrupted write or a permanent error. Inspect the stored state and download the execution trail.

  • 13 tests pass, including deliberately corrupted state
  • 200 unique synthetic events: 150 successful effects, 50 explicit review cases, no duplicate effects
  • The browser and tests execute the same engine; source and tests are downloadable
0duplicate effects in the 200-event test

TypeScript · React · FastAPI · pytest · Playwright · CI

Order Desk: one app, three stacks, one test suite

A small order web app with a Python JSON API, SQLite and a strict TypeScript front end, rebuilt in React 19 and on a FastAPI server. The same API, database and browser tests judge every version.

  • Original repaired baseline: 90 passing API, database, browser and tool checks
  • On a deliberately faulty build, exactly the tests that guard its 6 planted bugs fail, in every version
  • Reproducible local pipeline: type checks, builds and test suites; hosted CI configuration included
3 stacksTypeScript, React and FastAPI, judged by one test suite

Python · PDF · XML · OCR · Data quality

Document & data processing

Synthetic invoice, customer and sales datasets turned into clean, checked outputs. These are demonstration projects, independently recounted; they are not client engagements.

  • 3 PDF invoices: 11 of 11 line items exact, and a £10.00 overcharge flagged
  • 16 Mexican and Brazilian e-invoices (CFDI, NF-e): all 9 planted problems found
  • 299 Arabic and English customer records cleaned, 242 phone numbers in international format
  • 1,774 raw sales rows turned into a two-page weekly report
£10.00deliberately planted £10.00 discrepancy found
An invoice before extractionThe same invoice as checked spreadsheet rowsTwo-page weekly sales report

More work

Python · Web data · Structured data

Price comparison engine

Answers "what is the cheapest price, and who sells it" in code: finds shops, reads structured product data, keeps prices without VAT and in other currencies apart, and respects robots.txt.

  • Answered a live UK price question in 49 seconds, with all 7 facts matched
  • Shops that blocked automated reading were reported, never guessed

Python · Public registers · Data validation

Business verification at scale

Checked a list of UK businesses against Companies House and their own websites before any contact, following UK PECR rules. Register lookups also cover France (Sirene) and Australia (ABN).

  • 256 businesses checked: 132 confirmed
  • 23 wrong addresses and 4 inactive companies caught before contact

Python · Search · Official sources

Multilingual research engine

Searches in each country's own language, reads official pages and PDFs, scores every source and quotes each finding with its link.

  • 6 of 6 live runs passed their checks (Japan, Poland, Brazil)

Swift · SwiftUI · macOS

macOS operations app

A menu-bar app that brings email from 3 accounts, alerts, approvals and finished work into one panel.

  • Email panel load time cut from 64 s to 0.6 s
  • A build-time self-test presses all 32 buttons: 0 failures

Debian · Docker · n8n

Self-hosted Linux server

An always-on server running n8n workflows, a private search engine (SearXNG), a monitoring service and a local model server.

  • Health checks every 15 minutes and a daily digest
  • Watchdog tested: a stopped service restarted itself in 41 s

The platform

One system, designed and built independently

An independent platform project connecting persistent jobs, tools, retrieval and verification. It is where I investigate orchestration, recovery and how to turn model output into checked work. The results below describe specific recorded experiments.

2,175
automated tests passed, with 0 failures, in the full run of 28 October 2026
33 s
to get back to work by itself after a full machine restart
20 / 20
answers with swapped facts caught by its fact check
0.49 s
median reply to a simple question, down from 869 s
Part by part
  1. Task engine

    Turns a request into steps and runs each step with a tool. Every result is stored with a checksum, so any answer can be traced back to what was read.

    Python · state machines · durable records

  2. Tool layer

    26 tools behind one registry: web search, page and PDF readers, OCR, company registers, prices, tables, files and calendar. Each tool declares what it may do, and sending an email waits for a person’s approval.

    Plugin registry · typed parameters · approval classes

  3. Fact checking

    Code pulls records out of every tool result. A fact in an answer stands only if a single record holds both its value and what it describes, so a swapped or invented figure is refused.

    Typed validation · evidence binding

  4. Methods in code

    When code can answer, no model is asked. Price comparison, business checks, counting and table work run as fixed methods; a live UK price question took 49 seconds.

    Deterministic pipelines · structured data

  5. Search

    A search engine over 83,589 passages of technical documentation that combines keyword ranking with vector embeddings, and a research engine that searches each country in its own language.

    SQLite FTS5 · BM25 · embeddings · rank fusion

  6. Reliability

    A supervisor restarts failed work with growing pauses between tries. Jobs wait out internet outages instead of failing, and stop, pause and resume take effect on the next turn.

    Supervision · back-off · durable jobs

  7. Resource control

    Heavy work starts only when memory, heat and battery allow it. If the user starts a game, a running job steps aside at once and picks up again afterwards.

    Admission control · scheduling

The code is private. I walk through it in interviews and can share source under NDA.

Problem-solving record

Recorded engineering cases

Selected engineering investigations: the observed failure, the repair and its recorded checks.

A simple question that took 869 seconds

What I found
A short question typed into the app mid-job queued behind the busy main model and waited 869 seconds for an answer.
What I did
Questions are now sorted before anything runs. Sums and questions about the system are answered by code, and short questions with nothing to look up go to a small, fast model.
Result
20 of 20 general questions answered, with a median reply of 0.49 s.

An AI that couldn’t find a price after 24 tries

What I found
Guessing from search results never produced a price it could back up.
What I did
Replaced guessing with a method in code: find the shops, read their structured product data, compare like for like, and report what couldn’t be read.
Result
A live UK price question answered in 49 seconds, all 7 facts matched.

An email panel that gave up after 64 seconds

What I found
The reader opened every message in full, one at a time, from only one of three accounts, while the panel waited 25 seconds at most.
What I did
Read only the headers, one call per account, merged newest first.
Result
64 s → 0.6 s across all 3 accounts; a regression test guards it.

A fact check that passed swapped answers

What I found
I tested my own fact check by swapping figures between answers. All 20 swapped answers still passed: it confirmed the figures existed, not which claim they belonged to.
What I did
Rebuilt it around records drawn by code. A fact now stands only when one record holds both its value and what it describes.
Result
0 of 20 swapped answers pass.
More cases

A background job that ignored a game

What I found
A game was opened while a background job held 7.6 GB of memory. New work was held back, but the running job carried on until it was stopped by hand.
What I did
A running job now checks on every turn and steps aside as soon as a game is being played. It isn’t counted as a failure.
Result
The job stops on its next turn and starts again when the game ends.

A three-hour outage that burned 21 tries

What I found
During a three-hour internet outage the system kept starting work: 21 local tries and 9 cloud calls failed on a dead link, and 13 jobs were marked blocked.
What I did
It now reads the connection twice before starting work that needs the internet. Work waits while the link is down, and a try that failed only because of the outage isn’t counted.
Result
Work pauses during an outage and carries on when the link returns.

A stop button that filed a job called “stop”

What I found
In the app’s chat, “stop”, “pause” and “cancel that” were filed as new jobs. 10 of 12 everyday messages became jobs.
What I did
Commands are now recognised and written as one order that the runner obeys on its next turn: stop ends running work, pause lets it finish, resume starts again, and a cancelled job never starts.
Result
Proven live: a full stop left nothing running.

A right answer refused, then a wrong one

What I found
An AI agent counted 20 different people in a contact list correctly. A word-matching check refused it; the retry said 19.
What I did
Built a typed check that recounts from the source data under the request’s own rule. Right answers pass in any wording; wrong ones are refused with the cause named (here, the header row removed twice).
Result
Tested on the real records, independently reviewed twice, now live.

Alerts logged as shown that nobody saw

What I found
The app treated “sent” as “seen”: the operating system had alerts switched off, and the log still marked each one shown.
What I did
Check the real permission first, mark an alert shown only once the system accepts it, hold the rest, and tell the user plainly when alerts are off.
Result
Both lost alerts delivered and confirmed on screen; a regression test guards it.

Skills

What I bring to a team

Broad, hands-on skills across the stack, each one used in a real project shown above.

Backend, APIs & front end

Python services and REST APIs (also on FastAPI) with SQL storage, and typed front ends in TypeScript and React. Built with retries, idempotency and failure handling.

Python · FastAPI · TypeScript · React · REST APIs · JSON · SQL / SQLite · Bash · JavaScript

Data engineering

Messy data turned into clean, checked outputs: cleaning, de-duplication, validation, reconciliation, PDF and XML extraction, OCR and reporting.

Data pipelines · Data quality · PDF & XML · OCR · Reporting

AI & LLM integration

Agents that use real tools step by step, local and on-device models, retrieval, and evaluation on held-out tests, with code that checks every answer.

AI agents · Tool use · Ollama · MLX · Retrieval · Evaluation

Automation & integration

Workflows and integrations that connect systems and data sources reliably, including polite web data extraction and public registers.

n8n · API integration · Web data · Public registers

Testing & QA

Automated tests at every layer, regression tests written from real faults, and release gates that stop a bad build.

pytest · Playwright · API tests · Database tests · Release gates · CI/CD

Reliability & DevOps

Always-on services: supervision and restarts, admission control, release gates with rollback, monitoring, tracing, containers and backups.

Debian · Docker · systemd · SSH · Git · OpenTelemetry

Apple platforms

A native macOS app in Swift and SwiftUI, plus command-line tools for on-device OCR, speech-to-text and Core ML.

Swift · SwiftUI · Vision · Speech · Core ML

Security

Approval workflows, command allowlists, process sandboxing, signed audit logs and a consent-based data vault, plus OWASP practice in an isolated lab.

macOS Seatbelt · Semgrep · OWASP · Juice Shop · WebGoat

International

Ready for international work

My projects already cross borders. I build software that handles other countries’ documents, registers, languages and currencies correctly, and I work remotely with teams anywhere.

  • Latin AmericaMexican CFDI and Brazilian NF-e e-invoices read from XML and checked line by line; research in Portuguese for Brazil.
  • Middle East & North AfricaArabic and English customer records cleaned and de-duplicated, with phone numbers in international format.
  • EuropeCompany register lookups in the UK (Companies House) and France (Sirene); research in Polish.
  • Asia-PacificResearch in Japanese; company lookups in Australia (ABN).
  • Money and taxPrices kept in their own currency, with and without VAT, and never converted by guesswork.
  • Working hoursUK time (GMT/BST). Working-hour overlap and communication cadence agreed for each engagement.

About

About me

I’m a self-taught software engineer based in the UK. Since mid-2026 I have independently designed, built and run the platform above, along with the projects around it.

Vorthryss is my independent engineering practice. I originate ideas and architecture, compare competing approaches, and use AI tools to implement, critique and test them. I take responsibility for the scope, design choices and acceptance criteria.

I like problems where software meets the real world: messy data, documents from other countries, machines that restart in the middle of a job. I make small, tested changes and write down what changed and why.

  • Python · TypeScript · SQL · Swift · Bash
  • A full platform built and run independently since mid-2026
  • Documents, data and registers from 7 countries
  • Right to work in the UK

Experience

What I've been building

Independent Software Engineer

Self-directed engineering · Remote, UK-based · June 2026 – present

  • I originated the architecture and directed AI-assisted implementation, critique and testing of a persistent task platform with a native macOS interface.
  • Shipped 58 releases through a release gate: commit pinning, a preflight check, a baseline test run, a receipt and one-command rollback.
  • Developed the automated tests with AI assistance: the recorded full run on 28 October 2026 passed 2,175 tests with 0 failures.
  • Built data and verification tools used on real tasks: price comparison, business verification, multilingual research and document extraction.
  • Run a self-hosted Linux server with Docker, n8n workflows, monitoring and backups.

Principles

How I work

Small, tested steps

I pair implementation changes with relevant tests and inspect the result. Versioned releases can be rolled back.

Fix the cause

When something breaks, I find the cause, fix it, and turn the failure into a test so it can’t quietly come back.

Never guess

Where there is no record, I write “unknown” instead of a likely-sounding guess.

Written records

What changed, why, and the evidence beside it, so anyone can pick up the work.

Contact

Let's work together

Have a workflow to connect, an application to finish or an AI feature to make reliable? Send the goal, current stack and one example of the desired result. I also welcome remote software-engineering roles.

shaaf@vorthryss.com

  • Right to work in the UK
  • UK-based · remote worldwide
  • I work in English