DVINEX
DVINEX started as an incomplete, inefficient Java application with serious security defects. We mapped the entire system and built a parity test suite, then rewrote it from the ground up in Node.js and TypeScript.
A complete rewrite of an unfinished Java travel and vendor platform. We mapped the existing system, built a parity test suite and replaced the application with a new Node.js and TypeScript implementation. Alongside the rewrite, we resolved release-blocking security defects and delivered partner onboarding, Stripe subscriptions, itinerary planning, transactional email, AI integration and acquisition and referral analytics.
- Product
- Ground-up Java to Node.js rewrite
- Audience
- Travellers visiting Port Macquarie and Coffs Harbour, local experience providers, and the DVINEX team.
- View the platform
- dvinex.com
- Work involved
- System mapping and Java behaviour analysis
- Parity test suite for the replacement application
- Ground-up rewrite in Node.js and TypeScript
- React web application development
- Security remediation and account permissions
- Partner onboarding and listing approval workflows
- Stripe subscription billing and transactional email
- Itinerary planning and AI integration
- Acquisition and referral analytics
- Railway deployment and release automation
Why we chose a rewrite
A rewrite isn't always necessary. When an application's foundations are sound, fixing the problems in place can be the better use of a client's budget. DVINEX had unfinished workflows, an inefficient implementation and security defects that blocked release. The problems ran through enough of the application to justify replacing it. We mapped the entire system, including its routes, services, database operations and frontend calls, and built a parity test suite to compare the replacement against the Java application. That gave us a record of the behaviour we needed to retain and the defects we needed to fix.

A ground-up rewrite in Node.js and TypeScript
We replaced the Java application with a new implementation built on Fastify and TypeScript. Database access moved to Drizzle, with MySQL holding application data and Redis handling sessions and rate limits. Existing business data had to survive the change. The rewrite also meant completing the unfinished workflows and connecting the React app to the new API. As the Java comparison suite was retired, regression and database integration tests took over verification of the supported application.

Discovery and itinerary planning
DVINEX helps travellers find businesses and experiences around Port Macquarie and Coffs Harbour. We delivered the catalogue and day-by-day itinerary planner, including saved plans and AI-assisted suggestions. AI selections are checked against eligible businesses in the catalogue, with a fallback if the provider fails or returns an unusable response. Travellers book through the experience provider's own website or contact channels.

Partner accounts and Stripe subscriptions
Partners can register, manage their listings and submit content for review. The DVINEX team has separate manager and owner controls for approvals and administration. We implemented Preferred Partner subscriptions through Stripe, including checkout, subscription management and the webhook handling that keeps paid access in step with billing. Transactional email covers account verification and recovery. Acquisition and referral analytics record campaign sources and activity through the platform.

Fixing the security defects
We worked through session revocation, account verification and recovery, content ownership and access permissions. Listing changes and media edits needed review controls as well as permission checks. The fixes have regression tests, including database-backed checks for the account, content and billing workflows.
Deployment on Railway
The frontend and API run as separate Node.js services on Railway, backed by MySQL and Redis. GitHub Actions runs the backend, integration, frontend and browser checks before deployment. Database migrations run before the API starts, and readiness checks verify its dependencies. We documented deployment, backup and recovery procedures. The platform is deployed; public launch remains a separate client milestone.
Build notes
- The Java application was mapped before replacement, with a parity test suite to compare the new implementation against the existing system.
- A Fastify API written in TypeScript, with typed database access through Drizzle, MySQL for application data and Redis for sessions and rate limits.
- Revocable sessions, account verification and recovery, ownership checks and separate partner, manager and owner permissions.
- Stripe Checkout and subscription management for Preferred Partners, with duplicate and out-of-order webhook handling and separate test and live billing state.
- Transactional email through Resend, plus first-party campaign and referral attribution.
- Automated backend, database integration, frontend and browser checks gate Railway releases. Database migrations run before the API starts.
