EJ Art Mover
Job management app built for a professional art moving company. Handles the full workflow — clients, work orders, scheduling, photo documentation, invoicing, and printable PDFs. A drag-and-drop calendar plans daily routes. Built for the field — works on a phone as well as a desktop. Rebuilt from a Django monolith into a decoupled architecture.
Project Overview
A production-grade job management application for an art moving business. It manages the entire workflow from client intake through job scheduling, execution, and invoicing. Originally built as a Django monolith with Bootstrap templates, it was rebuilt as a decoupled system — Django REST Framework API backend with a Next.js/React/TypeScript frontend.
The Challenge
The client was managing logistics, invoicing, and scheduling manually via email and spreadsheets, which caused delays and errors.
The Solution
Built a centralized system that tracks jobs, clients, and invoices with a drag-and-drop calendar for daily route planning, PDF generation for work orders and invoices, and a mobile-first responsive design for field use.
Technology Stack
Backend
Frontend
Auth
Deployment
Key Features
Drag-and-drop calendar with month, week, and day views — reorder stops to plan daily routes
PDF generation for work orders and invoices via WeasyPrint
Invoicing with three-stage status flow (unpaid, in QuickBooks, paid)
Mobile-first: card layouts on phones, table layouts on desktop
Work orders track jobs through pending, in progress, completed, invoiced
File attachments with Cloudinary storage for photos and documents
Google Places address autocomplete for service and billing addresses
Business Impact
Digitized manual scheduling and invoicing
Visual overview of work orders via FullCalendar with drag-and-drop
Mobile-responsive design means the app works in the field on a phone
Rebuilt from monolith to decoupled architecture for maintainability
Technical Achievements
Full monolith-to-decoupled rebuild with direct data migration via pg_dump
Mobile-first UX with bottom sheet drawers on phones, dropdown menus on desktop
Drag-and-drop calendar for daily route planning
Production app used daily by a real business
Technical Implementation
Originally a Django monolith with Bootstrap templates and jQuery deployed on Heroku. Rebuilt as a decoupled system with a DRF API backend and Next.js frontend. Authentication uses JWT with automatic token refresh via Axios interceptors. Server state managed with TanStack Query. Forms use React Hook Form with Zod validation. Same PostgreSQL schema allowed direct data migration via pg_dump.