The problems, and how I solved them.
Five builds told properly. What was broken, the decisions I made, what I actually shipped, and what changed for the business afterwards.
Three RWA Platforms, Three Chains
Tokenizing real world assets on Ethereum, BNB Chain and Algorand. Same goal each time, three very different sets of constraints, and every one of them shipped to mainnet.
Real assets like property are high value and illiquid, so ordinary investors are locked out. Tokenizing them sounds simple until you hit compliance, issuance control, and the fact that a bug in a contract is permanent.
For each chain I built the token contracts, the issuance and distribution logic, investor onboarding with KYC gates, campaign pages, investor dashboards and an admin panel for the issuer. Ethereum used ERC-20 fractional ownership with IPFS metadata, BNB Chain was chosen where the economics only worked on low fees, and Algorand used ASA with instant finality and built in asset controls for the compliance heavy case.
Three working platforms where investors buy fractional ownership of real assets, issuers control supply and compliance, and the whole flow from signup to token holding runs without manual intervention.
Every chain has a different toolchain, a different fee model and different assumptions about compliance. The real work was not writing three sets of contracts, it was deciding which chain fitted each business case and then designing the money flow so that a mistake could not become permanent. Testing, staging and audit discipline mattered more than the code itself.
Medical CRM with AI Automation
A practice management system where clinical staff were losing hours a week to admin. I built the CRM, then wired AI automation into the parts that were pure repetition.
Patient records, scheduling and billing lived in separate places, and staff spent hours every week retyping intake forms, summarising notes and routing documents to the right person.
A unified CRM with patient records, appointment scheduling, billing and reporting under role based access. On top of that, AI automation for intake summarisation, document classification and routing, plus reporting dashboards so the practice could see where time was actually going.
Staff stopped retyping and started reviewing. The repetitive admin runs quietly in the background, the records live in one place, and the practice can see its own numbers without building a spreadsheet.
Healthcare data is unforgiving. AI that is roughly right is worse than no AI at all, so every automated step had to be reviewable, reversible and clearly attributed to a source. I designed the automation to draft and suggest rather than silently decide, which is what made staff trust it enough to actually use it.
Automated LinkedIn Content from GitHub Commits
Developers do interesting work every day and never talk about it. Built a tool that reads your GitHub commits, uses OpenAI to write developer-voice LinkedIn posts, and publishes them on a schedule.
Most developers are too deep in the work to think about personal branding. Writing LinkedIn posts about what you built is time-consuming, and most people just don't do it. The knowledge stays locked in commit messages that nobody outside the repo ever sees.
Users connect GitHub and LinkedIn via OAuth (NextAuth v5). The app pulls recent commits, sends them to OpenAI with a prompt tuned for developer voice — not corporate speak — and generates post drafts. Users can review and edit before scheduling. BullMQ with Upstash Redis handles the background job queue. Posts go out at the time the user sets, adjusted for their timezone. Deployed to Vercel with a background worker running separately.
An automated personal branding pipeline that runs on its own once connected. Users get consistent LinkedIn presence reflecting their actual work, without writing a single post manually.
Commit messages are terrible source material. Getting from raw diffs to something worth reading meant shaping the prompt around what was actually interesting in the work, and giving the user an edit step before anything reached their public profile.
Digitizing a Defence Procurement Workflow
A UK-based defence contractor was running procurement through email chains and spreadsheets. Built them a full-stack platform that handles the entire lifecycle — from RFQ creation to vendor selection.
Procurement was a mess. RFQs went out as PDFs via email. Vendors replied with attachments. Compliance docs got lost. Negotiations happened over phone calls with no record. There was no single source of truth, and audits were painful.
Built a full-stack platform on Next.js and NestJS. Admins create RFQs with line items, deadlines, and compliance requirements. Vendors log in, review RFQs, and submit structured proposals. A built-in chat component handles negotiations with full message history. Compliance documents are uploaded and tracked per vendor. The admin panel gives full visibility into every active procurement.
The entire procurement cycle — from RFQ to vendor selection — now runs through the platform. Zero emails exchanged for routine procurement. Every interaction is logged. Admins can track compliance status in real time and export audit trails on demand.
In defence procurement the audit trail is the product. Every state change needed to be recorded, attributable and impossible to quietly edit later, which shaped the data model far more than the interface did.
Fiat Payments & Subscription Billing for an MLM Platform
Migrated a crypto-only MLM platform to accept fiat payments via Authorize.net, fixed broken subscription billing, got rank tracking working correctly, and stood up a full staging environment.
The platform only accepted crypto. A large portion of users wanted to pay with cards. Authorize.net was partially integrated but kept throwing testRequest errors — turned out the team had mixed demo and sandbox credentials. On top of that, personalVolume wasn't tracking correctly for MLM rank calculation, and there was no safe place to test changes without risking production.
Diagnosed the Authorize.net credential mismatch — demo accounts don't work in the sandbox environment, full stop. Rebuilt the payment flow using createCustomerProfileFromTransaction so the first real charge also creates a Customer Information Manager (CIM) profile for recurring billing. Set short subscription expiry cycles in test mode to verify the billing loop. Fixed the personalVolume tracking logic in the rank calculation service. Provisioned a separate DigitalOcean droplet for staging with its own subdomain, MongoDB seed data, PM2 config, and Nginx reverse proxy.
Fiat payment processing is live. Subscription renewals fire correctly on schedule. Rank advancement works as expected based on real volume data. The staging environment is isolated from production and used for all new feature testing before deployment.
Two payment worlds with completely different failure modes. A card charge can be refunded, an on chain distribution cannot, so the system had to treat the chain as the final step and never the first one.