Built a Django App for an Art Business from a Nursing Home — While Quadriplegic
Published on June 29, 2025
Launching a fully functional, client-facing SaaS-style web application is challenging for anyone. Doing it from a nursing home, without the use of your hands, while navigating quadriplegia — that's something else entirely.
In this post, I want to walk through the project that kicked off my professional portfolio: a production-grade business management system built in Django for a high-end art moving company. This app was built entirely by me using a stylus-driven, voice-assisted coding setup — and it runs live today, handling client intake, work orders, scheduling, invoicing, and more.
Project Overview
Name: EJ Art Mover
Stack: Django, PostgreSQL, Bootstrap 5, Crispy Forms, WeasyPrint, jQuery, Docker, Heroku
Audience: Internal crew + clients of a small art moving and installation business
Purpose: Replace scattered tools (text/email/Word docs) with a centralized, secure, and elegant business dashboard.
Key Features
This isn’t just a brochure site. It’s a full business operations platform with several major modules:
1. User Authentication
-
Secure login system with Django’s custom user model
-
Role-based views for authenticated staff
-
Session-based security and CSRF protection
2. Client Management
-
Add, edit, or delete client profiles
-
Store contact details, address, and billing info
-
AJAX-enabled modal to add clients without leaving the work order page
3. Work Order System
-
Create and update work orders linked to clients
-
Support for job description, estimated cost, invoiced status
-
Event scheduling with dynamic modal interface
-
Attach notes and file uploads (e.g. photos, insurance docs)
4. Scheduling + Calendar
-
FullCalendar.js integration for drag-and-drop scheduling
-
View work orders in month, week, or day formats
-
Link between calendar and work order detail pages
5. Attachments + Notes
-
File uploads for each job (artwork images, insurance, etc.)
-
Internal job notes for workers
-
Crispy-form rendering for cleaner UX
6. Invoice Management
-
Generate invoices dynamically
-
View paid/unpaid/overdue jobs
-
PDF rendering via WeasyPrint
-
Status toggles and inline updates via AJAX
Architecture
The app is broken into modular Django apps:
-
accounts: custom user logic and auth -
clients: client profiles and creation -
workorders: job and event tracking -
invoices: invoice generation and status management -
calendar_app: frontend calendar view + API sync -
pages: dashboard and static views
This modular structure supports long-term scalability and testability. I used a relational PostgreSQL database with Dockerized services for consistency across local and production.
DevOps + Deployment
The project runs in a Heroku-hosted Docker container using:
-
Docker for local dev parity
-
Whitenoise for static file management
-
Heroku Postgres for production DB
-
Gunicorn as the WSGI server
-
Environment variables via
.envandenvironsfor secure config -
WeasyPrint installed as a buildpack for PDF generation
-
Custom
heroku.ymlfor Docker-based deployment
All production settings are managed in a separate prod.py file for clarity and environment control.
Special UX Features
One of the big priorities was smooth worker UX on mobile devices. Many workers are checking jobs on the go, in between pickups. To support that:
-
Mobile-responsive buttons and modals
-
Large clickable elements with Bootstrap spacing
-
Client and event modals that don’t reload the page
-
Calendar and list views that sync seamlessly
Technical Highlights
Some fun under-the-hood work:
-
AJAX form submission for new clients and events (less friction)
-
Crispy Forms with Bootstrap 5 layout
-
Select2 integration for searchable dropdowns
-
Hidden formsets that serialize scheduled events into Django’s backend
-
Dual submit buttons to support different job actions: “Save only,” “Save & Invoice,” “Save & Complete”
-
Event form rendering + deletion with dynamic indexing and JavaScript logic
What I Learned
-
How to write modular, production-grade Django apps
-
Handling circular model dependencies via
related_nameandon_delete=models.CASCADE -
Dockerizing a Django app for both local and cloud use
-
Using FullCalendar and WeasyPrint in real-world scenarios
-
Making user flows intuitive, especially for non-technical users
-
Creating graceful failure states and error feedback
-
Handling date and time data accurately for scheduling
The Human Story Behind the Code
I built this app over the course of several months while living in a nursing home. At the time, I was learning to code using two styluses, voice commands, and a completely reimagined workflow. What began as a learning project became a production tool used daily by a real business.
This wasn’t just a software project. It was a comeback project.
What’s Next?
This application was just the start. In the next blog post and YouTube episode, I’ll dive into a radically different kind of project: my viral AI image generation app — built with Django + React + Hugging Face, all in three weeks.
This time, we’re blending faces with history using Replicate’s SDXL and face-matching APIs. From moving fine art to generating it — I’m just getting started.