My work
Five systems built for real-world use.
Core
Offline-first site ops
Construction site operations that keep working when connectivity drops. Shipped as a PWA and React Native app.
The problem
Inductions, timesheets, safety reports, inspections, and access control still have to happen on sites with weak or no network. Always-online tools fail in the field, and compliance checks like CSCS or DVLA are hard to run offline.
The system
Galldris Core writes locally first, queues changes, and syncs when the network returns. One product shape across web and mobile for site teams who cannot wait on signal.
- Digital inductions with DVLA / CSCS verification
- Timesheets, attendance, and near-miss reporting
- Deliveries, inspections, and custom checklists
- Asset / vehicle tracking and site entry-exit control
Engineering notes
- Offline path: IndexedDB (web) and SQLite (mobile), with an auditing.sync_queue for pending writes.
- PostgreSQL multi-schema layout (core, projects, inductions, tools, auditing) with schema-level roles.
- Shared client patterns across PWA (Workbox) and React Native.
- On-prem Kubernetes deployment path; Docker Compose for local development.
Stack
- React
- Vite
- React Native
- Node.js / Express
- PostgreSQL
- Redis
- Kubernetes
In production
Live across 23+ sites.
Hub
On-prem work-winning platform
Pre-construction opportunity and bid management on company infrastructure, with on-prem LLM retrieval over internal documents.
The problem
Bid teams need one place to track opportunities, deadlines, documents, and reusable responses. Tender material is sensitive IP, so answers and corpus data have to stay inside the organisation.
The system
Galldris Work Winning Hub is a self-hosted web app for opportunity-to-bid workflow, document handling, analytics, and role-based collaboration. Teams can ask questions over internal knowledge using an on-prem LLM, with processing kept on local infrastructure.
- Opportunity-to-bid tracking with typed bid stages and deadlines
- Authenticated document storage for specs, proposals, and meet packs
- On-prem LLM Q&A over uploaded bids, lessons, and response material
- Six-tier RBAC, pipeline analytics, and win/loss forecasting
Engineering notes
- On-prem Docker deployment: React frontend, Node API, PostgreSQL, Nginx ingress; no public file URLs.
- Security defaults: session auth, CSRF, CSP/HSTS, rate limits, 2FA, password history, and security audit logs.
- Knowledge pipeline chunks internal documents for retrieval; chat runs against a local LLM with no cloud model calls for that path.
- Response blocks and activity notes sit alongside RAG so bid reuse works in structured workflow as well as Q&A.
Stack
- TypeScript
- React
- Vite
- Node.js / Express
- PostgreSQL
- Drizzle
- Docker
- Nginx
- Local LLM
PassMate
Voice-to-report workflow
Instructors record spoken lesson feedback; the system drafts a structured report; nothing reaches the learner until a human confirms.
The problem
Spoken lesson feedback is easy to give and hard to turn into consistent written reports. Automating the draft helps. Automating the send without review does not.
The system
A mobile + API product for lesson feedback: capture audio, draft a structured report with speech-to-text and an LLM, then hold in review until the instructor edits and confirms delivery.
- On-device recording into an async draft pipeline
- Structured report fields: faults, severity, remedies, and summary
- Hard review gate: send only from AWAITING_REVIEW
- Delivery orchestration with status and retry handling
Engineering notes
- Backend enforces state transitions: edit and send are rejected outside AWAITING_REVIEW.
- Forced structured generation keeps drafts schema-conformant before human review.
- Async worker processing so mobile clients are not blocked on transcription or drafting.
- Channel outcomes tracked separately so failed or skipped delivery can be retried without redoing the draft.
Stack
- TypeScript
- React Native / Expo
- NestJS
- PostgreSQL
- Speech-to-text
- LLM
- Object storage
- Email / messaging APIs
Atlas
Plant and fleet operations
Construction plant and fleet hire workflows with role-gated state changes, evidence capture, and a clean handoff into accounts.
The problem
Hire desk, transport, yard, and accounts each touch the same job through different actions. Requests, dispatch, returns, timesheets, and finance export have to stay consistent when field evidence and desk approvals collide.
The system
ODG Atlas is a modular plant-and-fleet operations platform: requisitions through transport and returns, signed timesheets, purchasing, and atomic accounting export. Desk and field actions share one permissioned workflow.
- Requisition lifecycle with item images and approval
- Transport dispatch, ordered stops, deliveries, and returns with evidence
- Operated-hire timesheets with signed-scan submit rules
- Atomic supplier-invoice export for reconciled batches
Engineering notes
- Route-level RBAC with resource:action guards across desk and driver-facing paths.
- Idempotent mutations on collection and problem capture so retries do not double-apply field events.
- Finance export writes the CSV and stamps invoices as posted in one transaction.
- Multi-schema tenant-aware data access with audit logs that store change data and reason.
Stack
- React
- Vite
- Express
- PostgreSQL
- Redis
- Socket.IO
- Docker
- Nginx
Auction
Live event bidding
A venue fundraising auction where concurrent bids, sniping, and flaky WiFi all have to resolve to one honest high bid.
The problem
Guests bid from phones on event WiFi while a projector shows live lots and the desk runs timers. Two bids can arrive at once, clocks drift, connections drop, and settlement still has to happen offline after the night ends.
The system
Galldris Golf Day Auction is a mobile-first live auction PWA: QR registration, realtime lots, anti-snipe timers, outbid SMS, projector leaderboard, and a CSV ledger for offline payment reconciliation.
- Atomic bidding with row locks so concurrent bids cannot double-win
- Anti-snipe extend in the final window, driven by server time
- Socket reconnect that refetches full lot state after WiFi blips
- Admin lot control, bid retraction, and post-event ledger export
Engineering notes
- placeBid runs high-bid check, increment rules, anti-snipe extend, and insert inside one FOR UPDATE transaction.
- Countdowns use a server-time offset so phone clock skew cannot fake a late bid.
- Outbid SMS queues with a per-user-per-lot cooldown, plus log-only mode when the SMS provider is unset.
- Pause stores remaining_ms so resume keeps the same countdown guests already saw.
Stack
- React
- Vite
- Express
- PostgreSQL
- Socket.IO
- SMS
- Docker
About
Full-stack and AI engineer · London
I own products from discovery through production: React and Node platforms on PostgreSQL, plus LLM features with human review where it matters.
Recent work spans offline-first site operations, on-prem bid and knowledge systems, plant-hire workflows, realtime event software, and a founder-built instructor product with voice-to-report AI. Strong at turning ambiguous operational problems into reliable software under real constraints.
Contact
Have a system worth building?
Open to full-stack and applied AI roles. Based in London.